VB.net - Создание тестов
Программа + XML |
|
Тест файл XML |
|
В этой статье я хочу показать ещё один пример использования файлов XML.
Как вы поняли из названия, мы создадим программу для тестирования.
Особенностью этой программы я отметил следующие: варианты ответов будут перемешиваться, т.е. просто запомнить буквы ответов не поможет. Все вопросы будут записаны в XML файл с такой структурой.
<?xml version="1.0" encoding="utf-8"?>
<Table>
<vprs>
<id>НОМЕР</id>
<text>ВОПРОС</text>
<otvet>ПравОтвет</otvet>
<otvet1>Ответ1</otvet1>
<otvet2>Ответ2 </otvet2>
<otvet3>Ответ 3</otvet3>
<otvet4>Ответ4 </otvet4>
</vprs>
Такая структура обусловлена тем, что если ответы статичны и всегда на своих местах, то правильный ответ может находится на любой позиции. Если ответы будут перемешиваться, то прав ответ можно записывать в ОТВЕТ1, тем самым избавляясь от лишней строки в каждом вопросе.
Количество вопросов берётся из файла, т.е. мы, не меняя кода программы, можем создать тест как на 2 вопроса, так и на 200.
Приступим к созданию программы.
На форму помещаем RichTextBox - 1 , RadioButton - 4, Button - 2.
Imports System.Xml 'библиотека для работы с ХМЛ
Public Class Form1
Dim fileName = "test.xml" 'файл с вопросами и ответами
Dim rang = 0 'количество верных ответов
Dim otvetPrav As String 'правильный ответ
Dim rezylt As String 'ваш ответ и правильный ответ
Dim a = 1 'номер вопроса
Dim maxId_ ' общее колво вопросов
' (1) Получение общего колва вопросов
Sub maxIDxml()
Dim xdoc As XDocument = XDocument.Load(fileName)
Me.Text = xdoc.Element("Table").Elements("vprs").Count
End Sub
' (2) показывает текст по номеру ID - вопрос и ответы
Sub element1(nnn As Integer)
maxIDxml()
maxId_ = Val(Me.Text)
Dim xdoc As XDocument = XDocument.Load(fileName)
rtbOtvet.Text = ""
For Each xe As XElement In xdoc.Element("Table").Elements("vprs")
If xe.Element("id").Value = nnn Then
rtbOtvet.Text += xe.Elements("text").Value
Dim o1 = xe.Elements("otvet1").Value
Dim o2 = xe.Elements("otvet2").Value
Dim o3 = xe.Elements("otvet3").Value
Dim o4 = xe.Elements("otvet4").Value
Dim mass() = {o1, o2, o3, o4}
'перемешивание
Dim x, y, el1, el2
Randomize()
For i = 1 To 10000
x = Int(Rnd() * 4) 'Определили случайный элемент массива с номером х
y = Int(Rnd() * 4) 'Определили случайный элемент массива с номером y
el1 = mass(x) 'Запомнили значение случайного х-элемента массива
el2 = mass(y) 'Запомнили значение случайного y-элемента массива
mass(y) = el1 'Присвоили случайному x элементу значение y элемента
mass(x) = el2 'Присвоили случайному y элементу значение x элемента
Next
'end перемешивание()
rb1.Text = mass(0)
rb2.Text = mass(1)
rb3.Text = mass(2)
rb4.Text = mass(3)
otvetPrav = xe.Elements("otvet").Value
End If
Next
End Sub
'результаты теста
Sub STOPS()
maxId_ = Val(Me.Text)
otvetPrav = ""
MsgBox("Ваш результат " + Str(rang) + " из " + Str(maxId_) + vbCrLf + vbCrLf + rezylt)
cmdOk.Enabled = False
End Sub
'запись ответов
Sub RadBut(rb As RadioButton)
If rb.Checked = True Then 'если выбранный РБ истина
If rb.Text = otvetPrav Then 'если текст в этом РБ является прав ответом
rang += 1 '+1 прав ответ
End If
'в перемен рез записываем выбран отв и прав отв
rezylt += rb.Text + " - " + otvetPrav + vbCrLf
End If
End Sub
'обнуление всех переменных для нового теста
Sub newTEST()
a = 1
rang = 0
cmdOk.Text = "Дальше"
cmdOk.Enabled = True
rezylt = ""
element1(a)
End Sub
'при запуске - новый тест
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
newTEST()
End Sub
'кнопка ОК
Private Sub cmdOk_Click(sender As Object, e As EventArgs) Handles cmdOk.Click
maxId_ = Val(Me.Text)
'делаем проверку для каждого РБ,
'тк выбран может быть только 1, но хз какой
RadBut(rb1)
RadBut(rb2)
RadBut(rb3)
RadBut(rb4)
'если НЕ последний вопрос тогда
If a < maxId_ Then
a += 1 'след вопрос
element1(a) 'показываем его
'статистика вопросов
cmdOk.Text = Str(a) + " из " + Str(maxId_)
'выбирается 1 РБ (для нового вопроса)
rb1.Checked = True
Else
'иначе - проверка ответов
STOPS()
End If
End Sub
'кнопка Новый тест
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
newTEST()
End Sub
End Class
Смотреть видео
В начало
|