FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine La programmazione in linguaggio C 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
Nota di Copyright 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. 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2
Strumenti per la programmazione specifiche del problema analisi algoritmo controllo dei risultati esecuzione debugging e correzione del programma implementazione programma eseguibile compilazione e linking programma sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
Strumenti per la programmazione specifiche del problema analisi algoritmo controllo dei risultatiin questo corso non è previsto l utilizzo di sistemi di analisi automatica né di strumenti di CASE (Computer Aided Software Engineering) esecuzione debugging e correzione del programma implementazione programma eseguibile compilazione e linking programma sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Strumenti per la programmazione specifiche del problema analisi algoritmo TEXT controllo EDITOR: programma per dei scrivere risultati file di testo (ASCII) Esempi: EDIT di MS-DOS, esecuzione debugging e correzione del programma Notepad, Wordpad o Notepad++ di MS-Windows, gedit o emacs di Unix implementazione programma eseguibile compilazione e linking programma sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Strumenti per la programmazione specifiche analisi del problema Compilatore C/C++ della GNU algoritmo Linguaggio C: controllo gcc -o foobar.exe foobar.c dei risultati esecuzione debugging e correzione del programma Linguaggio C++: g++ -o foobar.exe foobar.cpp implementazione programma eseguibile compilazione e linking programma sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Strumenti per la programmazione specifiche del problema analisi algoritmo controllo dei risultati esecuzione debugging e correzione del programma implementazione In MS-DOS e in unix per eseguire un programma è sufficiente scriverne il nome sulla linea di comando, seguitodainvio: programma eseguibile C:\PROGRAMMI> compilazione foobar programma e linking sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Strumenti di base: attenta analisi ragionata del codice selezione di casi significativi printf specifiche (per la stampa dei valori delle variabili) analisi del problema algoritmo Strumenti avanzati: debugger controllo dei risultati Strumenti per la programmazione esecuzione debugging e correzione del programma implementazione programma eseguibile compilazione e linking programma sorgente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
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) 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10
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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 11
Esempio: hello.c #include <stdio.h> #include <stdlib.h> /* programma principale */ int main() { printf ("Hello world!\n"); return EXIT_SUCCESS; } /* fine del programma */ 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 12
Esempio: hello.c #include <stdio.h> #include <stdlib.h> /* programma principale */ int main() { } Direttiva al preprocessor: include il file (del compilatore) stdio.h che printf ("Hello serve per l utilizzo world!\n"); delle return EXIT_SUCCESS; funzioni di input/output /* fine del programma */ 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() Commento: viene ignorato { dal compilatore printf ("Hello world!\n"); return EXIT_SUCCESS; } /* fine del programma */ 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 */ Funzione main: tutto comincia da qui int main() { printf ("Hello world!\n"); return EXIT_SUCCESS; } /* fine del programma */ Corpo della funzione main 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15
Esempio: hello.c Istruzione per terminare la #include <stdio.h> #include funzione main <stdlib.h> (e quindi il programma) restituendo al sistema operativo il valore numerico associato, in stdlib.h, a EXIT_SUCCESS /* programma principale */ int main() { printf ("Hello world!\n"); return EXIT_SUCCESS; } Istruzione per stampare la scritta /* fine del programma */ "Hello world!" e poi andare a capo 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16
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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 17
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) 18
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) 19
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! 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 20
#include <stdio.h> #include <stdlib.h> Fondamenti di Informatica - La programmazione in linguaggio C Esempio: somma.c 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; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 21
#include <stdio.h> #include <stdlib.h> Fondamenti di Informatica - La programmazione in linguaggio C Esempio: somma.c 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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 22
#include <stdio.h> #include <stdlib.h> Fondamenti di Informatica - La programmazione in linguaggio C Esempio: somma.c 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) 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 23
#include <stdio.h> #include <stdlib.h> Fondamenti di Informatica - La programmazione in linguaggio C Esempio: somma.c 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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 24
#include <stdio.h> #include <stdlib.h> Fondamenti di Informatica - La programmazione in linguaggio C Esempio: somma.c int main() /* somma due numeri interi */ { int num1, num2, somma; printf ("inserire num1: "); scanf ("%d", &num1); printf ("inserire num2: "); scanf ("%d", &num2); stampa del risultato (output formattato) } somma = num1 + num2; printf ("num1 + num2 = %d\n", somma); return EXIT_SUCCESS; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 25
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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 26
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; 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 27
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! 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 28
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 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 29
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) 30
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) 31
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) 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 32
Strutture di controllo Il ciclo while viene così ripetuto fino a che (while) la condizione contatore < esponente è ancora vera Nell esempio, le istruzioni interne al ciclo vengono eseguite un numero di volti pari al valore dell esponente 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 33