Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una...

23
Gli array slides credit M. Poneti

Transcript of Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una...

Page 1: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

Gli array

slides credit M. Poneti

Page 2: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 3: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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.

Page 4: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

…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

Page 5: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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].

Page 6: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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]

Page 7: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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;

Page 8: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 9: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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.

Page 10: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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 }

Page 11: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 12: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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' };

Page 13: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

…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

Page 14: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 15: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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];

Page 16: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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 */

Page 17: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 18: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 19: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 20: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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

Page 21: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

Address(val[i][j])=Address(val[0][0])+i*4+j

int val[3][4];

Page 22: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

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;

}

Page 23: Gli array - DISI, University of Trentodisi.unitn.it/~sebe/info/12a-Array.pdf · Array ad una dimensione a forma generale per dichiarare un array monodimensionale è:L ipo nome_variabile[dimensione];t

Array 3-dimensionale