Данный курсовой проект был разработан в среде Delphi. Среди множества языков Pascal является наиболее универсальным и легко изучаемым языком. При этом его удобно использовать для создания сложных приложений, базами данных, приложения масштаба предприятия. Delphi так же прост в обучении, как и Visual Basic, но при этом средства языка программирования Pascal позволяет использовать все современные возможности объектно-ориентированного программирования.
Delphi – это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi – строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.
Delphi прост и логичен. Основные конструкции языка четко выделяются в программе, что способствует хорошему восприятию написанного кода. Графический интерфейс Delphi отлично продуман, среда разработки предоставляет доступ только к тем участкам кода, с которыми необходимо работать, скрывая основную часть программы, которая создается автоматически самой разработкой.
Для выполнения данной курсовой работы необходимо разработать алгоритм решения поставленного задания, правильно указав последовательное выполнение соответствующих команд для получения необходимых результатов.
Цель работы заключается в том, чтобы правильно составить алгоритм поставленной задачи по разработке программы тестирования студентов по программированию, разработать и отладить программу, реализующую разработанный алгоритм.
1. Анализ технического задания и постановка задачи проектирования
Согласно заданию необходимо разработать программу проверки знаний для тестирования студентов по программированию, по окончании тестирования выводить оценку.
Для удобства анализа результатов и ответов будет полезно отслеживать каждый из ответов тестируемого и сохранять лог ответов в текстовый файл на жестком диске.
строка, файл, массив, запись
Тип STRING ( строка ) в «Borland Delphi» широко используется для обработки текстов. Он во многом похож на одномерный массив символов ARRAY [0..N] OF CHAR, однако, в отличие от последнего, количество символов в строке–переменной может меняться от 0 до N, где N – максимальное количество символов в строке.
Под файлом понимается либо именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, электронного «виртуального» диска), либо логическое устройство – потенциальный источник или приемник информации.
Создание проекта для тестирования знаний студентов по языку программирования ...
... эффективность и гибкость работы с данными. программный продукт тестирование 1.1 Что такое тест? Проверка приобретённых ... среды разработки Delphi при программной реализации, позволило создать качественное современное программное обеспечение, обладающее высокой скоростью работы, ... остается лишь расставить крестики против правильных ответов. Подобная технология позволила совершить качественный скачок ...
Запись представляет собой совокупность компонент различных типов.
«Borland Delphi» может использовать объекты, содержащее множество однотипных элементов, которые называются массивами. Массив– это формальное обледенение нескольких однотипных объектов (чисел, символов, строк и т.п.), рассматриваемое как единое целое. Для хранения содержимого типизированного файла и обработки удобно использовать массивы с элементами типа запись. Удобство массивов заключается в том, что можно обращаться к отдельному элементу массива по номеру. Дополнительное удобство привносят динамические массивы, отличительной особенностью которых является возможность динамического изменения размерности массива, то есть динамическое выделение или освобождение памяти под требуемое в данный момент количество элементов массива.
Поскольку данная программа является приложением Windows, то для ее реализации будем использовать стандартный подход при написании программ под Windows с использованием графического интерфейса. Так отдельно создадим форму с визуальными компонентами, для различных визуальных компонент сопоставляем процедуры – обработчики. Далее, как только происходит событие на каком-то из визуальных компонент, (щелчок мыши, нажатие на кнопку или пункт меню), операционная система посылает приложению соответствующее сообщение, и запускается соответствующий обработчик именно для этого события. Тогда решение задачи можно разбить на 3 этапа:
1) Разработка визуального интерфейса пользователя, на основе экранных форм среды Delphi и визуальных компонент, предназначенных для ввода исходных данных, запуска действий по обработке исходных данных, вывода результата обработки, вывода результатов на экранную форму. Еще можно предусмотреть вывод информации разработчике и задании курсового проекта.
2) Разработка обработчиков событий от элементов экранных форм, разработка алгоритмов и программных кодов действий обработки текстового файла согласно заданию.
3) Подготовка тестовых исходных данных и отладка программы.
На первом этапе целесообразно выполнить разработку интерфейса таким образом, чтобы в начале тестирования учащийся вводил своё имя и фамилию, а также задавал шифр группы. Затем учащийся приступает к тестированию. По окончании тестирования выводится итоговая оценка, которая равна максимальной, если все ответы были правильными. Если имеются ошибки, то должен выводится балл, пропорциональный количеству правильных ответов. Также должен вестись протокол ответов, вводимых тестируемым и потом записываться на жесткий диск.
Для корректности тестирования целесообразно предусмотреть механизм перемешивания вопросов, чтобы при различных запусках программы порядок следования вопросов изменялся.
При выполнении второго этапа следует использовать модульный принцип построения программы, то есть разбить программу на отдельные части, каждая из которых выполняет какую-то законченную задачу, либо ее малую часть. Роль таких частей будут выполнять процедуры и функции. Программы, состоящие из процедур и функций, называются модульными.
Процедуры и функции в свою очередь могут вызывать процедуры и функции более низкого уровня и так далее. Таким образом, каждая модульная программа имеет иерархическую структуру. Следует заметить, что обработчики событий от объектов экранных форм тоже реализуются как процедуры.
На третьем этапе при отладке приложения обязательно должна анализироваться правильность работы на исходных тестовых образцах. На этом этапе нужно проверить соответствие разработанной программы исходному заданию, а также проверить ее на отсутствие ошибок.
Подытожив все вышесказанное, можно сформулировать требования к разрабатываемому программному обеспечению и выполнить постановку задания на проектирование.
Программа должна быть реализована с графическим интерфейсом пользователя в среде Borland Delphi и должна выполнять следующие функции:
- запрашивать фамилию, имя и группу учащегося;
- выводить поочередно вопросы из базы;
- принимать ответы учащегося;
- анализировать правильность ответов и рассчитывать итоговый балл пропорционально количеству правильных ответов;
- вести протоколирование ответов и записывать их в файле на жестком диске;
- по окончании тестирования выводить правильную оценку;
- предусмотреть перемешивание вопросов, чтобы при повторных запусках порядок следования вопросов был различным.
Последующие разделы будут посвящены решению поставленных задач и разработке приложения с вышеперечисленными функциями.
2. Разработка экранных форм и алгоритма программы
В предыдущем разделе было сказано, что процесс решения поставленной задачи разбивается на 3 этапа, первый из которых заключается в построении интерфейса с пользователем на основе экранных форм и визуальных объектов проектирования.
По сформулированной в предыдущем задании постановке должна иметься возможность авторизации тестируемого учащегося – ввода его фамилии и группы. Для этого предусмотрим отдельную форму авторизации FormAvto. Для возможности ввода данных об учащемся поместим на форме поля ввода типа TEdit и соответствующие метки описания к ним. Список объектов экранной формы приведен в таблице 2.1
Таблица 2.1 – Объекты экранной формы FormAvto
Имя | Тип | Назначение |
Label1 | TLabel | надпись «Задайте фамилию, инициалы и группу учащегося» |
Label2 | TLabel | надпись «Фамилия» |
Label3 | TLabel | надпись «Имя» |
Efam | TEdit | поле для вода фамилии учащегося |
EGroup | TEdit | поле для ввода группы учащегося |
BitBtnStart | TBitBtn | кнопка для начала теста с надписью «НАЧАТЬ» |
Для начала теста предусмотрена кнопка типа TBitBtn, который в отличие от обычных кнопок типа TButton позволяет задавать не только текст, но и изображение. В обработчике нажатия на эту кнопку должна выводиться форма с вопросами. Внешний вид спроектированной формы приведен на рисунке 2.1
Рисунок 2.1 – Внешний вид формы FormAvto
Для вывода вопросов, ввода ответов пользователя предусмотрим отдельную форму FormTest. Список объектов, используемых в форме приведен в таблице 2.2, а внешний вид приведен на рисунке 2.2.
Таблица 2.2 – Объекты экранной формы FormTest
Имя | Тип | Назначение |
Label1 | TLabel | надпись «Текущий вопрос» |
LbNom | TLabel | надпись, в которой будет выводиться номер текущего вопроса |
StaticText1 | TStaticText | поле, в котором будет выводиться очередной вопрос |
RGroup1 | TRadioGroup | поля для вывода вариантов ответов и их указания студентом |
BitBtn1 | TBitBtn | кнопка «Принять ответ» для анализа ответа и перехода к следующему вопросу |
BNewTest | TButton | кнопка для закрытия формы тестов и перехода на форму авторизации (для новой попытки тестирования) |
При построении формы предполагалось, что база вопросов будет построєна таким образом, чтобы ответ предполагал выбор только одного из перечисленных четырех вариантов ответов. То есть, база не должна содержать вопросов с множественным выбором, либо вариантов без правильного ответа. Также не должно быть вопросов, требующих ввода ответа в текстовом виде (например, ответ вычисленной формулы или правильное написание ключевого слова).
Рисунок 2.2 – Внешний вид формы FormTest
Во избежание кратковременного завершения теста скроем системное меню окна, установив параметр формы FormTest. BorderIcons biSystemMenu равным false. Также в алгоритме следует предусмотреть, что в начале тестирования кнопка с надписью «Начать заново» должна быть невидимой, и должна появляться только после ответа на все вопросы и вывода итоговой оценки.
Анализируя все вышеизложенные предположения и разработанные формы, можем составить словесные алгоритмы приложения.
1. Запустить экранную форму авторизации FormAvto
2. При нажатии на кнопку «Начать» следует выполнить действия:
2.1 Сгенерировать базу вопросов, и перемешать их случайным образом;
2.2 Сформировать имя файла из имени студента и его группы и открыть файл для записи;
2.3 Обнулить количество правильных ответов;
2.4 Установить номер текущего вопроса на первый вопрос;
2.5 Скрыть форму FormAvto и показать форму с тестами FormTest;
2.6 Показать первый вопрос и варианты его ответов на форме FormTest;
2.7 Ожидать нажатия на кнопку «Принять ответ».
3. При нажатии на кнопку «Принять ответ» следует выполнить действия:
3.1 Проанализировать выбранный вариант ответа и сравнить его с правильным, и если ответ правильный, то нарастить количество правильных ответов на 1;
3.2 Записать в файл протокола текущий вопрос и вариант, который выбрал пользователь в качестве ответа;
3.3 Если номер текущего вопроса меньше общего количества вопросов в базе, то нарастить номер на 1, вывести очередной вопрос на форму и перейти к началу пункта 3.
3.4 Если номер текущего вопроса равен количеству вопросов в базе, то:
3.4.1.подсчитать оценку пропорционально количеству правильных ответов;
3.4.2.показать сообщение с оценкой;
3.4.3.сделать кнопку «Начать заново» видимой
4. При нажатии кнопки «Начать заново» закрыть форму с тестами FormTest и показать форму авторизации FormAvto.
Анализируя требования к функциям разрабатываемого приложения под разработанные экранные формы и словесный алгоритм, можно выделить следующие программные модули:
1) Генерация базы вопросов;
2) Перемешивание базы вопросов случайным образом;
3) Анализ текущего ответа и переход на следующий вопрос, если вопрос не последний либо вывод результатов тестирования при достижении последнего вопроса;
4) Модули перехода между экранными формами авторизации и тестирования.
Каждый из вышеприведенных модулей реализуем при помощи процедуры. Модуль 1 целесообразно запускать один раз при создании формы с тестами. Модуль 2 следует запускать каждый раз при начале нового теста, то есть при активизации формы с тестами. Модель 3 должен запускаться каждый раз при нажатии на кнопку «Принять ответ». Модули 4 должны быть обработчиками нажатий на кнопку «Начать» экранной формы авторизации и кнопку «Начать заново» экранной формы тестирования.
Составим алгоритм приложения, который представлен в приложении на рисунке A.1. На алгоритме приведены основные события экранных форм. В этом алгоритме:
Блок №4 реализован процедурой FormAvto, BitBtnStartClick,
блок №5 – процедурой FormTest. FormCreate,
блок №6 – процедурой FormTest. FormActivate,
блок№7 – процедуройFormTestBNewTestClick,
блок№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.
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));
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 – Итог