Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.

Documenti analoghi
Stringhe e allocazione dinamica della memoria

Strutture. Una dichiarazione struct definisce un nuovo tipo. - Può essere seguita da una lista di variabili.

Allocazione dinamica della memoria

Esercitazione 11. Liste semplici

La programmazione nel linguaggio C. Liste

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Allocazione dinamica della memoria

L'Allocazione Dinamica della Memoria nel linguaggio C

Il linguaggio C. Puntatori e dintorni

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Liste concatenate e allocazione dinamica

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Uso avanzato dei puntatori Allocazione dinamica della memoria

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Il linguaggio C Strutture

Il linguaggio C Strutture

Laboratorio di algoritmi e strutture dati

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Lezione 8: Stringhe ed array multidimensionali

L Allocazione Dinamica della Memoria

Corso di Fondamenti di Programmazione canale E-O. Strutture. Strutture. Definizione di strutture (2) Definizione di strutture (1)

Corso di Informatica A.A

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Allocazione dinamica della memoria (2)

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Puntatori. Fondamenti di Programmazione

Definizione di classi. Walter Didimo

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Introduzione al linguaggio C Puntatori

Gestione dinamica della memoria

PUNTATORI. Ivan Lanese

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Politecnico di Milano. Strutture dati dinamiche

dott. Sabrina Senatore

Lezione 8 Struct e qsort

Aritmetica dei puntatori

i Vettori Alessandra Giordani Lunedì 15 aprile

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

L'allocazione dinamica della memoria

L'allocazione dinamica della memoria

Lezione 6 Struct e qsort

Fondamenti di Informatica T. Linguaggio C: i puntatori

Strutture Dinamiche. Fondamenti di Informatica

Una breve introduzione all implementazione in C di algoritmi su grafo

Linguaggio C: PUNTATORI

C: panoramica. Violetta Lonati

Esercitazione di Reti degli elaboratori

&v restituisce l indirizzo della zona di memoria allocata per v.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Laboratorio di programmazione

Esercizio 1 Conta degli elementi distinti (file esercizio1.c e leggi.h/leggi.c - 15 punti)

Laurea In Ingegneria dell Informazione. Esercitazioni Guidate di Tecniche della Programmazione

Strutture Dati Dinamiche

Dispensa di Informatica II.6

Trasformare array paralleli in array di record

Stringhe. Stringhe costanti. t[0] t[1] t[2] t[3] t[4] s o l e \0. Esempio. char t[5] = { l, u, n, a, \0 }; definisce l array

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Strutture Dinamiche. Strutture Dinamiche

Le strutture. UNIVERSITÀ DEGLI STUDI DEL SANNIO Benevento DING DIPARTIMENTO DI INGEGNERIA

ESEMPIO: Ordinamento di parole in un testo

Strutture dati dinamiche in C. Emilio Di Giacomo

Trasformare array paralleli in array di record

Informatica ed Elementi di Informatica Medica

Trasformare array paralleli in array di record

Liste concatenate. Violetta Lonati

Sono variabili il cui valore corrisponde ad un indirizzo di memoria. Puntatori

Liste concatenate e allocazione dinamica

Fondamenti di Informatica e Laboratorio T-AB Prova Pratica - 16 Giugno 2009 Compito A

Fondamenti di Informatica T-1 Modulo 2

Introduzione al C Lez. 4

Lezione 20: Tipi derivati: struct e union

Parte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1

Corso di Informatica A.A

Puntatori e array. Violetta Lonati

Esercitazione 12. Esercizi di Ricapitolazione

Matrici. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Dati aggregati. Violetta Lonati

Il puntatore. Il puntatore

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Opinione calcolamedia( ) Opinione inverti( )

Previously on TDP. LISTA rappresentata mediante "struct e puntatori" TipoLista lis. Dichiarare DISEGNARE e. DISEGNARE aux.

Lezione 8: I Puntatori

Diversi modi di rappresentare sequenze di elementi

Quando è necessario elaborare una certa quantità di dati omogenei si possono usare variabili indicizzate: int a0, a1, a2;

Lezione 12: Allocazione Dinamica della Memoria

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Utilizzo delle Maschere in Microsoft Access

VARIABILI AUTOMATICHE E DINAMICHE. Manuale linguaggio C

Transcript:

Consideriamo l esercizio assegnato la scorsa lezione per rappresentare il libretto di uno studente. Per memorizzare i dati si sono utilizzati tre array: char* nomiesami[max ESAMI] Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). int cfu[max ESAMI] Array con i crediti degli esami. int voti[max ESAMI] Array con i voti degli esami. Vogliamo ora migliorare la rappresentazione usando un unico array esami.

