Проектирование и разработка сетевой системы тестирования студентов

Тип работы:
Контрольная
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Министерство образования и науки Российской Федерации

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЙ УНИВЕРСИТЕТ»

Математический факультет

Кафедра математического обеспечения информационных систем

КУРСОВАЯ РАБОТА

по дисциплине «Информатика и программирование»

Проектирование и разработка сетевой системы тестирования студентов

Руководитель Полежаев П. Н.

Исполнитель

студент гр. 11МОАИС (б) ТП

Иванов И.И.

Оренбург 2012

Содержание

  • Введение
  • 1. Техническое задание
  • 2. Выбор методов, способов и средств реализации
  • 3. Описание алгоритмов
  • 3.1 Файлы проекта и их основное назначение
  • 3.2 Описание основных модулей программы
  • 3.2.1 Модуль uiTestMain. pas главной формы проекта программы iTest
  • 3.2.2 Модуль uJournal. pas главной формы проекта программы iJournal
  • 3.2.3 Модуль uServer. pas формы сервера проекта программы iJournal
  • 3.2.4 Модуль uMain. pas главной формы проекта программы iConstructor
  • 3.2.5 Модуль Core. pas
  • 3.2.7 Модуль iCon. pas
  • 3.3 Работа с сетью
  • 4. Руководство пользователя
  • 4.1 Сведения о файлах программ и способе их установки
  • 4.2 Интерфейс и функциональность программы iTest
  • 4.3 Интерфейс и функциональность программы iJournal
  • 4.4 Интерфейс и функциональность программы iConstructor
  • Заключение
  • Список использованных источников
  • Приложения

Введение

Первые испытания берут начало из глубокой древности, когда, чтобы принять человека в школу жрецов или писцов его экзаменовали. Причем испытания в основном были на способности человека, его умения вести беседу, молчать. Также устраивался экзамен и по окончанию обучения. Но еще не было системы оценки результатов, и они воспринимались на интуитивном уровне.

Позже с развитием системы образования, устная форма экзаменов стала заменяться письменной. И в 1884 г. в США вышла первая книга с тестовыми материалами, содержавшая задания и ответы к ним с оценкой по пятибалльной шкале. Это был первый в истории случай использования простейших статистических расчетов в педагогической работе.

Родоначальником тестового движения можно назвать английского ученого Френсиса Гальтона. Он создал лабораторию психомоторного тестирования, в которой исследовал вес, рост, быстроту реакций, способности к запоминанию испытуемых, при этом Гальтон стал использовать статические методы оценивания результатов исследования.

Тесты, как форма контроля знаний в учебных заведениях, начали постепенно приживаться в различных странах мира. Но до сих пор не утихают споры о целесообразности их использования, качестве оценки знаний. Тесты долго не приживались в России, но в 90-ые годы началась активная пропаганда ЕГЭ.

Процесс тестирование может быть автоматизирован при использовании компьютерных технологий. В частности, создание тестовой программы может освободить преподавателей от бумажной и вычислительной работы — проверки работ и выставления оценок. В результате, у преподавателя будет больше времени на реализацию эффективного педагогического процесса.

Осуществление процесса тестирования в компьютерном классе с сетью позволит сэкономить время и одновременно протестировать большое количество людей. Тестирование может происходить и через Internet, что дает возможность участвовать учащимся в процессе тестирования, находясь в другой точке планеты. Автоматизированное выставление оценок и централизованный сбор результатов в десятки раз увеличат эффективность работы преподавателя.

Программа для составления тестов позволит работать с вопросами в электронном виде, использовать все виды цифровой информации для отображения содержания вопроса. Электронная форма заданий тестов дает большую гибкость в их модификации.

Во всем этом заключается актуальность данной работы.

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

1. Техническое задание

Создать программный продукт, для автоматизации процесса тестирования студентов в сети.

Исходное задание:

— Должны быть реализованы программы: клиент, осуществляющий процесс тестирования и посылки результата на сервер; сервер, он же журнал, для работы с записями пользователей системы, централизации и сбора информации; конструктор, главным назначением которого является создание и модификация тестов.

— Каждый вопрос теста должен быть заданием закрытой формы, когда на поставленный вопрос предлагается 4 варианта ответа, и только один из них правильный.

— Вопросы тестов могут содержать графические элементы — картинки (математические формулы, графики функций, схемы, сохраненные в графическом формате).

— Все вопросы подразделяются на три типа трудности — A, B и C, оценивающиеся соответственно в 1, 2 и 3 балла.

— Клиентская программа должна реализовывать возможность генерации списка вопросов тестов из предоставленных ей наборов вопросов при запуске процесса тестирования. Из общего набора вопросов типа A, B и C по конкретной теме программа должна выбрать в случайном порядке определенное число вопросов каждого типа и случайно их переставить. Также необходимо располагать ответы на каждый вопрос в случайном порядке.

— Результат тестирования вычисляется по пятибалльной шкале.

— Должна быть реализована возможность обработки записей тестируемых в журнале.

— В случае повторного тестирования по тесту той же темы старый результат тестируемого заменяется новым.

— Должна быть реализована возможность тестирования по сети с большим числом одновременно тестируемых студентов.

— Вся информации о процессе тестирования должна динамически отображаться у преподавателя.

— Информация о результатах тестирования должна централизованно собираться в журнале преподавателя.

— Необходимо реализовать возможность создания тестов, редактирования и добавления вопросов в существующие тесты.

сетевая система тестирование программа

2. Выбор методов, способов и средств реализации

В соответствии с исходным заданием было решено реализовать набор вопросов в виде тестового файла (файл с расширением. tst), хранящего ссылки на вопросы трех типов сложности, количества вопросов, которые необходимо выбрать по каждому типу. Каждый тестовый файл также содержит имя теста, которое может быть использовано для обозначения темы теста. Тексты и картинки вопросов и вариантов ответов было решено хранить в виде отдельных файлов формата bmp, wmf, emf и rtf. При генерации осуществляется случайная выборка вопросов из файла теста, тем самым составляется список вопросов теста.

