Программа

«Математический тестер»

Руководство программиста

Автор:

Руководитель:

Санкт Петербург 2006

Аннотация

Программа «Математический тестер» предназначена для проведения тестов по математике для учеников начальной школы.

В данном документе представлено руководство программиста к программе «Математический тестер».

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

Содержание

Постановка задачи. 4

Основные элементы программы.. 5

Форма. 5

Перемещение по элементам формы.. 5

Поле типа «дата». 5

Поле типа «число». 5

Поле типа «строка». 5

Кнопка. 5

Формализация алгоритма. 6

Общий алгоритм работы программы.. 6

Перечень подпрограмм.. 7

Главная «форма». 7

Форма «Регистрация». 7

Форма «Ввод пароля». 8

Форма Изменение пароля. 9

Форма «Для учителя». 9

Форма «Результат». 10

Хранение данных. 10

Листинг программы.. 12

Текст модуля FormMatht_Tester. pas. 12

Текст модуля ChangePassword. pas. 16

Текст модуля ForTeacher. pas. 18

Текст модуля password. pas. 30

Текст модуля registr. pas. 32

Текст модуля Results. pas. 35

Текст модуля Test. pas. 37

Описание размещения. 45

Требования к программным и аппаратным средствам.. 46


Постановка задачи

Эта программа предназначена для проведения тестов по математике для учеников начальной школы. В программе ученикам в игровой форме предлагается ответить на 10 вопросов по математике. По мере прохождения теста сложность вопросов увеличивается. В зависимости от количества правильных ответов выставляется оценка (от 2 до 5). Ученикам предлагается 9 вопросов для устного счёта и 1 задача. Из них 5 вопросов с выбором ответа и 5 вопросов без выбора ответа. Для учителя есть возможность просматривать результаты выполнения тестов учениками и просмотра сделанных учениками ошибок.

Основные элементы программы

Форма

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

Перемещение по элементам формы

Для перемещения по элементам формы можно использовать клавиши Tab или Shift+Tab или просто щелкать мышью на соответствующем элементе.

Для некоторых элементов формы проверяется корректность и полнота введенных данных.

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

Поле типа «дата»

Для ввода значения типа «дата» в табличной части формы необходимо в поле ввода указать дату в формате ДД. ММ. ГГГГ.

Поле типа «число»

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

Поле типа «строка»

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

Кнопка

Кнопки в форме используются для выполнения некоторых действий, предусмотренных алгоритмом формы. Для выбора кнопки следует щелкнуть по ней мышью или сделать ее активной клавишами Tab или Shift + Tab и нажать клавишу Enter. В некоторых формах одна или несколько из кнопок могут являться предопределенными (как правило, это кнопки Enter и Esc).

Формализация алгоритма

Общий алгоритм работы программы

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

Перечень подпрограмм

Программа MathsTester состоит из отдельных форм, каждая из которых выполняет определённые функции:

Название формы

Заголовок

Имя файла (Unit)

FormMatht_Tester

Математический тестер

mainForm

FormRegistr

Регистрация

registr

FormQ1

Тест

Test

FormPassword

Ввод пароля

password

FormChangePassword

Изменение пароля

ChangePassword

FormResults

Результаты

Results

ForTeacher

Для учителя

teacher

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

Процедуры/функции:

procedure ButtonBeginClick(Sender: TObject); //нажатие на кнопку Начать

procedure ButtonCloseClick(Sender: TObject); //нажатие на кнопку Выход

procedure Test; //процедура заполнения панели Результаты

procedure ForTeacherClick(Sender: TObject); //нажатие кнопки Для учителя

procedure FormClose(Sender: TObject; var Action: TCloseAction);
//закрытие формы

Форма «Регистрация» предназначена для ввода имени и фамилии ученика, который будет выполнять тест. Эти данные записываются в файл base. ini в секцию, соответствующую порядковому номеру ученика. Форма вызывается из главной формы (Математический тестер).

Процедуры/функции:

procedure BitBtnOKClick(Sender: TObject); //нажатие на кнопку OK

procedure readIni(); //чтение из файла base.ini количетва секций

procedure writeIni(Section : String); //запись нового количества секций в файл base.ini

НЕ нашли? Не то? Что вы ищете?

procedure WriteSectionBool(SectionName, ParamName: string; ParamValue : boolean); //запись параметра ParamName в секцию SectionName со значением ParamValue типа boolean

procedure FormCreate(Sender: TObject); //создание формы

procedure name_mKeyPress(Sender: TObject; var Key: Char);
//изменение поля для ввода имени ученика

procedure WriteSectionInt(SectionName, ParamName: string; ParamValue : integer); //запись параметра ParamName в секцию SectionName со значением ParamValue типа integer

procedure WriteSectionstr(SectionName, ParamName: string; ParamValue : string); //запись параметра ParamName в секцию SectionName со значением ParamValue типа string

В форме «Тест» устанавливается различные математические задания, и в зависимости от задания предлагаются два типа ввода ответа: выбор ответа или ввод ответа в специально отведённое поле. На выполнение задания отводится определённое время, которое зависит от типа задания. В ходе теста формируются 10 заданий. Задания заранее определены в программе, но данные для каждого формируемого здания задаются случайным образом. Сформированные задания и ответы на них сохраняются в текущей секции файла base. ini. Форма вызывается из главной формы (Математический тестер).

Процедуры/функции:

procedure FormCreate(Sender: TObject); //создание формы

procedure Button1Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №1, если даны варианты ответов

procedure Button2Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №2, если даны варианты ответов

procedure Button3Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №3, если даны варианты ответов

procedure Button4Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №4, если даны варианты ответов

procedure TimerMonstrTimer(Sender: TObject); //перемещение картинки с монстром

procedure TimerManTimer(Sender: TObject); //перемещение картинки с Ваней

procedure resultTest1(ButttonNum:integer); //проверка на правильный ответ, если даны варианты ответов

procedure timerEndTimer(Sender: TObject); //"кровавая сцена"

procedure otv_but(otv1:integer); //заполнение вариантов ответов

procedure resultTestEdit (otvet:integer); //проверка на правильный ответ, если не было дано вариантов ответов

procedure ButtonOKClick(Sender: TObject); //ввод ответа, если не было дано вариантов ответов

procedure editOtvetKeyPress(Sender: TObject; var Key: Char);
//изменения поля для ввода ответа

procedure umenshenie(var n:integer; NeBolshe :integer);
//уменьшение числа n (integer) до числа NeBolshe (integer)

procedure FormClose(Sender: TObject; var Action: TCloseAction);
//закрытие формы

Форма «Ввод пароля» предназначена для аутентификации пользователя. Форма является модальной. Пользователю предлагается ввести пароль, и если пароль опознан, открывается форма Для учителя. Если пароль не опознан, выдаётся сообщение об ошибке. Данные о пароле хранятся в файле Par.txt. Для изменения пароля предусмотрена кнопка Сменить.

Процедуры/функции:

procedure ButtonOKClick(Sender: TObject); //нажатие на кнопку OK

procedure ButtonChangeClick(Sender: TObject); //нажатие кнопки Сменить

procedure FormCreate(Sender: TObject); //создание формы

procedure EditParolKeyPress(Sender: TObject; var Key: Char);

//прослежтвание нажатия Enter

