Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовой проект / создания тестирующей системы / Пояснительная записка (Курсовой по МП).doc
Скачиваний:
30
Добавлен:
21.02.2014
Размер:
494.08 Кб
Скачать

3.5 Библиотеки объектных визуальных компонентов

Компоненты, используемые при разработке в Delphi (и также собственно самим Delphi), встроены в среду разработки приложений и представляют из себя набор типов объектов, используемых в качестве фундамента при строительстве приложения.

Этот костяк называется Visual Component Library (VCL). В VCL есть такие стандартные элементы управления, как строки редактирования, статические элементы управления, строки редактирования со списками, списки объектов.

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

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

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

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

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

Язык программирования Delphi базируется на Borland Object Pascal. Кроме того, Delphi поддерживает такие низкоуровневые особенности, как подклассы элементов управления Windows, перекрытие цикла обработки сообщений Windows, использование встроенного ассемблера.

4 Описание логической структуры

4.1 Алгоритм программы

Алгоритм функционирования данной программы достаточно прост, его можно представить следующей блок-схемой:

Рисунок 1 Блок схема программы

Поясним данную блок схему:

1. Ввод данных пользователя

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

Рисунок 2 Внешний вид окошка запроса данных пользователя

2. Загрузка вопросов.

Вопросы и варианты ответов на них хранятся в файле Questions.ini. Структура этого файла описана ниже.

3. Загрузка и раскодирование информации об ответах.

Информация об ответах, а именно процентная оценка правильности каждого варианта ответа хранится в файле Tests.ans. Раскодирование осуществляется на основе масок.

4. Генерация случайной последовательности.

Из всех находящихся в файле Questions.ini вопросов производится выборка (случайная) определенного (в этом же файле) количества вопросов.

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

Рисунок 3 Общий вид окна программы тестирования

4.2 Используемые методы

В программе используются основные компоненты Borland Delphi 7. Кратко опишем их.

4.2.1 TFrame - рама и шаблоны компонентов

Этот компонент впервые введен в Delphi 5. Он определяет раму - кон­тейнер для размещения других компонентов. В функциональном отноше­нии компонент почти повторяет свойства формы и отличается от нее в основном лишь тем, что его можно помещать на формы или в другие ра­мы. Фактически рама представляет собой удобное средство создания шаблонов – произвольных наборов компонентов, максимально приспо­собленных для нужд конкретного пользователя. Раз созданный шаблон может подобно любому другому компоненту размещаться на форме или другой раме (допускается неограниченная вложенность рам). Любые изменения в базовой раме (т.е. в раме, сохраненной в палитре) тут же отображаются во всех проектах, использующих данную раму.

4.2.2 TMainMenu - главное меню формы (программы)

Компонент класса TMainMenu определяет главное меню формы. На форму можно поместить сколько угодно объектов этого класса, но ото­бражаться в полосе меню в верхней части формы будет только тот из них, который указан в свойстве Menu формы.

4.2.3 TLabel - метка для отображения текста

Компоненты класса TLabel (метка) предназначен для размещения на форме различного рода текста, надписей. Для этого служит центральное свойство компонента - Caption. С помощью свойства Font можно разнообразить вид надписи.

4.2.4 TEdit - ввод и отображение строки

Компонент класса TEdit представляет собой одно­строчный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные тек­стовые строки.

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

4.2.5 TRadioButton - зависимые переключатели

Компоненты TRadioButton представляют собой зависимые переключатели, пред­назначенные для выбора одного из нескольких взаи­моисключающих решений. На форму (точнее, в компонент-контейнер) помещается по меньшей мере два таких компонента. Они могут иметь только два состояния, определяемых свойством Checked. Если в одном компоненте это свойство принимает значение True, во всех других компонентах, расположенных в том же контейнере, свойства Checked принимают значения False.

4.2.6 TFontDialog - диалог выбора шрифта

Компонент TFontDialog создает и обслуживает стандартное окно BI бора шрифта.

Рисунок 4 Внешний вид компонента TFontDialog

4.3 Структура программы

4.3.1 Ввод сведений об учащихся

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

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

Поясним текст Enter.pas:

procedure TEnterForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Application.Terminate;

end;

Данная процедура – завершение функционирования нашей программы.

procedure TEnterForm.BitBtnOkClick(Sender: TObject);

begin

if (EditName.Text='') or (EditSurname.Text='') or (EditFathername.Text='') or (EditSpeciality.Text='') or (EditGroup.Text='') then

begin

end;

Application.MessageBox('Не все поля заполнены!', 'Ошибка!');

end

else

begin

User.Name:=EditName.Text;

User.Surname:=EditSurname.Text;

User.Fathername:=EditFathername.Text;

User.Speciality:=EditSpeciality.Text;

