Questa è una vecchia versione del documento!
Indice
Esercitazione 1bis
Dove si approfondiscono alcune caratteristiche del C sequenziale.
Esercizio 1: 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;
e definire le seguenti funzioni che operano sulla lista
/** crea una lista vuota \returns il puntatore alla lista */ lista newList (void); /** dealloca la lista */ void freeList (lista l); /** iserisce n nella lista l creando un nuovo nodo \param l la lista \param n elemento da inserire \returns puntatore alla nuova lista */ lista insertList (lista l, int n); /** cancella n dalla lista (se c'e') \param l la lista \param n elemento da cancellare \returns puntatore alla nuova lista */ lista removeList (lista l, int n);
Testare il funzionamento delle funzioni implementate con un opportuno main().
Esercizio 2: 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 l); /** combina gli elementi della lista l usando un operatore binario associativo \param l la lsita \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 f en) */ int reduceList(int (*f) (int,int), int en, lista l);
Testare il risultato con un opportuno main.
Esercizio 3: Libreria di liste
Realizzare una libreria che fornisce le operazioni su liste implementate negli esercizi 1 e 2. In C tipicamente per realizzare una libreria si difinisce un file .h con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice in un opportuno file di libreria .a.
Nel nostro caso l'header si chiamera' lista.h' e la libreria si chiamera'
libList.a.
Procedere nel modo seguente:
* Definire un file
lista.h che contiene i tipi ed i prototipi delle funzioni implementate negli esercizi 1 e 2.
* Definire un file
lista.c che contiene il codice che implementa le funzioni.
* Generare il modulo oggetto
lista.o da inserire nella libreria con il comando
gcc come segue
<code>
$ gcc -Wall -pedantic -c lista.c
</code>
* Creare la libreria con i lcomando
ar come segue
<code>
$ ar -r libList.a lista.o
</code>
Quando la creazione e' andata a buon fine creare un file
main.c che contenga uno dei main di test sviluppati negli esercizi precedenti e compilarlo utilizzando la libreria. In particolare :
* il main di test dovra' includere il file
lista.h
* in fase di compilazione utilizzare la libreria sviluppata con
<code>
$ gcc -Wall -pedantic main.c -lList -L.
</code>
dove l'pzione
-l indica il nome della libreria da usare in fase di linking e l'opzione
-L specifica la directory dove cercarla (oltre alle directory standard tipo
/usr/lib''
Definire due opportuni file lista.h e lista.c e testarli con il file mainListe.c usando il seguente Makefile.
Esercizio 4: Marco con parametri, macro di somma
Esercizio 3 Usare la perror() per stampare i messaggi di errore relativi a ENOENT, EIO ed EPERM.
un tipo di dato astratto che realizza liste concatenate di interi. Tipicamente in C un TDA e' costituito da un file xxx.h che contiene la specifica del tipo e delle funzioni disponibili per operare su quel tipo e da una corrispondente file xxx.c che implementa la funzioni stesse.
Chi deve usare il tipo include il file .h e linka
===== Esercizio 1: =====Esercizio 2.(macro con parametri)
Scrivere una macro con parametri che calcoli il fattoriale di un numero N, passato come parametro e ne stampi il risultato. Es.
FATTORIALE(4+1)
La macro non deve fare assunzioni su come verranno passati i parametri. Che accade annidando due chiamate della macro? Es.
FATTORIALE(FATTORIALE(4+1))