Воскресенье, 2025-02-02

Professor VB - примеры на VB.net и C#
Меню сайта
Вход на сайт
Категории раздела
Уроки VB.net [25]
VB.net и математика [13]
Random VB [4]
VB.net - разное [7]
VB.net - Примеры программ [2]
Главная » Статьи » VB.net » Уроки VB.net

VB.net - Создание тестов 2 (+XML)

VB.net - Создание тестов 2 (+XML)



 

 

Продолжаем тему с различными тестами.

Тест - вопрос в виде текста (+XML)
XML с вопросами
Тест - вопрос в виде картинки (+XML +JPG)
XML с вопросами
Картинки (Rar)

 

В последнее время классический тест - вопрос и 4 варианта ответа - заменяется на задания такого типа. вопрос и набор букв, из которых складывается ответ.

Сегодня я продемонстрирую ее создание.

В этой части мы создадим программу, где вопрос будет представлен в виде текста, а затем -  дополним ее таким образом, что бы вопрос был картинкой и текстом.

Вопросы и ответы будем брать из файла XML


 

На форму помещаем текстовое поле - в него будет выводится вопрос,

3 кнопки - начать, очистить поле ответов и проверка.

кнопка начать - запускает выполнение заданий сначала.

кнопка очистить - очищает поля для ответа, если необходимо исправить.

Проверка - отвечает за проверку правильности ответа, и если он верен, запуск следующего вопроса.

 

 

В автоматическом режиме будут созданы 20 кнопок с буквами.

Как вариант, можно сделать несколько уровней сложности (чем меньше "левых" букв, тем проще)

А также кнопки для ответа - их будет столько же сколько и букв в слове-ответе.

 

А теперь переходим к коду.

Подключаем библиотеку для работы с файлами XML.


Imports System.Xml  'библиотека для работы с ХМЛ


Объявляем переменные


    'объявляем переменные
    Dim r As New Random     'случайное число

    'ярлыки-кнопки для букв
    Const wtykBukv = 20  'определяем колво объектов
    Const wtykOtv = 15    'определяем колво объектов

    Dim cmdN(wtykBukv) As Button   'массив кнопок заданного размера
    Dim cmdOtv(wtykOtv) As Button   'массив кнопок заданного размера

    Dim wir = 45     'ширина ярлыка
    Dim H = 35       'высота ярлыка
    Dim interv = 1  'интервал между соседями
    Dim Lefts = -25 'положение по горизонтали

    'вопрос-ответ инфа
    Dim fileName = "test.xml"   'файл с вопросами и ответами
    Dim otvetPrav As String     'правильный ответ
    Dim maxId_                        ' общее колво вопросов
    Dim a = 1   'номер вопроса
    Dim otvNamb = 1 'для удаления букв из ответа
    Dim slovoDlina = 1

    'Переменные для перемешивания
    Dim massCh As String() = {"а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"}
    Dim mass20(19)
    Dim chislo As Byte
'колво выводимых букв
    Dim element1, element2, x, y


 

Первая подпрограмма разбивает слово на буквы, а также добавляет случайные буквы до их общего колва 20.

После буквы перемешиваются и записываются в массив.

а затем из массива записываются в кнопки.


 'слова в буквы + рандомные буквы
    Sub Str2char(s As String)

        'слова в буквы
        Randomize() 'функция генерации случайных чисел
        chislo = 19 ' от 0 до 19=20 букв
        Dim ak = 0 'случайное число

        slovoDlina = s.Length - 1 'колво букв

        'заполняем массив буквами из слова
        For i = 0 To s.Length - 1
            mass20(i) = s.Chars(i)
        Next

        'в оставшееся место случайные буквы
        For i = s.Length To chislo
            ak = r.Next(1, 31)
'создание случ числа
            mass20(i) = massCh(ak)
        Next

        'перемешивание массива букв
        Randomize()
        For i = 0 To 10000
            x = Int(Rnd() * chislo) 
'Определили случайный элемент массива с номером х
            y = Int(Rnd() * chislo)  'Определили случайный элемент массива с номером y
            element1 = mass20(x)           'Запомнили значение случайного х-элемента массива
            element2 = mass20(y)           'Запомнили значение случайного y-элемента массива
            mass20(y) = element1           'Присвоили случайному x элементу значение y элемента
            mass20(x) = element2           'Присвоили случайному y элементу значение x элемента
        Next

        For i = 1 To wtykBukv       'от 1 до последнего элемента
            'пишем текст

            cmdN(i).Text = mass20(i - 1)
            cmdN(i).Enabled = True
        Next

    End Sub


 

