Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
La programmazione in linguaggio C
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell'Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L'informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell'informazione).
In ogni caso non può essere dichiarata conformità all'informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing e c
orre zion e del p rog ram
ma
Strumenti per la programmazione
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Strumenti per la programmazione
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing e c
orre zion e del p rog ram
ma
In questo corso non è previsto l’utilizzo di sistemi di analisi automatica né di strumenti di CASE (Computer Aided Software Engineering)
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Strumenti per la programmazione
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing e c
orre zion e del p rog ram
ma TEXT EDITOR: programma per scrivere file di testo (ASCII) Esempi: EDIT di MS-DOS, Notepad, Wordpad o Notepad++ di MS-Windows, gedit o emacs di Unix
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Strumenti per la programmazione
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing e c
orre zion e del p rog ram
ma Compilatore C/C++ della GNU
Linguaggio C:
gcc -o foobar.exe foobar.c Linguaggio C++:
g++ -o foobar.exe foobar.cpp
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Strumenti per la programmazione
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing
e c orre zion e del p
rog ram ma
In MS-DOS e in unix per eseguire un programma è sufficiente scriverne il nome sulla linea di comando, seguito da invio:
C:\PROGRAMMI> foobar
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
Strumenti per la programmazione
specifiche
del problema analisi algoritmo
programma sorgente
im ple m entazione
compilazione e linking programma
eseguibile
esecuzione
controllo
dei risultati deb ugg ing
e c orre zion e del p
rog ram ma Strumenti di base:
• attenta analisi ragionata del codice
• selezione di casi significativi
• printf (per la stampa dei valori delle variabili)
Strumenti avanzati:
• debugger
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
Utilizzo del compilatore GCC
• Compilazione:
C:\PROGR> gcc -o nome.exe nome.c
• Esecuzione:
C:\PROGR> nome
• Compilazione per il debugger:
C:\PROGR> gcc -g -o nome.exe nome.c
• Esecuzione con debugger grafico:
C:\PROGR> gdb nome C:\PROGR> insight nome C:\PROGR> nemiver prova
(versioni gcc precedenti alla 3) (in ambiente Ubuntu)
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10
Principi fondamentali
• “Implementare un algoritmo” significa tradurre una serie di operazioni aritmetico-logiche in procedure eseguibili dal calcolatore
• Tale traduzione è diversa a seconda del linguaggio di programmazione scelto
Un programma C è costituito fondamentalmente da variabili e funzioni
Fondamenti di Informatica - La programmazione in linguaggio C
Variabili e funzioni
• Le variabili memorizzano i valori (o dati) in input e/o in output e quelli usati durante l’esecuzione
• Le funzioni sono sequenze di istruzioni, ossia operazioni da effettuare sui dati
Fondamenti di Informatica - La programmazione in linguaggio C
Esempio: hello.c
#include <stdio.h>
#include <stdlib.h>
/* programma principale */
int main() {
printf ("Hello world!\n");
return EXIT_SUCCESS;
}
/* fine del programma */
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13
Esempio: hello.c
#include <stdio.h>
#include <stdlib.h>
/* programma principale */
int main() {
printf ("Hello world!\n");
return EXIT_SUCCESS;
}
/* fine del programma */
Direttiva al preprocessor:
include il file (del compilatore) stdio.h che serve per l’utilizzo delle funzioni di input/output
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14
Esempio: hello.c
#include <stdio.h>
#include <stdlib.h>
/* programma principale */
int main() {
printf ("Hello world!\n");
return EXIT_SUCCESS;
}
/* fine del programma */
Commento: viene ignorato dal compilatore
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15
Esempio: hello.c
#include <stdio.h>
#include <stdlib.h>
/* programma principale */
int main() {
printf ("Hello world!\n");
return EXIT_SUCCESS;
}
/* fine del programma */
Funzione main: tutto comincia da qui
Corpo della funzione main
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16
Esempio: hello.c
#include <stdio.h>
#include <stdlib.h>
/* programma principale */
int main() {
printf ("Hello world!\n");
return EXIT_SUCCESS;
}
/* fine del programma */
Istruzione per stampare la scritta
"Hello world!" e poi andare a capo Istruzione per terminare la
funzione main (e quindi il programma) restituendo al sistema operativo il valore numerico associato, in stdlib.h, a EXIT_SUCCESS
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 17
Struttura di un programma
• Ogni funzione è identificata da un nome
• Il programma inizia sempre l’esecuzione a partire da una funzione “speciale”: la funzione main
• Nei programmi C più semplici, tutte le operazioni da fare risiedono nella funzione main
• I programmi complessi prevedono che main invochi altre funzioni, suddividendo le molte istruzioni in blocchi logici più semplici
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 18
Direttive al preprocessor
• La prima linea del programma:
#include <stdio.h>
è comune a molti programmi C
• Indica al compilatore di includere
automaticamente le funzioni della libreria
standard di input/output stdio.h, come ad
esempio la funzione di stampa su video
printf ()
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 19
Commenti
• In ogni programma C è utile poter inserire dei commenti, a descrizione di quanto viene eseguito da una o più istruzioni
• La riga di commento:
/* programma principale */
non contiene istruzioni C e quindi non viene processata dal compilatore
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 20
Input e output
• printf () è una funzione di uso generale offerta della libreria standard di input/output
• Nell’esempio, essa stampa sul monitor (lo standard output) semplicemente la sequenza di caratteri: Hello world!
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 21
Esempio: somma.c
#include <stdio.h>
#include <stdlib.h>
int main() /* somma due numeri interi */
{
int num1, num2, somma;
printf ("inserire num1: ");
scanf ("%d", &num1);
printf ("inserire num2: ");
scanf ("%d", &num2);
somma = num1 + num2;
printf ("num1 + num2 = %d\n", somma);
return EXIT_SUCCESS;
}
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 22
Esempio: somma.c
#include <stdio.h>
#include <stdlib.h>
int main() /* somma due numeri interi */
{
int num1, num2, somma;
printf ("inserire num1: ");
scanf ("%d", &num1);
printf ("inserire num2: ");
scanf ("%d", &num2);
somma = num1 + num2;
printf ("num1 + num2 = %d\n", somma);
return EXIT_SUCCESS;
}
dichiarazione di variabili intere
Fondamenti di Informatica - La programmazione in linguaggio C
Esempio: somma.c
#include <stdio.h>
#include <stdlib.h>
int main() /* somma due numeri interi */
{
int num1, num2, somma;
printf ("inserire num1: ");
scanf ("%d", &num1);
printf ("inserire num2: ");
scanf ("%d", &num2);
somma = num1 + num2;
printf ("num1 + num2 = %d\n", somma);
return EXIT_SUCCESS;
input di un intero (input formattato)
Fondamenti di Informatica - La programmazione in linguaggio C
Esempio: somma.c
#include <stdio.h>
#include <stdlib.h>
int main() /* somma due numeri interi */
{
int num1, num2, somma;
printf ("inserire num1: ");
scanf ("%d", &num1);
printf ("inserire num2: ");
scanf ("%d", &num2);
somma = num1 + num2;
printf ("num1 + num2 = %d\n", somma);
return EXIT_SUCCESS;
somma e
assegnazione
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 25
Esempio: somma.c
#include <stdio.h>
#include <stdlib.h>
int main() /* somma due numeri interi */
{
int num1, num2, somma;
printf ("inserire num1: ");
scanf ("%d", &num1);
printf ("inserire num2: ");
scanf ("%d", &num2);
somma = num1 + num2;
printf ("num1 + num2 = %d\n", somma);
return EXIT_SUCCESS;
}
stampa del risultato (output formattato)
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 26
Variabili e dichiarazioni
• Per poter essere utilizzate da un’istruzione, tutte le variabili di un programma C devono essere dapprima dichiarate
• Una dichiarazione stabilisce il tipo e il nome di una o più variabili, come ad esempio:
int numero;
• Il tipo di dato determina la natura della variabile, ovvero il modo in cui verrà trattata nelle successive operazioni
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 27
Variabili ed espressioni
• L’istruzione
numero = numero * 20;
rappresenta di fatto la traduzione di due operazioni logiche distinte
• Dapprima viene valutata l’espressione a destra del segno =
• Il risultato di tale espressione è poi assegnato alla stessa variabile numero, che viene dunque sovrascritta:
numero ← numero * 20;
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 28
Input e output formattato
• scanf () e printf () consentono di leggere e stampare dati formattati
• La funzione scanf () legge un dato dalla tastiera (lo standard input) e ne scrive il valore in una variabile (o locazione in memoria)
• Esse operano in modo diverso a seconda del tipo dei dati da manipolare (numeri interi, numeri floating point, stringhe di caratteri, singoli byte ecc.)
• L’input/output formattato in C è molto potente!
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 29
Funzioni e argomenti
• Un metodo per comunicare dati alle funzioni è quello di fornire ad esse una lista di valori, detti argomenti
• Le parentesi che seguono il nome della funzione racchiudono tale lista, come per:
scanf ("%d", &numero);
• Esistono funzioni che non si aspettano argomenti: nell’esempio, main () ha la lista di argomenti vuota
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 30
Esempio: potenza.c
#include <stdio.h>
#include <stdlib.h>
/* elevamento a potenza con moltiplicazioni successive */
int main() {
int base, esponente, potenza, contatore;
printf ("inserire base: ");
scanf ("%d", &base);
printf ("inserire esponente: ");
scanf ("%d", &esponente);
potenza = 1;
contatore = 0;
while (contatore < esponente) {
potenza = base * potenza;
contatore = contatore + 1;
}
printf ("potenza = %d\n", potenza);
return EXIT_SUCCESS;
}
struttura di controllo:
ciclo while
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 31
Strutture di controllo
• L’esempio precedente rappresenta una possibile implementazione del calcolo dell’elevamento a potenza (esponente non negativo!)
• Il ciclo while è una struttura di controllo, il cui diagramma di flusso è:
Y N
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 32
Strutture di controllo
• Il costrutto:
while (contatore < esponente) {
potenza = base * potenza;
contatore = contatore + 1;
}
è un semplice ciclo iterativo
• Dapprima viene valutata la condizione contatore < esponente
• Se tale espressione risulta vera, allora il blocco di istruzioni racchiuse tra le parentesi graffe viene eseguito e, alla fine, la condizione viene valutata di nuovo (iterazione)
Fondamenti di Informatica - La programmazione in linguaggio C
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 33