- Генерация базы вопросов;
- Перемешивание базы вопросов случайным образом;
- Анализ текущего ответа и переход на следующий вопрос, если вопрос не последний либо вывод результатов тестирования при достижении последнего вопроса;
- Модули перехода между экранными формами авторизации и тестирования.
Каждый из вышеприведенных
модулей реализуем при помощи
процедуры. Модуль 1 целесообразно запускать один раз при создании формы с тестами.
Модуль 2 следует запускать каждый раз
при начале нового теста, то есть при активизации
формы с тестами. Модель 3 должен запускаться
каждый раз при нажатии на кнопку «Принять
ответ». Модули 4 должны быть обработчиками
нажатий на кнопку «Начать» экранной формы
авторизации и кнопку «Начать заново»
экранной формы тестирования.
Составим алгоритм приложения,
который представлен в приложении
на рисунке A.1. На алгоритме приведены
основные события экранных форм. В
этом алгоритме:
Блок №4 реализован процедурой
FormAvto, BitBtnStartClick,
блок №5 – процедурой
FormTest. FormCreate,
блок №6 – процедурой
FormTest. FormActivate,
блок №7 – процедурой FormTest BNewTestClick,
блок №8 реализован процедурой FormTest. BitBtn1Click.
Детальное описание разработанной программы,
алгоритмов и их программной реализации
приведено в последующих разделах.
3. Описание программных
модулей
3.1 Описание переменных и объектов
В программе используется
переменная 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 |
3.2 Описание процедуры BitBtn1Click
Процедура BitBtn1Click предназначена
для анализа ответа и вывода очередного
вопроса или итоговой оценки. Алгоритм
выполнения процедуры приведен на рисунке
А.2 приложения А.
В теле процедуры выполняются
следующие действия: Если текущий номер вопроса
меньше общего количества вопросов, то
формируется строка S c вопросом и выбранным
ответом и записывается в файл протоколов
f. Сравнивается выбранный номер ответа
(RGroup1. ItemIndex) с номером правильного ответа
(BasaV.test[curN].Korans) и, если он совпадает, то
наращивается количество правильных ответов
Ratio. Наращивается номер текущего вопроса
curN. И очередной вопрос с вариантами ответов
выводится на форму.
Если все вопросы
были заданы (curN равно количеству вопросов), то рассчитывается итоговая оценка
как (Ratio*12)/(общее количество вопросов)
и записывается в файл протокола, а также
выводится сообщение в виде диалогового
окна с оценкой. Также становится видимой
кнопка BNewtest c надписью «Начать заново»,
позволяющая перейти на форму авторизации.
Во избежание подбора ответов выводится
только последняя итоговая оценка без
указания в каких вопросах были сделаны
ошибки.
4. Инструкция оператору
Разработанная программа
представляет собой исполняемый
файл Tester.exe размером 422912 байт. В программе выполняется
тестирование пользователя основам языка
Pascal.
После запуска программы
появляется окно, изображенное на рисунке
4.1.
Рисунок 4.1 – Окно авторизации
В этом окне учащийся должен
задать свою фамилию и группу, после чего нажать на кнопку с надписью
«НАЧАТЬ». После этого появится вторая
форма с тестовыми вопросами, изображенная
на рисунке 4.2. Заметим, что порядок вопросов
при каждом новом запуске случайный, поэтому
содержание поля вопроса и ответом может
быть иным.
Рисунок 4.2 – Окно тестирования
Пользователь должен
выбрать только один из четырех предложенных
вариантов ответа, щелкнув по соответствующей
метке с вариантом ответа, при
этом напротив варианта ответа в кружочке
должна появиться отметка .
После этого следует нажать на кнопку .
Появится новый вопрос,
ответ на который реализуется
аналогичным способом. Если были пройдены
все вопросы, выводится сообщение
с оценкой, которая пропорциональна
количеству правильных ответов. Все
ответы правильные – оценка равна 12. Все ответы неправильные – оценка
равна 0. Пример окна с сообщением об оценке
приведено на рисунке 4.3.
Рисунок 4.3
После этого можно
вернуться на окно авторизации, чтобы
пройти тест заново, нажав на кнопку .
Протокол с вариантами
ответов, которые были введены учащимся заносятся
в текстовый файл на жестком диске с именем
«<фамилия>+<группа>.txt» в том же каталоге,
где находится исполняемый файл. Пример
протокола с правильными вариантами ответов
приведен в приложении В.
Выводы
Данный курсовой проект был выполнен в полном соответствии
поставленному заданию и отлажен в среде
DELPHI 7.0. В ходе выполнения курсовой работы
была разработана программа для тестирования
студентов по программированию с графическим
интерфейсом. База содержит 20 вопросов
по основам языка Pascal. Программа может
бать использована в образовательных
целях.
В качестве дальнейшего
развития возможна доработка программы
с целью поддержки множественных
вариантов ответа, поддержкой текстового
ввода в качестве ответа (без указания
альтернатив), организации таймера и ограничения
времени решения на каждый из вопросов,
возможности пропустить некоторые вопросы,
чтобы вернуться к ним и ответить на них
в случае наличия времени и др.
В результате выполнения
данной курсовой работы, я убедилась в широких возможностях языка программирования
Delphi 7.
Перечень
ссылок
- Валентин Озеров «Советы по Delphi», 1999
- Зуев Е.А. Программирование на языке Turbo Pascal 6. 0,7.0. – М.: Радио и связь, Веста, 1993.
- Фаронов В.В. Turbo Pascal 7.0. Начальный курс. – М.: Нолидж, 2000.
- Фаронов В.В. «DELPHI. Программирование на языке высокого уровня». – Питер, 2005.
- Дятченко Д.А. Методические указания к выполнению курсовой работы по дисциплине «Программирование и алгоритмическе языки» – Северодонецк, 2005.
Приложение А
Алгоритм программы
Рисунок А.1 – Обработка событий
экранных форм программы
Рисунок А.2 – Алгоритм процедуры
BitBtn1Click
Приложение Б
Модуль формы авторизации
- unit Unit2;
- interface
- uses
- Windows, Messages, SysUtils,
Variants, Classes, Graphics,
- Controls, Forms, Dialogs,
StdCtrls, Buttons;
- type
- TFormAvto = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- EFam: TEdit;
- EGroup: TEdit;
- BitBtnStart: TBitBtn;
- procedure BitBtnStartClick (Sender: TObject);
- private
- {Private declarations}
- public
- {Public declarations}
- end;
- var
- FormAvto: TFormAvto;
- implementation
- uses Unit1;
- {$R *.dfm}
- procedure TFormAvto. BitBtnStartClick (Sender: TObject);
- begin
- SFam:=EFam. Text+ ' ';
- SGr:=EGroup. Text;
- hide;
- FormTest. Show;
- end;
- end.
Модуль формы
тестирования
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils,
Variants, Classes, Graphics,
- Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
- type
- TFormTest = class(TForm)
- BitBtn1: TBitBtn;
- Label1: TLabel;
- LbNom: TLabel;
- StaticText1: TStaticText;
- RGroup1: TRadioGroup;
- BNewTest: TButton;
- procedure FormCreate (Sender: TObject);
- procedure BitBtn1Click (Sender: TObject);
- procedure BNewTestClick (Sender: TObject);
- procedure FormClose (Sender:
TObject; var Action: TCloseAction);
- procedure FormActivate (Sender: TObject);
- private
- {Private declarations}
- public
- {Public declarations}
- end;
- TTest = record
- vopr:string; // вопрос
- ans:array [0..3] of string; // ответы
- korans:byte; // номер правильного ответа
- end;
- CVoprosi = class
- test: array of TTest;
- procedure AddTest (_vopr,_ans0,_ans1,_ans2,_ans3:string;_korans:byte);
- procedure Mix;
- end;
- var
- SFam, Sgr:string; // фамилия и группа учащегося
- fName:string;
- f: TEXTFILE;
- FormTest: TFormTest;
- BasaV:CVoprosi;
- CurN:byte; // номер текущего вопроса
- Ratio:byte; // количество правильных ответов
- implementation
- uses Unit2;
- {$R *.dfm}
- // метод для добавления нового теста в базу
- Procedure CVoprosi. AddTest (_vopr,_ans0,_ans1,_ans2,_ans3:string;
_korans:byte);
- var ln:integer;
- begin
- ln:=Length(test);
- SetLength (test, ln+1);
- test[ln].vopr:= _vopr;
- test[ln].ans[0]:= _ans0;
- test[ln].ans[1]:= _ans1;
- test[ln].ans[2]:= _ans2;
- test[ln].ans[3]:= _ans3;
- test[ln].korans:= _korans;
- end;
- // перемешивание базы вопросов
- Procedure CVoprosi. Mix;
- var
- i, i1, i2, ln:byte;
- TestTmp:TTest;
- begin
- ln:=Length(test);
- for i:=1 to 20 do
- begin
- i1:=Random(ln); // случайный №1
- i2:=Random(ln); // случайный №2
- // меняем местами вопросы №1 и №2
- TestTmp:=test[i1];
- test[i1]:=test[i2];
- test[i2]:=TestTmp;
- end;
- end;
- procedure TFormTest. FormCreate
(Sender: TObject);
- begin
- // формирование базы вопросов
- BasaV:=CVoprosi. Create;
- BasaV. AddTest ('Что выведет следующая программа?'+#10+#13+'var i, sum:sіnglе;'+#10+#13+
- 'bеgin'+#10+'sum:=1;'+#10+
- ' for і:=2 to 10 dо sum:=sum+i;'+#10+
- ' WrіtеLn(sum);'+#10+'еnd.',
- '10', '55', '9', 'произойдет ошибка компиляции', 3);
- BasaV. AddTest ('Какое значение вернет выражение?'+#10+' chr (ord(«A»)+3)',
- 'A3', '68', ' «D» ', ' «C» ', 2);
- BasaV. AddTest ('С чего не может начинаться идентификатор?',
- 'с малой латинской буквы', 'с большой латинской буквы', 'с подчеркивания', 'с цифры', 3);
- BasaV. AddTest ('Что из нижеперечисленного может быть использовано как идентификатор?',
- 'ord', 'for1', 'cardinal',
'C#21', 1);
- BasaV. AddTest ('Какой из приведенных типов целочисленный?',
- 'real', 'byte', 'double', 'single', 1);
- BasaV. AddTest ('Какой из приведенных типов можно использовать для хранения дробных чисел?',
- 'byte', 'word', 'double', 'integer', 2);
- BasaV. AddTest ('Какая из приведенных инструкций является циклом с заданным числом повторений?',
- 'while <…> do ', 'for <…> do ', 'repeat until <…>', 'if <> then ', 1);
- BasaV. AddTest ('Какая из приведенных инструкций является циклом с предусловием?',
- 'for <…> do ', 'while <…> do ', 'repeat until <…>', 'if <> then ', 1);
- BasaV. AddTest ('Какая из приведенных инструкций является циклом с постусловием?',
- 'for <…> do ', 'while <…> do ', 'repeat until <…>', 'if <> then ', 2);
- BasaV. AddTest ('Какая из приведенных инструкций является инструкцией ветвления?',
- 'for <…> do ', 'while <…> do ', 'repeat until <…>', 'if <> then ', 3);
- BasaV. AddTest ('Какая из приведенных инструкций целочисленного деления?',
- 'MOD', 'DIV', '/', 'ODD',
1);
- BasaV. AddTest ('Какая из приведенных инструкций – остаток от деления?',
- 'MOD', 'DIV', '/', 'ODD',
0);
- BasaV. AddTest ('Какая из приведенных инструкций вещественного деления?',
- 'MOD', 'DIV', '/', 'ODD',
2);
- BasaV. AddTest ('Какая из приведенных инструкций проверка на четность?',
- 'MOD', 'DIV', '/', 'ODD',
3);
- BasaV. AddTest ('Укажите функцию округления по правилам арифметики:',
- 'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 2);
- BasaV. AddTest ('Укажите функцию выделения дробной части числа:',
- 'TRUNC()', 'FRAC()', 'ROUND()', 'INT()', 1);
- BasaV. AddTest ('Укажите функцию округления к нулю с целочисленным результатом:',
- 'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 0);
- BasaV. AddTest ('Укажите функцию округления к нулю с вещественным результатом:',
- 'TRUNC()', 'FRAC()', 'ROUND()', 'INT()', 3);
- BasaV. AddTest ('Укажите функцию открытия существующего файла:',
- 'ASSIGNFILE()', 'REWRITE()',
'RESET()', 'CLOSEFILE()', 2);
- BasaV. AddTest ('Укажите функцию создания нового файла и открытия его для записи:',
- 'ASSIGNFILE()', 'REWRITE()', 'RESET()', 'CLOSEFILE()', 1);
- randomize;
- end;
- // ***************************
- // активизация формы с тестами
- // ***************************
- procedure TFormTest. FormActivate
(Sender: TObject);
- var ln:integer;
- begin
- fName:=SFam+' ('+SGr+')'+'.txt';
- assignfile (f, fName);
- rewrite(f);
- BNewTest. Visible:=false;
- // перемешивание базы вопросов
- BasaV. Mix;
- // количество правильных ответов
- Ratio:=0;
- // текущий вопрос 0
- curN:=0;
- // отображаем первый вопрос на форме
- StaticText1. Caption:=BasaV.test[curN].vopr;
- RGroup1. Items[0]:=BasaV.test[curN].ans[0];
- RGroup1. Items[1]:=BasaV.test[curN].ans[1];
- RGroup1. Items[2]:=BasaV.test[curN].ans[2];
- RGroup1. Items[3]:=BasaV.test[curN].ans[3];
- RGroup1. ItemIndex:=0;
- Ln:=Length (BasaV.test);
- LbNom. Caption:= IntToStr
(curN+1) + ' из ' + IntToStr(Ln);
- end;
- // ***************************
- // обработчик нажатия на кнопку «Принять ответ»
- // ***************************
- procedure TFormTest. BitBtn1Click
(Sender: TObject);
- var
- sRes, S:string;
- ln:byte;
- begin
- // проверка ответа
- Ln:=Length (BasaV.test);
- if (CurN<ln) then
- begin
- // записываем лог ответов в файл
- S:= BasaV.test[curN].vopr
+ ' (ответил: – '+
- BasaV.test[curN].ans [RGroup1. ItemIndex]+')';
- writeln (f, S);
- // проверяем, правильно ли был сделан ответ
- if (RGroup1. ItemIndex = BasaV.test[curN].Korans) then
- Ratio:= Ratio +1;
- CurN:=CurN+1;
- if CurN=ln then // была последняя запись
- begin
- // сообщение с результатом
- sRes:= 'Итоговая оценка: '+FloatToStr (Ratio*12/ln);
- // запись результа в файл
- writeln (f, Sfam+Sgr);
- writeln (f, sRes);
- CloseFile(f);
- end;
- end;
- if CurN>=ln then
- begin
- sRes:= 'Итоговая оценка: '+FloatToStr (Ratio*12/ln);
- Application. MessageBox (PAnsiChar(sRes),
PAnsiChar (SFam+Sgr));
- BNewtest. Visible:=true;
- exit;
- end;
- // отображаем следующий вопрос на форме
- StaticText1. Caption:=BasaV.test[curN].vopr;
- RGroup1. Items[0]:=BasaV.test[curN].ans[0];
- RGroup1. Items[1]:=BasaV.test[curN].ans[1];
- RGroup1. Items[2]:=BasaV.test[curN].ans[2];
- RGroup1. Items[3]:=BasaV.test[curN].ans[3];
- RGroup1. ItemIndex:=0;
- LbNom. Caption:= IntToStr (curN+1) + ' из ' + IntToStr(Ln);
- end;
- // ***************************
- // закрыте формы с тестами
- // ***************************
- procedure TFormTest.BNewTestClick
(Sender: TObject);
- begin
- Close;
- end;
- // ***************************
- // активизация формы с авторизации
- // ***************************
- procedure TFormTest. FormClose
(Sender: TObject; var Action: TCloseAction);
- begin
- FormAvto. Show;
- end;
- end.
Приложение В
Моя программа выполняет
тестирование студентов по программированию.
При открытии программы появляется окно (рис В.1),
тестирования в котором нужно вести Фамилию
Имя и Группу. Тестирование состоит из
20 вопросов, в каждом вопросе четыре варианта
ответа необходимо выбрать один правильный
(рис В.2). В конце тестирования появляется
окно в котором выводится бал за количество
ответов по 12 бальной системе (рис В.3).
Рисунок В.1 – Окно авторизации
Рисунок В.2 – Внешний вид формы
FormTest
Рисунок В.3 – Итог