ASP 101 - Active Server Pages 101 - Web03
The Place ASP Developers Go!

Please visit our partners


Windows Technology Windows Technology
15 Seconds
4GuysFromRolla.com
ASP 101
ASP Wire
VB Forums
VB Wire
WinDrivers.com
internet.commerce internet.commerce
Partners & Affiliates














ASP 101 is an
internet.com site
ASP 101 is an internet.com site
IT
Developer
Internet News
Small Business
Personal Technology

Search internet.com
Advertise
Corporate Info
Newsletters
Tech Jobs
E-mail Offers

ASP 101 News Flash ASP 101 News Flash





ASP Source Code:
<%
' Takes a integer parameter and converts it to the appropriate letter
Function GetLetterFromAnswerNumber(iInput)
Dim strTemp
	Select Case iInput
		Case 0
			strTemp = "A"
		Case 1
			strTemp = "B"
		Case 2
			strTemp = "C"
		Case 3
			strTemp = "D"
		Case 4
			strTemp = "E"
		Case 5
			strTemp = "F"
	End Select
GetLetterFromAnswerNumber = strTemp
End Function
' To simplify and streamline the code I split this line into many parts,
' wrapped it into a function and commented it so you'd have a better
' chance of figuring out what I'm doing since I usually can't!
Function GetAnswerFromAnswerString(iQuestionNumber, strAnswers)
Dim strTemp
Dim iOffset
	' I use InStrRev since I want to retrieve the last entered value
	' in case they went back and changed their mind. 
	' Find the location of the question number we want to use
	iOffset = InStrRev(strAnswers, "|" & iQuestionNumber & "|", -1, 1)
	' Get our answer by using the offset we just found and then moving
	' right the length of the question indicator to arrive at the
	' appropriate letter
	strTemp = Mid(strAnswers, iOffset + Len("|" & iQuestionNumber & "|"), 1)
	' There's no way it should be anything else, but to be sure we
	' convert it to a string and make sure it's uppercase
GetAnswerFromAnswerString = UCase(CStr(strTemp))
End Function
%>
<%
' This code works with either a DB or hard coded in values.  I developed
' it using the DB connection and our sample DB, but switched to the hard
' coded to increase the speed for our site.  Using the DB allows for better
' data encapsulation and easier updates.  It all comes down to your specific
' needs so I gave you both options.
' Set this to True to use the Db.  False to use hard coded values
Const USE_DB_FOR_INFO = False
' These 2 things only apply if you use the DB
' If you're not then they're values are irrelevant
Dim DB_CONN_STRING
DB_CONN_STRING = "DBQ=" & Server.MapPath("quiz.mdb") & ";"
DB_CONN_STRING = DB_CONN_STRING & "Driver={Microsoft Access Driver (*.mdb)};"
DB_CONN_STRING = DB_CONN_STRING & "DriverId=25;FIL=MS Access;"
' Lets you run multiple quizzes from one DB by separating by QUIZ_ID!
Const QUIZ_ID = 1
' Now to all our other variables!
Dim cnnQuiz, rsQuiz     'DB objects if we use the DB for the info
Dim I                   'our standard (improperly named) looping variable
Dim iNumberOfQuestions  'the number of questions in the test
Dim iQuestionNumber     'the question we're currently on
Dim strQuestionText     'text of the question to be asked
Dim aAnswers            'array of choices for the question to be asked
                        'if we hard code, then I also use it for the
                        'correct answers when I go to grade the quiz
Dim strAnswers          'stores the question numbers and response choices
                        'seperated by |'s
Dim iScore              'so we know how well the user did
Dim bAbort              'added after I had finished to account for closed sessions
Dim strResults          'another late addition for the each question breakdown!
bAbort = False          'set it to false since we only want to abort in certain cases
' If this is the first call to the quiz then init everything
' o/w retrieve values we need.  We check by looking for the
' Question ID from the querystring.
If Request.QueryString("qid") = "" Then
	' Retrieve and Set the Quiz Info
	If USE_DB_FOR_INFO Then
		' Code to use DB!
		' Create DB connection and connect to the DB
		Set cnnQuiz = Server.CreateObject("ADODB.Connection")
		cnnQuiz.Open DB_CONN_STRING
		' Create RS and query DB for quiz info
		Set rsQuiz = Server.CreateObject("ADODB.Recordset")
		rsQuiz.Open "SELECT * FROM quizzes WHERE quiz_id=" & QUIZ_ID & ";", cnnQuiz
		' Set our session vars
		Session("QuizName") = CStr(rsQuiz.Fields("quiz_name").Value)
		Session("NumberOfQuestions") = CInt(rsQuiz.Fields("number_of_questions").Value)
		Session("PercentageToPass") = CInt(rsQuiz.Fields("percentage_to_pass").Value)
		' Close and dispose of our DB objects
		rsQuiz.Close
		Set rsQuiz = Nothing
		cnnQuiz.Close
		Set cnnQuiz = Nothing
	Else
		' If we're not going to the DB, hard code in values here!
		' BEGIN HARD CODE
		Session("QuizName") = "ASP 101 Quiz"
		Session("NumberOfQuestions") = 10
		Session("PercentageToPass") = 70
		' END HARD CODE
	End If
	' Set our question indicator to 1 and init our answer string
	iQuestionNumber = 1
	Session("AnswerString") = "|"
