Fondamenti di Programmazione     a.a. 2011-2012
Prova scritta - 19 settembre 2012
Avvertenze: non usare variabili globali; definire tutte le funzione ausiliarie usate; è consentito usare le funzioni della libreria standard; se una soluzione non è scritta in modo chiaro ed ordinato non sarà presa in considerazione.
Esercizio 1 (max 11 punti)
typedef struct SE {
    char *     name;          //stringa allocata dinamicamente
    struct SE *next;
} SE, *SL;
Scrivere una funzione SL rot(SL L, int k) che ruota a sinistra di k posizioni la lista L e ritorna il puntatore alla lista ruotata. Se k è maggiore della lunghezza della lista, la funzione ritorna NULL. Ad esempio, se k = 3 e la lista di input è "Aria"→"Bolla"→"Cielo"→"Duna"→"Eco", allora la funzione la modifica così "Duna"→"Eco"→"Aria"→"Bolla"→"Cielo".
Esercizio 2 (max 13 punti)
Scrivere una funzione int maxpref(char *pre, char *txt) che presi in input i nomi di due file di testo ritorna la lunghezza del più lungo prefisso del file pre che è contenuto nel file txt. Un prefisso è una qualsiasi sottostringa (sequenza di caratteri consecutivi) che inizia all'inizio del file. Ad esempio, se il contenuto del file pre è
prefisso non significa fisso
e il contenuto del file txt è
il prefisso non segna l'inizio
allora la funzione ritorna 14 (il prefisso più lungo è "prefisso non s").
Esercizio 3 (max 14 punti)
typedef struct Task {
    char         name[20];  //contiene stringa di lunghezza < 20
    int          hh;        //ore: 0 - 23
    int          mm;        //minuti: 0 - 59
    int          ss;        //secondi: 0 - 59
    struct Task *next;
} Task, *TList;
Scrivere una funzione char **tasks(TList *pL, int hh, int mm, int ss, int *dT) che elimina dalla lista *pL tutti i Task che hanno l'orario antecedente all'orario di input (hh,mm,ss), assumendo che tutti gli orari si riferiscano allo stesso giorno. La funzione restituisce in *pL il puntatore alla lista modificata, ritorna in un array allocato dinamicamente i nomi (contenuto dei campi name) dei Task eliminati e in *dT restituisce il numero di tali Task. La memoria dei Task eliminati deve essere rilasciata. Ad esempio, se la lista è
{"T7",7,34,40}→{"T3",14,21,7}→{"T5",5,56,58}→{"T12",7,34,41} 
e l'orario di input è (7,34,41), allora la lista modificata e l'array ritornato sono i seguenti:
{"T3",14,21,7}→{"T12",7,34,41}      ["T7", "T5"]