Prova scritta di Algoritmi e Strutture Dati (primo anno)
(giugno 99)
Esercizio 1 (punti 3)
Consideriamo il seguente codice C:
#include <stdio.h> #define MAX 12 char s[MAX]; main() { int i,m; char c; for ( i=0 ; i<MAX ; i++ ) scanf( "%c", &s[i] ); m = MAX/2; for ( i=0 ; i<m ; i++ ) { c = s[i]; s[i] = s[MAX-i-1]; s[MAX-i-1] = c; } for ( i=0 ; i<MAX ; i++ ) printf( "%c", s[i] ); printf("\n"); }
Domande:
Esercizio 2 (punti 3)
Consideriamo il seguente codice C:
#include <stdio.h> void ppp (int * x, int * y); int fff (int x, int y); main() { int a = 4; int b = 2; int c; c = fff(a,b); printf ("%d, %d, %d\n", a, b, c); ppp(&a, &b); printf ("%d, %d\n", a, b); } void ppp (int * x, int * y) { int i, aux; aux = 1; for (i=0; i<*y; i++) aux = *x * aux; *y = aux / 2; } int fff (int x, int y) { int aux; aux = x; x = y * 3; return( x + aux ); }
Domanda: qual'è l'output stampato dalle printf?
Esercizio 3 (punti 2)
Consideriamo le espressioni definite induttivamente come segue:
Lett = {A,B,C,à..,Z}, l'insieme delle lettere maiuscole.
Domande:
Esercizio 4 (punti 5)
Consideriamo il tipo di dato Dizionario di numeri interi implementato con alberi binari di ricerca (con puntatori).
Domande:
Esercizio 5 (punti 7)
Consideriamo il tipo di dato Successione di lunghezza minore o uguale a Kdi numeri interi, implementato con array + lunghezza.
Consideriamo l'operazione Insert-after : Int X Succ X Int ---> Succ
Definita (a parole) come segue:
Insert-after(x,s,y) cerca in s la prima occorrenza di y (a partire dall'inizio) e:
Domande:
Nel calcolo di complessità: non fare conti troppo dettagliati esplicitando tutte le costanti, ma non limitarsi a neppure a dare solo il risultato: bisogna spiegare come ci si arriva.
Esercizio 6 (punti 6)
Consideriamo la procedura seguente in pseudo-codice:
procedure ppp(aa : array[1..n] of integer IN; bb : array[1..n] of integer OUT);
{ i, j : integer;
per i = 1,...,n :
{ b[i] = 0
j = n
while j > i do
{ b[i] = b [i] + a[j]
j--
}
}
}
Domanda: determinare la complessità della procedura in funzione della dimensione n dei parametri.
Non fare conti troppo dettagliati esplicitando tutte le costanti, ma considerare il costo di tutte le parti di programma mettendo eventualmente in evidenza le operazioni dominanti (una volta che si sono individuate si possono ignorare le altre). Non limitarsi a dare solo il risultato: bisogna spiegare come ci si arriva.
Esercizio 7 (punti 4)
Assumiamo che la complessità di una procedura ricorsiva sia definita dal seguente sistema alle ricorrenze:
T(1) = b
T(n) = a + 2 T(n/2)
dove a e b sono due costanti e n è la dimensione del problema.
Domanda: dare la complessità della procedura in Theta() spiegando come si ottiene (suggerimento: usare l'albero della ricorsione).