Soluzione tema di esame Mercurio 2003 - seconda prova scritta di Informatica

Le entità che si possono individuare nel problema sono essenzialmente:

  • Corso, perché l'Istituto eroga diversi corsi
  • Allievo, per l'anagrafica delle persone che si iscrivono
  • Domanda, per le domande del test di ingresso.

Tra Corso e Allievo vi è dunque un'associazione molti a molti.
Anche tra Allievo e Domanda c'è un'associazione molti a molti.


Per rappresentare in modo più preciso il modello, conviene scomporre le due associazioni molti a molti in associazioni uno a molti, introducendo le entità di legame che ci consentono di evidenziare anche gli attributi delle associazioni.

Tra Corso e Allievo, inseriamo l'entità Iscrizione, per registrare la data di iscrizione, il livello conseguito dall'allievo dopo il test di ingresso e successivamente servirà anche per il risultato del test finale.

Tra Allievo e Domanda, inseriamo l'entità Risposta che contiene l'esito di ciascuna domanda per ciascun allievo.

Il modello logico che viene derivato dal modello E/R è formato dalle seguenti tabelle:
Corsi (KCodCorso, Descrizione, DataInizio, Costo, Docente, Tutor)
Allievi (KCodAllievo, Cognome, Nome, DataNascita, Email, Telefono, Indirizzo)
Domande (KNumDom, TestoDomanda, TestoRisposte, RispostaEsatta)
Iscrizioni (ID, DataIscrizione, LivelloIniziale, RisultatoFinale, CodCorso, CodAllievo)
Risposte (ID, Esito, NumDom, CodAllievo)

(chiavi primarie in neretto, chiavi esterne in corsivo)



Sviluppo del punto 1 (perfezionare l'iscrizione determinando il livello iniziale)

Dapprima esamino i risultati del test calcolando la percentuale di risposte esatte: stabilendo per il campo Esito i valori 1 oppure 0 a seconda che la risposta sia esatta o errata, si può calcolare la somma dei valori 1, contare il numero di risposte e infine calcolare la percentuale, scrivendo il tutto in una tabella temporanea Risultati.

SELECT CodAllievo, SUM(Esito) AS Esatte, Count(Esito) AS NumDomande, SUM(Esito)/Count(Esito)*100 AS Perc INTO Risultati
FROM Risposte
GROUP BY CodAllievo

Ora posso aggiornare il campo LivelloIniziale nella tabella Iscrizioni sulla base della percentuale conseguita. Posso fare tre comandi Update per i tre livelli, assegnando i livelli sulla fase di tre fasce di percentuali: da 0 a 33% = livello 1, da 34% a 66% = livello 2, oltre 66% = livello3.

UPDATE Iscrizioni
SET LivelloIniziale = 1
WHERE CodAllievo IN (SELECT CodAllievo
FROM Risultati
WHERE Perc < 34)

UPDATE Iscrizioni
SET LivelloIniziale = 2
WHERE CodAllievo IN (SELECT CodAllievo
FROM Risultati
WHERE Perc BETWEEN 34 AND 66)

UPDATE Iscrizioni
SET LivelloIniziale = 3
WHERE CodAllievo IN (SELECT CodAllievo
FROM Risultati
WHERE Perc > 66)


Se si volesse lasciare all'utente la possibilità di definire le fasce, basta inserire un parametro nel comando Update, per esempio per il primo livello:

UPDATE Iscrizioni
SET LivelloIniziale = 1
WHERE CodAllievo IN (SELECT CodAllievo
FROM Risultati
WHERE Perc < [percentuale massima per primo livello])

 

Sviluppo del punto 2 (allievi che hanno superato il test finale)

Sviluppo punto 3 (somministrazione del test con pagine ASP)