Osservazione Passare un array ad una funzione

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.