Следом идут 2 подобных подпрограммы - для создания кнопок для случайных букв и для ввода ответа.

Основные их свойства - размеры, тип шрифта - одинаковы.

Отличаются они только положение по оси у - одни выше других.

 


    'создаем кнопки для букв
    Sub knopki()
        Dim Tops = 210    'положение по вертикали

        'располагаем наши кнопки на форме
        For i = 1 To wtykBukv       'от 1 до последнего элемента
            cmdN(i) = New Button      'каждый элемент массива - новая кнопка

            'размеры
            cmdN(i).Height = H
            cmdN(i).Width = wir

            'положение на форме
            If i < 11 Then
                cmdN(i).Left = Lefts + i * (interv + wir)
                cmdN(i).Top = Tops

            Else
                cmdN(i).Left = Lefts + (i - 10) * (interv + wir)
                cmdN(i).Top = Tops + H
            End If

            'выравниваем текст по центру
            cmdN(i).TextAlign = ContentAlignment.MiddleCenter
            cmdN(i).Font = New System.Drawing.Font("Arial", 15) 
'задаем шрифт

            'пишем текст
            cmdN(i).Text = i 'mass20(i - 1)

            cmdN(i).Visible = True         'делаем видимыми
            Me.Controls.Add(cmdN(i))       'добавляем на форму

            'кликаем - получаем индекс элемента
            AddHandler cmdN(i).Click, AddressOf cmdNClick
            Me.Controls.AddRange(Me.cmdN)
           
'ЭНД --- кликаем - получаем индекс
        Next
    End Sub

    'кнопки для ответа
    'создаем 15 шт, но делаем все невидимые

    Sub knopkiOtv()

        Dim Tops = 145    'положение по вертикали

        'располагаем наши кнопки
        For i = 1 To wtykOtv     'от 1 до последнего элемента
            cmdOtv(i) = New Button      'каждый элемент массива - новый ярлык

            'размеры
            cmdOtv(i).Height = H
            cmdOtv(i).Width = wir

            'положение на форме
            cmdOtv(i).Left = Lefts + i * (interv + wir)
            cmdOtv(i).Top = Tops


            'выравниваем текст по центру
            cmdOtv(i).TextAlign = ContentAlignment.MiddleCenter
            cmdOtv(i).Font = New System.Drawing.Font("Arial", 15) 
'задаем шрифт

            'пишем текст
            cmdOtv(i).Text = ""

            cmdOtv(i).Visible = False        'делаем НЕвидимыми
            Me.Controls.Add(cmdN(i))       'добавляем на форму

            'кликаем - получаем индекс элемента
            AddHandler cmdOtv(i).Click, AddressOf cmdOtvClick
            Me.Controls.AddRange(Me.cmdOtv)
        
    'ЭНД --- кликаем - получаем индекс
        Next
   
End Sub


Конечно, можно их было сделать и одной подпрограмме, но тогда понадобилось бы вводить дополнительные условия для обработки нажатий.

А так, у нас получилось для каждого набора кнопок - свой обработчик событий.

для букв-вопросов - по нажатию на кнопку, кнопка становится не активной, а ее текст переносится в свободную кнопку ответа.

для букв-ответа - будет выполнятся только одно событие - очистка ответа от всех букв.

Добавляем обработчики нажатий для каждого набора букв.



    'кликаем - получаем индекс
    'при щелчке на кнопку - буква помещается в след кнопку ответ

    Private Sub cmdNClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim i As Integer

        'Если надо узнать именно индекс в массиве,
        'то ищем объект sender
        i = Array.IndexOf(cmdN, sender)
   
     '-------------
        If otvNamb <= slovoDlina + 1 Then
            cmdOtv(otvNamb).Text = cmdN(i).Text
            cmdN(i).Enabled = False
            'cmdOtv(otvNamb).Tag = i
            otvNamb += 1
        End If

    End Sub

    'кликаем - получаем индекс
    'убираем все буквы из ответа

    Private Sub cmdOtvClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        clearW()
 
   End Sub

 


