Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una...
Transcript of Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una...
Gli array
slides credit M. Poneti
Vettori• Vettore (Array)
– Gruppo di posizioni (o locazioni di memoria)consecutive
– Hanno lo stesso nome e lo stesso tipo didato
• Per fare riferimento ad un elemento, specificare– il nome del vettore– numero di posizione (o indice)
• Formato: nomevettore[numeroposizione]
– il primo elemento è alla posizione 0
– se c è un vettore di n elementi:c[0], c[1]...c[n-1]
c[6]
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
nome del vettore (tutti gli elementihanno lo stesso nome, c)
c[0]
c[1]
c[2]
c[3]
c[11]
c[10]
c[9]
c[8]
c[7]
c[5]
c[4]
numero di posizione all’interno del vettore c
Array ad una dimensione
�La forma generale per dichiarare un array monodimensionale è:
�tipo nome_variabile[dimensione];
�tipo dichiara il tipo di dato degli elementi che costituisconol’array�dimensione definisce quanti elementi contiene l’array
�Quando l’array è dichiarato, il compilatore alloca un blocco dimemoria per contenere l’array�È possibile accedere ad un singolo elemento dell’array tramiteun indice, che descrive la posizione di un dato elementoall’interno dell’array stessa.
…continua
Per un array monodimensionale la dimensione totale in byte occupata viene calcolata in questo modo:
Byte totali = n. di byte variabile_tipo_base X n. di elementi
Nota
� L’esempio seguente dichiara un array interochiamato vettore che ha dieci elementi:
int vettore[10];
� In C il primo elemento di qualsiasi array ha indicezero
� In questo caso, dato che vettore ha 10 elementi, havalori di indice che andranno da 0 a 9.
� il primo elemento in vettore è rappresentato davettore[0] e l’ultimo da vettore[9].
Esempi di dichiarazione dei vettori
int c[10];
float myArray[284];
• Per dichiarare più vettori dello stesso tipo– formato simile alle variabili
int b[100], x[27];
• Gli elementi di un vettore possono essere utilizzati comele altre variabili
c[0] = 3;
printf( "%d", c[0]);
– E’ possibile eseguire operazioni nell’indice. Se x = 3,c[5-2] == c[3] == c[x]
Inizializzazione di un array
Ci sono 2 forme per inizializzare un’array come per tutte le altre variabili:•In fase di dichiarazione :
tipo nome_variabile[ ]={e1,…,en};
•tramite indicizzazione diretta all’interno del programmaquando occorre, ad es:
int a[2]; /* dichiarazione array*/...a[0]=23; /* inizializzazione array*/a[1]=100;
Note • Inizializzare un vettore
int n[5] = {1, 2, 3, 4, 5 };
– Se gli inizializzatori non sono sufficienti, glielementi rimanenti sono azzerati
– Se sono troppi, errore di sintassiint n[5] = {0};
• azzera tutti gli elementi– In C non ci sono controlli sulla dimensione dei
vettori
• Se la dimensione non è dichiarata gli inizializzatori ladeterminano
int n[] = { 1, 2, 3, 4, 5 };
– 5 inizializzatori, quindi il vettore ha 5 elementi
Inizializzazione illegale
In C non è possibile assegnare un array ad un altro. Pertanto scrivere così è ILLEGALE:
int a[10],b[10];
a=b; /* ERRORE!!! */
Per trasferire il contenuto di un array in un altro ènecessario assegnare individualmente ogni valoreper esempio utilizzando un ciclo for.
1 /*
2 Histogram printing program */
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 one bar */
17 printf( "%c", '*' );
18
19 printf( "\n" );
20 }
21
22 return 0;
23 }
Element Value Histogram
0 19 *******************
1 3 ***
2 15 ***************
3 7 *******
4 11 ***********
5 9 *********
6 13 *************
7 5 *****
8 17 *****************
9 1 *
Element Value Histogram
0 19 *******************
1 3 ***
2 15 ***************
3 7 *******
4 11 ***********
5 9 *********
6 13 *************
7 5 *****
8 17 *****************
9 1 *
EsecuzioneEsecuzione
Esempi di utilizzo dei vettori
• Vettori di caratteri– La stringa "hello" è in realtà in vettore static di
caratteri– I vettori di caratteri possono essere inizializzati
usando stringhe letteralichar string1[] = "first";
• le stringhe terminano con il carattere nullo '\0'
• string1 ha in realtà 6 elementi
char string1[] = { 'f', 'i', 'r', 's', 't', '\0' };
…continua
– Accesso ai singoli caratteri• string1[ 3 ] è il carattere 's'
– Il nome del vettore è l’indirizzo del primo elementodel vettore stesso, pertanto non è necessariol’operatore & in scanf
scanf( "%s", string2 ) ;
• Legge i caratteri finchè incontra uno spaziobianco
• Può scrivere anche oltre la fine del vettore
1 /*
2 Treating character arrays as strings */
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 }
Enter a string: Hello there
string1 is: Hello
string2 is: string literal
string1 with spaces between characters is:
H e l l o
Enter a string: Hello there
string1 is: Hello
string2 is: string literal
string1 with spaces between characters is:
H e l l o
Ancora sulla dimensione
• La dimensione dell’array può essere specificatatramite
• una costante letterale:
intintintint arrayarrayarrayarray[12];[12];[12];[12];
• Una costante simbolica creata con #define:
#define#define#define#define MONTHS 12MONTHS 12MONTHS 12MONTHS 12
intintintint arrayarrayarrayarray[MONTHS];[MONTHS];[MONTHS];[MONTHS];
Assenza di controllo dei limiti
degli array
Il C non effettua alcun controllo sui limiti degli array. In altre parole è possibile inizializzare un array di dimensione N con più di N valori senza avere alcunmessaggio di errore in compilazioneÈ compito del programmatore garantire che tutti gliarray siano abbastanza grandi da contenere ciò per cui sono stati creati
int a[ ]={1,2,3,4,5};
int b[3];
a[8]=9; /* errore ho sforato in memoria */for(i=0;i<5;i++) b[i]=a[i]; /* non dà errore */
Vettori multidimensionali• Vettori con più indici
– Tabelle con righe e colonne (vettori m per n)
– Vettori bidimensionali o matrici : il primo indiceidentifica la riga, il seconda la colonna
Riga 0
Riga 1
Riga 2
Colonna 0 Colonna 1 Colonna 2 Colonna 3
a[0][0]
a[1][0]
a[2][0]
a[0][1]
a[1][1]
a[2][1]
a[0][2]
a[1][2]
a[2][2]
a[0][3]
a[1][3]
a[2][3]
indice di riga
nome del vettore
indice di colonna
Array bidimensionali
Gli array a più dimensioni vengono inizializzati allo stessomodo di quelli monodimensionali, ad esempio:int sqrs[4][2] = {
1,1,2,2,3,9,4,16};
Inizializza un array chiamatosqrs con i numeri da 1 a 4 ed iloro quadrati.
44442222
3333
4444
11111111
9999
16161616
0000 1
0000
1111
2222
3333
Indice sinistro
Indicedestro
Note• Inizializzazione
int b[2][2]={1,2,3,4};
• int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };
– I valori saranno raggruppati per riga all’ interno diparentesi graffe
– Se non sono sufficienti, gli elementi noninizializzati sono posti a zero
int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };
• Per riferirsi ad un elemento
– Specificare la riga, poi la colonna
printf( "%d", b[ 0 ][ 1 ] );
1 2
3 4
1 0
3 4
Esempio
#include <#include <#include <#include <stdio.hstdio.hstdio.hstdio.h>>>>
intintintint main()main()main()main()
{{{{
intintintint i,j,val[3][4];i,j,val[3][4];i,j,val[3][4];i,j,val[3][4];
for(i=0;i<3;i++)for(i=0;i<3;i++)for(i=0;i<3;i++)for(i=0;i<3;i++)
{{{{
for(j=0;j<4;j++)for(j=0;j<4;j++)for(j=0;j<4;j++)for(j=0;j<4;j++)
{{{{val[i][jval[i][jval[i][jval[i][j]=(i*4)+j+1;]=(i*4)+j+1;]=(i*4)+j+1;]=(i*4)+j+1;
}}}}
}}}}
return 0;return 0;return 0;return 0;
}}}}
0 1 2 3
0
1
2
1111 2222 3333 4444
5555 6666 8888
9999 10101010 11111111 12121212
7777
Indice sinistro
Indice destro
val[1][2]val[1][2]val[1][2]val[1][2]
n. byte=righe x colonne x n. byte del tipo
Address(val[i][j])=Address(val[0][0])+i*4+j
int val[3][4];
Array bidimensionali
#define M 5
#define N 9
int main()
{
int num[M][N];
…
return 0;
}
void funzione(num,M,N)
{
int num[M][N]; /*ILLEGAL DECLARATION*/
…
return 0;
}
Array 3-dimensionale