Форма Изменение пароля предназначена для изменения существующего пароля. Форма является модальной и вызывается из формы Ввод пароля. Для смены пароля необходимо ввести старый пароль, новый пароль и его подтверждение. Данные о новом пароле сохраняются в файле par.txt.

Процедуры/функции:

procedure ButtonCancelClick(Sender: TObject); //нажатие кнопки Отмена

procedure ButtonOKClick(Sender: TObject); //Нажатие кнопки OK

procedure ParolKeyPress(Sender: TObject; var Key: Char); //отслеживание нажатия Enter

Форма «Для учителя» предназначена для просмотра результатов выполнения тестов учениками. Она вызывается из формы Ввод пароля. На форму выводится информация о ученике( фамилия, имя, порядковый номер) и следующие данные для каждого вопроса:

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

Изменяя значение поля «№» можно осуществлять навигацию по результатам выполнения тестов. Форма заполняется из секции с порядковым номером ученика файла base.ini. Она вызывается из формы Ввод пароля.

Процедуры/функции:

procedure FormCreate(Sender: TObject); //созжание формы

procedure Zapolnenie(Nomer:integer); //запонение результатов

procedure ReadSectionBool(SectionName, ParamName: string; var ParamValue : boolean);
//чтение параметра ParamValue типа boolean из ParamName секции SectionName файла base. ini

procedure ReadSectionInt(SectionName, ParamName: string; var ParamValue : integer); //чтение параметра ParamValue типа integer из ParamName секции SectionName файла base. ini

procedure ReadSectionStr(SectionName, ParamName: string; var ParamValue : string); //чтение параметра ParamValue типа string из ParamName секции SectionName файла base. ini

procedure ButtonCaption(NButton:integer; pravOtv:string; var BCapion:string); //нахождение правильного ответа на определённый тест

procedure ReadIni; //чтение из файла base. ini количетва секций

function ZapSearch( direct: TUpDownDirection; var nomer:integer): boolean;
//поиск записи об ученике с определённым именем и/или фамилией

function UpDownNumb(n, max : Integer; direct:TUpDownDirection) : Integer;
//переход по записям (для поиска)

procedure ButtonSrchFClick(Sender: TObject); //нажатие кнопки Поиск вперёд

procedure ButtonSrchBClick(Sender: TObject); //нажатие кнопки Поиск назад

procedure EditNChange(Sender: TObject); //изменение порядкового номера

procedure BitBtnExitClick(Sender: TObject); //нажатие на кнопку Выход

Форма «Результат» предназначена для просмотра учеником окончательных результатов выполнения. Форма вызывается из главной формы после выполнения 10 тестов.

Процедуры/функции:

procedure FormCreate(Sender: TObject); //создание формы

procedure ButtonExitClick(Sender: TObject); //нажатие на кнопку Выход

Хранение данных

Для хранения пароля предназначен файл par.txt. Файл ДОЛЖЕН быть расположен в том же каталоге, где и программа.

Для работы программы необходим конфигурационный файл base.ini. Он должен быть расположен в том же каталоге, где и программа. Если файл не найден, то создаётся новый файл. Этот файл имеет следующую структуру:

    название секции (в [квадратных] скобках), название параметров в данной секции значении параметров (через «=»).

Пример:
[название секции1]

Параметр1=значение1

Параметр2=значение2

Файл имеет следующие секции: Global и секции с порядковыми номерами учеников. Секция Global содержит параметр LastNumb (integer), который определяет максимальный номер секции с порядковым номером ученика.

Секции с порядковым номером ученика содержит следующие параметры:

    Name – имя ученика (string) Familyname – фамилия ученика­ (string) identoficatorN – первая переменная для составления условий (integer) identoficatorM – вторая переменная для составления условий (integer) question1 – результат выполнения учеником теста №1 (Boolean) question1_otvetUchenika_knopka – номер варианта ответа ученика на вопрос №1 (integer) question2 – результат выполнения учеником теста №2 (Boolean) question2_otvetUchenika_knopka – номер варианта ответа ученика на вопрос №2 (integer) question3 – результат выполнения учеником теста №3 (Boolean) question3_otvetUchenika_edit – ответ ученика на вопрос №3 (String) question4 – результат выполнения учеником теста №4 (Boolean) question4_otvetUchenika_knopka – номер варианта ответа ученика на вопрос №4 (integer) question5 – результат выполнения учеником теста №5 (Boolean) question5_otvetUchenika_edit – ответ ученика на вопрос №5 (String) question6 – результат выполнения учеником теста №6 (Boolean) question6_otvetUchenika_knopka – номер варианта ответа ученика на вопрос №6 (integer) question7 – результат выполнения учеником теста №7 (Boolean) question7_otvetUchenika_edit – ответ ученика на вопрос №7 (String) question8 – результат выполнения учеником теста №8 (Boolean) question8_otvetUchenika_knopka – номер варианта ответа ученика на вопрос №8 (integer) question9 – результат выполнения учеником теста №9 (Boolean) question9_otvetUchenika_edit – ответ ученика на вопрос №9 (String) question10 – результат выполнения учеником теста №10 (Boolean) question10_otvetUchenika_edit – ответ ученика на вопрос №10 (String) mark – оценка ученика (integer)

Некоторые результаты могут отсутствовать, это значит, что ученик не стал заканчивать выполнение теста.

Листинг программы

Текст модуля FormMatht_Tester. pas

unit mainForm;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons;

type

TFormMatht_Tester = class(TForm)

Label1: TLabel;

Label2: TLabel;

ButtonBegin: TButton;

ButtonClose: TButton;

GroupBoxResult: TGroupBox;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

EditNum: TEdit;

EditTestOk: TEdit;

EditTestAll: TEdit;

Label6: TLabel;

livess: TEdit;

ForTeacher: TButton;

GroupBoxTask: TGroupBox;

TheTask: TLabel;

procedure ButtonBeginClick(Sender: TObject); //нажатие на кнопку Начать

procedure ButtonCloseClick(Sender: TObject); //нажатие на кнопку Выход

procedure Test; //процедура заполнения панели Результаты

procedure ForTeacherClick(Sender: TObject); //нажатие кнопки Для учителя

procedure FormClose(Sender: TObject; var Action: TCloseAction); //закрытие формы

private

{ Private declarations }

public

{ Public declarations }

end;

const quest='question';

VsegoLives=3;

var

FormMatht_Tester: TFormMatht_Tester;

identificatorN,

identificatorM,

questionNumber :integer;

NumTest : Integer = 0;

lives:integer;

vipolneno : Integer = 0;

testOk : boolean = false;

difficulty:integer;

PeredachaVsego:string;

NeUspel:integer;

Numb : Integer;

// filepar:text;

Fsearch:boolean = false;

implementation

uses registr, Test, Results, ForTeacher, password;

{$R *.DFM}

procedure TFormMatht_Tester. ButtonBeginClick(Sender: TObject);

