Fondamenti di Programmazione     a.a. 2011-2012
Prova scritta - 26 giugno 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 12 punti)
Si consideri il tipo:
typedef struct Elem {
    char *       str;
    struct Elem *next;
} Elem, *List;
Scrivere una funzione List extr(char *sA[], int n, int (*f)(char *)) che preso in input un array sA di n stringhe e il puntatore ad una funzione f, ritorna una lista i cui elementi sono di tipo Elem e che contiene le stringhe s dell'array sA tali che f(s) ha un valore diverso da zero. Le stringhe contenute nella lista ritornata non devono essere allocate. Ad esempio, se f è la funzione che ritorna un valore diverso da zero quando la stringa di input ha lunghezza 4 e sA = ["mela", "limone", "uva", "mela", "pera"] (quindi n = 5), allora la funzione ritorna una lista che contiene le stringhe "mela", "mela", "pera", l'ordine non conta.
Esercizio 2 (max 12 punti)
Si consideri il seguente tipo:
typedef struct {
    long cod;
    char info[10];    //una stringa di lunghezza inferiore a 10
} Rec;
Scrivere una funzione int txt2bin(char *tF, char *bF) che preso in input il nome (dato dalla stringa tF) di un file di testo che contiene una sequenza del tipo C1 S1 C2 S2 ..., dove i Ck sono interi positivi e gli Sk sono stringhe alfabetiche, crea un file binario, con nome dato dalla stringa bF, che per ogni coppia Ck Sk del primo file con lunghezza di Sk inferiore a 10 contiene un record Rk di tipo Rec tale che Rk.cod = Ck e Rk.info = Sk. La funzione ritorna il numero di coppie del file binario. È garantito che gli Sk hanno lunghezza inferiore a 100. Ad esempio, se il primo file contiene:
1203 martello 1305 chiodo 2345 cacciavite 28768 lima
Allora, la funzione crea un file binario che contiene i seguenti record:
{1203, "martello"}, {1305, "chiodo"}, {28768, "lima"}
e ritorna 3.
Esercizio 3 (max 14 punti)
Si consideri il seguente tipo:
typedef struct SElem {
    char *        str;    //stringa allocata dinamicamente
    struct SElem *next;
} SElem, *SList;
Scrivere una funzione SList repcpy(SList L, int k, SList R) che sostituisce il k-esimo elemento della lista L con una copia della lista R e ritorna la lista modificata. Se un tale elemento non c'è, la funzione ritorna la lista L inalterata. Nella copia di R anche le stringhe dei campi str devono essere duplicate. Esempi:
L = blue → gray → green  k = 1  R = red → red  ===>  L = red → red → gray → green
L = blue → gray → green  k = 2  R = red → red  ===>  L = blue → red → red → green
L = blue → gray → green  k = 1  R = NULL       ===>  L = gray → green
L = blue → gray → green  k = 4  R = red → red  ===>  L = blue → gray → green