Vettori e matrici
Quando è necessario memorizzare un insieme di valori omogenei (dello stesso tipo t) è necessario definire una variabile ingrado di contenere più di un valore.
Variabili di questo tipo sono chiamate vettori o array ad una dimensione.
In c un vettore si definisce specificando tipo nome[dimensione];
come tipo è possibile utilizzare uno dei tipi fondamentali del linguaggio C
il nome deve seguire le regole degli identificatori del linguaggio C
la dimensione deve essere una espressione costante, formata cioè solo da costanti assolute o simboliche, e indica il numero massimo di elementi che il vettore può contenere.
Un vettore può essere pensato come una successione di celle che occupano aree di memoria contigue, ogni cella occupa un numero di byte che dipende dallo scalare del tipo utilizzato per definire il vettore.
Le celle del vettore sono numerate a 0 a dimensione –1, quindi il riferimento alla posizione dimensione durante l’utilizzo del vettore è privo di significato.
Esempio di definizione di un vettore di interi:
int vett[20];
Esempi di inizializzazione:
int i;
for (i=0;i<20;i++) scanf(“%d”,&vett[i]);
int i,n;
printf(“Quanti valori vuoi inserire nel vettore?”);
scanf(“%d”,&n);
for (i=0;i<n;i++) scanf(“%d”,&vett[i]);
N.B.: non si può mai scrivere vett[20] perché non esiste uno scomparto nella posizione 20
Ogni elemento del vettore potrà essere utilizzato nei contesti nei quali è possibile utilizzare una variabile semplice dello stesso tipo, cioè
se per stampare il valore di una variabile intera n si scrive printf(“%d”,n);
allora per stampare l’i-esimo elemento di un vettore si scrive printf(“%d”,vett[i]);
Se si vuole fare riferimento all’indirizzo di uno specifico scomparto del vettore si usa l’operatore &
&vett[5] identifica l’indirizzo del sesto scomparto
mentre l’indirizzo di partenza del vettore e rappresentato dal suo nome, quindi il nome di un vettore è il suo l-value, di conseguenza vett coincide con &vett[0].
In C non esistono funzioni per operare su insiemi di interi o reali, quindi si deve lavorare sempre con un ciclo che permetta di riferire alle diverse componenti del vettore.
Quando è necessario memorizzare informazioni omogenee che sono concettualmente organizzate in forma tabellare, si deve definire una variabile detta matrice o array a due dimensioni.
In C la sua definizione è
tipo nome[numero_righe][numero_colonne];
come tipo è possibile utilizzare uno dei tipi fondamentali del linguaggio C
il nome deve seguire le regole degli identificatori del linguaggio C
numero_righe e numero_colonne devono essere espression costanti, formate cioè solo da costanti assolute o simboliche
Esempi di inizializzazione:
int tab[10][20];
int i,j;
for (i=0;i<10;i++) for(j=0;j<20;j++) scanf(“%d”,&tab[i][j]);
int n;
printf(“Quante righe della tabella vuoi inizializzare?”);
scanf(“%d”,&n);
for (i=0;i<n;i++) for(j=0;j<20;j++) scanf(“%d”,&tab[i][j]);
N.B.: non si può mai scrivere tab[10][20] perché non esiste un elemento nella posizione 10,20
Ogni elemento della tabella potrà essere utilizzato nei contesti nei quali è possibile utilizzare una variabile semplice dello stesso tipo, cioè
se per stampare il valore di una variabile intera n si scrive printf(“%d”,n);
allora per stampare l’i-esimo elemento della j-esima riga di una tabella si scrive printf(“%d”,vett[i][j]);
Stringhe
Il tipo stringa in C non è un tipo fondamentale, si definisce a partire dal tipo carattere.
Definizione : una stringa c è una successione di caratteri terminata dal carattere ‘\0’, questo carattere è detto terminatore.
Per definire una variabile in grado di memorizzare una stringa si deve scrivere char str[20];
Questa variabile potrà contenere una stringa lunga al massimo 19 caratteri perché uno deve essere riservato per il terminatore.
Per inizializzarla
scanf(“%s”,str); oppure gets(str);
Attenzione al fatto che non è stato specificato l’operatore & prima del nome della stringa perché il nome di un vettore identifica già il suo indirizzo.
Per visualizzare il contenuto di una stringa printf(“%s”,str); oppure puts(str);
Le funzioni gets e puts possono essere utilizzate solo per le stringhe.
Una costante stringa è una successione di zero o più caratteri racchiusa tra “”.
Esempio “ciao”, “x”,””, l’ultima costante è la costante nulla.
Il fatto che per definire stringhe si usano vettori implica che gli operatori di confronto (<,>,==,!=…) e l’operatore di assegnamento (=) non si possono utilizzare perché essi opererebbero sugli indirizzi delle stringhe invece che sui valori.
Pertanto si devono usare delle funzioni per eseguire le operazioni equivalenti.
La funzione strcpy serve per l’assegnamento:
strcpy(s1,s2) assegna il valore della stringa s2 alla stringa s1
strcpy(s1,”ciao”) assegna il valore della stringa costante “ciao” alla stringa s1
La funzione strcmp serve per il confronto tra due stringhe:
strcmp(s1,s2) dà risultato 0 se se le stringhe sono uguali, <0 se la prima precede la seconda in ordine alfabetico, >0 in caso contrario
La funzione strcat serve per concatenare due stringhe:
strcat(s1,s2) aggiunge i caratteri di s2 dopo quelli di s1, sovrascrivendo il terminatore di s1
strcat(s1,”xxx”) aggiunge la stringa costante “xxx” a s1
La funzione strlen serve per conoscere il numero di caratteri che formano una stringa, escluso il terminatore.
int l;
l=strlen(s);