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)
Dato un numero x e un vettore di numeri V diciamo che x è catturato da V se esistono due indici i < j tali che V[i] < x < V[j] e V[j] - V[i] <= 1. Scrivere una funzione int catch(float A[], float V[], int n) che ritorna il numero di elementi del vettore A che sono catturati dal vettore V (n è la dimensione dei due vettori). Ad esempio, se A = [6.9, -1, 7.1, -1, 0] e V = [-1.5, 7, -0.5, 7.7, 6], la funzione ritorna 3 (gli elementi catturati sono -1, 7.1 e -1).
Esercizio 2 (max 8 punti)
Scrivere una funzione int repstr(char *s, int k) che ritorna il numero di caratteri distinti che si ripetono almeno k volte nella stringa s. Ad esempio, se s = "le mele non sono solo rosse" e k = 3, allora la funzione ritorna 6. Infatti, i caratteri che si ripetono almeno 3 volte sono ' ', 'l', 'e', 'n', 'o', 's'.
Esercizio 3 (max 10 punti)
Scrivere una funzione char *factors(char *str, int k) che ritorna, in una stringa allocata dinamicamente, la concatenazione delle sottostringhe distinte di lunghezza k della stringa str separate dal carattere '_'. Ad esempio, se str = "aaabaaab" e k = 3, allora la funzione ritorna la stringa "aaa_aab_aba_baa".
SECONDA PARTE
Esercizio 4 (max 6 punti)
Si consideri il seguente tipo:
typedef struct Num {
    float       value;
    struct Num* next;
} Num, *NList;
Scrivere una funzione NList delsup(NList L) che elimina dalla lista L il primo elemento il cui valore (il campo value) è maggiore od uguale ai valori di tutti gli elementi che lo seguono nella lista. La funzione ritorna la lista modificata e non deve creare nuovi elementi. Ad esempio, se la lista L è 2 -> 5 -> 1.3 -> 5 -> 4 allora la lista modificata dalla funzione è 2 -> 1.3 -> 5 -> 4, se invece L è 2 -> 5 -> 4 -> 6 allora la lista modificata è 2 -> 5 -> 4.
Esercizio 5 (max 8 punti)
Scrivere una funzione float **fileToMatrix(char *fname, int *pdim) che legge dal file, di tipo testo, il cui nome è dato dalla stringa fname una matrice quadrata di numeri in virgola mobile, ritorna una matrice di float, allocata dinamicamente, riempita con i valori letti dal file e restituisce in *pdim la dimensione della matrice. Il file contiene un intero n che rappresenta la dimensione della matrice e poi separati da spazi i valori della matrice ordinati per righe (i primi n costituiscono la prima riga, i successivi n la seconda riga e così via). Il file quindi contiene l'intero n e poi n*n numeri in virgola mobile (float). Gli elementi della matrice ritornata si devono poter accedere tramite la sintassi delle parentesi quadre. Ad esempio, se il file contiene:
4 0.5 1.4 3 -6 3.6 1 2 6 0.7 4 6 8 11 12 4 7
cioè una matrice 4x4, allora la funzione crea e ritorna la seguente matrice:
0.5 1.4   3  -6
3.6   1   2   6 
0.7   4   6   8 
 11  12   4   7
e restituisce in *pdim il valore 4.
Esercizio 6 (max 10 punti)
Si consideri il seguente tipo:
typedef struct Elem {
    long         val;
    char *       str;   // stringa allocata dinamicamente
    struct Elem *next;
} Elem, *List;
Scrivere una funzione List join(List A, List B) che modifica la lista A in modo tale che per ogni elemento x se x.val è diverso da tutti i valori dei campi val degli elementi di B allora x è eliminato da A, altrimenti il campo str di x diventa la concatenazione della stringa originale con tutte le stringhe dei campi str degli elementi di B che hanno il valore del campo val uguale a x.val. La funzione ritorna la lista modificata e non deve modificare la lista B. Ad esempio, se le liste di input sono:
A = {2, "Tara"} -> {1, "Pietra"} -> {2, "Casa"} -> {1, "Gioco"} -> {4, "Albero"}
B = {5, "Mela"} -> {1, "Mulo"} -> {4, "Campo"} -> {1, "Erba"}
allora la funzione modifica la lista A così:
{1, "PietraMuloErba"} -> {1, "GiocoMuloErba"} -> {4, "AlberoCampo"}