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