Разработка программы с помощью языка программирования Delphi

Автор работы: Пользователь скрыл имя, 18 Декабря 2013 в 18:14, курсовая работа

Описание работы

Цель работы: разработать программу проверки знаний для тестирования студентов по программированию с кодом на языке Delphi, для ввода и вывода данных использовать компоненты Delphi.

Файлы: 1 файл

Разработка программы с помощью языка программирования Delphi.doc

— 202.50 Кб (Скачать файл)
  1. Генерация базы вопросов;
  2. Перемешивание базы вопросов случайным образом;
  3. Анализ текущего ответа и переход на следующий вопрос, если вопрос не последний либо вывод результатов тестирования при достижении последнего вопроса;
  4. Модули перехода между экранными формами авторизации и тестирования.

Каждый из вышеприведенных  модулей реализуем при помощи процедуры. Модуль 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.

     

     

    Перечень  ссылок

     

    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. implementation
    23. uses Unit1;
    24. {$R *.dfm}
    25. procedure TFormAvto. BitBtnStartClick (Sender: TObject);
    26. begin
    27. SFam:=EFam. Text+ ' ';
    28. SGr:=EGroup. Text;
    29. hide;
    30. FormTest. Show;
    31. end;
    32. end.

    Модуль формы  тестирования

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

     

     

    Приложение В

     

    Моя программа выполняет  тестирование студентов по программированию. При открытии программы появляется окно (рис В.1), тестирования в котором нужно вести Фамилию Имя и Группу. Тестирование состоит из 20 вопросов, в каждом вопросе четыре варианта ответа необходимо выбрать один правильный (рис В.2). В конце тестирования появляется окно в котором выводится бал за количество ответов по 12 бальной системе (рис В.3).

     

     

    Рисунок В.1 – Окно авторизации

     

     

    Рисунок В.2 – Внешний вид формы FormTest

     

    Рисунок В.3 – Итог

     


    Информация о работе Разработка программы с помощью языка программирования Delphi