Questa è una vecchia versione del documento!
Esercitazione 9
In alcuni degli esercizi che seguono (quando richiesto) si utilizzi la seguente definizione di tipo “lista di interi”:
typedef struct El { int info; struct El *next; } ElementoListaInt; typedef ElementoListaInt* ListaDiInteri;
Inoltre, dove c'è bisogno di allocazione dinamica della memoria, dovete assicurarvi di deallocare SEMPRE tutta la memoria allocata. Per verificarlo potete usare valgrind se correttamente installata sul vostro computer.
Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari.
Per fare questo procedere come segue:
- compilare il file da verificare con opzione -g per includere le informazioni di debugging. Ad esempio se il mio file si chiama main.c posso compilare con
bash$ gcc -Wall -pedantic -g -o prova main.c
- eseguire
bash$ valgrind ./prova
in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio,
invalid read
o
invalid write
sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. valgrind contiene moltissime opzioni, invitiamo gli studenti interessati ad esplorarle partendo dal sito
http://valgrind.org/
Ricordate infine che dovete includere la libreria stdlib.h per la gestione della memoria dinamica.
Esercizio 1
Definire un nuovo tipo di dato capace di rappresentare una data. Scrivere poi delle opportune funzioni/procedure che:
- ricevuta una data la aggiorni al giorno successivo (ignorando gli anni bisestili);
- ricevute due date verifichino che la prima preceda la seconda;
- ricevute due date, ritornino la differenza in anni fra la prima e la seconda.
Esercizio 2
Scrivere un nuovo tipo di dato coppia di interi. Inizializzare tre istanze di coppie con i primi tre numeri naturali e i loro doppi.
Esercizio 3
Scrivere un programma che crei dinamicamente una lista di 3 interi e li inizializzi con valori chiesti all'utente e stampi la lista a video in questo modo:
1 -> 9 -> 3 //
Il programma deve deallocare correttamente la lista prima di uscire, verificare con valgrind che questo sia avvenuto (se correttamente installato sul vostro pc).
Esercizio 4
Scrivere un programma che chieda all'utente un numero N e crei una lista con N elementi, inizializzata con i primi N naturali.
Il programma deve deallocare correttamente la lista prima di uscire,verificare con valgrind che questo sia avvenuto (se correttamente installato sul vostro pc).
11) Scrivere un programma che, creata una lista di interi come nell'esercizio precedente, calcoli e stampi la sua lunghezza percorrendo la lista dall'inizio alla fine. Ricordarsi di deallocare la lista prima di uscire dal main (e verificare con valgrind che questo sia avvenuto, vedi n
In alcuni degli esercizi che seguono (quando richiesto) si utilizzi la seguente definizione di tipo “lista di interi”: typedef struct El { int info; struct El *next; } ElementoListaInt; typedef ElementoListaInt* ListaDiInteri; Inoltre, dove c'è bisogno di allocazione dinamica della memoria, dovete assicurarvi di deallocare SEMPRE tutta la memoria allocata. Per verificarlo potete usare valgrind se correttamente installata sul vostro computer. Questo strumento permette fra l'altro di capire se tutte le variabili sono inizializzate prima del loro uso, se accediamo a memoria gia' deallocata o mai allocata e situazioni similari. Per fare questo procedere come segue: • compilare il file da verificare con opzione -g per includere le informazioni di debugging. Ad esempio se il mio file si chiama main.c posso compilare con bash$ gcc -Wall -pedantic -g -o prova main.c • eseguire bash$ valgrind ./prova in questo modo, a schermo verranno riportare le infrazioni rilevate. Ad esempio, invalid read o invalid write sono accessi in lettura o scrittura a memoria non allocata o gia' deallocata. valgrind contiene moltissime opzioni, invitiamo gli studenti interessati ad esplorarle partendo dal sito http://valgrind.org/ . Ricordate infine che dovete includere la libreria stdlib.h per la gestione della memoria dinamica.
1) Scrivere una funzione stampaLista che ricevuta una ListaDiInteri, la stampi a video in questo modo: 1 → 2 → 3 → 4 → / / Usare questa funzione per verificare le funzioni dei prossimi esercizi. 2)Scrivere una procedura che, data una lista di interi, restituisca l'i-esimo elemento della lista stessa. 3)Definire una funzione (fornirne due versioni, una iterativa e una ricorsiva) lunghezzaLista che dat una ListaDiInteri, restituisca la sua lunghezza.