Fondamenti di Programmazione    a.a. 2011-2012
Esercizi di preparazione alla prova scritta
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.
Per chi fa solamente una parte: i punteggi degli esercizi sono da intendersi raddoppiati.
Per chi fa entrambe le parti: per raggiungere la sufficienza deve ottenere almeno 8 punti sulla Prima Parte e almeno 8 punti sulla Seconda Parte.

PRIMA PARTE
Esercizio 1 (max 6 punti)
Scrivere una funzione int diffvals(int A[], int B[], int n) che presi in input due array A e B, ognuno di n interi, ritorna il numero di valori distinti che o sono presenti in A ma non in B oppure sono presenti in B ma non in A. Ecco alcuni esempi
A = {1,2,1,3,3}   B = {5,2,2,5,2}   diffvals(A, B, 5) ritorna 3
A = {1,2,3,3}     B = {2,3,1,1}     diffvals(A, B, 4) ritorna 0
A = {1,3,3,1}     B = {2,3,1,2}     diffvals(A, B, 4) ritorna 1
Esercizio 2 (max 8 punti)
Scrivere una funzione int mostfreqstr(char *sA[], int n) che preso in input un array sA di n stringhe, ritorna l'indice della prima occorrenza della stringa con il maggior numero di ripetizioni nell'array. Ecco alcuni esempi
sA = {"s7","s7","g","8b","g","8b","8b","g"}    mostfreqstr(sA, 8) ritorna 2
sA = {"ab","cd","dd"}                          mostfreqstr(sA, 3) ritorna 0
Esercizio 3 (max 10 punti)
Scrivere una funzione char *maxpre(char *s1, char *s2) che ritorna in una stringa, allocata dinamicamente, il più lungo prefisso della stringa s1 che appare come sottostringa della stringa s2. La dimensione del blocco della stringa ritornata non deve essere più grande del necessario. Ecco alcuni esempi
s1 = "la stringa"   s2 = "nella strada"      maxpre(s1, s2) ritorna "la str"
s1 = "stringa"      s2 = "parola"            maxpre(s1, s2) ritorna ""
s1 = "prefisso"     s2 = "il pref"           maxpre(s1, s2) ritorna "pref"
SECONDA PARTE
Esercizio 4 (max 6 punti)
Si consideri il seguente tipo:
typedef struct Elem {
    char *       str;     //stringa allocata dinamicamente
    struct Elem *next;
} Elem, *List;
Scrivere una funzione List copytail(List L, int k) che inserisce una copia dell'ultimo elemento della lista L immediatamente prima del k-esimo elemento della lista e ritorna la lista modificata. Gli elementi sono numerati a partire da 0, se k è maggiore o uguale al numero di elementi della lista, il nuovo elemento è aggiunto in coda. Il nuovo elemento deve avere una copia della stringa del campo str. Se la lista L è "zero" → "one" → "two" → "three" allora
copytail(L, 2) ritorna "zero" → "one" → "three" → "two" → "three"
copytail(L, 0) ritorna "three" → "zero" → "one" → "two" → "three"
copytail(L, 5) ritorna "zero" → "one" → "two" → "three" → "three"
Esercizio 5 (max 8 punti)
Si consideri il seguente tipo:
typedef struct {
    long       value;
    char       descr[30];
} Record;
Scrivere una funzione void insrec(char *fname1, char *fname2, Record rec) che presi in input i nomi di due file binari (nelle stringhe fname1 e fname2), tali che il primo file contiene una sequenza di record di tipo Record ordinata in senso crescente rispetto al campo value, scrive nel secondo file i record del primo file aggiungendovi il record rec inserito in modo da rispettare l'ordinamento. Ad esempio, se il primo file contiene
{3, "vite"} {5, "dado"} {5, "dado2"} {8, "punta"} 
e se rec = {2, "martello"} allora la funzione scrive nel secondo file
{2, "martello"} {3, "vite"} {5, "dado"} {5, "dado2"} {8, "punta"} 
se invece rec = {6, "martello"}, la funzione scrive nel secondo file
{3, "vite"} {5, "dado"} {5, "dado2"} {6, "martello"} {8, "punta"} 
Esercizio 6 (max 10 punti)
Si consideri il seguente tipo:
typedef struct Item {
    long            code;
    struct {
        int d, m, y;
    }               date;
    struct Item *   next;
} Item, *List;
Scrivere una funzione List transfer(List src, int (*tf)(Item *, Item *), List dst) che elimina dalla lista src ogni elemento y per cui esiste un elemento x che precede y e tale che tf(x, y) ritorna vero (cioè, un intero diverso da zero), inoltre inserisce tutti gli elementi eliminati nella lista dst mantenendola ordinata in senso crescente rispetto al campo code e infine ritorna la lista dst. Si assume che la lista di input dst è ordinata. Ad esempio se la funzione tf(x, y) ritorna vero se i due elementi x e y hanno lo stesso valore del campo code e la data di x è posteriore a quella di y e le liste di input sono:
src = {57, {22,2,2011}} → {45, {13,2,2011}} → {57, {18,2,2011}} → 
        → {45, {15,2,2011}} → {45, {8,2,2011}}
dst = {50, {10,1,2011}} → {52, {23,12,2011}} → {80, {27,12,2011}}
allora la funzione transfer(src, tf, dst) le modifica così
src = {57, {22,2,2011}} → {45, {13,2,2011}} → {45, {15,2,2011}}
dst = {45, {8,2,2011}} → {50, {10,1,2011}} → {52, {23,12,2011}} → 
        → {57, {18,2,2011}} → {80, {27,12,2011}}