download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Система за провеждане на Електронни Тестове 0.7


Система за провеждане на електронни тестове разработена на ASP


Изтегли (102 KB)

Визитна картичка на програмата

Автор: PhotonSoft Ltd.
Лиценз: Open Source
ОС: Windows 2000/XP/2003/Vista 
Големина: 102 KB
Обновен на: 25.10.2009 от danieldenev
5114 показвания, 114 сваляния  Статистики

Потребителите, изтеглили тази
програма свалят още:

Test-R 2.3.1
Тестов Конструктор 1.0
Конструктор на тестове 1

Публикации в списанието


няма публикации
 

Публикуваната тук програма изисква уеб услугата на Microsoft IIS да е инсталирана допълнително на вашият Windows с идея да може да се конфигурира да излъчва .asp страници. Системата е web-базирана и не използва база от данни. Отчитането на резултатите става индивидуално "на мигът" за конкретният обучаем. Програмката се отличава с изключителна простота и освен за използване при проверката на познанията, би могла да послужи и като тренировъчен проект за програмисти. Скриптът е включен направо в представянето и е на VB

Предходни разработки на PhotonSoft Ltd. по темата "Електронни Тестове" може да видите ето Тестов Конструктор приложението е разработено на PHP/Apache и не ползва база данни за съхраняване на резултатите от проведените електронни тестове, но за сметка на това е много мощно и удобно пиложение работещо през интернет.
Друга опростена система ползваща сравнително новата технология на Microsoft ASP.NET (C#) можете да намерите тук

Instrukcii.doc
<%
' Взимам целочислена стойност като параметър и я конвертирам в подходящия символ
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
 
' За да опростя кода съм го разделил на части,
' функционална и коментарна част
' за да може да се разбере какво правя!
' Разделил съм го и щото искам да покажа кога е удобно да се ползва връзка към DB и кога hard-код и защо.
 
Function GetAnswerFromAnswerString(iQuestionNumber, strAnswers)
Dim strTemp
Dim iOffset
	
              ' Използвам InStrRev защото искам да ми бъде върната като резултат последната въведена стойност
	' в случай че се върнат назад и си променят решението.
 
	' Намирам къде се намира номера на въпроса който искам да използвам
 
	iOffset = InStrRev(strAnswers, "|" & iQuestionNumber & "|", -1, 1)
	' Извличаме нашия отговор от откритото отместване и
	' преминаваме в дясно по дължината на индикатора за прогрес на теста to arrive at the
	' за да достигнем по този начин до подходящия символ	
	
	strTemp = Mid(strAnswers, iOffset + Len("|" & iQuestionNumber & "|"), 1)
 
	' Няма как да е по друг начин, но за да съм сигурен
	' , че съм го конвертирал се убеждавам че е с голяма буква
	
GetAnswerFromAnswerString = UCase(CStr(strTemp))
End Function
%>
 
<%
 
' Кодът съм го направил да работи както със стойности от DB така и с твърд код.
'Първоначално го почнах да използва връзка с DB и примерната ми DB, обаче по-малко товари
' при твърдо кодиране (работи по-бързо).  Все пак използването на  DB ми дава по-добро
' инкапсулиране на данните и по лесно обновяване на по-късен етап.
'Иъобразявайки се с евентуалните нужди на клиентите съм дал и двете възможности.
 
' Ако искаш да ползваш DB тук булевата стойност трябва да я настрош на "Истина".
' hard-кода ползваш ако булевата стойност настроиш на "Лъжа"
 
Const USE_DB_FOR_INFO = False
 
' Тези две неща се правят само ако искаш да използваш DB,
' дко ли не, стойностите им са без значение
 
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;"
 
' Позволява ти да подкараш много тестове с много въпроси и то от една база данни DB като ги различаваш по тяхното 'QUIZ_ID!
 
Const QUIZ_ID = 1
 
 
' Сега за другите ни променливи ...
Dim cnnQuiz, rsQuiz     'DB обекти ако ги използваме за информация
 
Dim I          'стандартната ми променлива (некоректно наречена рекурсивна)         
Dim iNumberOfQuestions  'броя на въпросите в теста
Dim iQuestionNumber     'въпроса на който сме в момента
Dim strQuestionText     'текста на въпроса който да бъде зададен
Dim aAnswers         'масив с възможните отговори на въпроса
                        'когато използваме твърдо кодиране, използвам го още за определяне на верните отговори при
                        'при завършването на теста
   
                        
                        
Dim strAnswers        'съхранява номерата на въпросите и съответните им отговори
                        'разделени са с прави чертички "|"  
                        
Dim iScore      'това въвеждам за да знам колко добре се справя решаващия теста         
Dim bAbort         'добавено след като приключих записването за приключените сесии       
Dim strResults      'това добавих по-късно за всеки сбъркан въпрос!      
 
bAbort = False       'булевата променлива се установява в "Лъжа", тъй като изкам да отменям само в определени случаи    
 
' Ако това е първото стартиране на теста се инициализира всичко
' o/w връща нужните стойности. Проверявам ги като търся по идентификатор ID на въпрос
'от стринга на заявкта.
 
If Request.QueryString("qid") = "" Then
	' Връща набор от информация за теста
	If USE_DB_FOR_INFO Then
		' Кодът се използва при връзка с база данни DB!
		' Създава връзката с базата данни и се свързва с нея		
		
		Set cnnQuiz = Server.CreateObject("ADODB.Connection")
		cnnQuiz.Open DB_CONN_STRING
		
		' Създава набор записи и заявка към базата данни относно информация за теста
		Set rsQuiz = Server.CreateObject("ADODB.Recordset")
		rsQuiz.Open "SELECT * FROM quizzes WHERE quiz_id=" & QUIZ_ID & ";", cnnQuiz
		
		' Настройвам променливите на сесията
		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)
		
		' Затварям и премахвам обектите в базата данни
		rsQuiz.Close
		Set rsQuiz = Nothing
		cnnQuiz.Close
		Set cnnQuiz = Nothing
	Else
		' ако няма да се използва DB, тук съм дал твърдо кодиране
		' НАЧАЛО
		Session("QuizName") = "ASP Тест"
		Session("NumberOfQuestions") = 10
		Session("PercentageToPass") = 70
		' КРАЙ
	End If
 
	' Уставовявам индикатора за въпроса в 1 и инициализирам стринга на отговора
	iQuestionNumber = 1
	Session("AnswerString") = "|"
