Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio:esercitazioni:esercitazione1bis

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)) 
informatica/sol/laboratorio/esercitazioni/esercitazione1bis.txt · Ultima modifica: 25/02/2010 alle 10:22 (15 anni fa) da Susanna Pelagatti