Подпрограмма очистки ответа от букв.


    'очищаем ответ от букв
    Sub clearW()
        'очищаем кнопки ответов от текста
        For j = 1 To wtykOtv
            cmdOtv(j).Text = ""
        Next

        'все кнопки с буквами делаем активными
        For i = 1 To wtykBukv
            cmdN(i).Enabled = True
        Next
        otvNamb = 1

    End Sub


Подпрограмма получения общего кол-ва вопросов - короткий вариант.


    ' (1) Получение общего колва вопросов
    Sub maxIDxml()     

        Dim xdoc As XDocument = XDocument.Load(fileName)

 

        Me.Text = xdoc.Element("Table").Elements("vprs").Count

 

    End Sub


 

Подпрограмма вывода нового вопроса.выводим в текст вопрос, делаем видимыми нужное колво букв для ответа.

Выводим все полученные буквы и увеличиваем номер следующего вопроса на 1, если он не больше чем общ колво вопросов.


 ' (2) показывает текст по номеру ID - вопрос и ответы
    Sub elements(nnn As Integer)
        otvNamb = 1
        maxIDxml()
        maxId_ = Val(Me.Text)
      
  'загрузка документа
        Dim xdoc As XDocument = XDocument.Load(fileName)
        For Each xe As XElement In xdoc.Element("Table").Elements("vprs")

            If xe.Element("id").Value = nnn Then
                txtVopros.Text = xe.Elements("text").Value
                otvetPrav = xe.Elements("otvet").Value
            End If

            Button3.Text = a ' номер вопроса
            slovoDlina = otvetPrav.Length

            'убираем все буквы ответа
            For j = 1 To wtykOtv
                cmdOtv(j).Visible = False
                cmdOtv(j).Text = ""
            Next

            'делаем видимыми необходимое колво букв
            For j = 1 To slovoDlina
                cmdOtv(j).Text = ""
                cmdOtv(j).Visible = True

            Next
         
   'разбиваем слово на буквы+лишние буквы
            Str2char(otvetPrav)
        Next
       
'если номер вопроса меньше общ колва вопросов
        If a < maxId_ Then
            a += 1
        End If

    End Sub


 

Структура элементов вопроса будет короче.

номер вопроса, текст вопроса, ответ.


<?xml version="1.0" encoding="utf-8"?>
<Table>
  <vprs>
    <id>1</id>
    <text>вопрос1</text>
    <otvet>ответ1</otvet>
  </vprs>
  <vprs>
    <id>2</id>
    <text>вопрос2</text>
    <otvet>ответ2</otvet>
  </vprs>
</Table>


 

Подпрограмма проверка.

 


    Sub proverka(mm As Integer)
        'Буквы в слово
        Dim vam = ""
        For j = 1 To wtykOtv
            vam += cmdOtv(j).Text
        Next

        'дальнейшее действие - новый вопрос
        If vam <> otvetPrav Then
            MsgBox("error")
        Else
            elements(a)
        End If
  
  End Sub


сравниваем полученное слово с верным.

Если все ок, тогда след вопрос, иначе - ошибка.

 

С подпрограммами мы закончили, идем дальше.

При загрузке формы мы находим общ колво вопросов в файле, строим оба набора кнопок, и выводим 1 вопрос.


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        maxIDxml()
        knopki()
        knopkiOtv()
        elements(a)
   
End Sub


 

Кнопка начать - выводит 1 вопрос.


  'начать заново
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        a = 1
        elements(a)
 
   End Sub


 

Кнопка проверка.

Если мы дошли до последнего вопроса, показывает нам, что мы выиграли.

Иначе запускает новый вопрос.


'проверка (тк а уже увеличена а-1)
    Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click

        If Val(Button3.Text) = maxId_ Then
            txtVopros.Text = "ПОБЕДА"
            Button4.Enabled = False
            Button3.Enabled = True
            Button3.Text = "Начать"

            '  PictureBox1.Image = Image.FromFile(pctwin)

            For j = 1 To wtykOtv
                cmdOtv(j).Visible = False
            Next

            For i = 1 To wtykBukv
                cmdN(i).Text = ""
                cmdN(i).Enabled = True
            Next
            MsgBox("win")

        Else
            proverka(a - 1)
        End If
    End Sub


 