{var s:string;

CurTime : TDateTime;

//f: Integer; }

begin

if (NumTest=0)or(NumTest=11) then begin

if NumTest=0 then begin

lives:=VsegoLives;

FormRegistr := TFormRegistr. Create(Self);

if (FormRegistr. ShowModal <> mrOK ) then begin

FormRegistr. Close;

//CurTime := now;

//s:=DateTimetostr(CurTime) ;

//FormRegistr. writesectionstr(inttostr(Numb) ,'beginTime',DateTimeToStr(now));

//break;

end else begin

FormRegistr. Close;

//CurTime := now;

//s:=Datetostr(CurTime) ;

FormRegistr. writesectionstr(inttostr(Numb) ,'beginTime',DateTimeToStr(now));

//break;

GroupBoxResult. visible:=true;

GroupBoxTask. visible:=true;

forTeacher. visible:=false;

inc(NumTest);

EditNum. text:= intToStr(NumTest);

ButtonBegin. Caption:='Дальше';

end;

end{if 0} else begin

FormRegistr. writesectionstr(inttostr(Numb) ,'EndTime',DateTimeToStr(now));

peredachaVsego:=editTestOK. text;

NeUspel:=vsegoLives-lives;

FormResults := TFormresults. Create(Self);

//if (FormRegistr. ShowModal <> mrOK ) then begin

FormResults. ShowModal;

//FormRegistr. Close;

close;

{конец}

end;{else = 0}

end{if=0,10)} else begin

if lives> 0 then begin

test; {начало следущего теста}

livess. text:=IntToStr(lives);

end else

Application. MessageBox('у Вани не остолось жизней', 'бедный Ваня', MB_OK) ;

end;{else = 0,10}

end;

procedure TFormMatht_Tester. ButtonCloseClick(Sender: TObject);

begin

Close;

end;

procedure TFormMatht_Tester. Test;

begin

if lives>=0 then begin

FormQ1 := TFormQ1.Create(Self);

formQ1.showmodal;

//if FormQ1.{ShowModal}modalresult =mrok then

//begin

if testOk=true then begin

editTestOK. text:=IntToStr(StrToInt(editTestOK. text) + 1);

testOk:=false;

end;

//inc(vipolneno)

//EditTestOk. text:=IntToStr(vipolneno);

//end;

FormQ1.Close;

inc(numTest);

EditNum. text:= intToStr(NumTest-1);

livess. text:=IntToStr(lives);

end;

end;

procedure TFormMatht_Tester. ForTeacherClick(Sender: TObject);

begin

FormPassword := TFormPassword. Create(Self);

FormPassword. ShowModal;

//TeacherParol. Close;

end;

procedure TFormMatht_Tester. FormClose(Sender: TObject;

var Action: TCloseAction);

begin

if GroupBoxResult. visible=true then begin

case strtoint(EditTestOk. text) of

10: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 5);

end;{10}

9: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 5);

end;{9}

8: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 4);

end;{8}

7: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 4);

end;{7}

6: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 3);

end;{6}

5: begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 3);

end;{5}

else begin

FormRegistr. writesectionInt(IntToStr(Numb),'mark', 2);

end;{else}

end;{case}

NeUspel:=vsegoLives-lives;

FormRegistr. writesectionInt(IntToStr(Numb),'NeUspel', NeUspel);

end;

end;

end.

Текст модуля ChangePassword. pas

unit ChangePassword;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, password, MD5;

type

TFormChangePassword = class(TForm)

Label1: TLabel;

OldParol: TEdit;

Label2: TLabel;

NewParol: TEdit;

ButtonOK: TButton;

Label3: TLabel;

NewParol2: TEdit;

ButtonCancel: TButton;

procedure ButtonCancelClick(Sender: TObject); //нажатие кнопки Отмена

procedure ButtonOKClick(Sender: TObject); //Нажатие кнопки OK

function HashPassword(const Password: string{; const LevelAccess: Byte}): string;

procedure ParolKeyPress(Sender: TObject; var Key: Char); //Отслеживание нажатия Enter

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormChangePassword: TFormChangePassword;

implementation

{$R *.DFM}

procedure TFormChangePassword. ButtonCancelClick(Sender: TObject);

begin

close;

end;

procedure TFormChangePassword. ButtonOKClick(Sender: TObject);

var

filepar : TextFile;

begin

if password. parol=HashPassword(oldParol. text) then begin

if NewParol. text=NewParol2.text then begin

password. parol:=HashPassword(NewParol. text);

assignfile(filepar, getcurrentdir+'\par. txt');

rewrite(filepar);

writeln(filepar, HashPassword(newparol. text));

closefile(filepar);

end else

Application. MessageBox('Введённые пароли не сходятся', 'ERROR', IDOK);

end else

Application. MessageBox('Неверный пароль', 'ERROR', MB_OK);

close;

end;

function TFormChangePassword. HashPassword(const Password: string{; const LevelAccess: Byte}): string;

var StrForEncrypt: string;

begin

StrForEncrypt:= Password;

//LeftStr(Password, csPasswordLength) + IntToStr(LevelAccess);

Result:= MD5DigestToStr(MD5String(StrForEncrypt));

end;

procedure TFormChangePassword. ParolKeyPress(Sender: TObject;

var Key: Char);

begin

