Linguaggio C Vettori e stringhe - diegm

Transcript

Linguaggio C Vettori e stringhe - diegm
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO
Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Vettori e stringhe
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
1
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Nota di Copyright
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.
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
2
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
3
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Vettori
int
int a[10];
a[10];
a
a[0] a[1]...
...a[9]
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].
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
4
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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)
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
5
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
6
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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+2
&v[2]
v
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
7
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
8
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Vettori multidimensionali
matrice [i]
indirizzo dell'i-esimo vettore di 5 interi
matrice [i][j]
matrice [i,j]
indirizzo dell'elemento i,j della matrice
sintatticamente sbagliato!
char vs [10][16]; vettore di 10 stringhe da 15 caratteri
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
9
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Vettori multidimensionali
Allocazione della memoria:
m, m[0], &m[0][0]
char m[3][4];
m[2], &m[2][0]
m[1], &m[1][0]
&m[2][3];
1 byte
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
10
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
11
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Vettori di puntatori
Allocazione della memoria:
char
char *m[3];
*m[3];
m[1]
m[0]
m[2]
1 word
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
12
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Vettori di caratteri (stringhe)
char s[8];
s
h
e
l
l
o \0 -
-
(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
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
13
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
I/O con stringhe
• Per leggere una parola da tastiera:
{
char str[64];
scanf ("%s", str);
...
}
• Per leggere l’intera riga da tastiera:
{
char str[64];
gets (str);
...
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
14
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
I/O con stringhe
• Per scrivere una stringa sul monitor:
{
char str[64];
...
printf ("%s", str);
}
oppure, andando a capo alla fine:
{
char str[64];
...
puts (str);
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
15
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Esempio: mygets
void mygets (char s[])
{
int i = 0;
while ((s[i++] = getchar()) != '\n');
s[i] = '\0';
return;
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
16
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
Esempio: myputs
void myputs (char s[])
{
int i = 0;
while (s[i] != '\0')
putchar (s[i++]);
putchar ('\n');
return;
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
17
Fondamenti di Informatica - Linguaggio C - Vettori e stringhe
strlen: versione evoluta
int strlen (char *s)
{
char *p = s;
while (*p != '\0')
p++;
return p - s;
}
© 2001 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
18