DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Recap su: array e puntatori
Marco D. Santambrogio – [email protected]
Ver. aggiornata al 20 Aprile 2015
Sui codici a lunghezza fissa
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
2
Sui codici a lunghezza fissa
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
3
Sui codici a lunghezza fissa
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
4
Sui codici a lunghezza fissa
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
5
Ore extra
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Molti del 3zo anno non riesco a venire
al giovedì pomeriggio…
6
Ore extra
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Molti del 3zo anno non riesco a venire
al giovedì pomeriggio…
 Possiamo fregarcene
7
Ore extra
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Molti del 3zo anno non riesco a venire
al giovedì pomeriggio…
 Possiamo fregarcene
 O trovare una soluzione
8
Ore extra
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Molti del 3zo anno non riesco a venire
al giovedì pomeriggio…
 Possiamo fregarcene
 O trovare una soluzione
• Mar dalle 2pm alle 3pm
• Gio dalle 7am alle 8am
9
Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Un ripasso generale sul C
• In particolare
 Array multi-dimensionali
 Dati strutturati e passaggio a funzioni
10
Problema
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si scriva in C un programma che,
recuperato un cubo di caratteri, dice
quante ‘a’ vi sono contenute.
 La dimensione del cubo è: 2x3x4
11
Sotto-problemi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si scriva in C un programma che,
recuperato un cubo di caratteri, dice
quante ‘a’ vi sono contenute.
 La dimensione del cubo è: 2x3x4
• Sotto-problemi
 P0: cubo di caratteri
 P1: Popolare il cubo di caratteri
 P2: Contare le ‘a’
12
Cubo di caratteri
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• La dimensione del cubo è: 2x3x4
#define dx 3
#define dy 2
#define dz 4
char data[dx][dy][dz];
13
Array in memoria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
char data[dx];
array di dx char (dx:3)
09
00
01
data[0]
0A
02
data[1]
0B
03
data[2]
0C
04
0D
05
0E
06
0F
07
10
08
11
14
Matrice (array di array) in memoria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
char data[dx];
char data[dx][dy];
array di dx char (dx:3)
array di dx array (dx:3)
array di dy char (dy:2)
09
00
01
02
03
04
05
06
[0]
data[0][0]
[0]
[1]
data[0][1]
0A
data[1][0]
[0]
[1]
data[1][1]
[1]
data[2][0]
[0]
[2]
data[2][1]
[1]
0C
0B
0D
0E
0F
07
10
08
11
15
Un array 3D
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
char data[dx];
array di dx char
char data[dx][dy]; array di dx array di dy char
char data[dx][dy][dz]
array di dx array (dx:3)
array di dy array (dy:2)
array di dz char (dz:4)
16
In memoria, macchina a 32bit, e.g. x86
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
char data[dx][dy][dz]
00
dx:3, dy:2, dz:4
09
data[1][0][0]
01
[0]
data[0][0][0]
0A
data[1][0][1]
02
data[0][0][1]
[0]
data[0][0][2]
0B
data[1][0][2]
0C
0D
05
data[0][0][3]
[0]
data[0][1][0]
data[1][0][3]
[1]
data[1][1][0]
0E
data[1][1][1]
06
data[0][1][1]
0F
data[1][1][2]
07
data[0][1][2]
10
data[1][1][3]
08
data[0][1][3]
11
data[2][0][0]
03
04
17
Torniamo al problema
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si scriva in C un programma che,
recuperato un cubo di caratteri, dice
quante ‘a’ vi sono contenute. La
dimensione del cubo è: 2x3x4
• Sotto-problemi
 P0: cubo di caratteri
 P1: Popolare il cubo di caratteri
 P2: Contare le ‘a’
18
P1: popolare il cubo di char
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Serve una funzione che
 Recuperato il cubo
void popola(char *p, int x, int y, int z);
 Permette l’inserimento dei caratteri
19
P2: contare le ‘a’
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Serve una funzione che
 Recuperato il cubo
int foo2(char p[][dy][dz], char x);
 Scorre gli elementi per cercare le ‘a’
20
Problema
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si scriva in C un programma che,
recuperati i cognomi di 5 studenti, li
ordina alfabeticamente
21
Sotto-problemi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si scriva in C un programma che,
recuperati i cognomi di 5 studenti, li
ordina alfabeticamente
• Sotto-problemi
 P0: rappresentare i cognomi
 P1: recuperare i cognomi
 P2: ordinare i cognomi alfabeticamente
22
P0: rappresentare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Vi sono diversi modi…
• Noi, per esercitarci,
 creiamo una struttura e
 definiamo un nuovo tipo di dato
23
dati
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Dopo aver definito studente
• Dobbiamo creare 5 studenti
studente studenti[5];
24
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
25
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
26
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “l’array”
27
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “l’array”
p[i].cognome;
28
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “l’array”
p[i].cognome;
p: l’indirizzo base - [i]: la posizione
p[i]: è l’elemento di interesse
.: accedo a - cognome: il campo
29
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
30
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “il puntatore”
31
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “il puntatore”
(*(p+i)).cognome;
32
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare “il puntatore”
(*(p+i)).cognome;
p: l’indirizzo base - i: la posizione
(*(p+i)): è l’elemento di interesse
.: accedo a - cognome: il campo
33
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
34
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare veramente “il puntatore”
35
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare veramente “il puntatore”
 Con una “freccia”