if (Key = #13{VK_RETURN}) then begin

ButtonOK. Click;

end;

end;

end.

Текст модуля ForTeacher. pas

unit ForTeacher;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus, StdCtrls, registr, Buttons, ComCtrls, IniFiles, mainForm, Spin, IniWork,

ExtCtrls;

type

Tteacher = class(TForm)

GroupBox1: TGroupBox;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

Label15: TLabel;

Label16: TLabel;

Label17: TLabel;

Label18: TLabel;

Label19: TLabel;

Result1: TCheckBox;

Result2: TCheckBox;

Result3: TCheckBox;

Result4: TCheckBox;

Result5: TCheckBox;

Result6: TCheckBox;

Result7: TCheckBox;

Result8: TCheckBox;

Result9: TCheckBox;

Result10: TCheckBox;

EditQuestion1: TEdit;

EditQuestion2: TEdit;

EditQuestion3: TEdit;

EditQuestion4: TEdit;

EditQuestion5: TEdit;

EditQuestion6: TEdit;

EditQuestion7: TEdit;

EditQuestion8: TEdit;

EditQuestion9: TEdit;

EditQuestion10: TEdit;

EditOtvUch1: TEdit;

EditOtvUch2: TEdit;

EditOtvUch3: TEdit;

EditOtvUch4: TEdit;

EditOtvUch5: TEdit;

EditOtvUch6: TEdit;

EditOtvUch7: TEdit;

EditOtvUch8: TEdit;

EditOtvUch9: TEdit;

EditOtvUch10: TEdit;

EditPrOtv1: TEdit;

EditPrOtv2: TEdit;

EditPrOtv3: TEdit;

EditPrOtv4: TEdit;

EditPrOtv6: TEdit;

EditPrOtv5: TEdit;

EditPrOtv7: TEdit;

EditPrOtv8: TEdit;

EditPrOtv9: TEdit;

EditPrOtv10: TEdit;

GroupBox2: TGroupBox;

EditFamilyname: TEdit;

EditName: TEdit;

Label20: TLabel;

Label21: TLabel;

Label22: TLabel;

EditN: TSpinEdit;

GroupBox4: TGroupBox;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

ButtonSrchB: TButton;

ButtonSrchF: TButton;

SName: TEdit;

SFamilyname: TEdit;

BitBtnExit: TBitBtn;

GroupBox3: TGroupBox;

Label4: TLabel;

BeginTime: TEdit;

Label23: TLabel;

EndTime: TEdit;

Label24: TLabel;

NeUspel: TEdit;

Label25: TLabel;

LabelMark: TLabel;

procedure FormCreate(Sender: TObject); //созжание формы

procedure Zapolnenie(Nomer:integer); //запонение результатов

procedure ReadSectionBool(SectionName, ParamName: string; var ParamValue : boolean); //чтение параметра ParamValue типа boolean из ParamName секции SectionName файла base. ini

procedure ReadSectionInt(SectionName, ParamName: string; var ParamValue : integer); //чтение параметра ParamValue типа integer из ParamName секции SectionName файла base. ini

procedure ReadSectionStr(SectionName, ParamName: string; var ParamValue : string); //чтение параметра ParamValue типа string из ParamName секции SectionName файла base. ini

procedure ButtonCaption(NButton:integer; pravOtv:string; var BCapion:string); //нахождение правильного ответа на определённый тест

procedure ReadIni; //чтение из файла base. ini количетва секций

function ZapSearch( direct: TUpDownDirection; var nomer:integer): boolean; //поиск записи об ученике с определённым именем и/или фамилией

function UpDownNumb(n, max : Integer; direct:TUpDownDirection) : Integer; //переход по записям (для поиска)

procedure ButtonSrchFClick(Sender: TObject); //нажатие кнопки Поиск вперёд

procedure ButtonSrchBClick(Sender: TObject); //нажатие кнопки Поиск назад

procedure EditNChange(Sender: TObject); //изменение порядкового номера

procedure BitBtnExitClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

teacher: Tteacher;

number, knopka, ch1,ch2,ch3:integer;

s:string;

FileIni:string;

vilet:integer;

implementation

uses Test, password;

{$R *.DFM}

procedure Tteacher. FormCreate(Sender: TObject);

var n:integer;

begin

fileIni:=getcurrentdir+'\base. ini';

readSectionInt('Global','LastNumb', n);

if n<>0 then begin

EditN. maxValue:=n;

EditN. Text:=IntToStr(n);

editN. text:=inttostr(n);

number:=n;

zapolnenie(number);

end else begin

Application. MessageBox('База с учениками пуста', 'Предупреждение', MB_OK) ;

end;

function TTeacher. UpDownNumb(n, max : Integer; direct:TUpDownDirection) : Integer;

begin

if direct= updUp then n:=n+1;

if direct= updDown then n:=n-1;

if n<=0 then n:=max;

if n>max then n:=1;

result := n;

end;

function TTeacher. ZapSearch( direct: TUpDownDirection; var nomer:integer): boolean;

var i:integer;

Name, Familyname{vop2,OtvUch}:string;

begin

result := false;

nomer := UpDownNumb(nomer, EditN. maxValue, direct);

for i:=1 to EditN. maxValue do begin

Name:='<без имени>';

Familyname:='<без фамилии>';

readSectionstr(inttostr(nomer), 'name', Name);

editName. text:=name;

readSectionstr(inttostr(nomer), 'familyname', familyname);

editFamilyname. text:=familyname;

editN. text:=inttostr(nomer);

if ((SName. text='')and(SFamilyname. text=''))or((SFamilyname. text=EditFamilyname. Text)and(SName. text=''))or((SFamilyname. text='')and(SName. text=EditName. Text))or((SFamilyname. text=EditFamilyname. Text)and(SName. text=EditName. Text)) then begin

result := true;//zapolnenie(nomer);

exit;

end else begin

nomer := UpDownNumb(nomer, EditN. maxValue, direct);

end;

end;{for}

end;

procedure Tteacher. Zapolnenie(Nomer:integer);

var Name, Familyname, vop2,OtvUch, StrTemp:string;// = 'без имени';

{QuestionNumber,}otv, identificatorM, identificatorN:integer;

result:boolean;

IntTemp:integer;

begin

readSectionstr(inttostr(nomer), 'name', Name);

editName. text:=name;

readSectionstr(inttostr(nomer), 'familyname', familyname);

editFamilyname. text:=familyname;

identificatorN:=0;

identificatorM:=0;

readSectionInt(inttostr(nomer), 'identoficatorN', identificatorN);

readSectionInt(inttostr(nomer), 'identoficatorM', identificatorM);

BeginTime. text:='не зафиксированно';

readSectionStr(inttostr(nomer), 'BeginTime', StrTemp);

BeginTime. text:=StrTemp;

EndTime. text:='не зафиксированно';

readSectionStr(inttostr(nomer), 'EndTime', StrTemp);

EndTime. text:=StrTemp;

readSectionInt(inttostr(nomer), 'NeUspel', IntTemp);

case IntTemp of

1,0: NeUspel. text:=IntToStr(IntTemp)+' раз';

else NeUspel. text:=IntToStr(IntTemp)+' раза';

end;{case}

result:=false;

readSectionbool(inttostr(nomer), 'question1', result);

Result1.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question2', result);

Result2.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question3', result);

Result3.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question4', result);

Result4.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question5', result);

Result5.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question6', result);

Result6.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question7', result);

Result7.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question8', result);

Result8.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question9', result);

Result9.checked:=result;

result:=false;

readSectionbool(inttostr(nomer), 'question10', result);

Result10.checked:=result;

//1

ch1:=identificatorN;

ch2:=identificatorM;

otv:=ch1 + ch2;

editPrOtv1.text:=inttostr(otv);

vop2:=inttostr(ch1)+'+'+inttostr(ch2);

editQuestion1.text:=vop2;

//1

if result1.Checked=true then begin

EditOtvUch1.text:=EditPrOtv1.text;

end else begin

//OtvUch:='<нет ответа>';

readSectionInt(inttostr(nomer), 'question1_otvetUchenika_knopka', knopka);

ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch1.text:='<нет ответа>'

else EditOtvUch1.text:=OtvUch

end;

//2

ch1:=identificatorN*3+2;

ch2:=identificatorM*4-3;

ch3:=identificatorN+8-identificatorM;

ch1:=abs(ch1);

ch2:=abs(ch2);

ch3:=abs(ch3);

otv:=ch1 - ch2 + ch3;

vop2:=inttostr(ch1)+'-'+inttostr(ch2)+'+'+inttostr(ch3);

editPrOtv2.text:=inttostr(otv);

editQuestion2.text:=vop2;

if result2.Checked=true then begin

EditOtvUch2.text:=EditPrOtv2.text;

end else begin

readSectionInt(inttostr(nomer), 'question2_otvetUchenika_knopka', knopka);

ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch2.text:='<нет ответа>'

else EditOtvUch2.text:=OtvUch;

end;

ch1:=identificatorN*6+10;

ch2:=identificatorM*8-15;

ch1:=abs(ch1);

ch2:=abs(ch2);

otv:=ch1 + ch2;

vop2:=inttostr(ch1)+'+'+inttostr(ch2);

editPrOtv3.text:=inttostr(otv);

editQuestion3.text:=vop2;

if result3.Checked=true then begin

EditOtvUch3.text:=EditPrOtv3.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionStr(inttostr(nomer), 'question3_otvetUchenika_edit', OtvUch);

// ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch3.text:='<нет ответа>'

else EditOtvUch3.text:=OtvUch;

end;

//4

ch1:=identificatorN+1;

ch2:=identificatorM+2;

{ch1:=}FormQ1.umenshenie(ch1,10);

{ch2:=}FormQ1.umenshenie(ch2,10);

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

editPrOtv4.text:=inttostr(otv);

editQuestion4.text:=vop2;

if result4.Checked=true then begin

EditOtvUch4.text:=EditPrOtv4.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionInt(inttostr(nomer), 'question4_otvetUchenika_knopka', knopka);

ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch4.text:='<нет ответа>'

else EditOtvUch4.text:=OtvUch;

end;

//5

ch1:=identificatorN*8+8;

ch2:=identificatorM*3+3;

FormQ1.umenshenie(ch1, 30);

FormQ1.umenshenie(ch2, 10);

while ch1<=10 do ch1:=ch1+5;

while ch2<=3 do ch2:=ch2+3;

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

editPrOtv5.text:=inttostr(otv);

editQuestion5.text:=vop2;

if result5.Checked=true then begin

EditOtvUch5.text:=EditPrOtv5.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionStr(inttostr(nomer), 'question5_otvetUchenika_edit', OtvUch);

// ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch5.text:='<нет ответа>'

else EditOtvUch5.text:=OtvUch;

end;

//6

ch1:=identificatorN*6+6;

ch2:=identificatorM*4+4;

FormQ1.umenshenie(ch1, 30);

FormQ1.umenshenie(ch2, 40);

while ch1<=11 do ch1:=ch1+5;

while ch2<=21 do ch2:=ch2+10;

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

editPrOtv6.text:=inttostr(otv);

editQuestion6.text:=vop2;

if result6.Checked=true then begin

EditOtvUch6.text:=EditPrOtv6.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionInt(inttostr(nomer), 'question6_otvetUchenika_knopka', knopka);

ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch6.text:='<нет ответа>'

else EditOtvUch6.text:=OtvUch;

end;

//7

ch1:=identificatorN*2-3;

ch2:=identificatorM*3+2;

otv:=ch2-ch1;

vop2:=inttostr(ch1)+'+___='+ inttostr(ch2);

editPrOtv7.text:=inttostr(otv);

editQuestion7.text:=vop2;

if result7.Checked=true then begin

EditOtvUch7.text:=EditPrOtv7.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionStr(inttostr(nomer), 'question7_otvetUchenika_edit', OtvUch);

// ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch7.text:='<нет ответа>'

else EditOtvUch7.text:=OtvUch;

end;

//8

ch1:=identificatorN*5-3;

ch2:=identificatorM*9+2;

otv:=ch2*ch1;

vop2:='___/'+inttostr(ch1)+'='+ inttostr(ch2);

editPrOtv8.text:=inttostr(otv);

editQuestion8.text:=vop2;

if result8.Checked=true then begin

EditOtvUch8.text:=EditPrOtv8.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionInt(inttostr(nomer), 'question8_otvetUchenika_knopka', knopka);

ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch8.text:='<нет ответа>'

else EditOtvUch8.text:=OtvUch;

end;

//9

ch1:=identificatorN*4-3;

ch2:=identificatorM*6+2;

FormQ1.umenshenie(ch2, 40);

while ch1<=11 do ch1:=ch1+5;

while ch2<=21 do ch2:=ch2+10;

otv:=ch2*ch1;

vop2:='___/'+inttostr(ch1)+'='+ inttostr(ch2);

editPrOtv9.text:=inttostr(otv);

editQuestion9.text:=vop2;

if result9.Checked=true then begin

EditOtvUch9.text:=EditPrOtv9.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionStr(inttostr(nomer), 'question9_otvetUchenika_edit', OtvUch);

// ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch9.text:='<нет ответа>'

else EditOtvUch9.text:=OtvUch;

end;

//10

ch1:=identificatorN*2+3;

ch2:=identificatorM*3+2;

FormQ1.umenshenie(ch1, ch2);

ch3:=abs(identificatorN*4-identificatorM*5-1);

viborVoprosa:=((identificatorN+identificatorM) mod 2)+1;

case viborVoprosa of

1: begin

s:='Человек вышел из дома и прошёл по прямой дороге '+inttostr(ch1)+' м. Потом он вспомнил, что забыл телефон и начал возвращаться, но пройдя '+inttostr(ch2)+' м, онрешил, что обойдется без него и пошел в другую сторону. Через '+inttostr(ch3)+' м он встретил приятеля. на каком расстояние от дома встретились два друга?';

otv:= ch1-ch2+ch3;

end;{1}

2: begin

s:='Поезд проехал от города Москва до деревни Марьино '+inttostr(ch1)+' км, потом от этой деревни к селу Петрушино '+inttostr(ch2)+' км, и от Села Петрушино до депо '+inttostr(ch3)+' км. Сколько всего проехал поезд?';

otv:=ch1+ch2+ch3;

end;{2}

end;{case}

editQuestion10.hint:=s;

editPrOtv10.text:=inttostr(otv);

editQuestion10.text:='Задача. Подведите мышку для просмотра';

if result10.Checked=true then begin

EditOtvUch10.text:=EditPrOtv10.text;

end

else begin

OtvUch:='<нет ответа>';

readSectionStr(inttostr(nomer), 'question10_otvetUchenika_edit', OtvUch);

// ButtonCaption(knopka, EditPrOtv1.text, {ch1, ch2, }Otvuch );

if OtvUch='' then EditOtvUch10.text:='<нет ответа>'

else EditOtvUch10.text:=OtvUch;

end;

readSectionInt(inttostr(number), 'mark', intTemp);

LabelMark. caption:=inttostr(intTemp);

end;

procedure TTeacher. ReadSectionBool(SectionName, ParamName: string; var ParamValue : boolean);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

ParamValue:=Ini. ReadBool(SectionName, ParamName, false);

Ini. Free;

end;

procedure TTeacher. ReadSectionInt(SectionName, ParamName: string; var ParamValue : integer);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

ParamValue:=Ini. ReadInteger(SectionName, ParamName, 0 );

Ini. Free;

end;

procedure TTeacher. ReadSectionStr(SectionName, ParamName: string; var ParamValue : string);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

ParamValue:=Ini. ReadString(SectionName, ParamName, ParamValue );

Ini. Free;

end;

procedure Tteacher. ButtonCaption(NButton:integer; pravOtv:string; {var ch11,ch22:integer; }var BCapion:string);

begin

case NButton of

1: {if then button1.caption:=inttostr(otv1) else} if inttostr(ch1-ch2)<>pravOtv then BCapion:=inttostr(ch1-ch2)else BCapion:=inttostr(ch1-2-ch2);

2: {if i=prav then button2.caption:=inttostr(otv1) else} if inttostr(ch1+ch2-10)<>pravOtv then BCapion:=inttostr(ch1+ch2-10) else BCapion:=inttostr(ch1+ch2-20);

3: {if i=prav then button3.caption:=inttostr(otv1) else} if inttostr((ch1+ch2)*2)<>PravOtv then BCapion:=inttostr({random(}(ch1+ch2)*2{)}) else BCapion:='не знаю';

4: {if i=prav then button4.caption:=inttostr(otv1) else} BCapion:='нет правильного';

end;{case}

end;

procedure Tteacher. ReadIni;

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Number := Ini. ReadInteger('GLOBAL','LastNumb',0);

end;

{procedure Tteacher. UpDown1ChangingEx(Sender: TObject;

var AllowChange: Boolean; NewValue: Smallint;

Direction: TUpDownDirection);

begin

number:=UpDownNumb(number, EditN. maxValue, Direction);

if ZapSearch(Direction, number)=true then zapolnenie(number)

else Application. MessageBox('Ошибка', 'Ученика с такими данными нет.', MB_OK ) ;

end; }

procedure Tteacher. ButtonSrchFClick(Sender: TObject);

begin

if ZapSearch(updUp, number)=true then zapolnenie(number)

else Application. MessageBox('Ученика с такими данными нет.', 'Ошибка', MB_OK ) ;

end;

procedure Tteacher. ButtonSrchBClick(Sender: TObject);

begin

if ZapSearch(updDown, number)=true then zapolnenie(number)

else Application. MessageBox('Ученика с такими данными нет.', 'Ошибка', MB_OK ) ;

end;

procedure Tteacher. EditNChange(Sender: TObject);

begin

// if EditN. Value=EditN. MaxValue then EditN. Value:=EditN. MinValue;

// if EditN. Value=EditN. MinValue then EditN. Value:=EditN. MaxValue;

number:=EditN. value;

Zapolnenie(number);

end;

procedure Tteacher. BitBtnExitClick(Sender: TObject);

begin

close;

end;

end.

Текст модуля password. pas

unit password;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, mainForm, md5;

type

TFormPassword = class(TForm)

Label1: TLabel;

EditParol: TEdit;

ButtonOK: TButton;

ButtonChange: TButton;

procedure ButtonOKClick(Sender: TObject); //нажатие на кнопку OK

procedure ButtonChangeClick(Sender: TObject); //нажатие кнопки Сменить

procedure FormCreate(Sender: TObject); //создание формы

function HashPassword(const Password: string{; const LevelAccess: Byte}): string;

procedure EditParolKeyPress(Sender: TObject; var Key: Char); //прослежтвание нажатия Enter

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormPassword: TFormPassword;

Parol : string;

implementation

uses ForTeacher, ChangePassword;

{$R *.DFM}

procedure TFormPassword. ButtonOKClick(Sender: TObject);

begin

if parol=HashPassword(editParol. Text) then

begin

close;

Teacher := TTeacher. Create(Self);

Teacher. ShowModal;

Close;

end else

Application. MessageBox('Неверный пароль', 'ERROR', MB_OK);

end;

procedure TFormPassword. ButtonChangeClick(Sender: TObject);

begin

FormChangePassword := TFormChangePassword. Create(Self);

FormChangePassword. ShowModal;

end;

procedure TFormPassword. FormCreate(Sender: TObject);

var

filepar : TextFile;

//ok : boolean;

begin

assignfile(filepar, getcurrentdir+'\par. txt');

//ok:=true;

try

reset(filepar);

read(filepar, parol);

closefile(filepar);

except begin

Application. MessageBox('Внимание, файл пароля не найден. Обратитесь к руководству оператора.', 'ОШИБКА!!!', MB_OK) ;

parol:=HashPassword('123');

//end;ok:=false;

end;

end;

end;

function TFormPassword. HashPassword(const Password: string{; const LevelAccess: Byte}): string;

var StrForEncrypt: string;

begin

StrForEncrypt:= Password;

//LeftStr(Password, csPasswordLength) + IntToStr(LevelAccess);

Result:= MD5DigestToStr(MD5String(StrForEncrypt));

end;

procedure TFormPassword. EditParolKeyPress(Sender: TObject; var Key: Char);

begin

if (Key = #13{VK_RETURN}) then begin

ButtonOK. Click;

end;

end;

end.

Текст модуля registr. pas

unit registr;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, Db, DBTables, IniFiles, mainForm, ExtCtrls;

type

TFormRegistr = class(TForm)

Label1: TLabel;

GroupBox1: TGroupBox;

Label2: TLabel;

Label4: TLabel;

name_m: TEdit;

familyname_m: TEdit;

Panel1: TPanel;

BitBtnOK: TButton;

procedure BitBtnOKClick(Sender: TObject); //нажатие на кнопку OK

procedure readIni(); //чтение из файла base. ini количетва секций

procedure writeIni(Section : String); //запись нового количества секций в файл base. ini

procedure WriteSectionBool(SectionName, ParamName: string; ParamValue : boolean); //запись параметра ParamName в секцию SectionName со значением ParamValue типа boolean

procedure FormCreate(Sender: TObject); //создание формы

procedure name_mKeyPress(Sender: TObject; var Key: Char); //изменение поля для ввода имени ученика

procedure WriteSectionInt(SectionName, ParamName: string; ParamValue : integer); //запись параметра ParamName в секцию SectionName со значением ParamValue типа integer

procedure WriteSectionstr(SectionName, ParamName: string; ParamValue : string); //запись параметра ParamName в секцию SectionName со значением ParamValue типа string

private

{ Private declarations }

public

{ Public declarations }

end;

const

iniName='Name';

iniFamilyname='Familyname';

IniGlobal='Global';

iniIdentificatorN='identoficatorN';

iniIdentificatorM='identoficatorM';

IniLastNumb='LastNumb';

var

FormRegistr : TFormRegistr;

st_name, st_familyname : string;

// Numb : Integer;

FileIni : String;

implementation

uses Test;

{$R *.DFM}

procedure TFormRegistr. BitBtnOKClick(Sender: TObject);

var s: String;

begin

// ModalResult := mrOK; //readIni();

if (name_m. text<>'') and (familyname_m. text<>'') then begin

st_name := name_m. text;

st_familyname :=familyname_m. text;

Inc(Numb);

s:= IntToStr(Numb) ;

writeIni( s );

{FormRegistr.}ModalResult := mrOK;

//FormRegistr. Close;

//FormQ1 := TFormQ1.Create(Self);//Form2.close;

end else

Application. MessageBox('Пожалуйста, введите свои данные', 'Нет данных', MB_OK) ;

end;

{procedure TFormRegistr. FormShow(Sender: TObject);

begin

// ScaleBy(Width, 162);

end;

}

procedure TFormRegistr. ReadIni;

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Numb := Ini. ReadInteger('GLOBAL','LastNumb',0);

end;

procedure TFormRegistr. WriteIni(Section : string);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Ini. WriteInteger(iniGLOBAL,'LastNumb',Numb);

Ini. writeString(Section, iniName, st_name);

Ini. writeString(Section, iniFamilyname, st_familyname);

Ini. writeInteger(Section, IniIdentificatorN, identificatorN);

Ini. writeInteger(Section, IniIdentificatorM, identificatorM);

Ini. Free;

end;

procedure TFormRegistr. WriteSectionBool(SectionName, ParamName: string; ParamValue : boolean);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Ini. WriteBool(SectionName, ParamName, ParamValue);

Ini. Free;

end;

procedure TFormRegistr. WriteSectionStr(SectionName, ParamName: string; ParamValue : string);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Ini. Writestring(SectionName, ParamName, ParamValue);

Ini. Free;

end;

procedure TFormRegistr. WriteSectionInt(SectionName, ParamName: string; ParamValue : integer);

var

Ini: TIniFile;

begin

Ini := TIniFile. Create(FileIni);

Ini. WriteInteger(SectionName, ParamName, ParamValue);

Ini. Free;

end;

procedure TFormRegistr. FormCreate(Sender: TObject);

var s: String;

begin

difficulty:=10;

randomize;

identificatorN:=random(difficulty);

identificatorM:=random(difficulty);

s:= GetCurrentDir;

s:= s + '\base. ini';

FileIni := s ;

readIni();

end;

procedure TFormRegistr. name_mKeyPress(Sender: TObject; var Key: Char);

begin

if (Key = #13{VK_RETURN}) then begin

BitBtnOK. Click;

end;

end;

end.

Текст модуля Results. pas

unit Results;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, mainForm, registr;

type

TFormResults = class(TForm)

GroupBoxResult: TGroupBox;

LabelOKTest: TLabel;

LabelAllTest: TLabel;

LabelLivess: TLabel;

EditTestOk: TEdit;

EditTestAll: TEdit;

livess: TEdit;

Label1: TLabel;

LabelRes: TLabel;

LabelMark: TLabel;

ButtonExit: TButton;

procedure FormCreate(Sender: TObject); //создание формы

procedure ButtonExitClick(Sender: TObject); //нажатие на кнопку Выход

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormResults: TFormResults;

implementation

{$R *.DFM}

procedure TFormResults. FormCreate(Sender: TObject);

begin

editTestOK. text:=peredachaVsego;

livess. text:=inttostr(NeUspel);

case strtoint(peredachaVsego) of

10: begin

labelMark. caption:='5';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 5);

end;{10}

9: begin

labelMark. caption:='5';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 5);

end;{9}

8: begin

labelMark. caption:='4';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 4);

