50404 (Разработка программы с помощью языка программирования Delphi), страница 2
Описание файла
Документ из архива "Разработка программы с помощью языка программирования Delphi", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "50404"
Текст 2 страницы из документа "50404"
Составим алгоритм приложения, который представлен в приложении на рисунке 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
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).