330 likes | 423 Views
Recap sul C. Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 11 Aprile 2013. Feedback. NUOVO, per le exe : http://tinyurl.com/IEIMExe2013 Per i lab: http://tinyurl.com/Feedback-LabIEIM2013 Per le lezioni: http://tinyurl.com/Feedback-IEIM2013. WAT.
E N D
Recap sul C Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 11 Aprile 2013
Feedback • NUOVO, per le exe: http://tinyurl.com/IEIMExe2013 • Per i lab: http://tinyurl.com/Feedback-LabIEIM2013 • Per le lezioni: http://tinyurl.com/Feedback-IEIM2013
WAT • 8 Maggio, sospesione lezione! • No homework!! W A T
WAT • Da feedback • l'esercitatore era troppo veloce.... ahahah WAT
Obiettivi • Un ripasso generale sul C • In particolare • Array multi-dimensionali • Dati strutturati e passaggio a funzioni
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 • 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’
Cubo di caratteri • La dimensione del cubo è: 2x3x4 #define dx 3 #define dy 2 #define dz 4 char data[dx][dy][dz];
Array in memoria char data[dx]; array di dx char (dx:3) data[0] data[1] data[2]
Matrice (array di array) in memoria char data[dx]; array di dx char (dx:3) char data[dx][dy]; array di dxarray (dx:3) array di dy char (dy:2) [0] [0] data[0][0] [1] data[0][1] data[1][0] [1] [0] data[1][1] [1] data[2][0] [2] [0] data[2][1] [1]
Un array 3D char data[dx]; array di dx char array di dxarray di dy char char data[dx][dy]; char data[dx][dy][dz] array di dxarray (dx:3) array di dyarray (dy:2) array di dz char (dz:4)
In memoria, macchina a 32bit, e.g. x86 dx:3, dy:2, dz:4 char data[dx][dy][dz] [1] data[1][0][0] [0] [0] [0] data[0][0][0] data[1][0][1] data[0][0][1] data[1][0][2] data[0][0][2] data[1][0][3] data[0][0][3] data[1][1][0] data[1][1][1] data[0][1][0] data[0][1][1] data[1][1][2] data[1][1][3] data[0][1][2] data[0][1][3] data[2][0][0]
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’
P1: popolare il cubo di char • Serve una funzione che • Recuperato il cubo • Permette l’inserimento dei caratteri void popola(char *p, int x, int y, int z);
P2: contare le ‘a’ • Serve una funzione che • Recuperato il cubo • Scorre gli elementi per cercare le ‘a’ int foo2(char p[][dy][dz], char x); Attenzione a char x
Problema • Si scriva in C un programma che, recuperati i cognomi di 5 studenti, li ordina alfabeticamente
Sotto-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
P0: rappresentare i cognomi • Vi sono diversi modi… • Noi, per esercitarci, • creiamo una struttura e • definiamo un nuovo tipo di dato
dati • Dopo aver definito studente • Dobbiamo creare 5 studenti studente studenti[5];
P1: recuperare i cognomi • Studenti è un array… si passa per indirizzo • studente è “strutturato” come accedo ai campi attraverso un puntatore? • Con una “freccia” void ins_alunno(studente *p, int dimensione); p->cognome;
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???
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
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
Da 4, 3, 1, 2 a 3, 1, 2, 4… • 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
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++)
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
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
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
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
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?
P2: ordinare i cognomi Come faccio ad ordinare i cognomi?
Fonti per lo studio + Credits • Fonti per lo studio • Tutte le slide precedenti del corso di IEIM 2012/2013