end;{8}

7: begin

labelMark. caption:='4';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 4);

end;{7}

6: begin

labelMark. caption:='3';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 3);

end;{6}

5: begin

labelMark. caption:='3';

// FormRegistr. writesectionInt(IntToStr(Numb),'mark', 3);

end;{5}

else begin

labelMark. caption:='2';

end;{else}

end;{case}

FormRegistr. writesectionInt(IntToStr(Numb),'NeUspel', NeUspel);

FormRegistr. writesectionInt(IntToStr(Numb),'mark', strtoint(labelMark. caption));

end;

procedure TFormResults. ButtonExitClick(Sender: TObject);

begin

close;

end;

end.

Текст модуля Test. pas

unit Test;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, mainForm, registr, IniFiles, ExtCtrls, jpeg;

const

to_door=380;

type

TFormQ1 = class(TForm)

Label1: TLabel;

TimerMonstr: TTimer;

TimerMan: TTimer;

GroupBox2: TGroupBox;

man: TImage;

monstr: TImage;

door: TImage;

GroupBox1: TGroupBox;

Label2: TLabel;

question: TLabel;

udar: TImage;

timerEnd: TTimer;

udar2: TImage;

blood: TImage;

proigral: TLabel;

live: TLabel;

Label3: TLabel;

man_stoy: TImage;

