Esame di Algoritmi e Strutture di Dati I Luned`ı 9 Giugno 2003 Nome

Esame di Algoritmi e Strutture di Dati I
Lunedı̀ 9 Giugno 2003
Nome:
Cognome:
Matricola:
Scrivere in forma leggibile il proprio nome, cognome e matricola sul
testo del compito e su ogni foglio consegnato;
Consegnare solo la bella copia e il testo del compito;
Non è possibile consultare alcun tipo di materiale didattico;
Non è possibile uscire dopo l’inizio dello scritto.
Esercizio 1 (Punti 30)
Il Consiglio di Corso di Laurea ha deliberato il seguente metodo per il calcolo
della media di laurea:
Per il calcolo della media di laurea si scartando i 40 crediti con voto
più basso. Si procede quindi al calcolo della media ponderata, rispetto
al credito, dei rimanenti esami. Il risultato viene rivalutato del 4%
e infine espresso in 110esimi.
1. Rappresentare mediante una opportuna struttura di dati l’informazione
necessaria per il calcolo della media.
2. Scrivere una procedura che calcola la media di laurea secondo quanto deliberato dal Consiglio utilizzando la struttura di dati scelta al punto 1.
Soluzione
Ogni esame viene rappresentato da un oggetto con tre campi: Corso, Credito, Voto. La procedura che calcola la media prende in ingresso un vettore A
che contiene i puntatori agli oggetti che rappresentano gli esami superati dallo
studente.
1
Algoritmo 1 Media(A)
Media(A)
1: soglia ← 40
2: coriv ← 1.04
3: // Ordino gli esami in senso crescente di voto
4: InsertionSort(A)
5: scarto ← 0
6: i ← 0
7: // Scarto i crediti con voto più basso
8: while scarto < soglia do
9:
if i = length[A] then
10:
error La soglia è superiore al numero di crediti
11:
end if
12:
i←i+1
13:
scarto ← scarto + Credito[A[i]]
14: end while
15: // Tengo conto dell’eventuale frazione da considerare dell’ultimo esame
scartato
16: creditot ← scarto − soglia
17: media ← V oto[A[i]] ∗ (scarto − soglia)
18: // Calcolo la media ponderata
19: for j ← i + 1 to length[A] do
20:
media ← media + V oto[A[j]] ∗ Credito[A[j]]
21:
creditot ← creditot + Credito[A[j]]
22: end for
23: media ← media/creditot
24: // Calcolo la media rivalutata
25: mediaplus ← media ∗ coriv
26: // Calcolo la media in 110esimi
27: media110 ← mediaplus ∗ (11/3)
28: return media110
2
La procedura InsertionSort deve essere modificata come segue:
Algoritmo 2 InsertionSort(A)
InsertionSort(A)
1: for j ← 2 to length(A) do
2:
pkey ← A[j]
3:
i←j−1
while (i > 0) and (V oto[pkey] < V oto[A[i]]) do
4:
5:
A[i + 1] ← A[i]
6:
i←i−1
7:
end while
8:
A[i + 1] ← pkey
9: end for
3