Программа
«Математический тестер»
Руководство программиста
Автор:
Руководитель:
Санкт Петербург 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Кб