GBotvetButton: TGroupBox;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

GBotvetEdit: TGroupBox;

editOtvet: TEdit;

ButtonOK: TButton;

Label4: TLabel;

procedure FormCreate(Sender: TObject); //создание формы

procedure Button1Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №1

procedure Button2Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №2

procedure Button3Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №3

procedure Button4Click(Sender: TObject); //нажатие на кнопку с вариантом ответа №4

procedure TimerMonstrTimer(Sender: TObject); //перемещение картинки с монстром

procedure TimerManTimer(Sender: TObject); //перемещение картинки с Ваней

procedure resultTest1(ButttonNum:integer); //проверка на правильный ответ, если даны варианты ответов

procedure timerEndTimer(Sender: TObject); //"кровавая сцена"

procedure otv_but(otv1:integer); //заполнение вариантов ответов

procedure resultTestEdit (otvet:integer); //проверка на правильный ответ, если не было дано вариантов ответов

procedure ButtonOKClick(Sender: TObject); //ввод ответа, если не было дано вариантов ответов

procedure editOtvetKeyPress(Sender: TObject; var Key: Char); //изменения поля для ввода ответа

procedure umenshenie(var n:integer; NeBolshe :integer); //уменьшение числа n (integer) до числа NeBolshe (integer)

procedure FormClose(Sender: TObject; var Action: TCloseAction); //закрытие формы