User.Group:=EditGroup.Text;

EnterForm.Hide;

TestsForm.Show;

end;

end;

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

4.3.2 Модуль тестирования. Далее выполняется следующий модуль программы – модуль собственно самого тестирования – это Tests.dfm и Tests.pas. Рассмотрим подробно все этапы функционирования программы.

procedure TTestsForm.FormCreate(Sender: TObject);

begin

TestNum:=1;

User.AnswersSum:=0;

QuestionsIni:= TMemIniFile.Create('Questions.ini');

FontStyle:=TFont.Create;

FontStyle.Size:=QuestionsIni.ReadInteger('Main','FontSize',14);

FontStyle.Name:=QuestionsIni.ReadString('Main','FontName','Times New Roman');

CreateRandomQuestions;

LoadAnswers;

LoadTest(RandomQuestions[TestNum]);

LabelQuestionNum.Font.Assign(FontStyle);

LabelQuestionNum.Caption:='Вопрос № '+IntToStr(TestNum)+' из '+IntToStr(RandomQuestions[0])+' ';

PanelT.Height:=LabelQuestionNum.Height+8;

LabelQuestionNum.Left:=(PanelT.Width-LabelQuestionNum.Width) shr 1;

LabelQuestionNum.Top:=(PanelT.Height-LabelQuestionNum.Height) shr 1;

end;

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

Процедура CreateRandomQuestions имеет следующую структуру:

procedure CreateRandomQuestions;//Создание случайной подборки вопросов.

var

i: Integer;

RandomNum:Integer;

Temp:Integer;

begin

Randomize;

QuestionsNumber:=QuestionsIni.ReadInteger('Main', 'Questions',0);

RandomNum:=QuestionsIni.ReadInteger('Main', 'RandomQuestions',0);

SetLength(RandomQuestions,RandomNum+1);

RandomQuestions[0]:=RandomNum;

for i:=1 to RandomNum do

begin

if i>1 then

begin

repeat

Temp:=Random(RandomNum)+1;

until Concurrences(RandomQuestions,Temp,i)=False;

RandomQuestions[i]:=Temp;

end

else

begin

RandomQuestions[i]:=Random(QuestionsNumber)+1;

end;

end;

end;

function Concurrences(ConArray: array of Integer;ConRan,ConNum: Integer):Boolean;//Поиск совпадений в случайной подборке

var

i: Integer;

ConTemp: Boolean;

begin

ConTemp:= False;

for i:=1 to ConNum do

begin

if ConArray[i]=ConRan then

begin

ConTemp:=True;

Break;

end;

end;

Result:=ConTemp;

end;

Алгоритм ее функционирования сводится к тому, что заполняется массив переменных RandomQuestions случайными числами, который генерирует встроенный (в Delphi) генератор случайных чисел. Каждый проход цикла заполнения процедура RandomQuestions с помощью функции Concurrences (Совпадения) определяет нет ли уже такого случайного числа в в массиве и если есть, то генерируется другое число. Таким образом массив переменных RandomQuestions заполняется случайными не повторяющимися числами.

Далее мы рассмотрим процедуру LoadAnswers, которая загружает и раскодирует информацию об ответах:

procedure LoadAnswers;//Загрузка и расшифровка информации об ответах

var

i: Integer;

Buf: Byte;

F1,F2: File;

TempDirectoryPath: [0..MAX_PATH] of Char;

begin

GetTempPath(MAX_PATH,TempDirectoryPath);

AssignFile(F1,AnsFileName);

Reset(F1,1);

AssignFile(F2,TempDirectoryPath+AnswersIniFileName);

Rewrite(F2,1);

for i:=0 to FileSize(F1)-1 do

begin

BlockRead(F1,Buf,1);

Buf:=Buf xor 255;

BlockWrite(F2,Buf,1);

end;

CloseFile(F1);

CloseFile(F2);

AnswersIni:=TMemIniFile.Create(TempDirectoryPath+AnswersIniFileName);

end;

Эта процедура использует простой алгоритм раскодирования информации, реализованный на основе масок. Для раскодирования каждый байт кодированного файла подвергается операции XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ). Далее раскодированная информации помещается в память.

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

procedure TTestsForm.BBNextTestClick(Sender: TObject);//Очистка окна программы, считывание результата ответа на вопрос и загрузка следующего.

begin

if TestTr then

begin

ClearTest;

if (TestNum+1)<>Length(RandomQuestions) then

begin

User.AnswersSum:=User.AnswersSum+(AnswersIni.ReadInteger(IntToStr(TestNum),IntToStr(CTN),0));

Inc(TestNum);

LoadTest(RandomQuestions[TestNum]);

end

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

begin

User.AnswersSum:=User.AnswersSum+(AnswersIni.ReadInteger(IntToStr(TestNum),IntToStr(CTN),0));

