Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 17 .Экзаменатор

Усовершенствуйте программу Экзаменатор так, чтобы она запрашивала имя тестируемого и сохраняла результат тестирования в файле. Для ввода имени тестируемого используйте стандартное окно ввода, которое выводит функция inputBox. (Рис. 77, 78)

Рис 77

Рис 78

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

Листинг

published: TLabel *Labell; // информационное сообщение, вопрос Tlmage *Image1; // иллюстрация к вопросу TButton *Buttonl; // кнопка OK / Дальше void fastcall FormActivate(TObject *Sender); void fastcall ButtonlClick(TObject * Sender),

private: // варианты ответа - радиокнопки выбора TRadioButton *RadioButton[4]; // щелчок на кнопке выбора ответа void fastcall RadioButtonClick(TObject *Sender); void fastcall ShowVopros(TVopros v); // выводит вопрос void fastcall EraseVopros(void); // удаляет вопрос

public: fastcall TForml(TComponent* Owner);

// *** модульформы *** #include <stdio.h> // длядоступакфункции sscanf iinclude <jpeg.hpp> // обеспечиваетработус // jpg-иллюстрациями

#pragma package(smart_init) #pragma resource "*.dfm"

Игры и другие полезные программы 223

TForml *Forml; // форма

int f; // дескриптор файла теста // имя файла теста берем из командной строки

int level[4]; // кол-во правильных ответов, необходимое // для достижения уровня AnsiString mes[4];// сообщение о достижении уровня

TVopros Vopros; // вопрос int otv; // номер выбранного ответа

int right =0; // кол-во правильных ответов i

// функции, обеспечивающие чтение вопроса из файла теста int Getlnt(int f); // читает целое int GetStringfint f, AnsiString *st); // читает строку

// конструктор fastcall TForml::TForml(ТСomponent* Owner) : TForm(Owner) { int i; int left = 10;

// создадимрадиокнопкидлявыбора // правильногоответа, носделаемихневидимыми tor (i = 0; i < 4; i++ ) { // создадимрадиокнопку RadioButton[i] = new TRadioButton(Forml); // установимзначениясвойств RadioButton[i]->Parent = Forml; RadioButton[i]->Left = left; RadioButton[i]->Width = Forml->

224 Часть 1. Примерыизадачи

ClientWidth - left - 20; RadioButton[i]->Visible = false; RadioButton[i]->Checked = false:

// зададимфункциюобработкисобытия Click RadioButton[i]->OnClick = RadioButtonClick;

void fastcall TForml::FormActivate(TObject *Sender)

