1 / 33

Recap sul C

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.

zoltin
Download Presentation

Recap sul C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Recap sul C Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 11 Aprile 2013

  2. 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

  3. WAT • 8 Maggio, sospesione lezione! • No homework!! W A T

  4. WAT • Da feedback • l'esercitatore era troppo veloce.... ahahah WAT

  5. Obiettivi • Un ripasso generale sul C • In particolare • Array multi-dimensionali • Dati strutturati e passaggio a funzioni

  6. Problema • Si scriva in C un programma che, recuperato un cubo di caratteri, dice quante ‘a’ vi sono contenute. • La dimensione del cubo è: 2x3x4

  7. 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’

  8. Cubo di caratteri • La dimensione del cubo è: 2x3x4 #define dx 3 #define dy 2 #define dz 4 char data[dx][dy][dz];

  9. Array in memoria char data[dx]; array di dx char (dx:3) data[0] data[1] data[2]

  10. 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]

  11. 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)

  12. 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]

  13. 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’

  14. 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);

  15. 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

  16. Problema • Si scriva in C un programma che, recuperati i cognomi di 5 studenti, li ordina alfabeticamente

  17. 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

  18. P0: rappresentare i cognomi • Vi sono diversi modi… • Noi, per esercitarci, • creiamo una struttura e • definiamo un nuovo tipo di dato

  19. dati • Dopo aver definito studente • Dobbiamo creare 5 studenti studente studenti[5];

  20. 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;

  21. P1: recuperare i cognomi

  22. 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???

  23. 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

  24. 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

  25. 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

  26. 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++)

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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?

  32. P2: ordinare i cognomi Come faccio ad ordinare i cognomi?

  33. Fonti per lo studio + Credits • Fonti per lo studio • Tutte le slide precedenti del corso di IEIM 2012/2013

More Related