Introduction
This article assumes that you are familiar with ASP, XML and HTML.
Using this OnLine Exam system, we can conduct any type of objective type examinations on line. Eventhough I implemented most of the conventional things, the reader is highly appreciated to incorporate all other features whatever so.
Let us talk on the overall functionality. The Questions are in the xml file stored in the server (it could be in the database). When the user is ready to take the exam, then the question ids list for this user will be sent to the browser from the server via Microsoft’s XMLHTTP Object. Using this same XMLHTTP Object, the question contents are retrieved from the server and displayed on the page whenever the user requests for a question. On user’s response to any question, the selected answer is stored in the client side itself. On end of the exam, the result will be displayed. The duration and no of questions per exam are set as 5 minutes and 5 questions respectively. But we can set them to any possible values.
How it works
The following screens are identical to the OnLine Exam system:
OnLine Exam The duration of this exam is 5 minutes. There is no order to answer a question. You may use Next as well as Previous button to get a question to answer. |
Time: 13 min: 43 sec | |||||||||||||
|
|||||||||||||
The duration of this exam is 5 minutes. There is no order to answer a question. You may use Next as well as Previous button to get a question to answer. |
Once user starts the exam, the question ids list will come from the server. For every request to the server for a question, a question id in the ids list stored in the client is fetched and sent to the server. The server will return the question content, corresponding to the question id, from the xml file.
When the user selects any one answer the system will store in the answers list as well as in the selection list in the client side. Answer list is used to check no of right answers the user has selected at the end. Selection list is there so that the system will automatically select the choice which the user has already selected (for example if the user clicks the Previous button)
The exam will be over either the user clicks the Finish button or the time is over (for example 5 minutes) which comes first. On finish, the system will calculate no of right answers and display it.
The following files are used in the OnLine Exam system:
OLExam.html
<html> <script> var objXmlHTTP,objXmlDOM; var aQuest; //to store question ids var aAnswer = new Array(); // to track the result var aSelected = new Array(); // to store user's response var count = 0; //to store the current question no var ansSel = 0; //to store user's selection var ExamDuration = 5 * 60 ; // 5 minutes var timerID; //to store the setInterval fun's id var radIndex = -1; //to store the selected radio's index //constructor like function //here XML objects are created and //No of questions as well as question ids list //are fetched from the server. function init(){ objXmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); objXmlDOM = new ActiveXObject("Microsoft.XMLDOM"); objXmlHTTP.open("POST","OLExam.asp?Action=Start",false); objXmlHTTP.send(""); temp =objXmlHTTP.ResponseText; aQuest = temp.split(","); //initialize the user's answers list for(i=0;i<aQuest.length; i++){ aAnswer[i] = 0; // 0 for wrong; 1 for right answer aSelected[i] = -1; // to store the radio's index } if(count < aQuest.length) { url = "OLExam.asp?Action=NextQ&QNo=" + aQuest[count]; objXmlHTTP.open("POST", url ,false); objXmlHTTP.send(""); objXmlDOM.loadXML(objXmlHTTP.ResponseText); //parse the response content fetched from the server //and display the question parseQ(); } //change the Start button's caption and its click event document.frm.btnFinish.value = "Finish the Exam"; document.frm.btnFinish.onclick = showResult; //function //start the timer timerID = setInterval("timer()",1000); } function getPreQ() { //update the user's answers list checkAnswer(); //decrement the question no - i.e. to previous Question count--; //stop the timer clearInterval(timerID); //fetch the question for the aQuest[count] id url = "OLExam.asp?Action=NextQ&QNo=" + aQuest[count]; objXmlHTTP.open("POST",url ,false); objXmlHTTP.send(""); objXmlDOM.loadXML(objXmlHTTP.ResponseText); //parse the response content fetched from the server //and display the question parseQ(); //start the timer timerID = setInterval("timer()",1000); } function getNextQ() { //update the user's answers list checkAnswer(); //increment the question no - i.e. to next Question count++; //stop the timer clearInterval(timerID); url = "OLExam.asp?Action=NextQ&QNo=" + aQuest[count]; objXmlHTTP.open("POST", url ,false); objXmlHTTP.send(""); objXmlDOM.loadXML(objXmlHTTP.ResponseText); //parse the response content fetched from the server //and display the question parseQ(); //start the timer timerID = setInterval("timer()",1000); } function parseQ(){ //fetch the question from theXML Object //format the display strOut = "<table border=0 align=center width=80%>"; strOut += "<tr><td colspan=2><b>"; strOut += "Question No: " + (count+1) + " of "; strOut += aQuest.length + "</b></td></tr>"; strOut += "<tr><td colspan=2> </td></tr>"; temp = objXmlDOM.selectSingleNode("data/qtext").text; strOut += "<tr><td colspan=2><b>"+temp+"</b></td></tr>"; strOut += "<tr><td colspan=2> </td></tr>"; Nodes = objXmlDOM.selectNodes("data/choice"); for(i=0;i<Nodes.length;i++){ strOut += "<tr><td align=center width=10%>"; strOut += "<input type=radio name=ansUsr "; strOut += " onClick='ansSel=" + (i+1); strOut += ";radIndex=" + i + "' "; strOut += "value=" + (i+1) + "></td><td>"; strOut += Nodes.item(i).text + "</td></tr>"; } //set ansNo (hidden field) to the actual answer temp = objXmlDOM.selectSingleNode("data/answer").text; document.frm.ansNo.value = temp; strOut += "<tr><td colspan=2> </td></tr>"; strOut += "<tr><td colspan=2>"; if(count != 0 ){ strOut += "<input type=button value=Previous "; strOut += " onClick='getPreQ()'> "; } if(count < aQuest.length-1){ strOut += " <input type=button value=Next"; strOut += " onClick='getNextQ()'>"; } strOut += "</td></tr></table>"; //set the strOut content to <P> tag named QArea QArea.innerHTML = strOut; //set the default value to ansSel ansSel = 0; radIndex = -1; //check the radio if user has selected previously if (aSelected[count] != -1) { radIndex = aSelected[count]; ansSel = radIndex + 1; document.frm.ansUsr[radIndex].checked = true; } } function checkAnswer(){ //store the selected radio's index aSelected[count] = radIndex; //if the user selection matches the actual answer if (ansSel == document.frm.ansNo.value) aAnswer[count] = 1; else aAnswer[count] = 0; } function showResult() { rights = 0; //stop the timer clearInterval(timerID); //update the user's answers list checkAnswer(); //count no of answers for(i=0;i<aAnswer.length;i++){ if(aAnswer[i] == 1) rights++; } strRes = "<h2 align=center><br>"; //if all the answers are correct then greet if(rights == aAnswer.length) strRes += "<br><br>Congratulations...!"; strRes += "<br><br>your score is " + rights; strRes += " out of " + aAnswer.length + "</h2>"; document.write(strRes); } var timeCount = 0; function timer(){ timeCount++; //increment the time by one second //to display the time in the status bar, // uncomment the next line //window.status = "..." + timeCount + " secs" ; //to display the time temp = "Time: " + parseInt(timeCount/60); temp += " min : " + (timeCount%60) + " sec "; TBlock.innerText = temp; //if the time is up if (timeCount == ExamDuration) { alert("Sorry, time is up"); showResult(); } } </script> <body> <h2 align=center><font color=green>OnLine Exam</font></h2> <form name=frm > <table border=1 width=95% bgcolor=DarkSeaGreen align=center> <tr><td align=right><b id=TBlock></b></td></tr> <tr><td> <p id="QArea"> <center> <br> Relax...! The duration of this exam is 5 minutes. <br> There is no order to answer a question. You may use Next as well as Previous button to get a question to answer. <br> <br> <input type=button name=btnFinish value="Start the Exam" onClick="init()"> </center> </p> <input type=hidden name=ansNo> </td></tr></table> </form> </body> </html> |
OLExam.asp
<%
Response.expires = 0 'create an instance of MS XMLDOM Object 'and load the QBank.xml file where all the questions are. set obj = server.createobject("Microsoft.XMLDOM") obj.async = false obj.load(Server.MapPath("QBank.xml")) 'very first request from the client if trim(request("Action")) = "Start" then 'set no of questions per exam Dim NoQ,TotalQ NoQ = 5 'set no less than the totalquestions 'count no of questions in the xml file '( or from database) TotalQ = obj.selectNodes("data/question").length Dim aQuest(),temp,isExist, strQ ReDim aQuest(0) 'to store the question ids 'generate (=NoQ) question ids randomly while ubound(aQuest) < NoQ isExist = false temp = Int((TotalQ * Rnd) + 1) for i = 1 to ubound(aQuest) if aQuest(i) = temp then isExist = true exit for end if next if Not isExist then Redim Preserve aQuest(ubound(aQuest)+1) aQuest(ubound(aQuest)) = temp strQ = aQuest(i) & "," & strQ end if wend 'remove the last comma ',' from strQ strQ = left(strQ,len(strQ)-1) 'send the question in the strQ to the client response.write strQ 'all further requests - after the first request elseif trim(request("Action")) = "NextQ" then 'fetch the question from the XML Object 'and form the output string temp = "data/question[@id=" & trim(request("QNo")) & "]" set Node = obj.selectSingleNode(temp) strXML = "<data>" strXML = strXML & "<qtext>" strXML = strXML & Node.selectSingleNode("qtext").text strXML = strXML & "</qtext>" strXML = strXML & "<answer>" strXML = strXML & Node.selectSingleNode("answer").text strXML = strXML & "</answer>" set Node = Node.selectNodes("choices/choice") for i = 0 to Node.length-1 strXML = strXML & "<choice>" strXML = strXML & Node.item(i).text strXML = strXML & "</choice>" next strXML = strXML & "</data>" 'send the output to the client Response.Write (strXML) end if %>
|
QBank.xml
<?xml version="1.0"?> <data> <question id="1"> <qtext>What does KB stand for?</qtext> <choices> <choice>Kilo Bits</choice> <choice>Key Board</choice> <choice>Kilo Bytes</choice> <choice>None</choice> </choices> <answer>3</answer> </question> <question id="2"> <qtext>CPU stands for</qtext> <choices> <choice>Central Processing Unit</choice> <choice>Central Power Unit</choice> <choice>Core Processing Unit</choice> <choice>Core Power Unit</choice> </choices> <answer>1</answer> </question> <question id="3"> <qtext>1 KB equals</qtext> <choices> <choice>1000 Bytes</choice> <choice>1024 Bytes</choice> <choice>1000 Bits</choice> <choice>1024 Bits</choice> <choice>Nothing</choice> </choices> <answer>2</answer> </question> <question id="4"> <qtext>RAM is </qtext> <choices> <choice>Random Access Modifier</choice> <choice>Primary Memory</choice> <choice>Secondary Memory</choice> <choice>Read And Modify</choice> </choices> <answer>2</answer> </question> <question id="5"> <qtext>Hard Disk is </qtext> <choices> <choice>Hard to break</choice> <choice>Primary Memory Storage</choice> <choice>Temporary Memory Storage</choice> <choice>Secondary Memory Storage</choice> </choices> <answer>4</answer> </question> <question id="6"> <qtext>Computer Monitor is used </qtext> <choices> <choice>To monitor activities</choice> <choice>To control Computer</choice> <choice>As display unit</choice> <choice>None</choice> </choices> <answer>3</answer> </question> <question id="7"> <qtext>XML stands for</qtext> <choices> <choice>Extended Markup Language</choice> <choice>Extended Model Language</choice> <choice>Extensible Markup Language</choice> <choice>Extensible Model Language</choice> </choices> <answer>3</answer> </question> <question id="8"> <qtext>ASP stands for</qtext> <choices> <choice>Active Server Page</choice> <choice>Application Service Provision</choice> <choice>As Soon as Possible</choice> <choice>All</choice> </choices> <answer>1</answer> </question> </data> |