Prova scritta di ASP Valutazione On-Line Classe 5.ta Inf.2. – a.s. 2002/2003 Il Ministero dell’Istruzione Università e Ricerca intende adottare a livello nazionale un sistema di valutazione on-line che consenta di monitorare periodicamente il livello di preparazione degli allievi iscritti alla Scuola Secondaria Superiore in merito alle conoscenze di base acquisite nella materia di Matematica. A tal proposito si progetti ed implementi un sistema informatico che effettui la somministrazione on-line di un questionario, a risposte chiuse, rivolto ad un generico allievo di un Istituto Superiore e nello specifico consenta quanto segue. 1. Autenticazione/Identificazione, secondo le seguenti voci: o Codice Istituto di appartenenza o Anno di corso dell’allievo o Codice allievo 2. Somministrazione questionario o Verifica che l’allievo non abbia già compilato il questionario o Compilazione del un questionario di matematica appropriato (uguale per tutte le scuole ma diverso per ciascun anno di corso) o Registrazione numero risposte esatte fornite dall’allievo 3. Statistiche (tabellari e/o grafiche) o Numero di Istituti, per ciascuna categoria, che hanno aderito all’iniziativa o Numero totale di questionari compilati distribuiti per anno di corso o Numero totale di questionari compilati distribuiti per tipo di Istituto o Medie nazionali di risposte esatte distribuite per anno di corso o Medie nazionali di risposte esatte distribuite per tipo di Istituto Il candidato, fatte le ipotesi aggiuntive che ritiene necessarie: a) proponga una soluzione per la creazione del sistema illustrandola facendo una breve analisi del problema che evidenzi le scelte di progetto essenziali nonché i criteri di codifica delle informazioni; b) definisca la struttura del Database (Access/SQL) necessario per supportare l’intera attività definendo le tabelle coinvolte, elencando per ciascuna, in maniera dettagliata, i campi di cui sono composte, il tipo di dato associato a ciascun campo ed eventuali relazioni tra tabelle; c) sviluppi nel dettaglio un’applicazione ASP in grado di gestire le funzionalità richieste ai punti 1. 2. e ad almeno due voci a scelta relative al punto 3. Riportare: a. diagramma di struttura che consenta di visionare gli ambiti dell’applicazione ASP b. diagramma dei collegamenti in grado di evidenziare i collegamenti statici, automatici e/o di elaborazione presenti tra le diverse pagine ASP/HTML dell’applicazione. c. codice ASP/HTML documentato per ciascuna pagina appartenente all’applicazione Tempo a disposizione: 3 ore Materiale consultabile: manuali HTML – VBScript – ASP – SQL HTML Svolgimento 1. Analisi del problema Per quanto riguarda la fase di autenticazione si è scelto di memorizzare nel database inizialmente solo le informazioni che identificano gli Istituti che hanno aderito all’iniziativa. In tal senso l’autenticazione è da intendersi come verifica che il Codice di Istituto appartenga ad una scuola riconosciuta. Ogni Istituto è identificato da un codice univoco la cui composizione è descritta di seguito. Per semplicità si considerano solo tre tipi di Istituti Superiori: Licei Istituti Tecnici Istituti Professionali Ad essi viene assegnata una codifica che rispecchia il seguente schema: Tipo di Istituto | valore numerico di 6 cifre che lo identifica univocamente Per quanto riguarda il tipo di Istituto vale la codifica riportata in tabella: Tipo di Istituto Liceo Istituto Tecnico Istituto Professionale Codifica LI IT IP Esempio di CodIstituto: LI001034 I dati aggiuntivi che verranno richiesti nella fase di autenticazione (Codice allievo e Classe) serviranno solo per controllare che l’allievo non abbia già compilato in precedenza il questionario; in caso negativo verranno registrati in un’apposita tabella del database cui seguirà la fase di somministrazione del questionario. Si suppone che ciascun questionario sia formato da 10 quesiti a risposta singola, chiusa, da selezionarsi tra tre alternative possibili. I questionari si differenziano solo per il contenuto (domande e risposte associate) non per la struttura. I questionari vengono valutati solo in termini di numero di quesiti a cui si è risposto in maniera corretta. Tale valore verrà memorizzato nel record dell’allievo che ha complilato il questionario. Le statistiche fanno riferimento ai dati memorizzati nel Database fino al momento in cui vengono richieste. Sono state sviluppate le prime tre statistiche relative al punto 3. del testo. Si è optato per la loro visualizzazione grafica. Non viene implementato nessun meccanismo di roll-back che consenta di ripristinare lo stato iniziale del Database qualora la sequenza di operazioni che portano dall’autenticazione all’invio del questionario venga interrotta per anomalie di qualsiasi tipo. 2. Struttura del Database Descrizione Tabelle Tabella Istituti Questa tabella contiene l’elenco di tutti gli Istituti abilitati alla somministrazione telematica dei questionari. Struttura IdIstituto (numerico, chiave primaria) CodIstituto (testo, 8 caratteri) Tabella Allievi Questa tabella registra gli allievi che compilano ed inviano on-line il questionario. Ogni allievo è identificato da un determinato codice numerico (CodAllievo) assegnato dall’Istituto di appartenenza. Viene memorizzato anche l’anno di corso d’ iscrizione dell’allievo ed il numero di risposte esatte determinato dopo la compilazione del questionario. Struttura IdAllievo (numerico, chiave primaria) CodAllievo (intero) IdIstituto (numerico, chiave esterna) AnnoCorso (intero: 1,2,3,4,5) NroRispEsatte (intero: 1..10) Tabella Questionari Questa tabella contiene 10 quesiti che compongono il questionario per un determinato anno di corso, tre risposte possibili per ciascun quesito e l’indicazione della risposta corretta. Struttura IdQuesito (numerico, chiave primaria) Quesito (testo, 255 caratteri) Risposta1 (testo, 255 caratteri) Risposta2 (testo, 255 caratteri) Risposta3 (testo, 255 caratteri) RispostaEsatta (intero: 1..3) Progettazione e sviluppo applicazione ASP Diagramma di struttura I Inserimento dati autenticazione HTM Index.htm Consente il riconoscimento dell’Istituto e la registrazione dell’allievo. A Q Somministrazione questionario ASP S ASP Autent.asp Questionario?.asp Visualizza Statistiche ASP Statistiche.asp Q1 Elabora risposte questionario ASP srvQuestionario.asp Diagramma dei collegamenti I A Q Q1 S Legenda Collegamento HTML Collegamento da form che richiama una pagina ASP di elaborazione dei dati introdotti Collegamento HTML temporizzato 1. Fase di Autenticazione/Identificazione o Inserimento dati di autenticazione/identificazione Consente l’inserimento dei seguenti dati: Codice Istituto assegnato dal Ministero e comunicato a ciascuna scuola aderente all’iniziativa Codice Allievo assegnato dall’Istituto frequentato dall’allievo Classe di appartenenza dell’allievo Index.htm Codice ASP <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE>Ministero Universita e Ricerca - Valutazione OnLine </TITLE> </HEAD> <BODY bgcolor=bisque> <h3 align=center> <i>Ministero dell'Istruzione Università e Ricerca<i><br> </h3> <h2 align=center> Valutazione On Line<br> </h2> <hr> <div align=center> <b>Autenticazione</b> <form method=post action=srvAutenticazione.asp> Codice Istituto:&nbsp;<input type=text name=codistituto><br> Codice allievo:&nbsp;<input type=text name=codallievo><br> Classe: &nbsp; <select name=anno> <option> <option>1 <option>2 <option>3 <option>4 <option>5 </select> <br><br> <input type=reset name=reset value=Cancella> <input type=submit name=submit value=Autentica><br> </form> </div> <hr> </BODY> </HTML> o Verifica corrispondenza Codice Istituto (autenticazione) e registrazione dati allievo (identificazione) Implementa le seguenti fasi: l’autenticazione dell’allievo tramite il Codice di Istituto verificando se quest’ultimo è presente tra quelli registrati nel Databasse dell’applicazione identificazione allievo e conseguente registrazione del Codice Allievo e della Classe nella tabella Allievi del Database dell’applicazione srvAutenticazione.asp Codice ASP <%@ Language=VBScript %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <!--#INCLUDE FILE="adovbs.inc"--> <BODY BGCOLOR=BISQUE> <h3 align=center> <i>Ministero dell'Istruzione Università e Ricerca<i><br> </h3> <h2 align=center> Valutazione On Line<br> </h3> <hr> <% Session("CodIstituto")=Request.Form("codistituto") Session("CodAllievo")=Request.Form("codallievo") Session("Anno")=Request.Form("anno") Dim objConn Dim objRsIstituti Dim objRsAllievi Dim trovato Dim IdAllievo Set objConn=Server.CreateObject("ADODB.Connection") objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & Server.MapPath("valutazione.mdb") objConn.Open Set objRsIstituti=Server.CreateObject("ADODB.Recordset") objRsIstituti.Open "Istituti",objConn,,,adCmdTable ' Ricerca codice Istituto nel Database Do While Not objRsIstituti.EOF If (objRsIstituti("CodIstituto")=Session("CodIstituto"))Then trovato=true Exit Do End If objRsIstituti.MoveNext Loop ' Registra il nuovo accesso Set objRsAllievi=Server.CreateObject("ADODB.Recordset") objRsAllievi.Open "Allievi",objConn,adOpenKeyset,adLockOptimistic,adCmdTable if Not objRsAllievi.EOF Then objRsAllievi.MoveLast IdAllievo=objRsAllievi("IdAllievo")+1 Else IdAllievo=1 End If objRsAllievi.AddNew objRsAllievi("IdAllievo")=IdAllievo objRsAllievi("CodAllievo")=Session("CodAllievo") objRsAllievi("IdIstituto")=objRsIstituti("IdIstituto") objRsAllievi("AnnoCorso")=Session("Anno") objRsAllievi.Update If trovato=true Then Response.Write "<center>" Response.Write "<h2>Utente identificato ... attendere avvio questionario.</h2>" Response.Write "</center>" Response.Write "<meta http-equiv=refresh content='5; url=questionario1.asp'>" Else Response.Write "<center>" Response.Write "<h2>Codice Istituto non corretto !!!</h2>" Response.Write "</center>" Response.Write "<meta http-equiv=refresh content='5; url=index.htm'>" End If objRsAllievi.Close Set objRsAllievi=Nothing %> <hr> </BODY> </HTML> 2. Questionario o Somministrazione questionario Implementa le seguenti fasi: raccolta delle risposte ai singoli quesiti per mezzo di pulsanti di opzione mutuamente esclusivi invio delle risposte al server (nello specifico alla pagina srvQuestionario.asp che si occuperà della loro vavalutazione) Codice ASP <%@ Language=VBScript %> <HTML> <HEAD></HEAD> <BODY bgcolor=bisque> <h3 align=center> <i>Ministero dell'Istruzione Università e Ricerca<i><br> </h3> <h2 align=center> Valutazione On Line<br></h2> <hr> <form method=post action=srvQuestionario.asp> <% Dim objConn Dim objRsQuestionario Questionario.asp Set objConn=Server.CreateObject("ADODB.Connection") objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & Server.MapPath("valutazione.mdb") objConn.Open Set objRsQuestionario=Server.CreateObject("ADODB.Recordset") objRsQuestionario.Open "Questionario1",objConn,,,adCmdTable ' Visualizzazione quesiti Do While Not objRsQuestionario.EOF Response.Write "<b>" & objRsQuestionario("IdQuesito") & ".</b>" & "&nbsp;&nbsp;" Response.Write objRsQuestionario("Quesito") & "<br>" Response.Write "<blockquote>" Response.Write "<input type=radio name=" & objRsQuestionario("IdQuesito") & " value=1>&nbsp;&nbsp;" Response.Write objRsQuestionario("Risposta1") & "<br>" Response.Write "<input type=radio name=" & objRsQuestionario("IdQuesito") & " value=2>&nbsp;&nbsp;" Response.Write objRsQuestionario("Risposta2") & "<br>" Response.Write "<input type=radio name=" & objRsQuestionario("IdQuesito") & " value=3>&nbsp;&nbsp;" Response.Write objRsQuestionario("Risposta3") & "<br><br>" Response.Write "</blockquote>" objRsQuestionario.MoveNext Loop %> <center> <hr align=center width=80%> <input type=reset name=reset value=Cancella> <input type=submit name=submit value="Invia questionario"><br> </center> </form> <hr> </BODY> </HTML> o Elaborazione risposte Implementa le seguenti fasi: conteggio del numero delle risposte corrette fornite ai singoli quesiti registrazione del numero di risposte esatte in corrispondenza del record dell’allievo che ha compilato il questionario Codice ASP <%@ Language=VBScript %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <BODY BGCOLOR=BISQUE> <h3 align=center> <i>Ministero dell'Istruzione Università e Ricerca<i><br> </h3> <h2 align=center> Valutazione On Line<br> </h2> <hr> <% Dim objConn Dim objRsAlliev Dim objRsQuestionario Dim RispEsatte Dim trovato Set objConn=Server.CreateObject("ADODB.Connection") objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & Server.MapPath("valutazione.mdb") objConn.Open Set objRsQuestionario=Server.CreateObject("ADODB.Recordset") objRsQuestionario.Open "Questionario1",objConn,,,adCmdTable srvQuestionario.asp ' Determina il numero delle risposte esatte RispEsatte=0 Do While Not objRsQuestionario.EOF If (cstr(objRsQuestionario("RispostaEsatta"))=Request.Form(objRsQuestionario("IdQuesito")))Then RispEsatte=RispEsatte+1 End If objRsQuestionario.MoveNext Loop Session("RispEsatte")=RispEsatte Response.Write "<center>" Response.Write "<h2>Totale risposte esatte: " & RispEsatte &"</h2>" Response.Write "<form method=post action=statistiche.asp >" Response.Write "<input type=submit value=Statistiche>" Response.Write "</form>" Response.Write "</center>" ' Aggiorna il record dell'allievo con il numero di risposte esatte Set objRsAlliev=Server.CreateObject("ADODB.Recordset") objRsAlliev.Open "Allievi",objConn,adOpenKeyset, ,adCmdTable trovato=false objRsAlliev.MoveFirst Do While Not objRsAlliev.EOF If (objRsAlliev("CodAllievo")= Cint((Session("CodAllievo"))))Then trovato=true objRsAlliev("NroRispEsatte")=RispEsatte objRsAlliev.Update Exit Do End If objRsAlliev.MoveNext Loop If trovato=false Then Response.Write "ERRORE !!! Codice allievo non trovato !!!" End If %> <hr> </BODY> </HTML> 3. Statistiche Visualizza i grafici delle seguenti distribuzioni statistiche: Numero di Istituti, per ciascuna categoria, che hanno aderito all’iniziativa Numero totale di questionari compilati distribuiti per anno di corso Numero totale di questionari compilati distribuiti per tipo di Istituto Statistiche.asp Codice ASP <%@ Language=VBScript %> <HTML> <HEAD> <% <!-- Display a single bar --> Sub Display_Bar (ByVal strLabel, ByVal iValue, ByVal strCaption) Response.Write("<tr>") Response.Write("<td width=200 >") Response.Write("<center><font size=1>" & strLabel & "</font></center>") Response.Write("</td>") Response.Write("<td height=10>") Response.Write("<img src=images/blu.gif height=15 width="& iValue & ">") Response.Write("</td>") Response.Write("<td width=150>") Response.Write("<center><font size=1>"& iValue & Perc(iAbsPercValue) &"</font></center>") Response.Write("</td>") Response.Write("</tr>") End Sub <!-- Display the Graph --> Sub Display_Bars(ByVal arrLabels, ByVal arrValues, ByVal strCaption, ByVal iBorder, ByVal iAbsPercValue) If (iAbsPercValue=1) Then iTot=0 For i=0 to UBound(arrValues) iTot=iTot+arrValues(i) Next For i=0 to UBound(arrValues) arrValues(i)=CInt(10000*arrValues(i)/iTot)/100 Next End If Response.Write("<table border=" & CStr(iBorder)& ">") Response.Write("<caption align=up><font size=2 color=blue><i>" &strCaption &"</i></font></caption>") For bar=LBound(arrLabels) to UBound(arrLabels) Display_Bar arrLabels(bar), arrValues(bar), strCaption Next Response.Write("</table>") End Sub <!-- Generate the % string if needed --> Function Perc(ByVal iAbsPercValue) If (iAbsPercValue=1) Then Perc=" %" Else Perc="" End If End Function %> </HEAD> <BODY bgcolor=bisque> <h3 align=center> <i>Ministero dell'Istruzione Università e Ricerca<i><br> </h3> <h2 align=center> Valutazione On Line<br> </h3> <table border=1 width=100% height=100%> <tr height=20%> <td valign=center align=center> <b><i> Numero di Istituti, per ciascuna categoria, che hanno aderito all'iniziativa</i></b> </td> <td valign=center> <% Dim objConn Dim objRsIstituti Dim objRsAllievi Set objConn=Server.CreateObject("ADODB.Connection") objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" & _ "DBQ=" & Server.MapPath("valutazione.mdb") objConn.Open Dim arrLabels(2) Dim arrValues(2) arrLabels(0)="Licei" arrLabels(1)="Istituti Tecnici" arrLabels(2)="Istituti Professionali" arrValues(0)=0 arrValues(1)=0 arrValues(2)=0 Set objRsIstituti=Server.CreateObject("ADODB.Recordset") objRsIstituti.Open "Istituti",objConn, , ,adCmdTable Set objRsAllievi=Server.CreateObject("ADODB.Recordset") objRsAllievi.Open "Allievi",objConn, , ,adCmdTable objRsIstituti.MoveFirst Do While Not objRsIstituti.EOF Select Case Mid(objRsIstituti("CodIstituto"),1,2) Case "LI" arrValues(0)=arrValues(0)+1 Case "IT" arrValues(1)=arrValues(1)+1 Case "IP" arrValues(2)=arrValues(2)+1 End Select objRsIstituti.MoveNext Loop strCaption="# Istituti per categoria" ' Caption iBorder=0 ' 0 = no border; 1 = border iAbsPercValue=1 ' 0 = absolute value; 1 = % value Display_Bars arrLabels, arrValues, strCaption, iBorder, iAbsPercValue %> </td> </tr> <tr height=20%> <td valign=center align=center> <b><i> Numero totale di questionari compilati distribuiti per anno di corso</i></b> </td> <td valign=center> <% Dim arrLabelz(4),arrValuez(4) arrLabelz(0)="I" arrLabelz(1)="II" arrLabelz(2)="III" arrLabelz(3)="IV" arrLabelz(4)="V" arrValuez(0)=0 arrValuez(1)=0 arrValuez(2)=0 arrValuez(3)=0 arrValuez(4)=0 objRsAllievi.MoveFirst Do While Not objRsAllievi.EOF Select Case objRsAllievi("AnnoCorso") Case 1 arrValuez(0)=arrValuez(0)+1 Case 2 arrValuez(1)=arrValuez(1)+1 Case 3 arrValuez(2)=arrValuez(2)+1 Case 4 arrValuez(0)=arrValuez(3)+1 Case 5 arrValuez(1)=arrValuez(4)+1 End Select objRsAllievi.MoveNext Loop strCaption="# Questionari per anno di corso" ' Caption iBorder=0 ' 0 = no border; 1 = border iAbsPercValue=1 ' 0 = absolute value; 1 = % value Display_Bars arrLabelz, arrValuez, strCaption, iBorder, iAbsPercValue %> </td> </tr> <tr height=20%> <td valign=center align=center> <b><i> Numero totale di questionari compilati distribuiti per tipo di Istituto</i></b> </td> <td valign=center> <% Dim arrValuew(2) arrValuew(0)=0 arrValuew(1)=0 arrValuew(2)=0 objRsAllievi.MoveFirst Do While Not objRsAllievi.EOF objRsIstituti.MoveFirst Do While Not objRsIstituti.EOF If objRsAllievi("IdIstituto")=objRsIstituti("IdIstituto") Then Exit Do End If objRsIstituti.MoveNext Loop Select Case Mid(objRsIstituti("CodIstituto"),1,2) Case "LI" arrValuew(0)=arrValuew(0)+1 Case "IT" arrValuew(1)=arrValuew(1)+1 Case "IP" arrValuew(2)=arrValuew(2)+1 End Select objRsAllievi.MoveNext Loop strCaption="# Questionari per tipo di Istituto" ' Caption iBorder=0 ' 0 = no border; 1 = border iAbsPercValue=1 ' 0 = absolute value; 1 = % value Display_Bars arrLabels, arrValuew, strCaption, iBorder, iAbsPercValue %> </td> </tr> </table> <hr> </BODY> </HTML>