Else
	'Проверявам за да съм сигурен, че сесията още продължава!	
	If Session("AnswerString") = "" Then
		Response.Write "Съжалявам, но Ви отне твърде много време.  Можете да започнете отначало като "
		Response.Write "щракнете <A HREF=""" & Request.ServerVariables("URL") & """>тук</A>."
		'Обикновено използвам response.end, тук обаче немога защото съм вътре
		'шаблона на сайта. Нуждая се от скрипта, за да завърша, така че тук съм декларирал и установил
                            'един флаг 
		'Response.End
		bAbort = True
	End If
	
	' Взимам броя на въпросите които обработвам
	iQuestionNumber = CInt(Request.QueryString("qid"))
		
	' Регистрирам избраните отговори на последният въпрос
	Session("AnswerString") = Session("AnswerString") & iQuestionNumber & "|" & _
		GetLetterFromAnswerNumber(CInt(Request.QueryString("sa"))) & "|"
	
	' Инкрементирам идентификатора на въпроса
	iQuestionNumber = iQuestionNumber + 1
End If
 
' Ако времето на сесията е изтекло, тогава пропускам целия този код.
' респективно, ако сесията не е изтекла, целия този код си работи!
If Not bAbort Then
 
	' Използвам локална променлива за да не ми се налага всеки път да искам достъп до набора
	' Това не е задължително да се прави, на прави достъпа по-лесен
	' а и работи по-бързо ... не знам колко точно, но със сигурност не вреди
	
	iNumberOfQuestions = Session("NumberOfQuestions")
 
	' Проверявам дали тстът е завършил. Ако е така показвам резултатите, o/w
	' задавам следващия въпрос
	
	If iQuestionNumber > iNumberOfQuestions Then
		' Обработват се резултатите и се показва нещо като отчет на постижението
		
		' Долното е направено по същата причина само че за iNumberOfQuestions както в няколкото реда по-горе
		strAnswers = Session("AnswerString")
		
		
		' Обработват се верните отговори и се сравняват с въведените
		If USE_DB_FOR_INFO Then
			' Следния код е в сила ако работим с DB!
			' Създавам връзка към базата данни и я използвам
			Set cnnQuiz = Server.CreateObject("ADODB.Connection")
			cnnQuiz.Open DB_CONN_STRING
				
			' Създавам набор записи и заявка към DB за да получа информация за теста
			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
                                                       ' Това се използва за да се получи изход
			             ' за коректния статус за всеки въпрос
				' Полезно е и за откриване на грешки в кода
				'Response.Write "Right" & "<BR>" & vbCrLf
					
				Else
					'Response.Write "Wrong" & "<BR>" & vbCrLf
					strResults = strResults & I & ", "
				End If
				I = I + 1
				rsQuiz.MoveNext
			Loop
 
			' Прекратявам разполагането на обектите в базата данни
			rsQuiz.Close
			Set rsQuiz = Nothing
			cnnQuiz.Close
			Set cnnQuiz = Nothing
		Else
			' Ако няма да се ползва база данни по-долу е даден кодът в отговорни стоиности
			' НАЧАЛО НА КОДА
			aAnswers = Array("A", "A", "A", "E", "D", "A", "E", "E", "A", "A")
			' КРАЙ НА КОДА
			
			
			iScore = 0
			For I = 1 to iNumberOfQuestions
				If UCase(CStr(aAnswers(I - 1))) = _
					GetAnswerFromAnswerString(I, strAnswers) Then
					
					iScore = iScore + 1
					' Последното използвам за да получа изход
					' за верността на всеки един въпрос
					' Полезно е и за откриване на грешки в кода
					'Response.Write "Вярно" & "<BR>" & vbCrLf
				Else
					'Response.Write "Грешно" & "<BR>" & vbCrLf					
					strResults = strResults & I & ", "
				End If
			Next 'I
		End If
 
		' Крайния резултат го превръщам в проценти, като го закръглям до цяло число
		iScore = Round((iScore / iNumberOfQuestions) * 100)
		%>
		<FONT SIZE="+2"><B><%= Session("QuizName") %></B></FONT><BR>
		<BR>
		<%
		If iScore >= Session("PercentageToPass") Then 
			Response.Write "Поздравления!  Преминахте теста с резултат от "
			Response.Write iScore & "%.<BR>" & vbCrLf
		Else
			Response.Write "Съжалявам!  Необходимо е да постигнете резултат от "
			Response.Write Session("PercentageToPass") & "% или по-висок процент, за да преминете теста.  "
			Response.Write "За съжаление вашият резултат беше само " & iScore & "%.  "
			Response.Write "Теста може да повторите отново, като щракнете <A HREF="""
			Response.Write Request.ServerVariables("URL") & """>тук</A>.<BR>" & vbCrLf
		End If
		Response.Write "<BR>" & vbCrLf
		If Len(strResults) <> 0 Then
			Response.Write "Допуснахте грешки на следните въпроси: " & Left(strResults, Len(strResults) - 2)
			Response.Write "<BR>" & vbCrLf
		End If
		'Response.Write iScore & "%"
                            ' Ако е необходимо, това е мястото където могат да се запишат резултатите.
		' в най прост вид това се прави като се запише стринга strAnswers във файл,
		' може да се форматират "отчетни карти" или резултатите да се запишат в отделна база данни
		' отделна база данни.
		
	Else
		' Обработва се информацията от теста
		If USE_DB_FOR_INFO Then
			' При използване на база данни е в сила следния код
			' Създавам и откривам връзка към база данни
			Set cnnQuiz = Server.CreateObject("ADODB.Connection")
			cnnQuiz.Open DB_CONN_STRING
				
			' Създавам набор записи и заявка към базата данни за да получа информация за теста
			Set rsQuiz = Server.CreateObject("ADODB.Recordset")
			rsQuiz.Open "SELECT * FROM questions WHERE quiz_id=" _
				& QUIZ_ID & " AND question_number=" & iQuestionNumber & ";", cnnQuiz
				
			' Поставям информацията за въпроса
			strQuestionText = CStr(rsQuiz.Fields("question_text").Value)
			
			' Взимам масив от отговори
			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 & ""))
				
			' Зле написано, но все пак работи
			For I = LBound(aAnswers) To UBound(aAnswers)
				If aAnswers(I) = "" Then
					ReDim Preserve aAnswers(I - 1)
					Exit For
				End If
			Next ' I
 
			' Прекратявам поместването на обекти в базата данни
			rsQuiz.Close
			Set rsQuiz = Nothing
			cnnQuiz.Close
			Set cnnQuiz = Nothing
		Else
			' Ако няма да се използва база данни стойностите са в кода
			' НАЧАЛО НА КОДА
			Select Case iQuestionNumber
				Case 1
					strQuestionText = "Какво означава на английски съкращението ASP?"
					aAnswers = Array( _
						"Active Server Pages", _
						"Additional Sensory Perception", _
						"Accidental Script Problem", _
						"Altruistically Solving Problems", _
						"Additional Sleeping Preferred", _
						"Всички посочени по-горе")
				Case 2
					strQuestionText = "На коя команда е еквивалентен записа <%= %>?"
					aAnswers = Array( _
						"Response.Write", _
						"Request.Write", _
						"Referer.Write", _
						"Redirect.Write", _
						"Reasonably.Write", _
						"Всяка една от посочените")
				Case 3
					strQuestionText = "Какво прави "Option Explicit"?"
					aAnswers = Array( _
						"Изисква деклариране на дадена променлива", _
						"Кара компютъра да дава съобщения за грешки", _
						"Преобразува PG в NC-17")
				Case 4
					strQuestionText = "Кой от следните записи не е валиден във "
					strQuestionText = strQuestionText & "VBScript?"
					aAnswers = Array( _
						"Do...Loop", _
						"While...Wend", _
						"For...Next", _
						"For Each...Next", _
						"Цикъла се повтаря 10 пъти")
				Case 5
					strQuestionText = "Кой от езиците не използваме за да вграждаме скриптове в ASP?"
					aAnswers = Array( _
						"VBScript", _
						"JavaScript (JScript)", _
						"PerlScript", _
						"SuperScript")
				Case 6
					strQuestionText = "Къде се изпълнява ASP кода?"
					aAnswers = Array( _
						"На сървъра", _
						"В клиентския браузър", _
						"На всяка машина която го изиска", _
						"По последни сведения само в София")
				Case 7
					strQuestionText = "Кой набор от съкращения не е свързан с  ASP?"
					aAnswers = Array( _
						"CDO, CDONTS", _
						"ADO, RDS, DAO, ODBC", _
						"IIS, PWS, MMC", _
						"ADSI, XML", _
						"B&#214;C, OU812, GNR, BTO")
				Case 8
					strQuestionText = "Кое от следните неможе да получим в отговор "
					strQuestionText = strQuestionText & "на набора заявки?"
					aAnswers = Array( _
						"Кукита", _
						"Формуляр за попълване", _
						"QueryString", _
						"Сървърни променливи", _
						"Съхраненият код", _
						"Клиентски сертификат")
				Case 9
					strQuestionText = "Какъв ще бъде резултатът от работата на този скрипт?<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 = "Кой е URL- ла на PHOTON.NET?"
					aAnswers = Array("http://pritybg.com/photon")
			End Select
			' КРАЙ НА КОДА
		End If
 
		' това което имаме е наборът променливи ...
		' показващ подходящия въпрос и отговори
		%>
 
		<FONT SIZE="+2"><B><%= Session("QuizName") %></B></FONT><BR>
		
		<BR>
		
		Прогрес Индикатор:
		<%
		Const BAR_LENGTH = 160
		If iQuestionNumber = 1 Then
			' Тъй като нулевата дължина се игнорира от браузърите
                                          ' трябва да премахна изображението напълно
			Response.Write "<IMG SRC=""spacer_red.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write BAR_LENGTH
			Response.Write """><BR>"
		Else
			Response.Write "<IMG SRC=""spacer_blue.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write (BAR_LENGTH / iNumberOfQuestions) * (iQuestionNumber - 1) 
			Response.Write """>"
			Response.Write "<IMG SRC=""spacer_red.gif"" HEIGHT=""10"" WIDTH="""
			Response.Write (BAR_LENGTH / iNumberOfQuestions) * (iNumberOfQuestions - (iQuestionNumber - 1))
			Response.Write """><BR>"
		End If
		%>
		Въпрос <%= iQuestionNumber %> от <%= iNumberOfQuestions %><BR>
		
		<BR>
 
		<STRONG><%= iQuestionNumber %>.</STRONG>  <%= strQuestionText %><BR>
 
		<BR>
 
		<STRONG>Отговори:</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
%> 

За въпроси: Даниел И. Денев

Символ на мъдростта
Символ на мъдростта

PhotonSoft Ltd. (president and owner)
Bulgaria, 5000 Veliko Tarnovo
58V Nikola Gabrovski blv.
cell 00359 884 027191
cell 00359 889 369651
tel 00359 619 23355
daniel.i.denev@gmail.com
daniel_i_denev@abv.bg
http://strongmind.webs.com (private blog)

Ограничения: IIS, ASP. Да не се включва в платени пакети! Да се извести разработчика за промени направени в кода.

Изисквания: IIS, ASP, XML


Мнения на потребители

Твоето мнение

Няма мнения

Платени препратки

Рекламни чанти
Екстрапак произвежда рекламни чанти
и опаковки от хартия и (био)полимери
Bags.BG
bgERP
Управлявайте фирмата си
с безплатен, уеб базиран софтуер
www.bgerp.com
Компютри за геймъри
Домашни компютърни системи за игри
Конфигурации по желание от Перси ООД
www.persy.com

вашето каре - тук

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.