Recap su: array e puntatori

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Ripasso R1 Dati strutturati.
Array multidimensionali
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap sul C Marco D. Santambrogio – Ver. aggiornata al 11 Aprile 2013.
Process synchronization
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 3: 8 Aprile 2013 Marco D. Santambrogio – Gianluca Durelli -
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
Passaggio di parametri per indirizzo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Ricerca sequenziale in un array di interi
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 L Aprile 2015 Marco D. Santambrogio – Gianluca Durelli -
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Recap su: array e puntatori Marco D. Santambrogio – Ver. aggiornata al 20 Aprile.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 22 Marzo 2016.
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 3 – Info B Marco D. Santambrogio – Matteo Ferroni –
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Process synchronization
Process synchronization
Rileaborato da M. Lenzerini - Basi di dati
Process synchronization
Array n-dimensionali e tipi di dati strutturati
Array n-dimensionali e tipi di dati strutturati
Process synchronization
Process synchronization
Organizzazione fisica
Process synchronization
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Process synchronization
Process synchronization
Corso Java Cicli e Array.
Programmazione e Laboratorio di Programmazione
Process synchronization
Process synchronization
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
comprensione e modifica di codice
Process synchronization
* 07/16/96 Sez. 2: Ordinamento La consultazione di banche dati è sempre più cruciale in tutte le applicazioni dell’Informatica. Se vogliamo consultare.
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
Lucidi della Pof.ssa Pazienza
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Process synchronization
APPUNTI SUL LINGUAGGIO C
Process synchronization
Array n-dimensionali e tipi di dati strutturati
Programmazione e Laboratorio di Programmazione
Process synchronization
Array e Stringhe Linguaggio C.
Array (vettori) In linguaggio C / C++.
Process synchronization
Programmazione e Laboratorio di Programmazione
Process synchronization
Process synchronization
Transcript della presentazione:

Recap su: array e puntatori Process synchronization Operating System Recap su: array e puntatori Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 26 Maggio 2016 © 2005 William Fornaciari

C-hackathon Quando: 21 Giugno A che ora: 1.30pm – 5pm Dove Sala conferenze @ DEIB Edificio 20, Via Ponzio 34/5

Sui codici a lunghezza fissa

Sui codici a lunghezza fissa

Sui codici a lunghezza fissa

Sui codici a lunghezza fissa

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

Problema 1 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 studente studenti[5]; Dopo aver definito studente Dobbiamo creare 5 studenti studente studenti[5];

P1: recuperare i cognomi

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

P1: recuperare i cognomi 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);

P1: recuperare i cognomi 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;

P1: recuperare i cognomi 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

P1: recuperare i cognomi 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);

P1: recuperare i cognomi 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;

P1: recuperare i cognomi 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

P1: recuperare i cognomi 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);

P1: recuperare i cognomi 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;

P1: recuperare i cognomi 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

P1: recuperare i cognomi

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 Iniziamo ad ipotizzare una soluzione 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… NO!!! 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++)

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? j=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 j=0: 1 > 2? No, non faccio nulla: 1, 2, 3, 4 j=1: 2 > 3? j=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?

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

Sotto-problemi Si scriva in C un programma che, recuperato un cubo di caratteri, dice quante ‘a’ vi sono contenute. La dimensione del cubo è: 3x2x4 Sotto-problemi P0: cubo di caratteri P1: Popolare il cubo di caratteri P2: Contare le ‘a’

Cubo di caratteri La dimensione del cubo è: 3x2x4 #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]

Matrice (array di array) in memoria char data[dx]; array di dx char (dx:3) char data[dx][dy]; array di dx array (dx:3) array di dy char (dy:2) [0] [0] data[0][0] data[0][1] [1] [1] data[1][0] [0] data[1][1] [1] data[2][0] [2] [0] data[2][1] [1]

Un array 3D char data[dx][dy][dz] char data[dx]; array di dx char 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)

In memoria, macchina a 32bit, e.g. x86 char data[dx][dy][dz] dx:3, dy:2, dz:4 [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[0][1][0] data[1][1][1] data[0][1][1] data[1][1][2] data[0][1][2] data[1][1][3] 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);

int foo2(char p[][dy][dz], char x); 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

Fonti per lo studio + Credits Tutte le slide precedenti del corso di IEIM 2013/2014