ResultCreate;

end;

end;

end;

Этапы его функционирования следующие:

1. Проверка существования следующего теста.

2. Если существует, то окно формы очищается от предыдущего вопроса процедурой ClearTest.

3. Создание и наполнение текстом окон вопроса и вариантов ответов на главной форме программы – процедура LoadTest.

4. Если вопросов больше нет, то с помощью процедуры ResultCreate реализуется вывод результатов тестирования на главную форму, а также в файл под названием Result.txt, который создается в каталоге программы.

Текст процедуры LoadTest довольно объемен, его смысл сводится к тому, что на пустой форме, с помощью заранее созданной структуры – фрейма создаются окна-контейнеры, которые содержат текст вопроса и вариантов ответов. Фреймы хранятся в следующих файлах: QFramePr.dfm – фрейм вопроса, CheckFramePr.dfm – фрейм вариантов ответов, ResultFramePr.dfm – фрейм ответа.

Процедура ClearTest просто обнуляет объекты-фреймы.

Процедура ResultCreate:

procedure TTestsForm.ResultCreate;//Расчет и вывод результатов прохождения теста.

var

ResultFile: TextFile;

begin

TestsForm.PanelOk.Hide;

TestsMainMenu.Destroy;

TestsForm.LabelQuestionNum.Hide;

QAResult:=TResultFrame.Create(nil);

User.ResultInPer:=User.AnswersSum div TestNum;

with QAResult do

begin

//Создание заголовков

Parent:=TestsForm.TestsScrollBox;

UserName.Font.Assign(FontStyle);

MesLab.Font.Assign(FontStyle);

Result.Font.Assign(FontStyle);

UserName.Font.Size:=FontStyle.Size+2;

MesLab.Font.Size:=FontStyle.Size+2;

Result.Font.Size:=FontStyle.Size+50;

MesLab.Caption:='Ваша оценка за тест:';

UserName.Caption:=User.Surname+' '+User.Name+' '+User.Fathername;

if (User.ResultInPer<=100) and (User.ResultInPer>=80) then User.Result:=5;

if (User.ResultInPer<80) and (User.ResultInPer>=60) then User.Result:=4;

if (User.ResultInPer<60) and (User.ResultInPer>=40) then User.Result:=3;

if (User.ResultInPer<40) and (User.ResultInPer>=20) then User.Result:=2;

if (User.ResultInPer<20) and (User.ResultInPer>=0) then User.Result:=1;

Result.Caption:=IntToStr(User.Result)+'('+IntToStr(User.ResultInPer)+'%'+')';

//Сохранение результата в файл

AssignFile(ResultFile,ResultFileName);

Rewrite(ResultFile);

WriteLn(ResultFile,'Студент: '+UserName.Caption);

WriteLn(ResultFile,'Специальность: '+User.Speciality);

WriteLn(ResultFile,'Группа: '+User.Group);

WriteLn(ResultFile,'Оценка за тест: '+Result.Caption);

CloseFile(ResultFile);

end;

end;

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

Таблица 1 – Определение оценки за тесты

Оценка правильности ответов на тесты, %

Полученная оценка

0-19

1

20-39

2

40-59

3

60-79

4

80-90

5

Две следующие процедуры выполняют прикладную роль – они пересчитывают размеры компонентов формы и прорисовывают ее в соответствии с новыми размерами при их изменении:

procedure TTestsForm.FormResize(Sender: TObject); //Реакция на изменение размера окна программы - перерисовка компонентов с вопросами.

var

Temp: String;

i: Integer;

begin

if QALabels[0].Parent<>nil then //Проверка существования вопроса в окне программы

begin

with TestsForm.TestsScrollBox do

begin

for i:= 0 to AnsNum do

begin

Temp:=QALabels[i].LabelText.Caption;

QALabels[i].LabelText.Caption:='';

QALabels[i].LabelText.Caption:=Temp;

QALabels[i].Height:=QALabels[i].LabelText.Height+AddHeight;

end;

end;

end;

end;

procedure TTestsForm.FormConstrainedResize(Sender: TObject; var MinWidth,

MinHeight, MaxWidth, MaxHeight: Integer); // Позиционирование и изменение остального содержимого окна программы в сооответствии с его изменяющимися размерами.

begin

BBNextTest.Left:=(PanelOk.Width-BBNextTest.Width) shr 1;

LabelQuestionNum.Left:=(PanelT.Width-LabelQuestionNum.Width) shr 1;

LabelQuestionNum.Top:=(PanelT.Height-LabelQuestionNum.Height) shr 1;

if QAResult<>nil then

begin

with QAResult do

begin

UserName.Left:=(Width-UserName.Width) shr 1;

MesLab.Left:=(Width-MesLab.Width) shr 1;

