====== Esercitazione 1 ====== Dove si richiama il C sequenziale: in particolarere puntatori, strutture ricorsive, puntatori a funzione. Poi si introduce con un esempio il concetto di libreria (che verra' approfondito nelle lezioni di teoria) e si fa la conoscenza con il debugger. ===== Esercizio 1: sul debugging ===== Usare il debugger [[http://www.gnu.org/software/ddd/manual/|ddd]] per trovare cosa non va nel seguente programma C: #include #include #include #include #define N 5 int a[N]; int i; int main(void) { srand(time(NULL)); i=0; while (i in pratica il codice, salvato in "file.c" compilato con gcc -Wall -pedantic -o ese file.c ed eseguito con $ ./ese va inspiegabilmente in ciclo all'interno del ciclo. Per eseguire in modalita' interattiva di debugging: * Compilare con opzione "-g", ad esempio gcc -Wall -pedantic -g -o ese file.c * lanciare l'eseguibile usando il debugger come in $ ddd ./ese a questo punto e' possibile fermare il programma durante la sua esecuzione, ispezionare le variabili etc.. //Elaborazione//: Per i solutori piu' che abili, provare a trovare cosa non va nel programma C che risolve il problema dell' [[http://it.wikipedia.org/wiki/Gioco_della_vita|Game of life]] in {{esempi-debug.tar|esempi.tar}} ===== Esercizio 2: liste concatenate di interi ===== Implementare in C le seguenti funzioni che lavorano su liste concatenate di interi di tipo typedef struct nodo { int valore; struct nodo * next; } nodo; typedef nodo * lista_t; e definire le seguenti funzioni che operano sulla lista /** crea una lista vuota \retval NULL il puntatore alla lista vuota */ lista_t newList (void); /** dealloca la lista \param l la lista */ void freeList (lista_t l); /** iserisce n nella lista l creando un nuovo nodo \param l la lista \param n elemento da inserire \retval p puntatore alla nuova lista se l'allocazione ha avuto successo \retval NULL in caso di errore */ lista_t insertList (lista_t l, int n); /** cancella n dalla lista (se c'e') \param l la lista \param n elemento da cancellare \retval p puntatore alla nuova lista */ lista_t removeList (lista_t l, int n); /** salva la lista su file (formato testuale o binario a scelta dello studente) \param f file su cui salvare la lista (gia' aperto) \param l puntatore alla testa della lista \retval -1 se si e' verificato un errore \retval 0 se tutto e' andato bene */ int saveList (FILE* f, lista_t l); /** legge la lista da file (formato testuale o binario a scelta dello studente) \param f file da cui leggere la lista (gia' aperto) \retval NULL se si e' verificato un errore \retval p puntatore alla testa della lista se tutto e' andato bene */ lista_t readList (FILE* f); Testare il funzionamento delle funzioni implementate con un opportuno ''main()''. ===== Esercizio 3: map e reduce su liste ===== Usando le liste dell'esercizio 1 implementare le seguenti funzioni: /** trasforma una lista applicando ad ogni elemento la funzione f \param l la lista \param f la funzione da mappare */ void mapList (int (*f) (int), lista_t l); /** combina gli elementi della lista l usando un operatore binario associativo \param l la lista \param f l'operatore binario \param en l'elemento neutro di f \return la 'somma' degli elementi di l secondo f (l1, f ( l2 , f (... f (lN, en)))...))*/ int reduceList(int (*f) (int,int), int en, lista_t l); Testare il risultato con un opportuno ''main''.