Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fondamenti di Informatica
PROVA SCRITTA – 23 Gennaio 2014
Esercizio 1. (6 punti)
Scrivere l'albero sintattico e verificare la legalità della seguente istruzione C:
struct list {
float V[10];
int code;
struct list * next;
};
Si discuta inoltre la semantica dell'istruzione indicando i side effects associati alla sua esecuzione nel caso i=2.
Esercizio 2. (6 punti)
Scrivere la funzione C che realizza l'inserimento ordinato in una lista collegata con array ed indici. Ipotizzare che i valori
della lista siano interi.
Esercizio 3. (8 punti)
Scrivere le funzioni C che realizzano l'algoritmo di ordinamento quicksort. Scrivere anche l'equazione di costo
dell'algoritmo discutendo la complessità nei vari casi.
Esempio:
lista1 3 5 7 8 10 11 12
lista2 1 2 4 5 6 7 10 13 14
lista1 al termine della esecuzione 1 2 3 4 5 6 7 8 10 11 12 13 14
lista2 al termine della esecuzione 5 7 10
Università degli Studi di Firenze, Scuola di Ingegneria
Corso di Laurea in Ingegneria Informatica – Prof. Stefano Berretti
Fondamenti di Informatica
PROVA SCRITTA – 23 Gennaio 2014
Exercise 1. (6 points)
Write the syntactic tree that verifies the legality of the following C instruction:
struct list {
float V[10];
int code;
struct list * next;
};
It is also required to discuss the semantic of the above instruction indicating the side effects that are associated to its
execution for i=2.
Exercise 2. (6 points)
Write the C function that realizes the algorithm for ordered insert in a linked list with array and indices. It is supposed
that the values of the list are integers.
Exercise 3. (8 points)
Write the C functions that realizes the quicksort algorithm. It is also required to write the cost equation of the
algorithm discussing the related complexity in the various cases.
Example:
list1 3 5 7 8 10 11 12
list2 1 2 4 5 6 7 10 13 14
list1 after execution 1 2 3 4 5 6 7 8 10 11 12 13 14
list2 after execution 5 7 10
Soluzione
Esercizio 1.
assegna il valore intero 0 alla variabile result. L'altro side effect è l'incremento postfisso dell'indice i : i = 3
Esercizio 2.
return TRUE;
}
else
return FALSE
}
Esercizio 3.
if ( N > 1 ) {
q = partition( V, N );
quicksort_r( V, q );
quicksort_r( &V[q], N-q-1 );
}
}
pivot = V[0];
l = 0;
r = N;
while ( l < r ) {
do {
r--;
} while ( V[r] > pivot && r > l );
if ( r != l ) {
do {
l++;
} while ( V[l] <= pivot && l < r );
swap(V, l, r);
}
}
swap(V, l, 0);
return l;
}
da cui segue la complessità è O(Nln2(N)) nel caso medio ed ottimo (pivot sempre in posizione mediana) e O(N2)
nel caso peggiore (pivot sempre agli estremi dell'array).
Esercizio 4.
struct list {
int value;
struct list * next_ptr;
};