1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/ Ing. Giuseppe Destefanis Diee, secondo piano Tel mail:
2 Array Gli array contengono un numero finito di dati tutti dello stesso tipo. Gli elementi dell'array sono individuati da un indice. a a[0] a[1]a[2]a[3]a[4]a[5]a[6]
3 Array (2) Per dichiarare un vettore si deve specificare il tipo e il numero dei suoi elementi: int v[10]; //un vettore di interi di 10 elementi Dichiarazione di un tipo array e definizione di un array sono contestuali.
4 Inizializzazione di un array #include int main() { int vett[10]; //dichiarazione for(int i=0; i<10; i++) vett[i]=i; for(int i=0; i<10; i++) { printf("vett[%d]=%d \n",i,vett[i]); }
5 Inizializzazione di un array (2) #include int main() { int vett[]={1,2,3,4,5}; for(int i=0; i<5; i++) { printf("vett[%d]=%d \n",i,vett[i]); }
6 Trovare il massimo elemento in un array #include int main() { int vett[10]; for(int i=0; i<10; i++) scanf("%d",&vett[i]); int max=vett[0]; for(int i=1; i<10; i++) if(vett[i]>max) max=vett[i]; printf("Il massimo è %d \n",max); }
7 Array multidimensionali int matrix[m][n]; //matrice con m righe e n colonne 1 … n 1...m1...m
8 Array multidimensionali #include int main() { int matrix[2][2]; //dichiarazione della matrice for(int righe=0; righe<2; righe++) for(int colonne=0; colonne<2; colonne++) { matrix[righe][colonne]=righe+colonne; } for(int righe=0; righe<2; righe++) { for(int colonne=0; colonne<2; colonne++) printf("%d\t",matrix[righe][colonne]); printf("\n"); }
9 //Tavola Pitagorica #include int main() { int matrix[10][10]; for(int righe=0; righe<10; righe++) for(int colonne=0; colonne<10; colonne++) { matrix[righe][colonne]=(righe+1)*(colonne+1); } for(int righe=0; righe<10; righe++) { for(int colonne=0; colonne<10; colonne++) printf("%d\t",matrix[righe][colonne]); printf("\n"); }
10 Le funzioni in matematica Nell'analisi matematica una funzione f da X in Y consiste in una legge che associa ad ogni elemento x in X uno e un solo elemento y di Y: f(x)=y x è l'argomento della funzione, o variabile indipendente, e y è il valore della variabile dipendente.
11 Le funzioni Quando si realizza un programma, capita spesso che una sequenza di operazioni debba essere ripetuta più volte. Esempio: calcolare il fattoriale di due numeri inseriti dall'utente.
12 Prima soluzione #include int main() { int num, fatt; fatt=1; scanf("%d",&num); for(int i=1; i<=num; i++){ fatt*=i; } printf("Il fattoriale vale: %d\n",fatt); fatt=1; //riscrivo la sequenza di istruzioni scanf("%d",&num); for(int i=1; i<=num; i++){ fatt*=i; } printf("Il fattoriale vale: %d\n",fatt); }
13 Seconda soluzione #include int fattoriale(int numero) //funzione fattoriale { int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; } int main() { int num, fatt; scanf("%d",&num); fatt=fattoriale(num); printf("Il fattoriale vale: %d\n",fatt); }
14 Le funzioni Per utilizzare una funzione è necessario che prima venga dichiarata e definita. Nella dichiarazione vi sono le informazioni sul tipo di dati utilizzati e sul risultato (valore restituito dalla funzione). Nella definizione vengono specificati i dati sui quali la funzione opera e le azioni per ottenere il risultato. La definizione di una funzione è anche una dichiarazione.
15 Dichiarazione di funzioni [tipo della funzione] nome (tipo parametro1,tipo parametro2,...); int fattoriale(int numero); tipo della funzione nome tipo del parametro nome del parametro Tra le parentesi tonde si specifica il nome, il numero e il tipo dei parametri formali.
16 Definizione di funzioni... int fattoriale(int numero) { int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }...
17 Dichiarazione #include int main() { int num, fatt; scanf("%d",&num); fatt=fattoriale(num); //ATTENZIONE! Funzione non dichiarata! printf("Il fattoriale vale: %d\n",fatt); } int fattoriale(int numero) { if(numero==0) return 1; int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }
18 Dichiarazione #include int fattoriale(int); //dichiarazione (deve precedere la chiamata) int main() { int num, fatt; scanf("%d",&num); fatt=fattoriale(num); // ok! printf("Il fattoriale vale: %d\n",fatt); } int fattoriale(int numero) { if(numero==0) return 1; int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }
19 Istruzione return L'istruzione return: fa terminare l'esecuzione della funzione; restituisce il risultato della funzione. Il corpo della funzione può contenere più di una volta l'istruzione return.
20 Istruzione return (2)... int fattoriale(int numero) { if(numero==0) return 1; int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }...
21 Argomenti di una funzione... int fattoriale(int numero) { if(numero==0) return 1; int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }... argomento formale
22 Argomenti di una funzione #include int fattoriale(int numero) //funzione fattoriale { int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; } int main() { int num, fatt; scanf("%d",&num); fatt=fattoriale(num); printf("Il fattoriale vale: %d\n",fatt); } argomento attuale
23 Argomenti di una funzione All'atto della chiamata di una funzione vengono eseguite le seguenti azioni: 1.Si valuta l'espressione che forma il parametro attuale; 2.Il controllo del flusso viene trasferito alla funzione; 3.Viene creata una variabile locale alla funzione e gli viene assegnato nome e tipo dell'argomento formale; 4.La variabile argomento formale viene inizializzata con il valore dell'argomento attuale; 5.Viene eseguita la funzione sino al primo return; 6.Viene valutata l'espressione dopo il return; tutte le variabili locali e i parametri formali vengono distrutti e il valore ottenuto viene sostituito alla variabile del main.
24 Corrispondenza tra parametri All'atto della chiamata di una funzione la corrispondenza tra parametri (formali e attuali) viene valutata nel seguente modo: 1.per numero (numero di parametri formali = numero di parametri attuali); 2.per tipo (altrimenti regole di conversione); 3.ordine;
25 Funzioni void... void fattoriale(int numero) { if(numero==0) printf(“Il fattoriale è 1\n”); int fatt=1; for(int i=1; i<=numero; i++){ fatt*=i; } printf(“Il fattoriale è%d\n”, fatt); }...
26 Visibilità (scope delle variabili) La visibilità, o scope, di una variabile è la parte di programma nel quale la variabile può essere usata. Scopo delle regole di visibilità: Consentire a più parti del programma di riferirsi ad una stessa variabile (il nome della variabile è visibile a tutte le parti interessate); Impedire ad una o più parti del programma di riferirsi ad una variabile (il nome della variabile non è visibile a queste parti del programma)
27 Blocco Un blocco è una sequenza di istruzioni racchiuse tra parentesi graffe: { … istruzioni … } Un identificatore dichiarato in un blocco è visibile dal punto in cui viene dichiarato sino alla fine del blocco. (Il corpo di una funzione è un blocco)
28 Classi di memorizzazione La classe di memorizzazione di una variabile è una proprietà riguardante il suo tempo di vita (cioè il tempo in cui la variabile rimane in memoria durante l'esecuzione). Classe di memorizzazione: Statica Automatica
29 Variabile statica Le variabili statiche vengono create a partire dal punto in cui vengono definite, e vengono distrutte alla fine del programma. Se non inizializzate dal programmatore vengono per default inizializzate a zero.
30 Esempio #include int main() { static int num; printf("%d\n",num); //0 { printf("%d\n",num); //0 int num=3; printf("%d\n",num); //3 //prima di uscire dal blocco si distrugge la variabile num del blocco //mentre non viene distrutta la variabile static num esterna al blocco } printf("%d\n",num); //0 }
31 Variabile automatica Le variabili automatiche vengono create a partire dal punto in cui vengono definite e vengono distrutte quando termina l'esecuzione del blocco al quale appartengono. Ciascuna chiamata di funzione comporta l'esecuzione del blocco che ne costituisce il corpo e per ogni chiamata si ha la creazione delle variabili automatiche coinvolte.
32 Posso rendere statica una variabile all'interno di un blocco?
33 #include int main() { int num=0; printf("%d\n",num); //0 { static int b=3; printf("%d\n",b); //3 } printf("%d",b); //errore b non è visibile a questo livello //l'area di memoria nella quale è memorizzato il valore //di b è ancora presente }
34 Visibilità Una variabile dichiarata nel corpo di una funzione è locale alla funzione. int fattoriale(int numero) { int fatt=1; //fatt è locale alla funzione for(int i=1; i<=numero; i++){ fatt*=i; } return fatt; }
35 Esempio #include void f() { int a=5; printf("%d\n",a); } int main() { printf("%d\n",a); //ATTENZIONE! a non è dichiarata int num=0; printf("%d\n",num); //0 { printf("%d\n",num); //0 int num=3; printf("%d\n",num); //3 } printf("%d\n",num); //0 f(); //5 }
36 Funzioni ricorsive #include int fatt(int num) { return (num<2)?1:num*fatt(num-1); } int main() { int num=0; printf("Inserire un numero: \n"); scanf("%d",&num); int fattoriale=fatt(num); printf("Il fattoriale vale %d\n",fattoriale); }