Информацию журнала было решено хранить в виде отдельного файла iTest. jnl, содержащего сведения о группах, названия тестов и список студентов. Имя группы, имя и фамилия студента в пределах одной группы считаются уникальным. Оценки хранятся вместе с записями о пользователях. Список названий тестов используется для расшифровки оценок и при записи результатов тестирования.

В соответствие с исходным заданием также было принято решение реализовать систему тестирования в виде 3-х связанных между собой программ. Программа iTest осуществляет процесс тестирования и реализует функции клиента. iJournal позволяет оперировать с записями журнала, осуществляет централизованный сбор результатов тестирования по сети (сервер). iConstructor применяется для создания тестовых наборов, которые в готовом виде могут быть использованы для тестирования.

Программа iTest реализует функции:

— Вход студента в систему тестирования по личным, уникальным в совокупности данным: фамилии, имени и группе. При входе в систему тестирования на сервер посылается команда запроса о входе данного пользователя, в случае существовании данного пользователя в журнале и отсутствия этого пользователя в списке текущих пользователей сервера производится вход в систему, в противном случае выдаются соответствующие сообщения. Также реализуется возможность локального тестирования без сети под определенным логином.

— Выбор имени нужного теста.

— Генерация списка вопросов для сеанса тестирования по указанному пользователем имени теста. Считывает вопросы из тестового файла.

— Осуществление процесса тестирования. Последовательная выдача вопросов и вариантов ответа на экран. Реакция программы на ответ пользователя (представляющий собой щелчок по картинке, текстовому полю варианта ответа или по соответствующей букве варианта ответа): выделение выбранного варианта, его сохранение и автоматический переход к следующему вопросу. По окончании тестирования, если пользователь пропустил несколько вопросов, то появляется информационное окно, которое предлагает пользователю вернуться к пропущенным вопросам или вычислить результат, считая, что на пропущенные вопросы ответил неправильно. Реализуется возможность навигации по вопросам теста через панель навигации: переход к следующему вопросу или возврат к предыдущему.

— Вычисляет и передает результат тестирования на сервер, выдает на экран оценку знаний.

— Во время тестирования посылает серверу запрос об обновлении времени существования в списке тестируемых в данный момент пользователей, при выходе из программы посылает запрос на выход.

Программа iJournal реализует следующие функции:

— Выбор группы, с записями о студентах которой, будут производиться дальнейшие операции (также реализовывается возможность просмотра и редактирование записей студентов всех групп одновременно). Добавление, удаление и редактирование названия групп.

— В выбранной группе можно производить операции добавления, удаления, просмотра, редактирования записей о студентах.

— Предоставляются возможности редактирования списка тестов, доступных в журнале системы тестирования: добавление, удаление, различные способы вставки названий тестов, чтение названий тестов из указанного тестового файла или из тестовых файлов, содержащихся в указанном каталоге (число уровней вложения не более двух).

— Реализует функции сервера по обработке запросов от клиентских программ, показывает список и сведения о пользователях, участвующих на данный момент в процессе тестирования.

Программа iConstructor реализует функции:

— Создание, редактирование тестовых файлов.

— Содержит встроенный текстовый редактор, имеющий широкий круг возможностей по редактированию текстовых полей вопроса.

— Позволяет загружать в поля вопроса данные из текстовых и графических файлов.

— Позволяет изменять параметры вопроса: тип сложности, правильный вариант ответа, стиль расположения вариантов ответов и т. п.

— Позволяет удалять, добавлять вопросы.

— Имеет функцию составления отчета о готовности теста к использованию клиентской программой.

Все три программы в совокупности образуют сетевую систему тестирования. Связь между клиентами iTest, установленными на компьютерах тестируемых, и сервером-журналом iJournal, находящемся на компьютере преподавателя, происходит через сеть. Для этого используется модель разработанного протокола взаимодействия этих программ. Программа iConstructor не подключается к сети и хранится на компьютере преподавателя. Создаваемые ее файлы тестов распространяют вручную на клиентские машины.

Вычисление оценки-результата производиться следующим образом:

1 находится отношение суммы баллов за правильно отвеченные вопросы теста к максимально возможной сумме баллов за данный тест, затем данное отношение умножают на 100% и получают коэффициент;

2 в соответствии с величиной выставляется оценка по критериям, записанным в таблицу 1.

Таблица 1 — Критерии оценивания

Оценка

«5»

«4»

«3»

«2»

«1»

Для проектирования программ было решено пользоваться методами объектно-ориентированного программирования (ООП), как наиболее удобными для проектирования больших программных комплексов с возможностью расширения их в будущем, из-за большой гибкости в модификации и возможности оперирования со структурами данных, как с некоторыми абстрактными объектами. В качестве среды программирования была выбрана среда Delphi 5.0 с языком программирования Object Pascal. Данная система программирования предоставляет большие возможности при проектировании интерфейсной части приложения под операционную систему Windows, множество готовых, стандартных компонентов — элементов оконного приложения, большие удобства при кодировании и отладки программы, удобства при использовании ООП. По перечисленным выше причинам она и была выбрана как средство реализации данной работы.

3. Описание алгоритмов

3.1 Файлы проекта и их основное назначение

Сетевая система тестирования была реализована на основе трех программ iTest, iJournal и iConstructor. О составе проектов программ можно узнать из таблиц 2, 3 и 4.

Таблица 2 — Основные файлы проекта программы iTest

Имя файла

Содержимое и назначение

iTest. dpr

Файл проекта программы iTest

uChooseTest. pas

Модуль формы выбора теста frmChooseTest (рисунок 4)

uEnter. pas

Модуль формы frmEnter, входа в систему тестирования (рисунок 1)

uiTestMain. pas

Модуль главной формы frmMain (рисунок 5)

Core. pas

Модуль ядра проектов iTest, iJournal и iConstructor

NetCore. pas

Модуль для работы с сетью

Таблица 3 — Основные файлы проекта программы iJournal

Имя файла

Содержимое и назначение

iJournal. dpr

Файл проекта программы iJournal

uAddEditGroup. pas

Модуль формы frmAddEditGroup, редактирования/добавления группы (рисунки 12, 13)

