Esame Di Programmazione (Mod A) - CDL Aida: Gcaravagna@Units - It
Esame Di Programmazione (Mod A) - CDL Aida: Gcaravagna@Units - It
1 Istruzioni
L’appello contiene 6 esercizi (A1, A2, A3, B1, B2, B3) da risolvere in 3 ore. Il template si trova su Moodle in formato
ZIP, su Moodle dovete carica la vostra soluzione.
Importante. A1, A2 e A3 sono di sbarramento e permettono di raggiungere 18/30. B1, B2 e B3 valgono fino al
raggiungimento del voto massimo di 30/30.
Risoluzione degli esercizi di sbarramento. Usando repl.it, risolvete l’esercizio partendo dal file main.c e testate
il codice con i comandi make test1, make test2 e make test3. Prima di ogni test ricordatevi di digitare make clean.
[i, j] e [t, u]
per cui si vuole calcolare la dimensione dell’intersezione I = |[i, j] ∩ [t, u]|. Per esempio, gli intervalli [1, 5] e [3, 12]
hanno sovrapposizione [3, 5] = {3, 4, 5} e quindi dimensione 3.
Il calcolo della dimensione deve essere fatto iterativamente utilizzando una funzione is_inside(x, y, z) che resti-
tuisce 0 se x ∈ [y, z], e −1 altrimenti.
A2. Si scriva un programma C iterativo che calcoli, per un dato n ≥ 1 in input, la successione di interi
a1 = 0
a2 = 0
an = (an−2 + an−1 − 1)(n + 1) con n ≥ 3 se an−1 > 2an−2
an = (an−2 − an−1 + 1)(an−2 + 1)2 con n ≥ 3 altrimenti.
nFn−2
F0 = 1 F1 = 100 Fn = nFn−1 − n≥2
2
∑N
e la quantita F = i=1 Fxi calcolata a partire da un array x di N valori non negativi x1 , x2 , . . ., xN .
Si scriva un programma C che dato x calcoli F iterativamente e ogni Fi ricorsivamente. Per esempio, se x = [1, 2, 0]
allora F = F1 + F2 + F1 ; F1 , F2 ed F1 sono ricorsive, il prodotto iterativo.
3 Esercizi opzionali
3.1 Es. B1 (6 punti)
In C, si vogliono definire liste linkate che possono memorizza un array di interi in ciascun loro elemento; si desidera
inoltre permettere agli array di avere dimensione variabile, e.g., una lista potrebbe essere
// struttura
struct elemento{
// dato memorizzato
...
// puntatore
struct elemento * next;
};
// tipi
typedef struct elemento ElementoDiLista;
typedef ElementoDiLista * ListaDiElementi;
dove i) ntot restitutisce il numero totale degli elementi inseriti nella lista (somma del numero di elementi in ciascun
array contentuto), e ii) largest che restituisce il numero massimo di elementi contenuti in un elemento delle lista.
Ad esempio (dopo la init)
// funzione ausiliaria
int f(int x){
return(x+6); // A
}
int x = 6;
int y = x + 1; // B
y = f(y);
int * z = y;
z = f(*z - y) // C
Si rappresenti la memoria del programma ai punto A, B e C. Si noti che A viene eseguito 2 volte.