====== Esercitazione 1bis ======
Dove si approfondiscono alcune caratteristiche del C sequenziale: puntatori, puntatori a funzione, librerie e macro con parametri.
===== 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
\param l 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
$ gcc -Wall -pedantic -c lista.c
* Creare la libreria con i lcomando ''ar'' come segue
$ ar -r libList.a lista.o
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
$ gcc -Wall -pedantic main.c -lList -L.
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'').
.
===== Esercizio 4: Macro con parametri, macro di somma =====
Usare le macro con parametri per definire una macro che somma (operatore +) i propri argomenti
#define SOMMA(X,Y,Z) ......
e testarla in un opportuno main. Valutare le differenze con una funzione di prototipo
int SOMMA(int X,int Y, int Z);
===== Esercizio 5: Macro con parametri, macro fattoriale =====
Scrivere una macro con parametri che calcoli il fattoriale di un numero N, passato come parametro e ne stampi il risultato. Ad esempio, posso utilizzare la macro per calcolare il fattoriale di 4+1 con
FATTORIALE(4+1)
La macro non deve fare assunzioni su come verranno passati i parametri.
Che accade annidando due chiamate della macro? Ad esempio
FATTORIALE(FATTORIALE(4+1))