{

AnsiString st;

// имяфайлатестадолжнобытьуказановкоманднойстроке int n = ParamCount(); if ( n < 1 ) { Labell->Font->Style = TFontStyles()« fsBold; Labell->Caption = "Вкоманднойстрокезапуска" "программынадозадатьимяфайлатеста"; Buttonl->Tag = 2; return; N

// открытьфайлтеста f = FileOpen(ParamStr(1), fmOpenRead); if ( f == -1 ) { Labell->Font->Style = TFontStyles()« fsBold; Labell->Caption = "Ошибкадоступакфайлутеста" + ParamStr(1); Buttonl->Tag = 2; return;

Игры и другие полезные программы 225

// вывести информацию о тесте GetString(f, &st); // прочитать название теста Forml->Caption = st;

GetString(f, &st); // прочитать вводную информацию Labell->Width = Forml->ClientWidth - Labell->Left -20; Labell->Caption = st; Labell->AutoSize = true,

// прочитать информацию об уровнях оценки for (int i=0; i<4; i

level[i] = Getlnt(f); GetString(f, &mes[i]);

// читает из файла очередной вопрос bool GetVopros(TVopros *v)

{

AnsiString st; int p; // если р=1, то к вопросу есть иллюстрация

if ( GetString(f, &(v->Vopr)) != 0 )

{

/* прочитать кол-во вариантов ответа, номер правильного ответа и признак наличия иллюстрации */ v->nOtv = Getlnt(f); v->rOtv = Getlnt(f); p = Getlnt(f);

if (p) //к вопросу есть иллюстрация GetString(f,&(v->Img) );

226 Часть 1. Примеры и задачи

else v->Img = "";

// читаемвариантыответа for (int i = 0; i < v->nOtv; i { GetStringff,&(v->0tv[i]) } return true;

} else return false;

// выводитвопрос void fastcall TForml::ShowVopros(TVopros v) { int top; int i;

// вопрос Labell->Width = ClientWidth - Labell->Le£t -20;

Labell->Caption = v.Vopr;

Labell->AutoSize = true;

if (v.Img != "") //квопросуестьиллюстрация I /* определимвысотуобласти, которуюможноиспользоватьдлявыводаиллюстрации */ int RegHeight = Buttonl->Top - (Labell->Top + Labell->Height +10) - (RadioButton[l]->Height + 10) * v.nOtv;

Imagel->Top = Labell->Top + Labell->Height + 10; // загрузим картинку и определим ее размер

Игры и другие полезные программы 227

Imagel->Visible = false; Imagel->AutoSize = true; Imagel->Picture->LoadFromFile(v.Img); if (Imagel->Height > RegHeight) // картинкане // помещается { Imagel->AutoSize = false; Imagel->Height = RegHeight; Imagel->Proportional = true; } Imagel->Visible = true; // положениеполейотсчитываемотиллюстрации top = Imagel->Top + Imagel->Height + 10;

} else // положение полей отсчитываем от вопроса top = Labell->Top + Labell->Height + 10;

// вариантыответа for (i = 0; i < v.nOtv; i++)

{

RadioButton[i]->Top = top; RadioButton[i]->Caption = v.0tv[i]; RadioButton[i]->Visible = true; RadioButton[i]->Checked = false; top += 20;

// щелчокнарадиокнопокевыбораответа void fastcall TForml::RadioButtonClick(TObject *Sender) { int i =0; while ( ! RadioButton[i]->Checked )

228 Часть 1. Примерыизадачи

otv = i+1; // ответвыбран, сделаемдоступнойкнопкуДальше Buttonl->Enabled = true;

// удаляетвопроссэкрана void fastoall TForml::EraseVopros(void)

{

Imagel->Visible = false,- // скрыть поле вывода иллюстрации // скрыть поля выбора ответа for (int i = 0; i <4; i

RadioButton[i]->Visible = falseRadioButton[i]->Checked = false;

} // сделать недоступной кнопку Дальше Buttonl->Enabled = false;

// щелчок на кнопке ОК/Дальше/ОК void fastcall TForml::ButtonlClick(TObject *Sender) { bool ok; // рез-т чтения из файла очередного вопроса

switch (Buttonl->Tag) {

case 0: // щелчок на кнопке ОК в начале работы

// программы

// прочитать и вывести первый вопрос

GetVopros(&Vopros);

ShowVopros(Vopros);

Buttonl->Caption - "Дальше";

Игры и другие полезные программы 229

Buttonl->Enabled = false,Buttonl->Tag = 1; break;

case 1: //^щелчокнакнопкеДальше if (otv == Vopros.rOtv) // выбранправильный // ответ right++; EraseVopros(); ok = GetVopros(&Vopros); if ( ok ) ShowVopros(Vopros); else

// вопросов больше нет { FileClose(f); // вывести результат AnsiString st; // сообщение int i; // номер достигнутого уровня

Forml->Caption = "Результат тестирования"; st.printf( "Правильных ответов: %i\n",right

// определим оценку i = 0; // предположим, что испытуемый // ответил на все // вопросы while (( right < level[i]) && (i < 3))

st = st + mes[i];

230 Часть 1. Примерыизадачи

Labell->Caption = st;

Buttonl->Caption = "OK"; Buttonl->Enabled = true; Buttonl->Tag = 2;

} break;

case 2: // щелчок на OK в конце работы программы Forml->Close(); // завершить работу программы

// Функция GetString читает строку из файла // значение функции - кол-во прочитанных символов int GetString(int f, AnsiString *st)

unsigned char buf[300]; // строка (буфер) unsigned char *p = buf; // указатель на строку

int n; // кол-во прочитанных байт (значение ф-и FlleRead) int len = 0; // длина строки

n = FileRead(f, р, 1); while ( п != 0 )

if ( *р == '\г')

n = FileReacHf, р, 1); // прочитать '\п' break;

len++;

Игры и другие полезные программы 231

n = FileRead(f, p, 1);

*р = '\0'; if ( len !=0) st->printf("%s", buf) return len;

// читаетизфайлацелоечисло int Getlnt(int f) { char buf[20]; // строка (буфер) char *p = buf; // указательнастроку

int n; // кол-во прочитанных байт (значение ф-и FileRead) int a; // число, прочитанное из файла

n = FileRead(f, p, 1) ; while ( (*р>= '0') && (*р<= '9') ScSc (n > 0) )

{

Р++; n = FileRead(f, p, 1) ;

if ( *р == Чг') n = FileReadff, р, 1); // прочитать '\п'

*р = ' \0 • ;

// преобразуем строку из буфера в целое sscanf(buf,"%i", &а); return a;