Else
	'Check to be sure we've still got a session!
	If Session("AnswerString") = "" Then
		Response.Write "I'm sorry, but you've taken too long.  You can start over by "
		Response.Write "clicking <A HREF=""" & Request.ServerVariables("URL") & """>here</A>."
		' I'd normally just do a response.end, but I can't because I'm inside of our
		' site template.  I need the script to complete so I've declared and set a Flag
		'Response.End
		bAbort = True
	End If
	' Get the number of the question we're processing
	iQuestionNumber = CInt(Request.QueryString("qid"))
	' Log selected answer to last question
	Session("AnswerString") = Session("AnswerString") & iQuestionNumber & "|" & _
		GetLetterFromAnswerNumber(CInt(Request.QueryString("sa"))) & "|"
	' Increment question identifier
	iQuestionNumber = iQuestionNumber + 1
End If
' If session has expired then skip all the code.
' Equivalently, only run all the code if it hasn't!
If Not bAbort Then
	' Set this to a local variable to avoid accessing the collection each time
	' This isn't required, but makes it easier for me to access and
	' supposedly speeds it up... I'm not sure how much, but it can't hurt!
	iNumberOfQuestions = Session("NumberOfQuestions")
	' Check to see it the quiz is over.  If so then show results, o/w
	' ask the next question
	If iQuestionNumber > iNumberOfQuestions Then
		' Process results and show end quiz status report
		' Done for the same reason as for iNumberOfQuestions a few lines above
		strAnswers = Session("AnswerString")
		' Useful for debugging
		'Response.Write strAnswers & "<BR>" & vbCrLf & "<BR>" & vbCrLf
		' Bug hunting once again... I didn't even come across any real bugs on this trip!
		' Could you imagine the ammo I'd take if it was real hunting I was doing!
		'For I = 1 to iNumberOfQuestions
		'	Response.Write GetAnswerFromAnswerString(I, strAnswers) & "<BR>" & vbCrLf
		'Next 'I
		' Retrieve Correct Answers and compare to the entered ones
		If USE_DB_FOR_INFO Then
			' Code to use DB!
			' Create DB connection and connect to the DB
			Set cnnQuiz = Server.CreateObject("ADODB.Connection")
			cnnQuiz.Open DB_CONN_STRING
			' Create RS and query DB for quiz info
			Set rsQuiz = Server.CreateObject("ADODB.Recordset")
			' Specify 3, 1 (Static, Read Only)
			rsQuiz.Open "SELECT * FROM questions WHERE quiz_id=" & QUIZ_ID & _
				" ORDER BY question_number;", cnnQuiz, 3, 1
			iScore = 0
			I = 1
			Do While Not rsQuiz.EOF
				If UCase(CStr(rsQuiz.Fields("correct_answer").Value)) = _
					GetAnswerFromAnswerString(I, strAnswers) Then
					iScore = iScore + 1
					' This and the Else could be used to output a
					' correctness status for each question
					' Also useful for bug hunting!
					'Response.Write "Right" & "<BR>" & vbCrLf
				Else
					'Response.Write "Wrong" & "<BR>" & vbCrLf
					strResults = strResults & I & ", "
				End If
				I = I + 1
				rsQuiz.MoveNext
			Loop
			' Close and dispose of our DB objects
			rsQuiz.Close
			Set rsQuiz = Nothing
			cnnQuiz.Close
			Set cnnQuiz = Nothing
		Else
			' If we're not going to the DB, hard code in answer values here!
			' BEGIN HARD CODE
			aAnswers = Array("A", "A", "A", "E", "D", "A", "E", "E", "A", "A")
			' END HARD CODE
			iScore = 0
			For I = 1 to iNumberOfQuestions
				If UCase(CStr(aAnswers(I - 1))) = _
					GetAnswerFromAnswerString(I, strAnswers) Then
					iScore = iScore + 1
					' This and the Else could be used to output a
					' correctness status for each question
					' Also useful for bug hunting!
					'Response.Write "Right" & "<BR>" & vbCrLf
				Else
					'Response.Write "Wrong" & "<BR>" & vbCrLf
					strResults = strResults & I & ", "
				End If
			Next 'I
		End If
		' Convert score to a percentage rounded to the whole number
		iScore = Round((iScore / iNumberOfQuestions) * 100)
		%>
		<FONT SIZE="+2"><B><%= Session("QuizName") %></B></FONT><BR>
		<BR>
		<%
		If iScore >= Session("PercentageToPass") Then 
			Response.Write "Congratulations!  You've passed the quiz with a score of "
			Response.Write iScore & "%.<BR>" & vbCrLf
		Else
			Response.Write "Sorry!  You needed to achieve a score of "
			Response.Write Session("PercentageToPass") & "% or higher to pass.  "
			Response.Write "Unfortunately, your score was only " & iScore & "%.  "
			Response.Write "You can take the test again by clicking <A HREF="""
			Response.Write Request.ServerVariables("URL") & """>here</A>.<BR>" & vbCrLf
		End If
		Response.Write "<BR>" & vbCrLf
		If Len(strResults) <> 0 Then
			Response.Write "You missed the following questions: " & Left(strResults, Len(strResults) - 2)
			Response.Write "<BR>" & vbCrLf
		End If
		'Response.Write iScore & "%"
		' This is also where you could log the results if you wanted to.
		' In it's simplest form, you would simply log strAnswers to a file,
		' but you could format little "report cards" or log the result to a
		' separate data source.
	Else
		' Retrieve and Set the Question Info
		If USE_DB_FOR_INFO Then
			' Code to use DB!
			' Create DB connection and connect to the DB
			Set cnnQuiz = Server.CreateObject("ADODB.Connection")
			cnnQuiz.Open DB_CONN_STRING
			' Create RS and query DB for quiz info
			Set rsQuiz = Server.CreateObject("ADODB.Recordset")
			rsQuiz.Open "SELECT * FROM questions WHERE quiz_id=" _
				& QUIZ_ID & " AND question_number=" & iQuestionNumber & ";", cnnQuiz
			' Set our question info
			strQuestionText = CStr(rsQuiz.Fields("question_text").Value)
			' Get an array of answers
			aAnswers = Array( _
			CStr(rsQuiz.Fields("answer_a").Value & ""), _
			CStr(rsQuiz.Fields("answer_b").Value & ""), _
			CStr(rsQuiz.Fields("answer_c").Value & ""), _
			CStr(rsQuiz.Fields("answer_d").Value & ""), _
			CStr(rsQuiz.Fields("answer_e").Value & ""), _
			CStr(rsQuiz.Fields("answer_f").Value & ""))
			' This is probably bad coding style, but too bad... it works!
			For I = LBound(aAnswers) To UBound(aAnswers)
				If aAnswers(I) = "" Then
					ReDim Preserve aAnswers(I - 1)
					Exit For
				End If
			Next ' I
			' Close and dispose of our DB objects
			rsQuiz.Close
			Set rsQuiz = Nothing
			cnnQuiz.Close
			Set cnnQuiz = Nothing
		Else
			' If we're not going to the DB, hard code in values here!
			' BEGIN HARD CODE
			Select Case iQuestionNumber
				Case 1
					strQuestionText = "What does ASP stand for?"
					aAnswers = Array( _
						"Active Server Pages", _
						"Additional Sensory Perception", _
						"Accidental Script Problem", _
						"Altruistically Solving Problems", _
						"Additional Sleeping Preferred", _
						"Any Solution Possible")
				Case 2
					strQuestionText = "What command is <%= %> equivalent to?"
					aAnswers = Array( _
						"Response.Write", _
						"Request.Write", _
						"Referer.Write", _
						"Redirect.Write", _
						"Reasonably.Write", _
						"Damn It I'm Right!")
				Case 3
					strQuestionText = "What does "Option Explicit" do?"
					aAnswers = Array( _
						"Requires explicit variable declaration", _
						"Makes the computer give you additional errors", _
						"Converts a PG rated programming language into one rated NC-17")
				Case 4
					strQuestionText = "Which of the following is not a valid "
					strQuestionText = strQuestionText & "VBScript looping statement?"
					aAnswers = Array( _
						"Do...Loop", _
						"While...Wend", _
						"For...Next", _
						"For Each...Next", _
						"Just do this 10 times you stupid computer!")
				Case 5
					strQuestionText = "What language can you not use to write ASP?"
					aAnswers = Array( _
						"VBScript", _
						"JavaScript (JScript)", _
						"PerlScript", _
						"SuperScript")
				Case 6
					strQuestionText = "Where does ASP code execute?"
					aAnswers = Array( _
						"On the web server", _
						"In the client's browser", _
						"On any machine it wants to", _
						"Reportedly somewhere in Washington State")
				Case 7
					strQuestionText = "Which set of acronyms is not associated with ASP?"
					aAnswers = Array( _
						"CDO, CDONTS", _
						"ADO, RDS, DAO, ODBC", _
						"IIS, PWS, MMC", _
						"ADSI, XML", _
						"BÖC, OU812, GNR, BTO")
				Case 8
					strQuestionText = "Which of the following is not something you can get "
					strQuestionText = strQuestionText & "from the Request collection?"
					aAnswers = Array( _
						"Cookies", _
						"Form", _
						"QueryString", _
						"ServerVariables", _
						"Beer", _
						"ClientCertificate")
				Case 9
					strQuestionText = "What will this script output when run?<BR><BR><%<BR>"
					strQuestionText = strQuestionText & "Dim aTempArray<BR>Dim I<BR>"
					strQuestionText = strQuestionText & "aTempArray = Array(1, 2, 3)<BR>"
					strQuestionText = strQuestionText & "For I = LBound(aTempArray) To "
					strQuestionText = strQuestionText & "Ubound(aTempArray)<BR>"
					strQuestionText = strQuestionText & "     "
					strQuestionText = strQuestionText & "Response.Write I & " "<BR>"
					strQuestionText = strQuestionText & "Next 'I<BR>%><BR>"
					aAnswers = Array( _
						"0 1 2", _
						"1 2 3", _
						"0<BR>1<BR>2<BR>", _
						"1<BR>2<BR>3<BR>")
				Case 10
					strQuestionText = "What is the URL of the best ASP web site?"
					aAnswers = Array("http://www.asp101.com (yeah... like we'd put any other choices here!)")
			End Select
			' END HARD CODE
		End If
		' Now that we've got the variables set...
		' show the appropriate question and choices
		%>
		<FONT SIZE="+2"><B><%= Session("QuizName") %></B></FONT><BR>
		<BR>
		Progress Indicator:
		<%
		Const BAR_LENGTH = 160
		If iQuestionNumber = 1 Then
			' Since a 0 width is ignored by the browsers we need to remove the image altogether!
			Response.Write "<IMG SRC=""./images/spacer_red.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write BAR_LENGTH
			Response.Write """><BR>"
		Else
			Response.Write "<IMG SRC=""./images/spacer_blue.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write (BAR_LENGTH / iNumberOfQuestions) * (iQuestionNumber - 1) 
			Response.Write """>"
			Response.Write "<IMG SRC=""./images/spacer_red.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write (BAR_LENGTH / iNumberOfQuestions) * (iNumberOfQuestions - (iQuestionNumber - 1))
			Response.Write """><BR>"
		End If
		%>
		Question <%= iQuestionNumber %> of <%= iNumberOfQuestions %><BR>
		<BR>
		<STRONG><%= iQuestionNumber %>.</STRONG>  <%= strQuestionText %><BR>
		<BR>
		<STRONG>Choices:</STRONG>
		<OL TYPE="A">
		<%
		For I = LBound(aAnswers) to UBound(aAnswers)
			Response.Write "<LI><A HREF=""" & Request.ServerVariables("URL")
			Response.Write "?qid=" & iQuestionNumber & "&sa=" & I & """>"
			Response.Write aAnswers(I) & "</A></LI>" & vbCrLf
		Next 'I
		%>
		</OL>
		<%
	End If
End If 'bAbort
%>

Back the the Sample Output

Back to the Sample Index


Home |  News |  Samples |  Articles |  Lessons |  Resources |  Forum |  Links |  Search |  Feedback

Internet.com
The Network for Technology Professionals

Search:

About Internet.com

Legal Notices, Licensing, Permissions, Privacy Policy.
Advertise | Newsletters | E-mail Offers