Esercitazione 4

Esercizio 1. (variante dell'esercizio della scorsa volta) Scrivere un programma C che legge una sequenza di studenti da tastiera nel formato

nome cognome data_di_nascita numero_di_matricola 

(due stringhe di caratteri, seguite da tre interi nel formato gg mm aaaa, e da un altro intero) terminata da EOF (End Of File, ottenibile premendo insieme i tasti di CTRL e D), e li memorizza in una lista di strutture di tipo studente opportunamente definita. La lista deve essere dinamica: ogni volta che si inserisce uno studente bisogna aggiungere un nuovo elemento alla lista stessa. Definire un'apposita funzione di lettura:

void leggi_stud (listastudenti l) 
/* legge gli studenti e li memorizza nella lista l*/

Si richiede inoltre di definire una funzione di ordinamento della suddetta lista, che accetti come parametro una funzione di confronto:

void ordina_stud (listastudenti l, int (* confr) (studente s1, studente s2))
 /* ordina gli studenti in l nell'ordine dipendente dalla funzione confr */

Si richiede di utilizzare la suddetta funzione per ordinare la lista degli studenti in ordine alfabetico, in ordine di matricola, ed in ordine di data di nascita (definire tre opportune funzioni di confronto).

Si richiede infine di stampare la suddetta lista per tre volte, una volta per ognuno degli ordinamenti di cui sopra, utilizzando un'opportuna funzione di stampa.

Suggerimento: Il tipo della lista degli studenti puo' essere il seguente (notare la ridenominazione)
 typedef struct elem {
  studente cont;
  struct elem * next;
} elem;

typedef elem * listastudenti;

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))