Result.Left:=(Width-Result.Width) shr 1;

UserName.Top:=(Height-(UserName.Height+MesLab.Height+Result.Height)) shr 1;

MesLab.Top:=((Height-(UserName.Height+MesLab.Height+Result.Height)) shr 1)+UserName.Height;

Result.Top:=((Height-(UserName.Height+MesLab.Height+Result.Height)) shr 1)+UserName.Height+MesLab.Height;

end;

end;

end;

Смену шрифтов и оформления текста осуществляет довольно простая функция ChooseClick:

procedure TTestsForm.ChooseClick(Sender: TObject);//Выбор шрифта для отображения текста в программе

begin

if TestsFontDialog.Execute then

begin

if (QALabels[0].Parent<>nil) then

FontStyle.Assign(TestsFontDialog.Font);

ClearTest;

LoadTest(RandomQuestions[TestNum]);

if TestNum=1 then

begin

TestsForm.Height:=TestsForm.Height+1;

TestsForm.Height:=TestsForm.Height-1;

end;

end;

end;

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

4.4. Структура файлов Queston.ini и Answer.ini.

Ini файл, это стандартный текстовый файл Windows в котором хранятся настройки программы. В скобках, указывается раздел например [Main], ключ указывается как “имя ключа=”, например FontSize=. После равно, без пробелов, идет значение ключа.

Question.ini:

[Main]

FontSize=14

FontName=Times New Roman

Questions=4

RandomQuestions=3

[1]

answers=3

question=Дайте определение: Микропроцессора

1=МП - это программно-независимое устройство…

2=МП - это программно-управляемое устройство,…

3=МП - это программно-управляемое устройство,…

В разделе [main], находятся значения параметров программы:

FontSize=14 - размер шрифта

FontName=Times New Roman - имя шрифта

Questions=4 - общее количество вопросов

RandomQuestions=3 - количество вопросов которые будут заданы.

В разделе [1], [2] и т.д. описываются вопросы, имя раздела соответствует порядковому номеру вопроса.

answers=3 - количество ответов

question=Дайте определение: Микропроцессора - вопрос

1=МП - это программно-независимое устройство…- 1ый вариант ответа

2=МП - это программно-управляемое устройство,…- 2ой вариант ответа

3=МП - это программно-управляемое устройство,… 3ий вариант ответа

Answer.ini:

[1]

1=10

2=0

3=100

Имя раздела [1], [2] соответствует порядковому номеру вопроса. Ключи 1=, 2= и т. д. соответствуют ответу, значение этих ключей равно процентному эквиваленту правильности ответа. Если ответ абсолютно не верен то 0, если абсолютно верен то 100. Ключ может принимать любое значение от 0 до 100.

5 ОПисание программы

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

Появится окно ввода личных данных (рисунок 2). Введите свою Фамилию, Имя, Отчество, группу и нажмите кнопку продолжить.

Появится основное окно программы (рисунок 3), в котором находится вопрос теста и несколько вариантов ответов. Укажите ответ, кликнув на кружке перед словом “Ответ №”. Нажмите кнопку «Следующий тест».

Загрузиться новый вопрос и варианты ответов. Таким же образом необходимо ответить на все вопросы. Для удобства в середине теста, вверху окна программы указывается значение количества вопросов и на какое количество из них уже был получен ответ. Например: «Вопрос 10 из 20».

В верхнем левом углу окна находится меню Шрифт. Там можно выбрать любой шрифт, которым будут отображаться вопросы и ответы. Каждый тестируемый может выбрать шрифт для себя индивидуально.

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

После того как вы ответите на последний вопрос, откроется окно результата. Где вы увидите вашу оценку в баллах и процент правильных ответов.

ЗАКЛЮЧЕНИЕ

Результатом выполнения курсового проекта является разработка программы тестирования студентов по дисциплине «Микропроцессоры».

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

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

1. Карпова И.П. Исследование и разработка подсистемы контроля знаний в распределенных автоматизированных обучающих системах. Москва, 2002.

2. Кнут Д. Искусство программирования для ЭВМ/т.3 Сортировка и поиск / Пер. с англ. / Под ред. Баяковского и Штаркмана. – М.: Мир, 1978. – 848 с.

3. Фаранов В.В. Delphi 5. Учебный курс. –М.:”Нолидж”,2000.-608с., ил.

ПРИЛОЖЕНИЕ

1. Вопросы и ответы 35

2. Дискета с тестом 45

Приложение 1

Вопросы и ответы

1. Дайте определение: Микропроцессора

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

+ МП - это программно-управляемое устройство, предназначенное для обработки цифровой информации и управления этим процессом, выполненное в виде одной или нескольких ИС с высокой степенью интеграции электронных элементов.

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