RISPOSTE DISTILLATO ARRAY E STRINGHE
1. Array
Un array è una variabile indicizzata:
contiene più elementi dello stesso tipo
gli elementi sono collocati in memoria uno di seguito all'altro
gli elementi sono individuabili con un indice che dipende dalla posizione a partire da 0. Quindi ad es. in un array di 5 elementi l'indice varia tra 0 e 4.
In C è possibile creare array di qualunque tipo: char, int, float, double e anche array di array (ovvero array multidimensionali, che contiene altri array).
2. Dichiarazione
Come tutte le variabili anche i vettori, prima di essere utilizzati, devono essere dichiarati in modo tale che alla variabile si assegnino le necessarie locazioni di memoria.
Es.
int array1[10]; // si dichiara un array di 10 interi e si riservano in memoria 10 locazioni contigue di tipo int
char array2[30]; // si dichiara un array di 30 caratteri
All’interno delle parentesi quadre si inserisce il numero di elementi, detto dimensione
La dimensione di ogni array deve essere precisata in fase di dichiarazione e deve essere valutata accuratamente. Se tale dimensione non si conosce con precisione si rischia o un sottodimensionamento (la memoria non basta) o un sovradimensionamento con conseguente spreco di memoria ( l’array sarà riempito parzialmente ma non ci sono problemi di memoria insufficiente).
Il nome di un array è l’indirizzo del suo primo elemento: array1 è un indirizzo, mentre array1[0] è il contenuto del primo indirizzo.
In C, in fase di compilazione, non ci sono controlli sulla dimensione dei vettori; quindi con un indice errato si può accedere ad aree di memoria non riservate al vettore! Il compilatore C non esegue controlli sul superamento dei limiti degli array: questo è un compito del programmatore.
In fase di dichiarazione dell’array non è possibile utilizzare variabili per specificare la dimensione ma solo costanti. Il seguente esempio è errato:
int num=10;
int array1[num]; // errore! perchè num è una variabile
Per specificare le dimensioni di un array, per evitare errori, è consigliato usare costanti definite (per evitare di ricordare la dimensione e per semplificare eventuali cambiamenti):
#define MAX1 10
#define MAX2 20
...
int array1[MAX1];
char array2[MAX2];
3. Assegnazione
Si intende l'attribuzione di un valore agli elementi dell'array. Può avvenire in due modi:
In fase di dichiarazione, fornendo i dati (inizializzazione). Se gli inizializzatori non sono sufficienti, gli elementi rimanenti sono azzerati, mentre se sono troppi, il compilatore segnala un errore di sintassi.
int vettore_interi[3] = {12, 0, 4};
char vocali[5] = {‘a’, 'e’, 'i’, 'o’, 'u’};
float numeri_decimali[2] = {0.43, 10.4};
Se la dimensione non è dichiarata gli inizializzatori la determinano. Ad es. nel caso:
int n[]={1,2,3,4,5}; si utilizzano 5 inizializzatori e quindi la dimensione del vettore è 5.
Durante l’esecuzione del programma, generalmente con un ciclo. In questo caso, per specificare l'indice, all'interno delle parentesi quadre, si possono usare le variabili ed anche intere espressioni. Ad es:
x=1; vet[2*x+1] si riferisce all'elemento di indice 3 dell'array vet.
Gli elementi di un vettore possono essere utilizzati come tutte le altre variabili: var1 = var2+ array1[5];
......
i =5;
array1[i+1]=12;
.....
int pari[MAX], dispari[MAX], i;
for(i =0; i < MAX; i++)
{
pari[i] = i*2;
dispari[i] = i*2+1;
}
In C non è possibile assegnare un array ad un altro direttamente. Il trasferimento deve avvenire individualmente, elemento per elemento, per esempio utilizzando un ciclo for. La seguente scrittura è errata:
int v1[5], v2[5];
v1=v2; //ERRORE!!!
4. Stringhe
Il C, diversamente da altri linguaggi di programmazione, non mette a disposizione del programmatore il tipo stringa.
Una stringa è un semplice array di caratteri con due particolarità:
è sempre terminata dal carattere '\0', detto terminatore di stringa;
l'assegnazione, oltre che nelle modalità previste per gli array, si può effettuare digitando l'intera stringa racchiusa tra doppi apici.
main()
{ char stringa1[6];
char stringa2[6];
char stringa3[5] = "nave"; // Inizializzazione durante la definizione
stringa1[0] = 'm'; // Inizializzazione elemento per elemento
stringa1[1] = 'a';
stringa1[2] = 'r';
stringa1[3] = 'e';
stringa1[4] = '\0';
cin >> stringa2; // Inizializzazione effettuata da STDIN (tastiera) // Si suppone che l'utente inserisca sole
cout << stringa1 <<" ";
cout << stringa2 <<" ";
cout << stringa3;
}
L’output del programma: mare sole nave
5. Vettori multidimensionali
Sono vettori con più indici; se le dimensioni sono due si possono intendere come tabelle con righe e colonne (vettori m per n): il primo indice identifica la riga, il secondo la colonna.
Dichiarazione ed inizializzazione:
int mat[4][2] = {
1,2,
3,4,
3,9,
8,10
};
int matx[2][2]={1,2,3,4};
int maty[2][2] = { { 1, 2 }, { 3, 4 } };
I valori saranno raggruppati per riga all’ interno di parentesi graffe
Se i dati di inizializzazione non sono sufficienti, gli elementi mancanti sono posti a zero