4 aprile 2002 Avvisi: • 1o Esonero: mercoledi 17 aprile ore 11:30 – 14:00 consulta la pag. WEB alla voce “esoneri” si raccomanda la puntualita’! Introduzione • Array – Struttura di elementi di dati, tutti dello stesso tipo, correlati. • Strutture di elementi di dati di tipi diversi correlati (struct ), in seguito. – Struttura dati statica : ha la stessa dimensione per tutta la durata del programma • Strutture dati dinamiche saranno considerate nella parte finale del corso Array –Gruppo di locazioni di memoria consecutive –Stesso nome e stesso tipo Nome dell’array (Tutti gli elementi hanno lo stesso nome, c) c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9] c[10] c[11] -45 6 0 72 1543 -89 0 62 -3 1 6453 78 Posizione dell’elemento nell’array Dichiarazioni di Array • Per dichiarare un array si deve specificare – Nome – Tipo dell’ array – Numero di elementi • Formato: arrayType arrayName[numberOfElements]; int c[ 10 ]; float myArray[ 3284 ]; • Dichiarare molti array dello stesso tipo – Similmente a quando si dichiarano le variabili comuni int b[ 100 ], x[ 27 ]; Array • Per riferirsi ad un elemento, specificare: – Nome dell’array – Posizione (indice) • Formato: nomearray [posizione] – Primo elemento alla posizione 0 – Array di nome c di n elementi : c[0], c[1]...c[n-1] Array • Gli elementi sono normali variabili c[0] = 3; printf( "%d", c[0] ); • Si possono effettuare operazioni negli indici. Se x = 3, c[5-2] == c[3] == c[x] Esempio di uso di un array • Inizializzatori int n[5] = {1, 2, 3, 4, 5 }; – Se non ci sono abbastanza inizializzatori, i piu’ a destra saranno 0 – Se ci sono troppi inizializzatori, errore di sintassi int n[5] = {0} • Tutti gli elementi sono inizializzati a 0 • Se la size e’ omessa, viene determinata dagli inizializzatori int n[] = { 1, 2, 3, 4, 5 }; – 5 inzializzatori, dunque l’array ha 5 elementi 1. /* Inizializzazione di un array */ 2. #include <stdio.h> 3. main() 4. { 5. int n[10], i; 6. 7. 8. for (i = 0; i <= 9; i++) n[i] = 0; 9. printf("%s%13s\n", "Element", "Value"); 10. for(i = 0; i <= 9; i++) 11. printf("%7d%13d\n", i, n[i]); 12. return 0; 13. } /* print array */ Element Value 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 Output 1. /* Inizializzazione di un array con una dichiarazione */ 2. #include <stdio.h> 3. main() 4. { 5. int n[10] = {32, 27, 64, 18, 95, 14, 90, 70, 60, 37}; 6. int i; 7. 8. printf("%s%13s\n", "Element", "Value"); 9. 10. 11. 12. 13. } for(i = 0; i <= 9; i++) printf("%7d%13d\n", i, n[i]); return 0; Element Value 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 8 60 9 37 Output 1. /* Initializza gli elementi dell’ array s con i 2. numeri pari da 2 a 20 */ 3. #include <stdio.h> 4. #define SIZE 10 5. main() 6. { 7. int s[SIZE], j; 8. for (j = 0; j <= SIZE - 1; j++) 9. /* assegna i valori */ s[j] = 2 + 2 * j; 10. printf("%s%13s\n", "Element", "Value"); 11. for (j = 0; j <= SIZE - 1; j++) 12. 13. 14. } /* stampa i valori */ printf("%7d%13d\n", j, s[j]); return 0; Element Value 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 9 20 Output 1. /* Calcola la somma degli elementi di un array */ 2. #include <stdio.h> 3. #define SIZE 12 4. main() 5. { 6. int a[SIZE] = {1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45}; 7. int i, total = 0; 8. 9. 10. for (i = 0; i <= SIZE - 1; i++) total += a[i]; 11. 12. printf("Total of array element values is %d\n", total); 13. return 0; 14. } Total of array element values is 383 Output 1. /* Tiro un dado 6000 volte */ 2. /* versione con 3. #include <stdio.h> 4. #include <stdlib.h> 5. main() 6. { 7. 8. 9. istruzione switch int face, roll, frequency1 = 0, frequency2 = 0, frequency3 = 0, frequency4 = 0, frequency5 = 0, frequency6 = 0; for (roll = 1; roll <= 6000; roll++) { 10. face = 1 + rand() % 6; 11. switch (face) { 12. case 1: 13. ++frequency1; 14. break; 15. case 2: 16. ++frequency2; 17. break; 18. */ case 3: 19. ++frequency3; 20. break; 21. case 4: 22. ++frequency4; 23. break; 24. case 5: 25. ++frequency5; 26. break; 27. case 6: 28. ++frequency6; 29. break; 30. } 31. } 32. printf("%s%13s\n", "Face", "Frequency"); 33. printf(" 1%13d\n", frequency1); 34. printf(" 2%13d\n", frequency2); 35. printf(" 3%13d\n", frequency3); 36. printf(" 4%13d\n", frequency4); 37. printf(" 5%13d\n", frequency5); 38. printf(" 6%13d\n", frequency6); 39. return 0; 40. } Tiro un dado 1. /* 2. #include <stdio.h> 3. #include <stdlib.h> 4. #include <time.h> 5. #define SIZE 7 6. main() 7. { 6000 volte – versione con array 8. int face, roll, frequency[SIZE] = {0}; 9. srand(time(NULL)); 10. for (roll = 1; roll <= 6000; roll++) { 11. face = rand() % 6 + 1; 12. ++frequency[face]; /* sostituisce 20 linee 13. } 14. printf("%s%17s\n", "Face", "Frequency"); 15. for (face = 1; face <= SIZE - 1; face++) 16. 17. 18. } printf("%4d%17d\n", face, frequency[face]); return 0; */ istruzione switch */ Face 1 2 3 4 5 6 Frequency 1006 1011 983 978 988 1034 Face 1 2 3 4 5 6 Frequency 1008 957 957 1040 1004 1034 Face 1 2 3 4 5 6 Frequency 962 1028 1005 986 1018 1001 Sommario Output 1 /* Fig. 6.8: fig06_08.c 2 Programma per stampare gli istogrammi */ 3 #include <stdio.h> 4 #define SIZE 10 5 6 int main() 7 { 8 int n[ SIZE ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 }; 9 int i, j; 10 11 printf( "%s%13s%17s\n","Element","Value“,"Histogram"); 12 13 for ( i = 0; i <= SIZE - 1; i++ ) { 14 printf( "%7d%13d ", i, n[ i ]) ; 15 16 for ( j = 1; j <= n[ i ]; j++ ) /* print una barra */ 17 printf( "%c", '*' ); 18 19 printf( "\n" ); 20 } 21 22 return 0; 23 } Sommario Sommario Element 0 1 2 3 4 5 6 7 8 9 Value 19 3 15 7 11 9 13 5 17 1 Histogram ******************* *** *************** ******* *********** ********* ************* ***** ***************** * Output Array di caratteri – La stringa "hello" e’ di fatto un array static di caratteri – Gli array di caratteri si possono inizializzare usando delle stringhe char string1[] = "first"; • La stringa termina col carattere null '\0' • string1 ha di fatto 6 elementi char string1[] = { 'f', 'i', 'r', 's', 't', '\0' }; Array di caratteri – Si puo’ accedere ai caratteri singoli della stringa • string1[ 3 ] e’ il carattere 's' – Il nome di un array e’ l’ indirizzo dell’array, dunque non si deve mettere & in scanf scanf( "%s", string2 ) ; • Legge i caratteri finche’ si incontra uno spazio • Si puo’ scrivere oltre la fine dell’array, attenzione! 1 /* Fig. 6.10: fig06_10.c 2 Trattare gli array di caratteri come stringhe */ 3 #include <stdio.h> 4 5 int main() 6 { 7 char string1[ 20 ], string2[] = "string literal"; 8 int i; 9 10 printf(" Enter a string: "); 11 scanf( "%s", string1 ); 12 printf( "string1 is: %s\nstring2: is %s\n" 13 "string1 with spaces between characters is:\n", 14 string1, string2 ); 15 16 for ( i = 0; string1[ i ] != '\0'; i++ ) 17 printf( "%c ", string1[ i ] ); 18 19 printf( "\n" ); 20 return 0; 21 } Sommario Sommario Enter a string1 string2 string1 H e l l string: Hello there is: Hello is: string literal with spaces between characters is: o Output /* Gli arrays statici sono inizializzati a zero */ • #include <stdio.h> • void staticArrayInit(void); • void automaticArrayInit(void); • main() • { • printf("First call to each function:\n"); • staticArrayInit(); • automaticArrayInit(); • printf("\n\nSecond call to each function:\n"); • staticArrayInit(); • automaticArrayInit(); • return 0; • } • • /* funzione per dimostrare l’uso di un array locale statico */ • void staticArrayInit(void) • { • static int a[3]; • int i; 21. printf("\nValues on entering staticArrayInit:\n"); 22. 23. for (i = 0; i <= 2; i++) printf("array1[%d] = %d ", i, a[i]); 24. printf("\nValues on exiting staticArrayInit:\n"); 25. for (i = 0; i <= 2; i++) 26. printf("array1[%d] = %d ", i, a[i] += 5); 27. } 28. 29. /* funzione per dimostrare l’uso di un array locale automatico */ 30. void automaticArrayInit(void) 31. { 32. int a[3] = {1, 2, 3}; 33. int i; 34. printf("\n\nValues on entering automaticArrayInit:\n"); 35. for (i = 0; i <= 2; i++) 36. printf("array1[%d] = %d ", i, a[i]); 37. printf("\nValues on exiting automaticArrayInit:\n"); 38. for (i = 0; i <= 2; i++) 39. 40. } printf("array1[%d] = %d ", i, a[i] += 5); Sommario First call to each function: Values on array1[0] Values on array1[0] entering staticArrayInit: = 0 array1[1] = 0 array1[2] = 0 exiting staticArrayInit: = 5 array1[1] = 5 array1[2] = 5 Values on array1[0] Values on array1[0] entering automaticArrayInit: = 1 array1[1] = 2 array1[2] = 3 exiting automaticArrayInit: = 6 array1[1] = 7 array1[2] = 8 Second call to each function: Values on array1[0] Values on array1[0] entering staticArrayInit: = 5 array1[1] = 5 array1[2] = 5 exiting staticArrayInit: = 10 array1[1] = 10 array1[2] = 10 Values on array1[0] Values on array1[0] entering automaticArrayInit: = 1 array1[1] = 2 array1[2] = 3 exiting automaticArrayInit: = 6 array1[1] = 7 array1[2] = 8 Output