gli array - disi, university of trentodisi.unitn.it/~sebe/info/12a-array.pdf · array ad una...

Post on 13-Aug-2020

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related