(p+i)->cognome;
36
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Studenti è un array… si passa per
indirizzo
void ins_alunno(studente *p, int dimensione);
• studente è “strutturato” come accedo ai
campi attraverso un puntatore?
 Posso sfruttare veramente “il puntatore”
 Con una “freccia”
(p+i)->cognome;
p+i: è l’indirizzo dell’elemento di interesse
->: accedo a, tramite ind. - cognome: il campo
37
P1: recuperare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
38
P2: ordinare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Come faccio ad ordinare i cognomi?
 Vi è differenza nell’ordinare studente rispetto
ad ordinare int?
• Ma quindi il problema è…
 Come ordino N interi???
39
Ordiniamo N interi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Problema
 Dati: 4, 3, 1, 2
 Voglio ottenere: 1, 2, 3, 4
• Iniziamo ad ipotizzare una soluzione
 Confronto gli elementi a due a due e se non
sono nell’ordine corretto, inverto i valori
40
Ordino 4, 3, 1, 2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Confronto gli elementi a due a due e se
non sono nell’ordine corretto, inverto i
valori
Dati: 4, 3, 1, 2
4 > 3?
Si, inverto: 3, 4, 1, 2
4 > 1?
Si, inverto: 3, 1, 4, 2
4 > 2?
Si, inverto: 3, 1, 2, 4
41
Da 4, 3, 1, 2 a 3, 1, 2, 4…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Problema
 3, 1, 2, 4 è ordinato?
 Basta confrontare a due a due gli
elementi?
NO!!!
Devo confrontare a due a due
TUTTI (quasi vero) gli elementi
42
Facciamolo su tutti
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Dato vet[4]={4, 3, 1, 2}
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
ci porta da 4, 3, 1, 2
a 3, 1, 2, 4
Ma questo vogliamo farlo su tutti gli elementi
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
43
E quindi… i=0
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Dato vet[4]={4, 3, 1, 2}
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
i=0, vario j
ci porta da 4, 3, 1, 2 a 3, 1, 2, 4
j=0: 4 > 3?
Si, inverto: 3, 4, 1, 2
j=1: 4 > 1?
Si, inverto: 3, 1, 4, 2
j=2: 4 > 2?
Si, inverto: 3, 1, 2, 4
44
E quindi… i=1
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Dato vet[4]={4, 3, 1, 2}
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
i=0, vario j
ci porta da 4, 3, 1, 2 a 3, 1, 2, 4
i=1, vario j
ci porta da 3, 1, 2, 4 a 1, 2, 3, 4
j=0: 3 > 1?
Si, inverto: 1, 3, 2, 4
j=1: 3 > 2?
Si, inverto: 1, 2, 3, 4
j=2: 3 > 4?
No, non faccio nulla: 1, 2, 3, 4
45
E quindi… i=2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Dato vet[4]={4, 3, 1, 2}
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
i=0, vario j
ci porta da 4, 3, 1, 2 a 3, 1, 2, 4
i=1, vario j
ci porta da 3, 1, 2, 4 a 1, 2, 3, 4
i=2, vario j
ci porta da 1, 2, 3, 4 a 1, 2, 3, 4
j=0: 1 > 2?
No, non faccio nulla: 1, 2, 3, 4
j=1: 2 > 3?
No, non faccio nulla: 1, 2, 3, 4
j=2: 3 > 4?
No, non faccio nulla: 1, 2, 3, 4
46
E quindi… i=3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Dato vet[4]={4, 3, 1, 2}
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
i=0, vario j
ci porta da 4, 3, 1, 2 a 3, 1, 2, 4
i=1, vario j
ci porta da 3, 1, 2, 4 a 1, 2, 3, 4
i=2, vario j
ci porta da 1, 2, 3, 4 a 1, 2, 3, 4
i=3, vario j
ci porta da 1, 2, 3, 4 a 1, 2, 3, 4
j=0: 1 > 2?
No, non faccio nulla: 1, 2, 3, 4
j=1: 2 > 3?
No, non faccio nulla: 1, 2, 3, 4
j=2: 3 > 4?
No, non faccio nulla: 1, 2, 3, 4
47
Ordinamento, qualche osservazione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Si può migliorare?
for(i=0;i<dimensione;i++)
for(j=0;j<dimensione-1;j++)
è vero che vet[j]>vet[j+1]?
•Nel for innestato
 Mi serve davvero arrivare a dimensione-1?
•Nel for esterno,
 mi serve veramente arrivare a dimensione?
48
P2: ordinare i cognomi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Come faccio ad ordinare i cognomi?
49
Fonti per lo studio + Credits
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Fonti per lo studio
 Tutte le slide precedenti del corso di IEIM 2013/2014
50
Scarica

PPT - V0 - Dipartimento di Elettronica ed informazione