DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – [email protected] Ver. aggiornata al 26 Marzo 2014 Torniamo a ieri… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 2 Il maggiore tra N numeri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema Trovare il maggiore tra N numeri interi inseriti da tastiera • Soluzione Conoscere N Richiedere l’inserimento degli N valori Ricerca del maggiore tra gli N valori 3 Soluzione “semplice” DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 4 Soluzione “semplice” DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 5 Soluzione “semplice” DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 6 Soluzione più complessa DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 7 Soluzione più complessa DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 8 Torniamo ad oggi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 9 Frase… insieme di caratteri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Che cosa è una frase? Un insieme di caratteri • Come la rappresento? Un insieme, di tante variabili carattere? Una variabile, insieme di caratteri? supercali fragili stiche spiralidoso 10 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Gli array, questi sconosciuti • Gli array in C • Array particolari: le stringhe 11 Gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE dichiarazione • Gruppi di celle consecutive nome array int v[12]; Rappresentano gruppi di variabili • con lo stesso nome e lo stesso tipo • Per riferirsi a un elemento, si specificano: Il nome dell’array La posizione dell’elemento (indice) • Sintassi: <nomearray>[<posizione>] Il primo elemento ha indice 0 L’n° elemento dell’array v è v[n-1] v[0] -45 v[1] 6 v[2] 0 v[3] 72 v[4] 1543 v[5] -89 v[6] 0 v[7] 62 v[8] -3 v[9] 1 v[10] 6453 v[11] 78 posizione elemento 12 Gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Gli elementi di un array sono normali variabili: vett[0] 3; printf("%d", vett[0]); > 3 scanf("%d", &vett[1]); > 17 vett[1] assume valore 17 • Si possono usare espressioni come indici: se x 3 vett[52] è equivalente a vett[3] ed è equivalente a vett[x] 13 La gara di nuoto: con salvataggio DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema Si hanno10 giudici • 1 giudice = 1 voto Si vogliono memorizzare i 10 voti, per poterli rileggere Ogni voto è nell’itervallo 0-10 Dato un tuffo, calcolare • La media dei voti • Il voto massimo ed il voto minimo 14 Come salvare i voti... La dichiarazione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 15 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 1: devo salvare i dati nel mio array (int voto[0];) • Problema 2: devo definire un ciclo che mi permetta di scorrere N elementi 16 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 1: devo salvare i dati nel mio array (int voto[0];) scanf(&voto[posix]); *pseudo-codice 17 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 2: devo definire un ciclo che mi permetta di scorrere N elementi for(index = 0, index < N, index++){ } *pseudo-codice 18 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 1 + Problema 2 for(index = 0, index < N, index++){ scanf(&voto[posix]); } *pseudo-codice 19 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 1 + Problema 2 posix = 0; for(index = 0, index < N, index++){ scanf(&voto[posix]); posix++; } *pseudo-codice 20 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema 1 + Problema 2 for(index = 0, index < N, index++){ scanf(&voto[index]); } *pseudo-codice 21 Come salvare i voti... L’inserimento DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 22 Come salvare i voti... La stampa DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 23 Mettiamo tutto insieme DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 24 Un primo incontro con gli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Array: collezione di dati omogenei Dichiare il tipo dei suoi dati Dichiarare la sua dimensione • Come si accede ai dati di un array? Come a normali variabili • Esempio di scrittura • Esempio di lettura 25 Inizializzazione di un array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Sintassi compatta: int n[5] {1, 2, 3, 4, 5}; Inizializzazione parziale: gli elementi più a destra sono posti a 0 int n[5] {13}; tutti gli altri elementi sono posti a 0 Specificare troppi elementi tra le graffe è un errore di sintassi • Se la lunghezza dell’array è omessa, gli inizializzatori la determinano: int n[] {5, 47, 2, 0, 24}; è equivalente a: int n[5] {5, 47, 2, 0, 24}; In tal caso la dimensione è inferita automaticamente, e si avranno 5 elementi nell’array 26 Operazioni sugli array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Si opera sui singoli elementi, uno per volta • Non è possibile operare sull’intero array, agendo su tutti gli elementi simultaneamente / come ricopiare array1 in array2 / int array1[10], array2[10]; int i; . . . array2 array1; / ERRATO / . . . for( i 0; i 10; i ) array2[i] array1[i]; / CORRETTO / 27 Problema: sequenza di interi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Mostrare una sequenza di 10 interi nell'ordine inverso rispetto a quello con cui è stata introdotta dall’utente Con un array?... ora Senza array?... Provateci voi ;) 28 Sequenza: possibile soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 29 Sequenza: possibile soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se ora volessi 100 numeri? 30 Sequenza: possibile soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se ora volessi 100 numeri? 31 "Generalizziamo" con la direttiva #define DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • In testa al programma: #define LUNG_SEQ 100 • Così possiamo adattare la lunghezza del vettore alle eventuali mutate esigenze senza riscrivere la costante 100 in molti i punti del programma Il preprocessore sostituisce nel codice LUNG_SEQ con 100 prima della compilazione • La lunghezza dell’array, quindi, anche in questo caso è decisa al momento della compilazione del programma • Nella dichiarazione degli array non si usano mai variabili per specificarne la dimensione 32 Sequenza con define DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 33 Sequenza con define DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se ora volessi 17 numeri? 34 Sequenza con define DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E se ora volessi 17 numeri? 35 Pausa 10’ DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 36 Le stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Array di caratteri: spesso chiamati stringhe Quando rappresentano “caratteri da leggersi in fila” • Dichiarazione+inizializzazione di una stringa: char stringa[] "word"; • Il carattere nullo '\0' termina le stringhe • Perciò l’array stringa ha 5 elementi (non 4): w o r d \0 • Dichiarazione equivalente: char stringa[] {'w', 'o', 'r', 'd', '\0'}; 37 Problema: inserisci nome DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 38 Stringhe e caratteri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Qual è la differenza tra 'x' e "x"? • 'x' è una costante di tipo char, rappresentata in memoria da un intero • "x" è una stringa costante, rappresentata in memoria da un array che contiene i caratteri: 'x' e '\0' ATTENZIONE Le stringhe non sono propriamente un tipo di dato (non sono un tipo base!) Non hanno operatori nativi, ma una serie di funzioni nella libreria standard che permettono di manipolarle 39 Operazioni su stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE char str1[32]; / str1 ha spazio per 32 char. / char str2[64]; / str2 ha spazio per 64 char. / / inizializza str1 con la stringa "alfa" / strcpy(str1, "alfa"); / str1 contiene "alfa" / / copia str1 in str2 / strcpy(str2, str1); / str2 contiene "alfa" / / lunghezza di str1 / x = strlen(str1); / / x assume valore 4 / scrivi str1 su standard output / printf("%s", str1); / scrive str1 su stdout / / leggi str1 da standard input / scanf("%s", str1); / str1 “riceve” da stdin / 40 Operazioni su stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE char str1[32]; char str2[64]; scanf("%s", str1); > ciao / ora str1 contiene "ciao" / strcpy(str2, str1);/ str2 riceve "ciao"/ val = strlen(str2); / val = 4 / printf("%s\n", str2); > ciao / stampa "ciao" / Attenzione: strlen("") vale 0 ! 41 Problema: copia stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 42 Particolarità delle stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il nome dell’array rappresenta l’indirizzo del suo primo elemento, perciò quando ci si vuole riferire all’intero array nella scanf non si mette il simbolo &! scanf("%s", stringa); • Questa scanf legge in input i caratteri fino a quando trova il carattere “blank” (lo spazio), o l’invio NOTA: se nel buffer si trova una stringa “troppo lunga”, essa è memorizzata oltre la fine dell’array !!! Ed è un errore grave !!! 43 Confrontare due stringhe DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Una funzione apposita: strcmp(s1,s2) restituisce un intero confronta le due stringhe fino al ‘\0’ char str1[32], str2[64]; int diverse; /*... acquisizione di valori per le stringhe ... (codice omesso)*/ diverse = strcmp(str1, str2); if( diverse == 0 ) printf("UGUALI\n"); else if( diverse < 0 ) printf("%s PRECEDE %s\n", str1, str2); else printf("%s SEGUE %s\n", str1, str2); 44 Problema: ??? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 45 Output del programma DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Element Value 0 1 2 3 4 5 6 7 8 9 19 3 15 7 11 9 13 5 17 1 Histogram ******************* *** *************** ******* *********** ********* ************* ***** ***************** * Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Informatica arte e mestiere, S. Ceri, D. Mandrioli, L. Sbattella, McGrawHill • Capitolo 5 • Credits Daniele Braga - http://home.dei.polimi.it/braga/ 47