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[52] è 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
Scarica

PPT - V2