uAddUser. pas

Модуль формы frmAddUser, добавления пользователя в группу (рисунок 17)

uChoose. pas

Модуль формы frmChoose, выбора способа добавления имени теста при загрузке имен из тестовых файлов (рисунок 20)

uEditUser. pas

Модуль формы frmEditUser, редактирования записи о пользователе (рисунок 18)

uEnter. pas

Модуль формы frmEnter входа в программу

uGroups. pas

Модуль формы frmGroups, окна списка групп (рисунок 11)

uTestList. pas

Модуль формы frmTestList, редактирования списка имен тестов (рисунок 19)

uJournal. pas

Модуль главной формы frmJournal (рисунок 15)

uServer. pas

Модуль формы серверного окна frmServer (рисунок 22)

Core. pas

Модуль ядра проектов iTest, iJournal и iConstructor

NetCore. pas

Модуль для работы с сетью

Таблица 4 — Основные файлы проекта программы iConstructor

Имя файла

Содержимое и назначение

iConstructor. dpr

Файл проекта программы iConstructor

uMain. pas

Модуль главной формы frmMain (рисунок 23)

uTestOptions. pas

Модуль формы frmTestOptions, которая предназначена для настройки опций теста (рисунок 29)

uTestRediness. pas

Модуль формы отчета готовности теста frmTestRediness (рисунок 30)

Core. pas

Модуль ядра проектов iTest, iJournal и iConstructor

iCon. pas

Модуль, содержащий класс и вспомогательные функции для работы конструктора

Модуль Core является общим для всех трех программ системы. Модуль NetCore является общим для программ iTest и iJournal. Модуль iCon используется только в проекте программы iConstructor.

3.2 Описание основных модулей программы

Кратко опишем содержание основных модулей программ, основные методы и поля классов, отвечающие за функциональность программ, и принципы их работы. Полное описание можно найти в текстах программ в приложении Б.

3.2.1 Модуль uiTestMain. pas главной формы проекта программы iTest

Данный модуль содержит класс формы TfrmMain, основные поля которого отражены в таблице 5, а методы в таблице 6.

Таблица 5 — Основные поля класса формы TfrmMain

Поля

Назначение

Timer: TTimer;

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

CSocket: TClientSocket;

Сокет клиента.

memLog: TMemo;

Компонент TMemo для ведения лога клиента.

FAnswerReceived: Boolean;

Флаг, определяющий, был ли получен ответ сервера.

FConnecting: Boolean;

Флаг, определяющий идет ли сейчас процесс соединения.

FRequestType: TRequestType;

Поле, определяющее тип посланного на сервер запроса.

FLogedIn: Boolean;

Поле, определяющее вошел ли пользователь в систему тестирования (была ли регистрация на сервере).

FRootDir: String;

Текущая директория, та в которой находится текущий тестовый файл.

FUName, FUSurname, FUGroup: String;

Поля, используемые для хранения имени, фамилии и имени группы текущего тестируемого пользователя.

Таблица 6 — Основные методы класса формы TfrmMain

Метод

Назначение

procedure CSocketError (Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer);

Обработчик события ошибки сокета клиента. Используется для определения невозможности соединиться и продолжения попыток сделать это в методе TryToConnect.

procedure CSocketRead (Sender: TObject; Socket: TCustomWinSocket);

Обработчик события получения сокетом клиента ответов сервера на его запросы.

procedure TimerTimer (Sender: TObject);

Обработчик тиканья таймера. Используется для посылки обновления своего состояния клиентом на сервер.

procedure CSocketConnect (Sender: TObject; Socket: TCustomWinSocket);

Обработчик события установления клиентом соединения.

procedure CSocketDisconnect (Sender: TObject; Socket: TCustomWinSocket);

Обработчик события отсоединения.

procedure LOG (S: String);

Метод, используемый для ведения лога, в качестве параметра передается информационная строка.

procedure Draw (Question: TQuestion);

Метод, получающий на входе данные о текущем вопросе Question. Загружает данные вопроса из файлов в соответствующие компоненты и располагает их в нужных позициях на экране.

procedure DrawFinal;

Метод, осуществляющий вывод результата на форму по окончании тестирования и сохранение результата тестирования в журнал сервера.

procedure Answer (v: Integer);

Производит подсвечивание выбранного варианта ответа v, передачу ответа в объект Test и автоматический переход к следующему вопросу.

procedure GoBack;

Метод, реализующий переход класса формы к предыдущему вопросу.

procedure GoNext;

Метод, реализующий переход класса формы к следующему вопросу.

procedure InitClientSocket;

Метод, инициализирующий сокет клиента.

procedure DeInitClientSocket;

Метод, деактивирующий сокет клиента.

procedure TryToConnect;

Метод, пытающийся установить соединение с сервером.

procedure SendLogIn (Name, SurName, Group: String);

Метод, посылающий на сервер запрос входа в систему, в качестве параметров передаются имя, фамилия и название группы пользователя соответственно.

procedure SendLogOut (Name, SurName, Group: String);

Метод, посылающий на сервер запрос выхода, в качестве параметров передаются имя, фамилия и название группы пользователя соответственно.

procedure SendUpdate (Name, SurName, Group: String);

Метод, посылающий на сервер запрос обновления времени существования записи в списке тестируемых пользователей, в качестве параметров передаются имя, фамилия и название группы пользователя соответственно.

procedure SendResult (Name, SurName, Group, TestName: String; Mark: Integer);

Метод, посылающий на сервер запрос результата тестирования, в качестве параметров передаются имя, фамилия, название группы пользователя, название теста и оценка соответственно.

procedure InitState (FileName: String);

Метод, производящий инициализацию класса формы для работы с тестовым файлом FileName (полное имя).

procedure PutUserData (UName, USurname, UGroup: String);

Данный метод используется для передачи данных пользователя UName, USurname, UGroup (имени, фамилии и названия группы) при входе в iTest главному окну приложения.

В этом модуле также объявлен объект теста Test, класса TTest, Он описан в модуле Core.

