La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap su: array e puntatori Marco D. Santambrogio – Ver. aggiornata al 20 Aprile.

Presentazioni simili


Presentazione sul tema: "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap su: array e puntatori Marco D. Santambrogio – Ver. aggiornata al 20 Aprile."— Transcript della presentazione:

1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap su: array e puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 20 Aprile 2015

2 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sui codici a lunghezza fissa 2

3 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sui codici a lunghezza fissa 3

4 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sui codici a lunghezza fissa 4

5 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Sui codici a lunghezza fissa 5

6 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ore extra Molti del 3zo anno non riesco a venire al giovedì pomeriggio… 6

7 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ore extra Molti del 3zo anno non riesco a venire al giovedì pomeriggio…  Possiamo fregarcene 7

8 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ore extra Molti del 3zo anno non riesco a venire al giovedì pomeriggio…  Possiamo fregarcene  O trovare una soluzione 8

9 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ore extra 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

10 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEObiettivi Un ripasso generale sul C In particolare  Array multi-dimensionali  Dati strutturati e passaggio a funzioni 10

11 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEProblema Si scriva in C un programma che, recuperato un cubo di caratteri, dice quante ‘a’ vi sono contenute.  La dimensione del cubo è: 2x3x4 11

12 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONESotto-problemi 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

13 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cubo di caratteri La dimensione del cubo è: 2x3x4 13 char data[dx][dy][dz]; #define dx 3 #define dy 2 #define dz 4

14 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array in memoria 14 char data[dx]; array di dx char (dx:3) data[0] data[1] data[2]

15 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Matrice (array di array) in memoria 15 char data[dx][dy]; char data[dx]; array di dx char (dx:3) array di dx array (dx:3) array di dy char (dy:2) [0] [1] [0] [1] [0] [1] [2] data[0][0] data[0][1] data[1][0] data[1][1] data[2][0] data[2][1]

16 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Un array 3D 16 char data[dx][dy][dz] char data[dx][dy]; char data[dx];array di dx char array di dx array di dy char array di dx array (dx:3) array di dy array (dy:2) array di dz char (dz:4)

17 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 17 char data[dx][dy][dz] data[0][0][0] In memoria, macchina a 32bit, e.g. x86 dx:3, dy:2, dz:4 data[0][0][1] data[0][0][2] data[0][0][3] data[0][1][0] data[0][1][1] data[0][1][2] data[0][1][3] data[1][0][0] data[1][0][1] data[1][0][2] data[1][0][3] data[1][1][0] data[1][1][1] data[1][1][2] data[1][1][3] data[2][0][0] [0] [1]

18 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Torniamo al problema 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

19 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: popolare il cubo di char Serve una funzione che  Recuperato il cubo  Permette l’inserimento dei caratteri 19 void popola(char *p, int x, int y, int z);

20 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P2: contare le ‘a’ Serve una funzione che  Recuperato il cubo  Scorre gli elementi per cercare le ‘a’ 20 int foo2(char p[][dy][dz], char x); Attenzione a char x

21 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEProblema Si scriva in C un programma che, recuperati i cognomi di 5 studenti, li ordina alfabeticamente 21

22 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONESotto-problemi 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

23 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P0: rappresentare i cognomi Vi sono diversi modi… Noi, per esercitarci,  creiamo una struttura e  definiamo un nuovo tipo di dato 23

24 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONEdati Dopo aver definito studente Dobbiamo creare 5 studenti 24 studente studenti[5];

25 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 25

26 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 26 Studenti è un array… si passa per indirizzo void ins_alunno(studente *p, int dimensione);

27 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 27 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “l’array” void ins_alunno(studente *p, int dimensione);

28 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 28 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “l’array” void ins_alunno(studente *p, int dimensione); p[i].cognome;

29 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 29 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “l’array” void ins_alunno(studente *p, int dimensione); p[i].cognome; p: l’indirizzo base - [i]: la posizione p[i]: è l’elemento di interesse.: accedo a - cognome: il campo

30 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 30

31 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 31 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “il puntatore” void ins_alunno(studente *p, int dimensione);

32 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 32 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “il puntatore” void ins_alunno(studente *p, int dimensione); (*(p+i)).cognome;

33 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 33 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare “il puntatore” void ins_alunno(studente *p, int dimensione); (*(p+i)).cognome; p: l’indirizzo base - i: la posizione (*(p+i)): è l’elemento di interesse.: accedo a - cognome: il campo

34 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 34

35 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 35 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare veramente “il puntatore” void ins_alunno(studente *p, int dimensione);

36 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 36 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare veramente “il puntatore”  Con una “freccia” void ins_alunno(studente *p, int dimensione); (p+i)->cognome;

37 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 37 Studenti è un array… si passa per indirizzo studente è “strutturato” come accedo ai campi attraverso un puntatore?  Posso sfruttare veramente “il puntatore”  Con una “freccia” void ins_alunno(studente *p, int dimensione); (p+i)->cognome; p+i: è l’indirizzo dell’elemento di interesse ->: accedo a, tramite ind. - cognome: il campo

38 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P1: recuperare i cognomi 38

39 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P2: ordinare i cognomi Come faccio ad ordinare i cognomi?  Vi è differenza nell’ordinare studente rispetto ad ordinare int? Ma quindi il problema è…  Come ordino N interi??? 39

40 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ordiniamo N interi 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

41 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ordino 4, 3, 1, 2 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

42 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Da 4, 3, 1, 2 a 3, 1, 2, 4… Problema  3, 1, 2, 4 è ordinato?  Basta confrontare a due a due gli elementi? 42 NO!!! Devo confrontare a due a due TUTTI (quasi vero) gli elementi

43 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Facciamolo su tutti 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

44 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi… i=0 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

45 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi… i=1 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

46 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi… i=2 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

47 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E quindi… i=3 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

48 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ordinamento, qualche osservazione 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

49 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE P2: ordinare i cognomi Come faccio ad ordinare i cognomi? 49

50 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Fonti per lo studio + Credits Fonti per lo studio  Tutte le slide precedenti del corso di IEIM 2013/2014 50


Scaricare ppt "DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap su: array e puntatori Marco D. Santambrogio – Ver. aggiornata al 20 Aprile."

Presentazioni simili


Annunci Google