10 aprile 2002 Avvisi: • 1o Esonero: mercoledi 17 aprile ore 11:30 – 14:00 consulta la pag. WEB alla voce “esoneri” si raccomanda la puntualita’! Qualche minuto di “laboratorio”… Analizziamo le soluzioni proposte da voi agli esercizi della volta scorsa Dalla volta scorsa…. 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 } Osservazione Nome dell’array e’ l’indirizzo del primo elemento 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. /* Fig6_12.c */ /* Il nome dell’array e’ lo stesso di &array[0] */ #include <stdio.h> main() { char array[5]; printf(" array = %p\n&array[0] = %p\n", array, &array[0]); return 0; } array = 0253FDC8 &array[0] = 0253FDC8 Output Passare un array ad una funzione • Passare l’array per intero – Specificare il nome dell’array senza parentesi [] int myArray[ 24 ]; myFunction( myArray, 24 ); • Puo’ essere utile passare alla funzione la size dell’array – Array e’ passato per riferimento – Nome dell’array e’ l’indirizzo del primo elemento – La funzione “sa” dove l’array e’ memorizzato • Modifica la locazione di memoria relativa • Passare un elemento di un array – Un elemento di un array e’ passato per valore – Passo il nome con l’indice relativo (es., myArray[3]) alla funzione Passare un array ad una funzione • Prototipo della funzione void modifyArray( int b[], int arraySize ); – Il nome dei parametri e’ opzionale nel prototipo •int b[] potrebbe essere solo int [] •int arraySize potrebbe essere solo int void modifyArray( int [], int); 1 /* Fig. 6.13: fig06_13.c 2 Passare array e singoli elementi a una funzione */ 3 #include <stdio.h> 4 #define SIZE 5 5 6 void modifyArray( int [], int ); /* attenzione! New! */ 7 void modifyElement( int ); 8 9 int main() 10 { 11 int a[ SIZE ] = { 0, 1, 2, 3, 4 }, i; 12 13 printf( "Effects of passing entire array call " 14 "by reference:\n\nThe values of the " 15 "original array are:\n" ); 16 Intero array passato per per 17 for ( i = 0; i <= SIZE - 1; i++ ) riferimento , puo’ essere 18 printf( "%3d", a[ i ] ); modificato 19 20 printf( "\n" ); 21 modifyArray( a, SIZE ); /* passato per riferimento */ 22 printf( "The values of the modified array are:\n" ); 23 24 25 26 27 28 29 30 31 33 } 32 for ( i = 0; i <= SIZE - 1; i++ ) printf( "%3d", a[ i ] ); Singolo elemento dell’ array passato per valore, non puo’ essere modificato printf( "\n\n\nEffects of passing array element call " "by value:\n\nThe value of a[3] is %d\n", a[ 3 ] ); modifyElement( a[ 3 ] ); printf( "The value of a[ 3 ] is %d\n", a[ 3 ] ); return 0; 34 void modifyArray( int b[], int size ) 35 { 36 int j; 37 38 39 for ( j = 0; j <= size - 1; j++ ) b[ j ] *= 2; 40 } 41 42 void modifyElement( int e ) 43 { 44 45 } printf( "Value in modifyElement is %d\n", e *= 2 ); Effects of passing entire array call by reference: The values of 0 1 2 3 The values of 0 2 4 6 the original array are: 4 the modified array are: 8 Effects of passing array element call by value: Output The value of a[3] is 6 Value in modifyElement is 12 The value of a[3] is 6 1. 2. /* Fig6_14.c Demonstrating the const type qualifier */ #include <stdio.h> 3. void tryToModifyArray(const int []); 4. 5. 6. 7. 8. 9. 10. main() { int a[] = {10, 20, 30}; tryToModifyArray(a); printf("%d %d %d\n", a[0], a[1], a[2]); return 0; } 11. 12. 13. 14. 15. 16. void tryToModifyArray(const int b[]) { b[0] /= 2; /* error */ b[1] /= 2; /* error */ b[2] /= 2; /* error */ } Risultati della compilazione Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland FIG6_14.C: Error E2024 FIG6_14.C 16: Cannot modify a const object in function tryToModifyArray Error E2024 FIG6_14.C 17: Cannot modify a const object in function tryToModifyArray Error E2024 FIG6_14.C 18: Cannot modify a const object in function tryToModifyArray Warning W8057 FIG6_14.C 19: Parameter 'b' is never used in function tryToModifyArray *** 3 errors in Compile *** DEV C++ Line 16: warning: assignment of read-only location Line 17: warning: assignment of read-only location Line 18: warning: assignment of read-only location Program compiled successfully Ordinamento di array – Importante applicazione – Tutte le organizzazioni devono ordinare dei dati… • Spesso grandi quantita’ di dati! • Bubble sort (ordinamento a bolle) – Svariati passaggi attraverso l’array – Si confrontano coppie di elementi adiacenti • Se sono in ordine crescente (o coincidono), no cambiamenti • Se sono in ordine descrescente, scambia gli elementi – Ripeti • Esempio: Seq. originale: 3 4 2 6 7 passaggio 1: 3 2 4 6 7 passaggio 2: 2 3 4 6 7 – Gli elementi piu’ piccoli “risalgono a galla" 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. /* Fig6_15.c Questo programma ordina un array in ordine ascendente usando bubble sort */ #include <stdio.h> #define SIZE 10 main() { int a[SIZE] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37}; int i, pass, hold; printf("Data items in original order\n"); for (i = 0; i <= SIZE - 1; i++) printf("%4d", a[i]); for (pass = 1; pass <= SIZE - 1; pass++) for (i = 0; i <= SIZE - 2; i++) if (a[i] > a[i + 1]) { hold = a[i]; a[i] = a[i + 1]; a[i + 1] = hold; } /* passaggi */ /* un passaggio */ /* un confronto */ /* uno scambio */ 21. printf("\nData items in ascending order\n"); 22. 23. for (i = 0; i <= SIZE - 1; i++) printf("%4d", a[i]); 24. printf("\n"); 25. 26. return 0; } Data items in original order 2 6 4 8 10 12 89 68 Data items in ascending order 2 4 6 8 10 12 37 45 45 37 68 89 Output Come esercizio… • Migliorare il codice dell’algoritmo di ordinamento precedente relativamente ai seguenti due aspetti: • Il ciclo della linea 14 puo’ essere “accorciato” ad ogni passaggio. • Si puo’ inserire un controllo che, nel caso di passaggio senza alcuno scambio, esce dal ciclo (esterno). In questo modo, nel caso di array gia’ ordinato l’algoritmo eseguirebbe un solo passaggio.