Последняя кнопка - очистка - запускает подпрограмму очистки.


'очищаем ответ от букв
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        clearW()
   
End Sub


 

 

Кроме текстового вопроса можно использовать вопрос-картинку, для этого нам необходимо добавить PictureBox, а также внести пару строк в код.

 

Добавим в переменные


  'для картинки   'pct+
    Dim pctPach = Application.StartupPath + "\xgamesfoto\n"   'путь до папки с картинками
    Dim pctName = ""        'номер картинки - задаем в месте с вопросом
    Dim pctEx = ".jpg"       'расширение картинок

    'путь к картинке ПОБЕДА
    Dim pctwin = Application.StartupPath + "\xgamesfoto\win.jpg"


 

Вывод ответа - целиком (изменения выделил жирным)


    ' (2) показывает текст по номеру ID - вопрос и ответы
    Sub elements(nnn As Integer)
        otvNamb = 1
        maxIDxml()
        maxId_ = Val(Me.Text)

        'загрузка документа
        Dim xdoc As XDocument = XDocument.Load(fileName)
    
        For Each xe As XElement In xdoc.Element("Table").Elements("vprs")

            If xe.Element("id").Value = nnn Then
             
   'pct+
                'при переводе из инт в стринг появляется лишний пробел,
                'удаляем его

                pctName = LTrim(Str(nnn))

                'полный путь к файлу
                Dim pctFulNam = pctPach & pctName & pctEx
             
   'размещение файла в пикчер бокс
                PictureBox1.Image = Image.FromFile(pctFulNam)
               
'pct+----end

                txtVopros.Text = xe.Elements("text").Value
                otvetPrav = xe.Elements("otvet").Value
            End If

            Button3.Text = a
            slovoDlina = otvetPrav.Length

            For j = 1 To wtykOtv
                cmdOtv(j).Visible = False
                cmdOtv(j).Text = ""
            Next

            For j = 1 To slovoDlina
                cmdOtv(j).Text = ""
                cmdOtv(j).Visible = True

            Next
            Str2char(otvetPrav)
        Next
        If a < maxId_ Then
            a += 1
        End If

    End Sub


 

Так же можем украсить нашу программу. по нажатию на картинку она будет увеличиваться.


    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
        If PictureBox1.Width = 600 Then
            PictureBox1.Width = 300
            PictureBox1.Height = 150
        Else
            PictureBox1.Width = 600
            PictureBox1.Height = 300
        End If

    End Sub


Я использовал картинки размером 600Х300. так что в своей программе вы должны задать размеры исходя из своих картинок.

 

На сегодня это все.

 

Оценивайте это видео,  изучайте статью и делитесь ими в соц сетях.

 

 

Смотреть видео

В начало

 

 



 

 

 

Категория: Уроки VB.net | Добавил: ProfessorVB (2016-03-28)
Просмотров: 2407 | Теги: Test, XML, Vb.net, Тест | Рейтинг: 5.0/2
Всего комментариев: 0
avatar
Облако тегов
Поиск
Друзья сайта
  • www.youtube.com

  • vk.com/professorvb

  • Партнерка AIR

  • Партнерка VSP Group
  • Поделись с друзьям
    Теги
    Видео Switch массивы уравнения геометрия continue forEach while Обработка событий задать цвет C# math Vb.net xml количество элементов xml поиск значений математика видеоуроки Soft системы Google pirat Proxy tor НОД нок добавление записи в xml поиск Уроки генератор hello world время деструкторы конструкторы дроби калькулятор десятичные дроби решебник сокращение дробей си шарп мнемоника тренажер random количество дней между датами professorvb дата Урок mindgames алгебра многомерные слова словарь Пароль cos SIN база timer рандом Цикл Break DO for RGB условия массив элементов xml редактирование xml создание вирус MenuStrip AntiCenz fri-gate запрещенные сайты база данных Open RichTextBox XML удалить из xml save TopMost анекдот создать XML Классы Тест OpenFileDialog английский развитие иностранные слова DateTimePicker календарь массив перемешивание массива Анаграммы Рифмоплет Сравнение дробей Меморина скорочтение Использование ребусы комплексные числа программа генератор имен
    Copyright ProfessorVB © 2025