Данная форма производит загрузку теста в компонент Test (он генерирует на основе тестового файла список вопросов для сеанса тестирования). Она показывает данные каждого вопроса пользователю, реагирует на его выбор, позволяет производить переход вперед и назад по списку вопросов, показывает результат тестирования. Одной из главных функций также является взаимодействие с сервером по сети.

3.2.2 Модуль uJournal. pas главной формы проекта программы iJournal

Данный модуль содержит класс формы TfrmJournal, основные поля которого отражены в таблице 7, а методы в таблице 8.

Таблица 7 — Основные поля класса формы TfrmJournal

Поля

Назначение

sgUsers: TStringGrid;

Таблица, используемая для отображения текущей группы журнала.

FCurGroup: String;

Поле-имя текущей группы.

Таблица 8 — Основные методы класса формы TfrmJournal

Метод

Назначение

procedure InitData;

Метод инициализации формы frmJournal.

procedure ChangeGroup (Group: String);

Метод, изменяющий текущую (отображаемую в sgUsers) группу на группу Group.

procedure UpdateData;

Метод, отображающий список пользователей текущей группы объекта Journal в компонент sgUsers.

procedure miAddUserClick (Sender: TObject);

Обработчик события нажатия по пункту меню miAddUser и кнопке spdAddUser добавления студента в группу.

procedure miDelUserClick (Sender: TObject);

Обработчик события нажатия по пункту меню miDelUser и кнопке spdDelUser удаления студента из группы.

procedure miEditUserClick (Sender: TObject);

Обработчик события нажатия по пункту меню miEdit и кнопке spdEditUser редактирования записи студента.

procedure miTestsListClick (Sender: TObject);

Обработчик события нажатия по пункту меню miTestsList и кнопке spdEditList для вызова формы frmTestList, организующей работу со списком оценок.

procedure miEditGroupClick (Sender: TObject);

Обработчик события нажатия по пункту меню miEditGroup и кнопке spdGroups, осуществляющий вызов формы frmGroups для операций с группами.

procedure miSaveClick (Sender: TObject);

Обработчик события нажатия по пункту меню miSave и кнопке spdSave для запуска процесса сохранения журнала.

procedure miReopenClick (Sender: TObject);

Обработчик события нажатия по пункту меню miReopen и кнопке spdReopen для запуска процесса повторного чтения журнала.

procedure spdServerWindowClick (Sender: TObject);

Обработчик события нажатия по кнопке вызова серверного окна.

Все основные операции над данными журнала производятся после вызова других форм в обработчиках событий нажатия по кнопкам панели или выбора пунктов меню. Для осуществления этих операций применяется объект класса TJounral, описанный в модуле Core. Он объявлен в разделе описания переменных модуля данной формы.

Класс данной формы реализует базовые функции по работе с записями журнала.

3.2.3 Модуль uServer. pas формы сервера проекта программы iJournal

Данный модуль содержит класс формы TfrmServer, основные поля которого отражены в таблице 9, а методы в таблице 10.

Таблица 9 — Основные поля класса формы TfrmServer

Поля

Назначение

sgLogedIn: TStringGrid;

Таблица, используемая для отображения записей «залогиненных» (тестирующихся на данный момент) пользователей.

btnStartStop: TButton;

Кнопки запуска-остановки сервера.

Timer: TTimer;

Таймер. Используется для обновления списка тестируемых на данный момент пользователей.

SSocket: TServerSocket;

Сокет сервера.

memLog: TMemo;

Многострочный редактор для отображения лога сервера.

lbIP: TLabel;

Метка, отображающая IP адрес компьютера.

LogedIn: TLIList;

Компонент класса списка «залогиненных» пользователей.

Таблица 10 — Основные методы класса формы TfrmServer

Метод

Назначение

procedure SSocketClientRead (Sender: TObject; Socket: TCustomWinSocket);

Обработчик события получения данных от клиентского сокета.

procedure SSocketClientError (Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer);

Обработчик события возникновения ошибки при работе с сетью.

procedure btnStartStopClick (Sender: TObject);

Обработчик события нажатия по кнопке остан. /зап. сервера.

procedure TimerTimer (Sender: TObject);

Обработчик события тиканья таймера, используется для контроля времени существования записей «залогиненных» пользователей в списке тестируемых пользователей.

procedure RunRequest (S: String; var Answ: String);

Метод, выполняющий полученный сервером от клиента запрос. В качестве параметра передается полученная строка запроса, возвращает строку ответа на запрос.

procedure InitServerSocket;

Метод инициализации сокета сервера.

procedure UpdateData;

Метод, обновляющий список текущих (тестируемых) пользователей в таблице.

procedure LOG (S: String);

Процедура сохранения строки в лог-файл.

Данная форма реализует работу сервера системы тестирования. Позволяет запускать и останавливать сервер, просматривать список текущих тестируемых пользователей и лог работы сервера.

3.2.4 Модуль uMain. pas главной формы проекта программы iConstructor

Данный модуль содержит класс формы TfrmMain, основные поля которого отражены в таблице 11, а методы в таблице 12.

Таблица 11 — Основные поля класса формы TfrmMain

Поля

Назначение

FCurQuestion: TQuestion;

В этом поле храним информацию о текущем, редактируемом вопросе.

FLastActive: Integer;

Это поле определяет последний компонент TRichEdit, участвующий в процессе редактирования (1 — 4 — варианты ответов, 5 — поле ввода текста вопроса). Используется для определения, над каким компонентом необходимо производить действия, в случае потери им фокуса ввода.

FPicHeight: Integer;

Поле высоты дополнительной картинка. Используется для автоматической перерисовки текста вопроса в следующий раз.

FTempStr: array [1. 4] of String;

Массив имен картинок, которые были загружены

в процессе редактирования текущего вопроса.

FClosingApp: Boolean;

Логическая переменная-поле, определяющая, закрывается ли приложение (Истина — закрывается).

FDontCare: Boolean;

Поле-флаг, которое определяет в обработчиках ряда событий нужно ли его обрабатывать. Используется для установки в методе Draw всех полей компонентов, относящихся к текущему вопросу.