La struttura esame Un esame può essere rappresentato da una terna ( nome, cfu, voto ) dove nome è il nome dell esame (una stringa), cfu sono i crediti (un intero) e voto è il voto (un intero). Per rappresentare un esame usiamo la struttura struct esame, avente i tre campi nome, cfu e voto. struct esame{ char *nome; int cfu; int voto; }; // nome // crediti // voto Il campo nome è un puntatore all array di char contenente il nome dell esame.

L array esami Per memorizzare gli esami usiamo il seguente array esami: struct esame* esami[max_esami]; Per ogni k 0, esami[k] punta a una struttura che rappresenta il k-esimo esame inserito. La struttura associata a un esame va creata dinamicamente usando calloc.

L array esami Esempio Supponiamo che gli esami inseriti siano ("mat 1", 12, 28) ("prog 1 ", 12, 26) ("fisica", 6, 27) Allora: esami[0] punta a una struttura che rappresenta l esame il cui nome è "mat 1", i crediti sono 12 e il voto 28; esami[1] punta a una struttura che rappresenta l esame il cui nome è "prog 1", i crediti sono 12 e il voto 26; esami[2] punta a una struttura che rappresenta l esame il cui nome è "fisica", i crediti sono 6 e il voto 27.

L array esami 12 28 m a t 1 \0 esami[0] esami[1] esami[2]... 12 26 6 27 p r o g 1 \0 f i s i c a \0

La funzione newesame La funzione struct esame* newesame(char* nome, int cfu, int voto) crea una nuova struttura che rappresenta un esame il cui nome, crediti e voto sono specificati dai parametri e restituisce l indirizza della nuova struttura. Le operazioni da compiere sono: Creazione di una nuova struttura di tipo struct esame. Occorre definire una variabile newes per memorizzare l indirizzo della nuova struttura (notare che newes deve avere tipo struct esame*). struct esame* newes; newes = malloc(sizeof(struct esame)); Ora newes punta alla struttura creata da malloc.

La funzione newesame Inizializzazione dei campi della nuova struttura. Per i crediti e i voti occorre eseguire gli assegnamenti newes->cfu = cfu; newes->voto = voto; L espressione newes->cfu equivale a (*newes).cfu e denota il campo cfu della struttura a cui newes si riferisce. La prima istruzione assegna al campo cfu della nuova struttura il valore di cfu (secondo parametro della funzione). La seconda istruzione assegna al campo voto della nuova struttura il valore di voto (terzo parametro della funzione).

La funzione newesame Per inizializzare il campo nome della nuova struttura, occorre creare dinamicamente un nuovo array, da assegnare a newes->nome, e copiare in esso il nome dell esame (stringa a cui punta il parametro nome della funzione). newes->nome = calloc(strlen(nome)+1, sizeof(char)); strcpy(newes->nome, nome); Infine, la funzione deve restituire l indirizzo della nuova struttura (valore della variabile newes). return newes;

La funzione newesame struct esame* newesame(char* nome, int cfu, int voto){ struct esame* newes; newes = malloc(sizeof(struct esame)); newes->nome = calloc(strlen(nome)+1, sizeof(char)); strcpy(newes->nome, nome); newes->cfu = cfu; newes->voto = voto; return newes; }

Lettura e inserimento di un esame Per leggere un esame occorre compiere le seguenti operazioni: Vanno letti da standard input nome, crediti e voto dell esame. Per leggere il nome dell esame (che può contenere spazi) va usata una apposita funzione, ad esempio la funzione readesame definita la scorsa lezione. Quando i dati relativi a un esame sono stati letti, va creata una nuova struttura esame usando la funzione newesame in cui vanno inseriti i dati letti. Occorre assegnare poi a esame[k] l indirizzo della nuova struttura (k vale inizialmente 0 e va incrementato dopo ogni inserimento).