// procedure WriteSectionBool(SectionName, ParamName: string; ParamValue : boolean);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormQ1: TFormQ1;

vop2,vop1:string;

ch1,ch2,ch3,otv:integer; {составляющие вопроса и ответ}

prav, i{выбор кнопки с правильным ответом},

deystvie, viborVoprosa{в 10 тесте}:integer;

implementation

uses Results;

{$R *.DFM}

procedure TFormQ1.otv_but(otv1:integer);

var

i:integer;

begin

randomize;

prav:=1+random(4);

for i:=1 to 4 do

case i of

1: if i=prav then button1.caption:=inttostr(otv1) else if ch1-ch2<>otv1 then button1.caption:=inttostr(ch1-ch2)else button1.caption:=inttostr(ch1-2-ch2);

2: if i=prav then button2.caption:=inttostr(otv1) else if ch1+ch2-10<>otv1 then button2.caption:=inttostr(ch1+ch2-10) else button2.caption:=inttostr(ch1+ch2-20);

3: if i=prav then button3.caption:=inttostr(otv1) else if (ch1+ch2)*2<>otv1 then button3.caption:=inttostr(random((ch1+ch2)*2)) else button3.caption:='не знаю';

4: {if i=prav then button4.caption:=inttostr(otv1) else} button4.caption:='нет правильного';

end;{case}

end;

procedure TFormQ1.umenshenie(var n:integer; NeBolshe :integer);

begin

while n>NeBolshe do n:=n-NeBolshe;

// umenshenie:=n;

end;

procedure TFormQ1.FormCreate(Sender: TObject);

begin

questionNumber:=NumTest;

label1.caption:='Тест '+IntToStr(numtest);

case numtest of

1: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. interval:=100;

ch1:=identificatorN;

ch2:=identificatorM;

otv:=ch1 + ch2;

vop2:=inttostr(ch1)+'+'+inttostr(ch2);

otv_but(otv);

end;{1}

2: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. interval:=150;

ch1:=identificatorN*3+2;

ch2:=identificatorM*4-3;

ch3:=identificatorN+8-identificatorM;

ch1:=abs(ch1);

ch2:=abs(ch2);

ch3:=abs(ch3);

otv:=ch1 - ch2 + ch3;

vop2:=inttostr(ch1)+'-'+inttostr(ch2)+'+'+inttostr(ch3);

otv_but(otv);

end;{2}

3: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. interval:=200;

ch1:=identificatorN*6+10;

ch2:=identificatorM*8-15;

ch1:=abs(ch1);

ch2:=abs(ch2);

otv:=ch1 + ch2;

vop2:=inttostr(ch1)+'+'+inttostr(ch2);

GBotvetButton. visible:=false;

GBotvetEdit. visible:=true;

end;{3}

4: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. interval:=300;

ch1:=identificatorN+1;

ch2:=identificatorM+2;

{ch1:=}umenshenie(ch1,10);

{ch2:=}umenshenie(ch2,10);

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

GBotvetButton. visible:=true;

GBotvetEdit. visible:=false;

otv_but(otv);

end;{4}

5: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. Interval:=500;

ch1:=identificatorN*8+8;

ch2:=identificatorM*3+3;

umenshenie(ch1, 30);

umenshenie(ch2, 10);

while ch1<=10 do ch1:=ch1+5;

while ch2<=3 do ch2:=ch2+3;

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

GBotvetButton. visible:=false;

GBotvetEdit. visible:=true;

end;{5}

6: begin

vop1:='посчитайте значение выражения: ';