FCurQueModified: Boolean;

Поле-флаг, определяющее модификацию текущего, редактируемого вопроса.

FTestNameGiven: Boolean;

Поле, определяющее, было ли указано пользователем имя файла для текущего, редактируемого теста.

FAnswerTextMemLoaded: array [1. 4] of Boolean;

Массив переменных-флагов, определяющих, были ли загружены в память файлы вариантов ответов — текстов.

FAnswerPicMemLoaded: array [1. 4] of Boolean;

Массив переменных-флагов, определяющих, были ли загружены в память файлы вариантов ответов — картинок.

FExtPicMemLoaded: Boolean;

Поле, определяющее, была ли загружена в память дополнительная картинка.

FMainTextMemLoaded: Boolean;

Поле, определяющее, был ли загружен в память файл с вопросом.

Таблица 12 — Основные методы класса формы TfrmMain

Метод

Назначение

procedure ClearMemLoadedState;

Метод, заполняющий значением лжи флаги загрузки данных вопроса в память.

procedure ClearRichEdits;

Метод, очищающий компоненты класса TRichEdit.

procedure ClearColors;

Метод, очищающий подсветку выбранного варианта ответа.

procedure ClearLastEmptyQue;

Метод, удаляющий пустые вопросы в конце.

procedure GoToQuestion (Num: Integer);

Метод, реализующий переход к конкретному вопросу с номером Num теста.

procedure GetAndDrawCurQuestion;

Метод, прорисовывающий текущий вопрос с настройкой всех параметров.

procedure Draw (Question: TQuestion);

Метод, осуществляющий прорисовку содержимого текущего вопроса на форме.

procedure SaveQuestion;

Метод, сохраняющий текущий вопрос.

procedure New;

Метод создания нового документа.

procedure Save;

Метод, сохраняющий текущий документ.

Данная форма реализует работу конструктора. Она отображает данные текущего вопроса, предоставляет возможности редактирования данных вопроса, позволяет переходить по списку вопросов, добавлять вопросы, удалять и т. п. Работа со структурами данных теста осуществляется при помощи объекта класса TCon, описанного в модуле iСon.

3.2.5 Модуль Core. pas

В данном модуле описываются следующие типы данных:

— Динамических массивов различных базовых типов и типов, определенных пользователем (TIntArray, TQuestionsArray, TUsersArray, TStringArray).

— Типы данных для описания основных единиц информации (запись о вопросе TQuestion, запись о пользователе TUser, запись о результате тестирования TTestResult, стиль расположения вариантов ответа TAnswerStyle), используемых в созданных классах.

— Класс TTest для осуществления процесса тестирования.

— Класс TJournal для работы с журналом.

Назначение класса TTest:

— открытие файла теста и генерации списка вопросов для сеанса тестирования;

— хранение этого списка вопросов;

— предоставление доступа к списку вопросов, навигация по нему;

— сохранения ответов пользователя;

— вычисление результата.

Назначение класса TJournal: загрузка и сохранения файла журнала; работа с группами (добавление, удаление, переименование групп пользователей и т. п.); работа с записями о студентах (добавление, удаление, редактирование, поиск); поддержка и синхронизация двух массивов списков пользователей (первый содержит записи о студентах всех групп, второй только записи, которые будут видны в таблице-списке главного окна программы iJournal); оперирование со списком имен тестов.

Описание полей класса TTest приведено в таблице 13, а описание основных методов — в таблице 14. Описание основных полей и методов класса TJournal отражено в таблицах 15 и 16 соответственно.

Таблица 13 — Основные поля класса TTest

Поля

Назначение

FTestName: String;

Название текущего теста.

FMaxWeight: Integer;

Максимальная сумма набираемых баллов.

FQuestionsCount: Integer;

Число вопросов в тесте.

FQuestions: TQuestionsArray;

Массив данных о вопросах.

FCurQuestionNum: Integer;

Номер текущего вопроса в массиве вопросов.

FUserAnswers: TIntArray;

Массив ответов пользователя.

Таблица 14 — Основные методы класса TTest

Метод

Назначение

function GenerateTest (FileName: String): Boolean;

Эта функция генерирует тест по переданному ей тестовому файлу. Возвращает истину, если все прошло успешно.

procedure Init (FileName: String);

Метод, инициализирующий экземпляр класса, передается имя файла с тестом.

function GetQuestion (var Question: TQuestion): Boolean;

Функция в качестве параметра Question возвращает данные текущего вопроса, если не закончено тестирование. Возвращает истину, если текущий вопрос получить удалось.

function Next: Boolean;

Функция-метод перехода к следующему вопросу, если переход был осуществлен (следующий вопрос существует), то возвращает истину, иначе ложь.

function Back: Boolean;

Функция-метод перехода к предыдущему вопросу, если переход был осуществлен (предыдущий вопрос существует), то возвращает истину, иначе ложь.

function ExistsSkiped: Boolean;

Функция-метод, определяющая, были ли пропущены в ходе тестирования пользователем вопросы.

procedure Answer (Answ: Integer);

Метод, отвечающий на текущий вопрос, сохраняет ответ в FUserAnswers. Answ — номер варианта ответа (1−4).

function CalcResult: Integer;

Функция-метод, выдающая результат тестирования по пятибалльной шкале.

Таблица 15 — Основные поля класса TJournal

Поля

Назначение

FUsersCount: Integer;

Число записей о пользователях (элементов массива FUsers).

FGroupsCount: Integer;

Число записей о группах (элементов массива FGroups).

FTestNamesCount: Integer;

Число названий тестов (элементов массива FTestNames).

FCurUsersCount: Integer;

Число текущих пользователей (элементов массива FCurUsersCount).

FUsers: TUsersArray;

Массив сведений о всех пользователях.

FGroups: TStringArray;

Массив названий групп.

FTestNames: TStringArray;

Массив названий тестов.

FCurUsers: TUsersArray;

Массив сведений о текущих пользователях (тех, которые, отображаются в таблице журнала).

Таблица 16 — Основные методы класса TJournal

Метод

Назначение

function Load: Boolean;