La funzione main int main(void){ struct esame* esami[max_esami]; char nome[max_len + 1]; // array usato per leggere il nome di un esame int c,k,cfu,voto; c = getchar(); // leggi il primo carattere k = 0; while( c!= q ){ // termina quando viene letto q switch(c){ case + : // inserisci un esame readesame(nome); // legge il nome dell esame scanf("%d%d", &cfu, &voto ); esami[k] = newesame(nome,cfu,voto); k++; break; case p :... // stampa libretto }// end switch c = getchar(); // leggi prossimo carattere }// end while return 0; }// end main

Esempio di esecuzione Supponiamo che l esame da inserire sia ("mat 1", 12, 28). Nella funzione main, dopo la lettura dei dati di input viene eseguita la chiamata newesame(nome,cfu,voto) Il primo argomento è l indirizzo dell array nome definito in main, che contiene il nome dell esame; Il secondo argomento è 12 (valore variabile cfu di main); Il terzo argomento è 28 (valore variabile voto di main).

Esempio di esecuzione newesame nome cfu 12 voto 28 newes main nome[0] m nome[1] a nome[2] t nome[3] nome[4] 1 nome[5] \0... esami[0] esami[1]...

Esempio di esecuzione Viene creata una nuova struttura esame e assegnata a newes newesame nome cfu 12 voto 28 newes main nome[0] m nome[1] a nome[2] t nome[3] nome[4] 1 nome[5] \0... esami[0] esami[1]...

Esempio di esecuzione L istruzione newes->nome = calloc(strlen(nome)+1,sizeof(char)); crea un nuovo array di 6 elementi ( strlen("mat 1") vale 5) e il suo indirizzo viene assegnato a newes->nome (ossia, al campo nome della struttura a cui la variabile newes punta). L istruzione strcpy(newes->nome, nome); copia nel nuovo array la stringa "mat 1". Infine, le istruzioni newes->cfu = cfu; newes->voto = voto; assegnano ai campi cfu e voto dell nuova struttura i valori delle variabili (parametri) cfu e voto definite in newesame.

Esempio di esecuzione newesame nome cfu 12 voto 28 newes m a t 1 \0 main nome[0] m nome[1] a nome[2] t nome[3] nome[4] 1 nome[5] \0... esami[0] esami[1]... 12 28

Esempio di esecuzione La funzione newesame termina l esecuzione con l istruzione return newes; che restituisce il valore della variabile newes, ossia l indirizzo della nuova struttura. Il controllo ritorna alla funzione main che completa l esecuzione dell istruzione esami[k] = newesame(nome,cfu,voto); // k vale 0 assegnando a esami[0] l indirizzo restituito dalla chiamata a newesame.

Esempio di esecuzione newesame nome cfu 12 voto 28 newes m a t 1 \0 main nome[0] m nome[1] a nome[2] t nome[3] nome[4] 1 nome[5] \0... esami[0] esami[1]... 12 28

Esempio di esecuzione Quando il record di attivazione di newesame è tolto dalla memoria, l array esami è: esami[0] esami[1] esami[2]... 12 28 m a t 1 \0 Esercizio Scrivere il codice della funzione printlibretto(esami, int n) che, dato l array degli esami come primo parametro e il numero n di esami sostenuti come secondo parametro, stampa il libretto.

Deallocazione della memoria Supponiamo di voler cancellare l esame appena inserito. Occorre rilasciare la memoria precedentemente allocata tramite le funzioni malloc e calloc in modo che possa essere riutilizzata per successive allocazioni. La chiamata free(p) rilascia la memoria a cui punta p. Si assume che il valore di p sia l indirizzo di un blocco di memoria precedentemente allocato tramite malloc o calloc.

Deallocazione della memoria Esempio La chiamata free(esami[0]) rilascia lo spazio di memoria occupato dalla struttura a cui esami[0] si riferisce m a t 1 \0 esami[0] esami[1] esami[2]...

Deallocazione della memoria Come si nota dalla figura, ci sono due problemi: (1) esami[0] contiene un indirizzo di memoria non più in uso (dangling reference). (2) È rimasto allocato in memoria il vettore usato per rappresentare la stringa "mat 1" a cui ora non è più possibile accedere. Per risolvere (1) si può porre esami[0] = NULL; // NULL e l indirizzo 0 che segnala che esami[0] non contiene alcun indirizzo valido Il punto (2) non è invece risolubile in quanto non è più noto l indirizzo del blocco di memoria da deallocare.

Deallocazione della memoria Il modo corretto di rilasciare tutta la memoria usata per rappresentare esami[0] è quello di rilasciare prima la memoria occupata dall array contenente la stringa "mat 1" e successivamente la memoria occupata dalla struttura. free(esami[0]->nome); free(esami[0]); esami[0] = NULL; Esercizio Aggiungere al programma un operazione che permetta di eliminare l esame in posizione k. Occorre poi modificare la funzione printlibretto facendo in modo che non vengano stampati gli elementi dell array esami (primo argomento della funzione) per cui esami[k] è NULL.