Рисунок 4.2 – Окно тестирования
Пользователь должен выбрать только один из четырех предложенных вариантов ответа, щелкнув по соответствующей метке с вариантом ответа, при этом напротив варианта ответа в кружочке должна появиться отметка
.После этого следует нажать на кнопку
.Появится новый вопрос, ответ на который реализуется аналогичным способом. Если были пройдены все вопросы, выводится сообщение с оценкой, которая пропорциональна количеству правильных ответов. Все ответы правильные – оценка равна 12. Все ответы неправильные – оценка равна 0. Пример окна с сообщением об оценке приведено на рисунке 4.3.
Рисунок 4.3
После этого можно вернуться на окно авторизации, чтобы пройти тест заново, нажав на кнопку
.Протокол с вариантами ответов, которые были введены учащимся заносятся в текстовый файл на жестком диске с именем «<фамилия>+<группа>.txt» в том же каталоге, где находится исполняемый файл. Пример протокола с правильными вариантами ответов приведен в приложении В.
Данный курсовой проект был выполнен в полном соответствии поставленному заданию и отлажен в среде DELPHI 7.0. В ходе выполнения курсовой работы была разработана программа для тестирования студентов по программированию с графическим интерфейсом. База содержит 20 вопросов по основам языка Pascal. Программа может бать использована в образовательных целях.
В качестве дальнейшего развития возможна доработка программы с целью поддержки множественных вариантов ответа, поддержкой текстового ввода в качестве ответа (без указания альтернатив), организации таймера и ограничения времени решения на каждый из вопросов, возможности пропустить некоторые вопросы, чтобы вернуться к ним и ответить на них в случае наличия времени и др.
В результате выполнения данной курсовой работы, я убедилась в широких возможностях языка программирования 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}
54. public
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);
125. BasaV. AddTest ('Какой из приведенных типов можно использовать для хранения дробных чисел?',
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. // записываем лог ответов в файл
196. S:= BasaV.test[curN].vopr + ' (ответил: – '+
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));