Наименование
|
Обр-к
|
Назначение
|
Строки
|
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 надписью «Начать заново», позволяющая перейти на форму авторизации. Во
избежание подбора ответов выводится только последняя итоговая оценка без
указания в каких вопросах были сделаны ошибки.
4. Инструкция
оператору
Разработанная программа представляет собой исполняемый
файл Tester.exe размером 422912 байт. В программе выполняется тестирование
пользователя основам языка Pascal.
После запуска программы появляется окно,
изображенное на рисунке 4.1.
Рисунок 4.1 – Окно
авторизации
В этом окне учащийся должен задать свою фамилию и
группу, после чего нажать на кнопку с надписью «НАЧАТЬ». После этого появится
вторая форма с тестовыми вопросами, изображенная на рисунке 4.2. Заметим, что
порядок вопросов при каждом новом запуске случайный, поэтому содержание поля
вопроса и ответом может быть иным.
Рисунок 4.2 – Окно тестирования
Пользователь должен выбрать только один из
четырех предложенных вариантов ответа, щелкнув по соответствующей метке с
вариантом ответа, при этом напротив варианта ответа в кружочке должна появиться
отметка .
После этого следует нажать на кнопку .
Появится новый вопрос, ответ на который
реализуется аналогичным способом. Если были пройдены все вопросы, выводится
сообщение с оценкой, которая пропорциональна количеству правильных ответов. Все
ответы правильные – оценка равна 12. Все ответы неправильные – оценка равна 0.
Пример окна с сообщением об оценке приведено на рисунке 4.3.
Рисунок 4.3
После этого можно вернуться на окно авторизации,
чтобы пройти тест заново, нажав на кнопку .
Протокол с вариантами ответов, которые были
введены учащимся заносятся в текстовый файл на жестком диске с именем
«<фамилия>+<группа>.txt» в том же каталоге, где находится
исполняемый файл. Пример протокола с правильными вариантами ответов приведен в
приложении В.
Выводы
В качестве дальнейшего развития возможна
доработка программы с целью поддержки множественных вариантов ответа,
поддержкой текстового ввода в качестве ответа (без указания альтернатив), организации
таймера и ограничения времени решения на каждый из вопросов, возможности
пропустить некоторые вопросы, чтобы вернуться к ним и ответить на них в случае
наличия времени и др.
В результате выполнения данной курсовой работы, я
убедилась в широких возможностях языка программирования Delphi 7.
Перечень ссылок
1.
Валентин
Озеров «Советы по Delphi», 1999
2.
Зуев Е.А. Программирование
на языке Turbo Pascal 6. 0,7.0. – М.: Радио и связь, Веста, 1993.
3.
Фаронов В.В. Turbo Pascal 7.0. Начальный курс. – М.:
Нолидж, 2000.
4.
Фаронов В.В.
«DELPHI. Программирование на языке высокого уровня». – Питер, 2005.
5.
Дятченко Д.А. Методические
указания к выполнению курсовой работы по дисциплине «Программирование и
алгоритмическе языки» – Северодонецк, 2005.
Приложение А
Алгоритм программы
Рисунок А.1 –
Обработка событий экранных форм программы
Рисунок А.2 – Алгоритм
процедуры BitBtn1Click
Приложение Б
Модуль формы авторизации
1.
unit Unit2;
2.
interface
3.
uses
4.
Windows, Messages, SysUtils,
Variants, Classes, Graphics,
5.
Controls, Forms, Dialogs,
StdCtrls, Buttons;
6.
type
7.
TFormAvto = class(TForm)
8.
Label1: TLabel;
9.
Label2: TLabel;
10.
Label3: TLabel;
11.
EFam: TEdit;
12.
EGroup: TEdit;
13.
BitBtnStart: TBitBtn;
14.
procedure BitBtnStartClick (Sender: TObject);
15.
private
16.
{Private declarations}
17.
public
18.
{Public declarations}
19.
end;
20.
var
21.
FormAvto: TFormAvto;
22.
23.
implementation
24.
uses Unit1;
25.
{$R *.dfm}
26.
procedure TFormAvto. BitBtnStartClick
(Sender: TObject);
27.
begin
28.
SFam:=EFam. Text+ ' ';
29.
SGr:=EGroup. Text;
30.
hide;
31.
FormTest. Show;
32.
end;
33.
end.
Модуль формы тестирования
34.
unit Unit1;
35.
interface
36.
uses
37.
Windows, Messages, SysUtils,
Variants, Classes, Graphics,
38.
Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons;
39.
type
40.
TFormTest = class(TForm)
41.
BitBtn1: TBitBtn;
42.
Label1: TLabel;
43.
LbNom: TLabel;
44.
StaticText1: TStaticText;
45.
RGroup1: TRadioGroup;
46.
BNewTest: TButton;
47.
procedure FormCreate (Sender: TObject);
48.
procedure BitBtn1Click (Sender: TObject);
49.
procedure BNewTestClick (Sender: TObject);
50.
procedure FormClose (Sender:
TObject; var Action: TCloseAction);
51.
procedure FormActivate (Sender: TObject);
52.
private
53.
{Private declarations}
55.
{Public declarations}
56.
end;
57.
TTest = record
58.
vopr:string; // вопрос
59.
ans:array [0..3] of string; // ответы
60.
korans:byte; // номер правильного ответа
61.
end;
62.
CVoprosi = class
63.
test: array of TTest;
64.
procedure AddTest (_vopr,_ans0,_ans1,_ans2,_ans3:string;_korans:byte);
65.
procedure Mix;
66.
end;
67.
var
68.
SFam, Sgr:string; // фамилия и группа учащегося
69.
fName:string;
70.
f: TEXTFILE;
71.
FormTest: TFormTest;
72.
BasaV:CVoprosi;
73.
CurN:byte; // номер текущего вопроса
74.
Ratio:byte; // количество правильных ответов
75.
implementation
76.
uses Unit2;
77.
{$R *.dfm}
78.
// метод для добавления нового теста в базу
79.
Procedure CVoprosi. AddTest
(_vopr,_ans0,_ans1,_ans2,_ans3:string; _korans:byte);
80.
var ln:integer;
81.
begin
82.
ln:=Length(test);
83.
SetLength (test, ln+1);
84.
test[ln].vopr:= _vopr;
85.
test[ln].ans[0]:= _ans0;
86.
test[ln].ans[1]:= _ans1;
87.
test[ln].ans[2]:= _ans2;
88.
test[ln].ans[3]:= _ans3;
89.
test[ln].korans:= _korans;
90.
end;
91.
// перемешивание базы вопросов
92.
Procedure CVoprosi. Mix;
93.
var
94.
i, i1, i2, ln:byte;
95.
TestTmp:TTest;
96.
begin
97.
ln:=Length(test);
98.
for i:=1 to 20 do
99.
begin
100.
i1:=Random(ln); // случайный №1
101.
i2:=Random(ln); // случайный №2
102.
// меняем местами вопросы №1 и №2
103.
TestTmp:=test[i1];
104.
test[i1]:=test[i2];
105.
test[i2]:=TestTmp;
106.
end;
107.
end;
108.
procedure TFormTest. FormCreate
(Sender: TObject);
109.
begin
110.
// формирование базы вопросов
111.
BasaV:=CVoprosi. Create;
112.
BasaV. AddTest ('Что выведет следующая программа?'+#10+#13+'var i,
sum:sіnglе;'+#10+#13+
113.
'bеgin'+#10+'sum:=1;'+#10+
114.
' for і:=2 to 10 dо sum:=sum+i;'+#10+
115.
' WrіtеLn(sum);'+#10+'еnd.',
116.
'10', '55', '9', 'произойдет ошибка компиляции', 3);
117.
BasaV. AddTest ('Какое значение вернет выражение?'+#10+' chr
(ord(«A»)+3)',
118.
'A3', '68', ' «D» ', ' «C»
', 2);
119.
BasaV. AddTest ('С чего не может начинаться идентификатор?',
120.
'с малой латинской буквы', 'с большой латинской буквы', 'с
подчеркивания', 'с цифры', 3);
121.
BasaV. AddTest ('Что из нижеперечисленного может быть использовано
как идентификатор?',
122.
'ord', 'for1', 'cardinal', 'C#21',
1);
123.
BasaV. AddTest ('Какой из приведенных типов целочисленный?',
124.
'real', 'byte', 'double', 'single', 1);
126.
'byte', 'word', 'double', 'integer', 2);
127.
BasaV. AddTest ('Какая из приведенных инструкций является циклом с
заданным числом повторений?',
128.
'while <…> do ', 'for
<…> do ', 'repeat until <…>', 'if <> then ', 1);
129.
BasaV. AddTest ('Какая из приведенных инструкций является циклом с
предусловием?',
130.
'for <…> do ', 'while
<…> do ', 'repeat until <…>', 'if <> then ', 1);
131.
BasaV. AddTest ('Какая из приведенных инструкций является циклом с
постусловием?',
132.
'for <…> do ', 'while
<…> do ', 'repeat until <…>', 'if <> then ', 2);
133.
BasaV. AddTest ('Какая из приведенных инструкций является
инструкцией ветвления?',
134.
'for <…> do ', 'while
<…> do ', 'repeat until <…>', 'if <> then ', 3);
135.
BasaV. AddTest ('Какая из приведенных инструкций целочисленного
деления?',
136.
'MOD', 'DIV', '/', 'ODD', 1);
137.
BasaV. AddTest ('Какая из приведенных инструкций – остаток от
деления?',
138.
'MOD', 'DIV', '/', 'ODD', 0);
139.
BasaV. AddTest ('Какая из приведенных инструкций вещественного
деления?',
140.
'MOD', 'DIV', '/', 'ODD', 2);
141.
BasaV. AddTest ('Какая из приведенных инструкций проверка на
четность?',
142.
'MOD', 'DIV', '/', 'ODD', 3);
143.
BasaV. AddTest ('Укажите функцию округления по правилам
арифметики:',
144.
'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 2);
145.
BasaV. AddTest ('Укажите функцию выделения дробной части числа:',
146.
'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 1);
147.
BasaV. AddTest ('Укажите функцию округления к нулю с целочисленным
результатом:',
148.
'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 0);
149.
BasaV. AddTest ('Укажите функцию округления к нулю с вещественным
результатом:',
150.
'TRUNC()', 'FRAC()', 'ROUND()',
'INT()', 3);
151.
BasaV. AddTest ('Укажите функцию открытия существующего файла:',
152.
'ASSIGNFILE()', 'REWRITE()',
'RESET()', 'CLOSEFILE()', 2);
153.
BasaV. AddTest ('Укажите функцию создания нового файла и открытия
его для записи:',
154.
'ASSIGNFILE()', 'REWRITE()',
'RESET()', 'CLOSEFILE()', 1);
155.
randomize;
156.
end;
157.
// ***************************
158.
// активизация формы с тестами
159.
// ***************************
160.
procedure TFormTest. FormActivate
(Sender: TObject);
161.
var ln:integer;
162.
begin
163.
fName:=SFam+' ('+SGr+')'+'.txt';
164.
assignfile (f, fName);
165.
rewrite(f);
166.
BNewTest. Visible:=false;
167.
// перемешивание базы вопросов
168.
BasaV. Mix;
169.
// количество правильных ответов
170.
Ratio:=0;
171.
// текущий вопрос 0
172.
curN:=0;
173.
// отображаем первый вопрос на форме
174.
StaticText1. Caption:=BasaV.test[curN].vopr;
175.
RGroup1. Items[0]:=BasaV.test[curN].ans[0];
176.
RGroup1. Items[1]:=BasaV.test[curN].ans[1];
177.
RGroup1. Items[2]:=BasaV.test[curN].ans[2];
178.
RGroup1. Items[3]:=BasaV.test[curN].ans[3];
179.
RGroup1. ItemIndex:=0;
180.
Ln:=Length (BasaV.test);
181.
LbNom. Caption:= IntToStr
(curN+1) + ' из ' + IntToStr(Ln);
182.
end;
183.
// ***************************
184.
// обработчик нажатия на кнопку «Принять ответ»
185.
// ***************************
186.
procedure TFormTest. BitBtn1Click
(Sender: TObject);
187.
var
188.
sRes, S:string;
189.
ln:byte;
190.
begin
191.
// проверка ответа
192.
Ln:=Length (BasaV.test);
193.
if (CurN<ln) then
194.
begin
195.
// записываем лог ответов в файл
197.
BasaV.test[curN].ans
[RGroup1. ItemIndex]+')';
198.
writeln (f, S);
199.
// проверяем, правильно ли был сделан ответ
200.
if (RGroup1. ItemIndex =
BasaV.test[curN].Korans) then
201.
Ratio:= Ratio +1;
202.
CurN:=CurN+1;
203.
if CurN=ln then // была последняя запись
204.
begin
205.
// сообщение с результатом
206.
sRes:= 'Итоговая оценка: '+FloatToStr (Ratio*12/ln);
207.
// запись результа в файл
208.
writeln (f, Sfam+Sgr);
209.
writeln (f, sRes);
210.
CloseFile(f);
211.
end;
212.
end;
213.
if CurN>=ln then
214.
begin
215.
sRes:= 'Итоговая оценка: '+FloatToStr (Ratio*12/ln);
216.
Application. MessageBox
(PAnsiChar(sRes), PAnsiChar (SFam+Sgr));
217.
BNewtest. Visible:=true;
218.
exit;
219.
end;
220.
// отображаем следующий вопрос на форме
221.
StaticText1. Caption:=BasaV.test[curN].vopr;
222.
RGroup1. Items[0]:=BasaV.test[curN].ans[0];
223.
RGroup1. Items[1]:=BasaV.test[curN].ans[1];
224.
RGroup1. Items[2]:=BasaV.test[curN].ans[2];
225.
RGroup1. Items[3]:=BasaV.test[curN].ans[3];
226.
RGroup1. ItemIndex:=0;
227.
LbNom. Caption:= IntToStr
(curN+1) + ' из ' + IntToStr(Ln);
228.
end;
229.
// ***************************
230.
// закрыте формы с тестами
231.
// ***************************
232.
procedure
TFormTest.BNewTestClick (Sender: TObject);
233.
begin
234.
Close;
235.
end;
236.
// ***************************
237.
// активизация формы с авторизации
238.
// ***************************
239.
procedure TFormTest. FormClose
(Sender: TObject; var Action: TCloseAction);
240.
begin
241.
FormAvto. Show;
242.
end;
243.
244.
end.
Приложение В
Моя программа
выполняет тестирование студентов по программированию. При открытии программы
появляется окно (рис В.1), тестирования в котором нужно вести Фамилию Имя и
Группу. Тестирование состоит из 20 вопросов, в каждом вопросе четыре варианта
ответа необходимо выбрать один правильный (рис В.2). В конце тестирования
появляется окно в котором выводится бал за количество ответов по 12 бальной
системе (рис В.3).
Рисунок В.1 – Окно
авторизации
Рисунок В.2 – Внешний вид
формы FormTest
Рисунок В.3 – Итог