Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni 1 (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 1
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria Università degli Studi di Udine
Linguaggio C Vettori e stringhe
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell'Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L'informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell'informazione).
In ogni caso non può essere dichiarata conformità all'informazione contenuta in queste slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Nota di Copyright
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 3
Vettori
• Un vettore è un insieme ordinato di dati omogenei (cioè dello stesso tipo elementare)
• Ogni elemento dell’insieme è
accessibile tramite un indice (il numero d’ordine)
• In C il primo elemento di un vettore ha sempre indice 0
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 4
Vettori
int a[10];
a
a[0] a[1]...
Il nome di un vettore è sinonimo dell’indirizzo del suo primo elemento.
int a[10]; dichiara un vettore a di dieci elementi (interi) consecutivi, chiamati a[0], a[1], ...
a[9].
...a[9]
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 5
Vettori
• In C i vettori iniziano sempre da 0
• I vettori possono essere inizializzati nella dichiarazione:
int a[5] = { 30, 39, 23, 10, 87 };
• Normalmente i compilatori non controllano se un indice eccede la fine di un vettore, né a tempo di compilazione (compile time), né durante l’esecuzione del programma (runtime)
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 6
Vettori e puntatori
• In realtà, la sintassi del C per i vettori è una forma semplificata di istruzioni con i puntatori:
v [i]
è equivalente a
*(v + i)
• Grazie alle regole dell’aritmetica dei puntatori,
a v viene sommato il valore di i moltiplicato
per il numero di byte occupati da un singolo
elemento del vettore
Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni 2 (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 7
Sottovettori
• f(&v[2]) e f(v + 2) sono due modi equivalenti per passare alla funzione f il sottovettore di a che inizia da a[2].
v
v+2
&v[2]
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 8
Vettori multidimensionali
In realtà non esistono: sono realizzati come vettori di vettori.
Es.: int matrice [10][5];
vettore di 10 elementi
ogni elemento è a sua volta un vettore di 5 interi
In pratica: int matrice [10][5];
numero di righe numero di colonne
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 9
Vettori multidimensionali
matrice [i] indirizzo dell'i-esimo vettore di 5 interi
matrice [i][j] indirizzo dell'elemento i,j della matrice
matrice [i,j] sintatticamente sbagliato!
char vs [10][16]; vettore di 10 stringhe da 15 caratteri
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 10
Vettori multidimensionali
Allocazione della memoria:
char m[3][4];
m, m[0], &m[0][0]
m[1], &m[1][0]
&m[2][3];
m[2], &m[2][0]
1 byte
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 11
Vettori multidimensionali e funzioni
• Se una matrice (vettore bidimensionale) deve essere passata ad una funzione f come parametro, la dichiarazione di f deve includere la dimensione delle colonne.
• Esempi:
f(char v[10][16]);
f(int v[][10]);
f(double (*v)[3]);
• Il 16 deve comparire perché permette al
compilatore di calcolare correttamente gli indirizzi di memoria delle singole locazioni della matrice
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 12
Vettori di puntatori
Allocazione della memoria:
char *m[3]; m[0]
m[1] m[2]
1 word
Fondamenti di Informatica
© 2001 Pier Luca Montessoro, Davide Pierattoni 3 (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 13
Vettori di caratteri (stringhe)
char s[8];
h e l l o \0 s
(vettore di caratteri)
• "hello" è una stringa costante
• Nella rappresentazione interna, il vettore corrispondente è terminato dal codice ASCII '\0', in modo che il programma possa trovarne la fine
- -
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 14
I/O con stringhe
• Per leggere una parola da tastiera:
• Per leggere l’intera riga da tastiera:
{
char str[64];
scanf ("%s", str);
...
}
{
char str[64];
gets (str);
...
}
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 15
I/O con stringhe
• Per scrivere una stringa sul monitor:
oppure, andando a capo alla fine:
{
char str[64];
...
printf ("%s", str);
}
{
char str[64];
...
puts (str);
}
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 16
Esempio: mygets
void mygets (char s[]) {
int i = 0;
while ((s[i++] = getchar()) != '\n');
s[i] = '\0';
return;
}
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 17
Esempio: myputs
void myputs (char s[]) {
int i = 0;
while (s[i] != '\0') putchar (s[i++]);
putchar ('\n');
return;
}
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2) 18