Метод, осуществляющий загрузку содержимого файла журнала в экземпляр класса. Возвращает True в случае успешного чтения, False в противном случае.

procedure Save;

Метод, сохраняющий структуры данных экземпляра класса в файл журнала.

function GetTestID (S: String): Integer;

Функция-метод, возвращающая по имени теста его индекс (номер элемента в массиве TestNames, равного S). В случае отсутствия такого возвращает — 1.

function GetGroupID (S: String): Integer;

Функция-метод, возвращающая по имени группы ее индекс (номер элемента в массиве FGroups, равного S). В случае отсутствия такого возвращает — 1.

procedure AddGroup (Group: String);

Метод добавления группы с именем Group в список групп (массив FGroups) с учетом соблюдения уникальности.

function FindGroup (Group: String): Integer;

Метод поиска группы с именем Group в список групп (массив FGroups). Возвращает номер элемента массива, равного Group или — 1 в случае его отсутствия.

procedure DelGroup (Num: Integer);

Метод, удаляющий группу с индексом Num (индекс в массиве FGroups) со всеми записями пользователей, принадлежащих ей из списка всех пользователей FUsers и из списка текущих пользователей FCurUsers, если эта группа была текущей.

procedure EditGroup (Num: Integer; NewGroup: String);

Метод, присваивающий значение NewGroup имени группы с индексным номером Num.

function ExistsGroup (Group: String): Boolean;

Метод, определяющий существует ли группа с указанным именем в журнале. Возвращает истину, если существует, и ложь в противном случае.

procedure SetNewTestNames (A: TStringArray; Count: Integer);

Метод, устанавливающий в качестве списка имен тестов элементы массива A. Параметр Count содержит количество строк в массиве A. Также происходит обновление списка оценок пользователей.

function AddUser (Name, Surname: String; GroupID: Integer): Boolean;

Функция-метод добавляет пользователя с именем, фамилией и индексом группы соответственно равными Name, Surname, GroupID в журнал. Если добавление произошло успешно, то функция возвращает True, в противном случае — False.

procedure DelUser (Name, Surname: String; GroupID: Integer);

Метод, удаляет пользователя из списка FUsers (если пользователь в списке текущих, то он также удаляется из этого списка). В качестве входных параметров процедура получает имя, фамилию и индекс группы соответственно.

function EditUser (LastUserData, NewUserData: TUser): Boolean;

Если пользователь, с данными LastUserData существует, то функция возвратит True, и данные пользователя заменятся на значение переменной NewUserData (параллельно производится синхронизация списка текущих пользователей), в противном случае функция возвратит False.

function FindUser (Name, Surname, Group: String): Integer;

Функция-метод, производящая поиск пользователя по уникальным в совокупности данным: Name (имени), Surname (фамилии), Group (группе) в массиве FUsers. Возвращает номер пользователя в массиве, если не найден, то возвращает — 1.

function FindCurUsers (UserID: Integer): Integer;

Функция-метод, производящая поиск индексного номера пользователя в массиве FCurUsers по указанному индексному номеру этого пользователя в массиве FUsers. Возвращает номер пользователя в массиве, если не найден, то возвращает — 1.

Алгоритм работы с объектами класса TTest:

1 Создается экземпляр класса (например, в обработчике события создания главной формы приложения).

2 Вызывается метод Init, которому, в качестве параметра передается имя тестового файла, который необходимо открыть.

3 Далее идет работа со списком уже сгенерированных вопросов TTest. Читается текущий вопрос методом GetQuestion и рисуется формой на экран, вызывается метод передачи ответа пользователя Answer (или не вызывается, если вопрос пропускается), далее вызывается метод перехода к следующему вопросу Next. В любой момент можно вызвать метод перехода к предыдущему вопросу Back. После перехода к новому вопросу идет повторный вызов GetQuestion и т. д.

4 Когда дошли до последнего вопроса, вызываем метод ExistsSkiped, чтобы определить были ли пользователем пропущены некоторые вопросы. Если не были, то вызываем метод CalcResult и получаем оценку.

5 В случае повторного тестирования переходим к пункту 2 этого списка.

6 Уничтожается экземпляр класса (например, в обработчике события уничтожения главной формы приложения).

Алгоритм работы с объектами класса TJournal:

1 Создается экземпляр класса (например, в обработчике события создания главной формы приложения).

2 Вызывается метод загрузки данных журнала Load.

3 Выбираем текущую группу журнала, присвоив свойству CurGroup имя группы.

4 Можем производить любую модификацию групп и пользователей (в том числе и не текущей группы, например, для сохранения результатов тестирования, поступивших на сервер). В случае необходимости можем сохранить журнал методом Save.

5 При необходимости сменить группу, переходим к пункту 3 этого списка.

6 Уничтожается экземпляр класса (например, в обработчике события уничтожения главной формы приложения).

Также данный модуль содержит множество констант, используемых в приложениях:

— Различные константы, задающие цвета, стандартные строки, размеры видимых элементов.

— Константы названий стандартных директорий, файлов и их масок.

— Пароль для входа в iJournal.

— Признаки типа каждого файла системы.

— Сообщения.

— Отладочные константы.

Модуль Core содержит несколько дополнительных подпрограмм, которые используются сразу в нескольких классах.

3.2. 6 Модуль NetCore. pas

В данном модуле описываются следующие типы данных:

— Тип запроса клиента TRequestType.

— Типы TUserData и TUserDataArray для внутреннего использования классом TLIList.

— Класс TLIList для работы со списком пользователей, участвующих на данный момент в процессе тестирования.

Назначение класса TLIList:

— Хранения, регистрация и удаления необходимых серверу данных о тех пользователях, которые на данный момент участвуют в процессе тестирования.

— Обновления времени существования пользователей в этом списке и удаление их этого списка записей тех пользователей, которые потеряли право на существование в этом списке.

Описание полей класса TLIList приведено в таблице 17, а описание основных методов — в таблице 18.

Таблица 17 — Основные поля класса TLIList

Поля

Назначение

FUsers: TUserDataArray;

Массив данных о текущих пользователях.

