I vettori (superiori)
I Vettori
[modifica]I vettori sono delle strutture dati omogenee i cui elementi sono accessibili tramite un indice. Finora abbiamo usato delle singole variabili per memorizzare i dati, quando le informazioni diventano tante si utilizzano dei vettori per memorizzare tutte queste informazioni per poi poterle elaborare facilmente.
Un vettore memorizza ciascuna informazione in una cella, se il vettore contiene n elementi (informazioni) ci sono n celle continue in memoria ordinate secondo un indice che assume i valori interi da 0 a n-1 , si parla allora di cella 0, cella 1, cella 2 o ... cella i-esima del vettore. Per accedere a un elemento del vettore bisogna conoscere il nome del vettore e l'indice dell'elemento.Un vettore è una struttura dati omogenea perche' i dati di un singolo vettore sono tutti dello stesso tipo (intero,float,bool,string etc).
per dichiarare un vettore di nome vett in grado di contenere 10 interi si scrive
e per riferirsi all'elemento di indice 5 si scrive vett[5]
si possono allora scrivere i seguenti comandi:
vett[0]=3; abbiamo caricato nella cella 0 del vettore vett il numero 3;
vett[1]=14; abbiamo caricato nella cella 1 del vettore vett il numero 14;
vett[2]=vett[0]+vett[1]+4; questa istruzione utilizza l'operatore di assegnazione , prima si deve calcolare l'espressione di destra e poi trasferire il risultato nella variabile di sinistra, valutando quello che c'e' a dx si trova che vett[0] vale 3 che vett[1] vale 14, 3+14+4 vale 21 questo numero viene caricato nella cella 2 del vettore
le cose si possono complicare scrivendo vett[vett[0]+2]=7; cioe' ogni indice può essere indicato sia con una costante ma anche tramite una espressione intera , in questo caso l'espressione vale vett[0]+2 visto che vett[0] vale 3 allora vett[0]+2 vale 5 , la precedente istruzione equivale allora ad aver scritto vett[5]=7; che carica il numero 7 nella cella 5 del vettore vett.
vett[5]=vett[5]+1; carica il valore 8 nella cella 5 del vettore vett
se il vettore ha 10 elementi l'indice può assumere i valori da 0 a 9, e quindi scrivere vett[10]=3; è un errore perche' la cella 10 non esiste nel vettore vett (sarebbe l'undicesimo elemento altrimenti).
in generale per dichiarare un vettore la sintassi da usarsi è
tipodato nomevettore[numeroelementivettore];
per dichiarare un vettore di 5 stringhe che rappresentino dei nomi possiamo scrivere
string nome[5];
dopo questo comando si hanno a disposizione 5 celle numerate da 0 a 4 accessibili mediante nomevettore[indice] possiamo allora scrivere
nome[2]="luca";
abbiamo allora creato il vettore vett di 10 interi e il vettore nomi di 5 elementi
possiamo dichiarare e inizializzare un vettore con comandi del tipo
int v1[10]= { 3,5,7,-1,3,0,1,12,5,6 }; attenzione a inizializzare il vettore con un numero di elementi uguale a quelli specificato fra parentesi quadrate (nel nostro caso 10), dopo questo comando la cella zero ha assunto il valore 3, la cella uno il valore 5 .... la cella nove il valore 6
oppure int v2[]= { 3,2,7,-1,1,0 }; in questo caso la dimensione complessiva del vettore è desunta dal numero di elementi usati per l'inizializzazione, e di solito si fa cosi' per dichiarare e inizializzare contemporaneamente
char v3[]= { 'a','h','z' };
string v4[]= { "marco","luca","anna","maria" };
bool v5[]={ true, false, true, false,false};
double v6[]={ 2.1, 7.003 , 0,-45.34};
se non viene inizializzato un vettore può contenere valori qualsiasi, se i valori di inizializzazione sono minori della dimensione del vettore , gli elementi mancanti sono posti a zero
int va[2000]= { }; crea un vettore di 2000 celle tutte inizializzate a zero
il c non controlla se stiamo accedendo ai dati con un indice corretto, se diamo un indice superiore o uguale alla dimensione n stiamo leggendo o scrivendo celle di memorie che non sono quelle riservate al vettore e questo è fonte di problemi (o di vantaggi per gli hacker)
il nome di un vettore da solo (senza parentesi quadre) rappresenta l'indirizzo di memoria della cella iniziale del vettore ed è un valore costante non modificabile , quindi si può scrivere cout<<a; e stampa l'indirizzo della cella zero del vettore ma non si puo scrivere a=a+1; perche' a è un valore costante ( che riceve il suo valore nel momento della dichiarazione del vettore (cioe' quando viene allocato in memoria il blocco di celle continue che rappresenta tutto il vettore). Quando viene allocato (cioe' vengono riservate da parte del sistema operativo (che gestisce la ram) le celle di memoria per il vettore) il vettore la sua dimensione è pari alla dimensione in byte del tipo di dato moltiplicato per il numero di celle , quindi se per memorizzare un intero servono 4 byte, quando creo un vettore di 10 interi lo spazio occupato è 40 byte, se l'indirizzo iniziale della cella zero vale 134 (esempio) allora la cella 1 inizia all'indirizzo 138 .
se dichiariamo due vettori int a[6]={ 5,6,7,8,9,10 }; int b[7]; non posso scrivere b=a per caricare tutti i valori di a e b, l'istruzione genera poi un errore perche' è un tentativo di modificare il valore costante b , per fare la copia bisogna copiare uno a uno tutti i valori delle celle del vettore a in quelle di b, quindi scrivere delle istruzioni del tipo b[0]=a[0]; poi b[1]=a[1]; etc
è possibile dichiarare la dimensione di un vettore in fase di compilazione tramite una variabile o una costante quindi possiamo scrivere
int n=10; float vett[n];
oppure const int m=10; float vetta[m];
m è una variabile costante che nel seguito del programma non potra' essere modificata
è possibile anche se non conforme allo standard c89 dichiarare la dimensione di un vettore durante l'esecuzione di un programma quindi si puo scrivere
int i;
cin>>i; int vett[i];
in alternativa rispettando lo standard c89 possiamo allocare dinamicamente il vettore con la funzione malloc che vedremo dopo aver studiato i puntatori
la potenza di un vettore si esplica quando si utilizzano insieme alle istruzioni cicliche e a uno o più contatori.