TimerMonstr. interval:=1000;

ch1:=identificatorN*6+6;

ch2:=identificatorM*4+4;

umenshenie(ch1, 30);

umenshenie(ch2, 40);

while ch1<=11 do ch1:=ch1+5;

while ch2<=21 do ch2:=ch2+10;

otv:=ch1*ch2;

vop2:=inttostr(ch1)+'*'+inttostr(ch2);

GBotvetButton. visible:=true;

GBotvetEdit. visible:=false;

otv_but(otv);

end;{6}

7: begin

vop1:='Какое число должно быть на месте пробела? ';

TimerMonstr. Interval:=500;

ch1:=identificatorN*2-3;

ch2:=identificatorM*3+2;

otv:=ch2-ch1;

vop2:=inttostr(ch1)+'+___='+ inttostr(ch2);

GBotvetButton. visible:=false;

GBotvetEdit. visible:=true;

end;{7}

8: begin

vop1:='Какое число должно быть на месте пробела? ';

TimerMonstr. Interval:=900;

ch1:=identificatorN*5-3;

ch2:=identificatorM*9+2;

otv:=ch2*ch1;

vop2:='___/'+inttostr(ch1)+'='+ inttostr(ch2);

GBotvetButton. visible:=true;

GBotvetEdit. visible:=false;

otv_but(otv);

end;{8}

9: begin

vop1:='Какое число должно быть на месте пробела? ';

TimerMonstr. Interval:=1500;

ch1:=identificatorN*4-3;

ch2:=identificatorM*6+2;

umenshenie(ch2, 40);

while ch1<=11 do ch1:=ch1+5;

while ch2<=21 do ch2:=ch2+10;

otv:=ch2*ch1;

vop2:='___/'+inttostr(ch1)+'='+ inttostr(ch2);

GBotvetButton. visible:=false;

GBotvetEdit. visible:=true;

end;{9}

10: begin

vop1:='Решите задачу';

TimerMonstr. interval:=2000;

ch1:=identificatorN*2+3;

ch2:=identificatorM*3+2;

umenshenie(ch2, ch1);

ch3:=abs(identificatorN*4-identificatorM*5-1);

vop2:='';

label4.Visible:=true;

//randomize;

viborVoprosa:=((identificatorN+identificatorM) mod 2)+1;//1+random(2);

case viborVoprosa of

1: begin

label4.caption:='Человек вышел из дома и прошёл по прямой дороге '+inttostr(ch1)+' м. Потом он вспомнил, что забыл телефон и начал возвращаться, но пройдя '+inttostr(ch2)+' м, онрешил, что обойдется без него и пошел в другую сторону. Через '+inttostr(ch3)+' м он встретил приятеля. на каком расстояние от дома встретились два друга?';

otv:= ch1-ch2+ch3;

end;{1}

2: begin

label4.caption:='Поезд проехал от города Москва до деревни Марьино '+inttostr(ch1)+' км, потом от этой деревни к селу Петрушино '+inttostr(ch2)+' км, и от Села Петрушино до депо '+inttostr(ch3)+' км. Сколько всего проехал поезд?';

otv:=ch1+ch2+ch3;

end;{2}

end;{case}

GBotvetButton. visible:=false;

GBotvetEdit. visible:=true;

end;{10}

end;{case}

question. caption:=vop1+ vop2;

end;

procedure TFormQ1.Button1Click(Sender: TObject);

begin

ResultTest1(1);

end;

procedure TFormQ1.Button2Click(Sender: TObject);

begin

ResultTest1(2);

end;

procedure TFormQ1.Button3Click(Sender: TObject);

begin

ResultTest1(3);

end;

procedure TFormQ1.Button4Click(Sender: TObject);

begin

ResultTest1(4);

end;

procedure TFormQ1.TimerMonstrTimer(Sender: TObject);

begin

if monstr. Left<=to_door then begin

monstr. left:=monstr. left+10;

end else begin

TimerMonstr. enabled:=false;

monstr. visible:=false;

man_stoy. visible:=false;

udar. visible:=true;

timerEnd. Enabled:=true;

deystvie:=1;

end;

end;

procedure TFormQ1.TimerManTimer(Sender: TObject);

begin

if man. Left<=to_door then begin

man. left:=man. left+10;

end else begin

man. visible:=false;

man_stoy. visible:=true;

TimerMan. enabled:=false;

monstr. visible:=true;

TimerMonstr. enabled:=true;

end;

end;

procedure TFormQ1.resultTest1(ButttonNum:integer);

var s : string;

//Ini: TIniFile;

begin

s:= quest+inttostr(questionNumber) ;

if prav=ButttonNum then begin

testOk:=true;

FormRegistr. WriteSectionBool(IntToStr(Numb), s, true);

end else

FormRegistr. WriteSectionBool(IntToStr(Numb), s, false);

FormRegistr. WriteSectionInt(IntToStr(Numb), s+'_otvetUchenika_knopka' ,ButttonNum );

ModalResult:=mrOK;

close;

end;

procedure TFormQ1.timerEndTimer(Sender: TObject);

begin

case deystvie of

1: begin

lives:=lives-1;

udar. visible:= false;

udar2.visible:=true;

end;{1}

2: begin

udar2.visible:=false;

blood. visible:=true;

end;{2}

3: begin

formQ1.color:=clred;

end;{5}

4: begin

proigral. visible:=true;

end;{3}

5: begin

case lives of

0: begin

live. caption:='У Вани не остолось жизней'

end;{0}

1: begin

live. caption:='У Вани осталось '+IntToStr(lives)+' жизнь'

end;{1}

else live. caption:='У Вани осталось '+IntToStr(lives)+' жизни'

end;{case lives}

live. visible:=true;

end;{4}

6: begin

end;{6}

7: begin

close

end;{7}

else begin

timerEnd. enabled:=false;

//Application. MessageBox('ERROR Timer3', 'Ошибка', IDOK ) ;

end;

end;{case}

inc(deystvie);

end;

procedure TFormQ1.resultTestEdit(otvet:integer);

var s : string;

begin

s:= quest+inttostr(questionNumber) ;

if editOtvet. text=inttostr(otvet) then begin

FormRegistr. WriteSectionBool(IntToStr(Numb), s, true);

ModalResult:=mrOK;

testOk:=true;

end

else FormRegistr. WriteSectionBool(IntToStr(Numb), s, false);

FormRegistr. WriteSectionStr(IntToStr(Numb), s+'_otvetUchenika_edit' ,editOtvet. text );

ModalResult:=mrOK;

close;

end;

procedure TFormQ1.ButtonOKClick(Sender: TObject);

begin

resultTestEdit(otv);

end;

procedure TFormQ1.editOtvetKeyPress(Sender: TObject; var Key: Char);

begin

if (Key = #13{VK_RETURN}) then begin

ButtonOK. Click;

end;

end;

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

begin

TimerMonstr. enabled:=false;

TimerMan. enabled:=false;

timerEnd. enabled:=false;

end;

end.


Описание размещения

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

Требования к программным и аппаратным средствам

Минимальные системные требования:

    Компьютер совместимый с IBM/PC; Память не менее 64 Мб.

На компьютере должна быть установлена операционная система:

    Windows95/98/ME/NT/2000/XP; Свободное дисковое пространство:

Þ  для установки программы – 1000 Кб

Þ  на 1 тест – 0.3Кб