FUsersCount: Integer;

Число записей в этом массиве.

FTime: array of Integer;

Массив времен, оставшихся до следующего обновления по протоколу или удаление записи из списка.

Таблица 18 — Основные методы класса TLIList

Метод

Назначение

procedure Clear;

Метод, очищающий список.

procedure Add (Name, SurName, Group: String);

Метод, добавляющий нового пользователя (передается имя, фамилия и название группы соответственно).

procedure Delete (Name, SurName, Group: String);

Метод, удаляющий пользователя (передается имя, фамилия и название группы соответственно).

function ExistsUser (Name, SurName, Group: String): Boolean;

Метод, проверяющий, если пользователь с указанными данными в списке (передается имя, фамилия и название группы соответственно), возвращает истину только тогда, когда пользователь с переданными данными будет найден в списке текущих пользователей.

function ExistsGroup (Group: String): Boolean;

Метод, определяющий, есть ли указанная группа, среди групп пользователей списка (в качестве параметра передается имя искомой группы), возвращает истину, если группа существует.

procedure Update (Name, SurName, Group: String);

Метод, обновляющий время указанного пользователя (передается имя, фамилия и название группы соответственно).

procedure Tick (var Str: TStringArray; var Count: Integer);

Метод, производящий уменьшение времени существования тестируемых пользователей, и если время вышло, то удаляет их. Возвращает массив данных об удаленных записях пользователей (соединенные строки) и число элементов в этом массиве (нужно для лога).

procedure DelUser (Num: Integer);

Метод, удаляющий пользователя с указанным номером в массиве FUsers.

function FindUser (Name, SurName, Group: String): Integer;

Метод, возвращает позицию пользователя в массиве FUsers (передается имя, фамилия и название группы соответственно).

Также данный модуль содержит множество констант, используемых в приложениях:

— Константы значений сетевых параметров по умолчанию.

— Типизированные константы значений сетевых параметров.

— Константы команд запросов клиента и ответов сервера.

— Константы для работы с логами.

— Константы данных пользователя для локального тестирования.

— Константы сетевых сообщений.

— Константы для работы с конфигурационными файлами клиента и сервера.

Модуль NetCore содержит несколько дополнительных подпрограмм, которые используются сразу в нескольких классах.

3.2.7 Модуль iCon. pas

В данном модуле описывается класс конструктора TCon для создания и редактирования тестовых файлов.

Назначение класса TCon:

— Открытие, сохранения, хранение в памяти данных файла вопроса.

— Предоставляет набор базовых операций по работе со списком вопросов (удаление, добавление, модификация вопроса и т. п.). Также реализует навигацию по этому списку.

— Реализует возможности изменения параметров каждого из вопросов.

Описание полей класса TCon приведено в таблице 19, а описание основных методов — в таблице 20.

Таблица 19 — Основные поля класса TCon

Поля

Назначение

FQuestions: TQuestionsArray;

Массив вопросов.

FQuestionsCount: Integer;

Число вопросов в массиве FQuestions.

FCurQuestionNum: Integer;

Номер текущего вопроса.

FTestName: String;

Название теста.

FTypeACount: Integer;

Число генерируемых вопросов типа А.

FTypeBCount: Integer;

Число генерируемых вопросов типа В.

FTypeCCount: Integer;

Число генерируемых вопросов типа С.

FModified: Boolean;

Флаг модификации.

FFileName: String;

Имя текущего файла (включая путь).

FTempDir: String;

Временная директория;

Таблица 20 — Основные методы класса TCon

Метод

Назначение

procedure New;

Метод создания нового теста.

procedure SaveAs (FileName: String);

Метод, сохраняющий все файлы документа в указанную папку (эта папка — путь к файлу FileName), он делает эту папку в качестве настоящей, а временная папка не меняется.

procedure Save;

Метод, сохраняющий все файлы в настоящую папку, работа продолжается с временной папкой.

function Load (FileName: String): Boolean;

Метод, загружающий данные из файла теста. FileName — имя тестового файла.

function Open (FileName: String): Boolean;

Метод, загружающий данные и производящий копирование всех файлов во временную папку. FileName — имя открываемого тестового файла.

function GoBack: Boolean;

Метод перехода назад по списку вопросов, возвращает истину, если переход произошел.

function GoNext (CanCreate: Boolean): Boolean;

Метод перехода к следующему вопросу, если CanCreate=True, то если следующего вопроса нет, то он создается. Возвращает истину, если переход произошел.

function GoFirst: Boolean;

Метод перехода к первому вопросу, возвращает истину, если переход произошел.

function GoLast: Boolean;

Метод перехода к последнему вопросу, возвращает истину, если переход произошел.

function GoToQuestion (Num: Integer): Boolean;

Метод перехода к указанному вопросу с номером Num, возвращает истину, если переход произошел.

function GetCurQuestion: TQuestion;

Метод, возвращающий данные текущего вопроса.

procedure UpdateCurQuestion (Question: TQuestion);

Метод, обновляющий данные текущего вопроса. Question — новые данные для текущего вопроса.

procedure DeleteQuest (Num: Integer);

Метод, удаляющий вопрос с указанным номером Num.

procedure InsertEmptyQuest (Pos: Integer);

Метод, вставляющий пустой вопрос в заданную позицию Pos.

procedure AppendEmptyQuest;

Метод, добавляющий в конец пустой вопрос.

function IsReadyForTesting: Boolean;

Метод-функция, возвращает истину, когда тест готов к использованию.

procedure MakeReport (var Str: TMemo);

Метод, составляющий отчет о готовности, возвращает TMemo Str с отчетом.

Алгоритм работы с классом TCon:

1 Создается экземпляр класса (например, в обработчике события создания главной формы приложения).

2 Вызывается метод New или Open, инициализирующий класс конструктора.

3 Осуществляется работа со списком вопросов методами DeleteQuest, InsertEmptyQuest, AppendEmptyQuest; навигация по списку вопросов методами GoBack, GoNext, GoFirst, GoLast, GoToQuestion; получение данных текущего вопроса методом GetCurQuestion, их изменение и сохранение методом UpdateCurQuestion.

