Рисунок 2.1 – Внешний вид формы FormAvto
Для вывода вопросов, ввода ответов пользователя предусмотрим отдельную форму FormTest. Список объектов, используемых в форме приведен в таблице 2.2, а внешний вид приведен на рисунке 2.2.
Таблица 2.2 – Объекты экранной формы FormTest
Имя | Тип | Назначение |
Label1 | TLabel | надпись «Текущий вопрос» |
LbNom | TLabel | надпись, в которой будет выводиться номер текущего вопроса |
StaticText1 | TStaticText | поле, в котором будет выводиться очередной вопрос |
RGroup1 | TRadioGroup | поля для вывода вариантов ответов и их указания студентом |
BitBtn1 | TBitBtn | кнопка «Принять ответ» для анализа ответа и перехода к следующему вопросу |
BNewTest | TButton | кнопка для закрытия формы тестов и перехода на форму авторизации (для новой попытки тестирования) |
При построении формы предполагалось, что база вопросов будет построєна таким образом, чтобы ответ предполагал выбор только одного из перечисленных четырех вариантов ответов. То есть, база не должна содержать вопросов с множественным выбором, либо вариантов без правильного ответа. Также не должно быть вопросов, требующих ввода ответа в текстовом виде (например, ответ вычисленной формулы или правильное написание ключевого слова).
Рисунок 2.2 – Внешний вид формы FormTest
Во избежание кратковременного завершения теста скроем системное меню окна, установив параметр формы FormTest. BorderIcons biSystemMenu равным false. Также в алгоритме следует предусмотреть, что в начале тестирования кнопка с надписью «Начать заново» должна быть невидимой, и должна появляться только после ответа на все вопросы и вывода итоговой оценки.
Анализируя все вышеизложенные предположения и разработанные формы, можем составить словесные алгоритмы приложения.
1. Запустить экранную форму авторизации FormAvto
2. При нажатии на кнопку «Начать» следует выполнить действия:
2.1 Сгенерировать базу вопросов, и перемешать их случайным образом;
2.2 Сформировать имя файла из имени студента и его группы и открыть файл для записи;
2.3 Обнулить количество правильных ответов;
2.4 Установить номер текущего вопроса на первый вопрос;
2.5 Скрыть форму FormAvto и показать форму с тестами FormTest;
2.6 Показать первый вопрос и варианты его ответов на форме FormTest;
2.7 Ожидать нажатия на кнопку «Принять ответ».
3. При нажатии на кнопку «Принять ответ» следует выполнить действия:
3.1 Проанализировать выбранный вариант ответа и сравнить его с правильным, и если ответ правильный, то нарастить количество правильных ответов на 1;
3.2 Записать в файл протокола текущий вопрос и вариант, который выбрал пользователь в качестве ответа;
3.3 Если номер текущего вопроса меньше общего количества вопросов в базе, то нарастить номер на 1, вывести очередной вопрос на форму и перейти к началу пункта 3.
3.4 Если номер текущего вопроса равен количеству вопросов в базе, то:
3.4.1.подсчитать оценку пропорционально количеству правильных ответов;
3.4.2.показать сообщение с оценкой;
3.4.3.сделать кнопку «Начать заново» видимой
4. При нажатии кнопки «Начать заново» закрыть форму с тестами FormTest и показать форму авторизации FormAvto.
Анализируя требования к функциям разрабатываемого приложения под разработанные экранные формы и словесный алгоритм, можно выделить следующие программные модули:
1) Генерация базы вопросов;
2) Перемешивание базы вопросов случайным образом;
3) Анализ текущего ответа и переход на следующий вопрос, если вопрос не последний либо вывод результатов тестирования при достижении последнего вопроса;
4) Модули перехода между экранными формами авторизации и тестирования.
Каждый из вышеприведенных модулей реализуем при помощи процедуры. Модуль 1 целесообразно запускать один раз при создании формы с тестами. Модуль 2 следует запускать каждый раз при начале нового теста, то есть при активизации формы с тестами. Модель 3 должен запускаться каждый раз при нажатии на кнопку «Принять ответ». Модули 4 должны быть обработчиками нажатий на кнопку «Начать» экранной формы авторизации и кнопку «Начать заново» экранной формы тестирования.
Составим алгоритм приложения, который представлен в приложении на рисунке A.1. На алгоритме приведены основные события экранных форм. В этом алгоритме:
Блок №4 реализован процедурой FormAvto, BitBtnStartClick,
блок №5 – процедурой FormTest. FormCreate,
блок №6 – процедурой FormTest. FormActivate,
блок№7 – процедуройFormTestBNewTestClick,
блок№8 реализованпроцедуройFormTest. BitBtn1Click.
Детальное описание разработанной программы, алгоритмов и их программной реализации приведено в последующих разделах.
3. Описание программных модулей
В программе используется переменная FormAvto, которая представляет собой экранную форму. Объекты экранной формы были приведены в таблице 2.1. У формы имеется лишь один обработчик нажатия на кнопку BitBtnStart. Текст обработчика приведен в строках 26–32 листинга из приложения Б. В теле обработчика происходит считывание введенных имени и фамилии учащегося и его группы в переменные, после чего исходная форма скрывается и активизируется форма тестирования.
Переменная FormTest, представляет собой экранную форму, объекты которой приведены в таблице 2.2.
В разделе var опишем переменные, приведенные в таблице 3.1
Таблица 3.1 – Переменные программы
Наименование | Тип | Назначение |
SFam, SGr | String | хранение фамилии и группы учащегося |
fName | String | имя текстового файла для записи протокола |
f | TextFile | переменная для работы с текстовым файлом |
BasaV | CVoprosi | класс, хранящий базу вопросов и ответы |
CurN | byte | номер текущего вопроса из базы |
Ratio | byte | количество правильных ответов |
Для хранения базы вопросов разработаем пользовательский класс CVoprosi. В классе содержится одно поле и два метода. Поле test – это динамический массив, в котором хранятся вопросы и ответы. При это каждый тест храниться в виде записи типа TTest со следующими полями:
- Vopr: string – содержит вопрос теста;
- ans: array [0..3] of string – содержит 4 варианта ответов;
- korans: byte – содержит вариант правильного ответа (его номер в массиве ans).
Для формирования базы ответов создан метод AddTest (_vopr, _ans0, _ans1, _ans2, _ans3:string; _korans:byte), которому в качестве параметров передаются вопрос, четыре варианта ответов и номер правильного ответа, а в теле метода происходит увеличение длины массива с тестами на единицу и текущий тест записывается в конец массива.
Второй метод класса CVoprosi. Mix предназначен для перемешивания базы вопросов. В нём организован цикл, в теле которого генерируются два произвольных числа i1 и i2 в интервале от 0 до количества вопросов в базе каждое. После чего вопросы с номерами i1 и i2 меняются местами.
В разработанной программе содержится описание пользовательских процедур и обработчиков событий, которые приведены в таблице 3.2.
Таблица 3.2. Пользовательские процедуры и обработчики событий
Наименование | Обр-к | Назначение | Строки |
BitBtnStartClick | + | переход на форму тестов после нажатия «НАЧАТЬ» | 26–32 |
FormCreate | + | формирование базы вопросов при создании фомры тестирования | 108–156 |
FormActivate | + | инициализация тестирования (перемешивание, сброс количества ответов и номера текущего вопроса, вывод первого вопроса) при активизации формы тестирования | 157–182 |
BitBtn1Click | + | анализ введенного ответа и вывод очередного вопроса или итоговой оценки | 183–228 |
BNewTestClick | + | закрытие формы тестов и переход на форму авторизации при нажатии на «Начать заново» | 229–235 |
AddTest | добавление нового теста в базу | 78–90 | |
Mix | перемешивание базы тестов случайным образом | 91–107 |
Процедура BitBtn1Click предназначена для анализа ответа и вывода очередного вопроса или итоговой оценки. Алгоритм выполнения процедуры приведен на рисунке А.2 приложения А.
В теле процедуры выполняются следующие действия: Если текущий номер вопроса меньше общего количества вопросов, то формируется строка S c вопросом и выбранным ответом и записывается в файл протоколов f. Сравнивается выбранный номер ответа (RGroup1. ItemIndex) с номером правильного ответа (BasaV.test[curN].Korans) и, если он совпадает, то наращивается количество правильных ответов Ratio. Наращивается номер текущего вопроса curN. И очередной вопрос с вариантами ответов выводится на форму.
Если все вопросы были заданы (curN равно количеству вопросов), то рассчитывается итоговая оценка как (Ratio*12)/(общее количество вопросов) и записывается в файл протокола, а также выводится сообщение в виде диалогового окна с оценкой. Также становится видимой кнопка BNewtest c надписью «Начать заново», позволяющая перейти на форму авторизации. Во избежание подбора ответов выводится только последняя итоговая оценка без указания в каких вопросах были сделаны ошибки.
Разработанная программа представляет собой исполняемый файл Tester.exe размером 422912 байт. В программе выполняется тестирование пользователя основам языка Pascal.
После запуска программы появляется окно, изображенное на рисунке 4.1.
Рисунок 4.1 – Окно авторизации
В этом окне учащийся должен задать свою фамилию и группу, после чего нажать на кнопку с надписью «НАЧАТЬ». После этого появится вторая форма с тестовыми вопросами, изображенная на рисунке 4.2. Заметим, что порядок вопросов при каждом новом запуске случайный, поэтому содержание поля вопроса и ответом может быть иным.