4 Уничтожается экземпляр класса (например, в обработчике события создания главной формы приложения).

Также данный модуль содержит множество констант, используемых в приложениях:

— Стандартные константы для реализации класса конструктора.

— Константы сообщений для программы iConstructor.

3.3 Работа с сетью

Для реализации связи клиента и сервера по сети были использованы стандартные компоненты TClientSocket и TServerSocket.

Для логической связи был реализован небольшой протокол. Общение клиента и сервера осуществляется в течение нескольких соединений. Во время каждого сеанса соединения клиент осуществляет следующие действия:

1 Пытается соединиться с сервером.

2 При установлении соединения, клиент посылает запрос на выполнения некоторого действия серверу.

3 Получает ответ о результате выполнения запроса.

4 Разрывает связь.

5 Производит реакция на ответ сервера.

Каждый запрос в общем, виде может быть записан следующим образом:

Команда «Строка 1» «Строка 2» «Строка 3» … «Строка N»

Команда запроса представляет собой непрерывную последовательность букв латинского алфавита, в качестве параметров команды передаются строки в двойных кавычках. Символами строчек могут быть любые символы, кроме управляющих и символа двойной кавычки. Разные команды имеют разное, но фиксированное число параметров.

Ответ сервера представляет собой непрерывную последовательность букв латинского языка. Ответ не содержит параметров.

Во время тестирования клиент не держит постоянной связи с сервером. При необходимости отправления каждого запроса, клиент соединяется вновь. Это сделано, чтобы позволить одновременно тестироваться большому числу пользователей.

Описание протокола приведено в таблице 21. В первой колонке описана команда запроса клиента, а во второй приведены варианты ответов сервера на данную команду.

Таблица 21 — Описание команд запросов

Команда запроса клиента и ее описание

Варианты ответов сервера на соответствующие запросы клиента и их описание

L «Имя» «Фамилия» «Группа»

Команда запроса входа пользователя с указанным именем, фамилией и группой на вход в систему тестирования.

OK

Пользователь добавлен в список тестируемых пользователей.

UL

Пользователь с этими данными уже вошел в систему тестирования.

UNB

Пользователь с этими данными не зарегистрирован в журнале.

O «Имя» «Фамилия» «Группа»

Команда запроса выхода пользователя с указанным именем, фамилией и группой из системы тестирования.

OK

Пользователь был успешно удален из списка тестируемых пользователей.

UN

Нет пользователя с этими данными в списке тестируемых пользователей.

U «Имя» «Фамилия» «Группа»

Команда запроса обновления времени существования пользователя с указанным именем, фамилией и группой в системе тестирования.

OK

Время существования данного пользователя в списке тестируемых пользователей было обновлено. Если пользователя не было в списке тестируемых, но есть в журнале, то он добавляется в список текущих.

UNB

Пользователя с этими данными вообще нет в журнале.

R «Имя» «Фамилия» «Группа» «Название теста» «Оценка»

Команда запроса сохранения результата тестирования пользователя с указанным именем, фамилией и группой в журнале.

OK

Результат был сохранен. При этом, если пользователя не было в списке текущих пользователей, то он будет добавлен.

TN

Тест с данным названием не зарегистрирован в журнале и результат не может быть сохранен.

UNB

Нет записи данного пользователя в журнале.

Сервер ведет список тестируемых пользователей, который отображается на экране серверного окна журнала. В этот список могут быть добавлены пользователи, в случае успешной обработки запроса входа, обновления времени существования или сохранения результата. Запись о пользователе будет удалена из списка тестируемых пользователей в случае получения запроса о выходе этого пользователя из системы тестирования или неполучения от клиентской программы пользователя запроса об обновлении времени существования.

Класс формы frmMain проекта программы iTest имеет методы SendLogIn, SendLogOut, SendUpdate, SendResult для посылки всех, перечисленных выше запросов серверу. В каждом из данных методов вызывается метод TryToConnect, который пытается соединиться с сервером. Он производит MAX_CONNECT_TRIES или меньше попыток соединиться с сервером. Обработка ошибок соединения производится в обработчике события OnError сокета. Если соединения с сервером после всех попыток не происходит, то выдается соответствующее сообщение пользователю. Если же соединение происходит, но сервер не дает ответа на запрос, то клиент ждет ответ в течение MAX_WAIT_TIME секунд, разрывает связь и пытается соединиться вновь. Если клиенту не удалось получить ответ сервера после MAX_CONNECT_NOANSWER успешных попыток соединения без ответа, то выдаем пользователю сообщение об этом.

Получение клиентом ответа сервера на запрос происходит в обработчике OnRead сокета клиента. Здесь анализируется ответ сервера. И в зависимости от значения FRequestType (типа последнего запроса), производится реакция. Если ответ отличается от OK, то в зависимости от типа запроса будет выдаваться соответствующее сообщение. Например, если был послан запрос входа в систему, а получен ответ UNB, то выдается сообщение об отсутствии регистрации этого пользователя в журнале.

Посылка запроса входа в систему тестирования производится из формы frmEnter (входа в систему). В случае получения ответа ОК производится тестирование. После входа в систему запускается таймер Timer, время его тиканья устанавливается равным TIMEPERCENTTOCONNECT процентов от TIMEOUT секунд (TIMEOUT — это время в секундах, через которое запись пользователя в списке тестируемых пользователей на сервере будет удалена). В обработчике OnTime таймера вызывается метод посылки запроса обновления времени существования. После вычисления результата тестирования, посылается запрос о сохранении результата. При выходе из программы клиента посылается запрос о выходе из системы.

Класс формы frmServer проекта программы iJournal получает запрос клиента в обработчике события OnClientRead сокета сервера в виде строки. Обработчик сначала вызывает метод RunRequest, которому передает полученную строку. В RunRequest распознается команда, выполняются действия и возвращается ответ, который посылается обработчиком события OnClientRead сокета сервера клиенту. Также вызываются соответствующие методы обновления списка текущих пользователей и таблицы журнала.

ПоказатьСвернуть
Заполнить форму текущей работой