// TestMe -программа тестировщик знаний
// Дата 1 июня
//—————————————————————————
#include "ToHelpc.h"
#include "AboutTestMe.h"
#include "StatisTestMe.h"
#include <stdio.h>
#include <stdlib.h>
#include <vcl.h>
#pragma hdrstop
#include "kurs.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TTester *Tester;
TFont *FontAns=new TFont;
//—————————————————————————
__fastcall TTester::TTester(TComponent* Owner)
: TForm(Owner)
{
FontAns->Size=15;
reset_bit->Enabled=false;
}
//——————-Объявление функций и переменных—————————-
void DelQuestions(void);
int number_of_variants( int);
void rand_func( int, int *);
int correct_answers;
int variants_ans( int, int);
void proverka();
void output_q();
int current_question;
int *rand_q, count=0, *questions,count_of_string;
//————————Открытие файла———————————————-
void __fastcall TTester::N6Click(TObject *Sender)
{
FILE *norm, *shifr; // исходный тест, зашифрованный
randomize();
OpenDialog->Title="Загрузить тест…";
if (OpenDialog->Execute()) //раскодирование зашифрованного файла
{
shifr=fopen(OpenDialog->FileName.c_str(),"r");
norm=fopen("unshifr.txt","w");
do
{
fputc(fgetc(shifr)-20, norm);
}
while(!feof(shifr));
fclose(norm);
fclose(shifr);
ListBox->Items->LoadFromFile("unshifr.txt");// перенос расшифров. файла в ListBox
DeleteFile("unshifr.txt"); //удаление расшифровнного файла
}
count=0;
count_of_string=ListBox->Items->Count; //количество строк в тесте
ListBox->Items->Delete( count_of_string-1);
count_of_string=ListBox->Items->Count; //количество строк в тесте
for(int i=0; i<count_of_string; i++) //определение количества
if(!strcmp(ListBox->Items->Strings[i].c_str(), "") ) //вопросов, равного
count++; //количеству пустых строк
StatusBar->Panels->Items[0]->Text="Всего: "+IntToStr(count);//Вывод на статусную
questions=new int[count]; //панель
for(int i=0,j=0; i<count_of_string; i++) //Создание массива порядковых номеров
if(!strcmp(ListBox->Items->Strings[i].c_str(), "") ) //вопросов
{
questions[j]=i+1;
j++;
}
rand_q=new int[count];
for(int i=0;i<count; i++) // обнуление
rand_q[i]=-1;
rand_func( count, rand_q); //Создание массива случ чисел от 0 до count
output_q(); //Вывод вопроса
Next_q->Enabled=true;
N6->Enabled=false;
open_bit->Enabled=false;
reset_bit->Enabled=true;
}
//—————————Проверка ответов————————————
void __fastcall TTester::Next_qClick(TObject *Sender)
{
proverka();
DelQuestions();
output_q();
}
//—————————Проверка вариантов ответов—————————
void proverka(void)
{
int n,k=1;
AnsiString user_ans;
user_ans=" ";
n=1;
for(int i=0;i<List->Count;i++)
if(((Rec*)List->Items[i])->Check->Checked==1)
{
user_ans[n]=i+49;
n++;
}
do
k++;
while( variants_ans( k, current_question-1));
AnsiString correct_ans=
Tester->ListBox->Items->Strings[questions[rand_q[current_question-1]]+k].c_str();
if(correct_ans==TrimRight(user_ans))
{
correct_answers++;
Tester->StatusBar->Panels->Items[2]->Text="Правильных: "+IntToStr(correct_answers);
Tester->ProgressBar->Position=100*correct_answers/count;
}
}
//——————————-Сброс теста————————————
void __fastcall TTester::reset_bitClick(TObject *Sender)
{
current_question=count;
output_q();
DelQuestions();
}
//————————функция вывода вопроса———————————
void output_q(void)
{
Tester->StatusBar->Panels->Items[1]->Text="Текущий: "+IntToStr(current_question);
if(current_question<count)
{
Tester->question->Width=Tester->QuestionBox->Width-70;
Tester->question->Caption=
Tester->ListBox->Items->Strings[questions[rand_q[current_question]]].c_str();
List=new TList;
Rec *otvet;
int Height=10;
for(int i=0;i<=number_of_variants(current_question);i++)
{
otvet=new Rec;
otvet->Label=new TLabel( Tester->AnswerBox);
otvet->Check=new TCheckBox( Tester->AnswerBox);
otvet->Label->Left=70;
otvet->Label->Font=FontAns;
otvet->Check->Left=30;
otvet->Check->Width=25;
otvet->Check->Alignment=taLeftJustify;
otvet->Label->WordWrap=true;
otvet->Label->Width=Tester->AnswerBox->Width-100;
otvet->Label->Cursor=crHandPoint;
otvet->Check->Cursor=crHandPoint;
otvet->Label->Caption=
Tester->ListBox->Items->Strings[questions[rand_q[current_question]]+i+1].c_str(); ;
List->Add( otvet);
}
int *posl=new int[number_of_variants(current_question)+1];
rand_func(number_of_variants(current_question)+1,posl);
for(int i=0;i<=number_of_variants(current_question);i++)
{
((Rec*)List->Items[posl[i]])->Check->Caption=i+1;
((Rec*)List->Items[posl[i]])->Label->Top=Height+30;
((Rec*)List->Items[posl[i]])->Check->Top=Height+30;
((Rec*)List->Items[posl[i]])->Label->Parent=Tester->AnswerBox;
((Rec*)List->Items[posl[i]])->Check->Parent=Tester->AnswerBox;
Height+=((Rec*)List->Items[posl[i]])->Label->Height;
}
current_question++;
delete []posl;
}
else
{ int rez=100*correct_answers/count;
ShowMessage("Тест окончен !");
Application->CreateForm(__classid(TStatistica), &Statistica);
Statistica->Memo1->Lines->Add("Название теста:");
Statistica->Memo1->Lines->Add(Tester->ListBox->Items->Strings[0]);
Statistica->Memo1->Lines->Add("Всего вопросов: "+ IntToStr(count));
Statistica->Memo1->Lines->Add("Правильно ответили на : "+ IntToStr(correct_answers));
Statistica->Memo1->Lines->Add("Ваша оценка за тест: "+IntToStr(rez)+" баллов");
Statistica->ShowModal();
Statistica->Free();
Tester->Next_q->Enabled=false;
Tester->ProgressBar->Position=0;
correct_answers=0;
Tester->question->Caption="";
Tester->N6->Enabled=true;
Tester->open_bit->Enabled=true;
Tester->reset_bit->Enabled=false;
current_question=0;
}
}
//—————————Количество вариантов ответов————————
int number_of_variants( int i)
{
int N;
N=0;
do
N++;
while( variants_ans( N+2, current_question));
return(N);
}
//——————————————————————————
void DelQuestions(void)
{
for(int i = 0; i < List->Count; i++)
{
delete ((Rec *)List->Items[i])->Label;
delete ((Rec *)List->Items[i])->Check;
delete (Rec *)List->Items[i];
}
delete List;
}
//————————Определения последнего варианта ответа——————
int variants_ans( int k, int current_question)
{
if( count_of_string==questions[rand_q[current_question]]+k+1)
return 0;
if (strcmp(Tester->ListBox->Items->
Strings[questions[rand_q[current_question]]+k+1].c_str(),""))
return (1);
else return 0;
}
//——————создания случайного массива чисел (0~number)——————
void rand_func( int number, int *rand_m)
{
int n,N;
int povtor=0;
for(n=0;n<number;n++)
{
N=rand()%number;
for(int i=0;i<number;i++)
if(N==rand_m[i]) povtor=1;
if(!povtor)
rand_m[n]=N;
else n—;
povtor=0;
}
}
//———————————Выход—————————————-
void __fastcall TTester::N8Click(TObject *Sender)
{
Close();
}
//——————————————————————————
void __fastcall TTester::Exit_bitClick(TObject *Sender)
{
Close();
}
//——————————————————————————
void __fastcall TTester::N5Click(TObject *Sender)
{
Application->CreateForm(__classid(TAboutBox), &AboutBox);
AboutBox->ShowModal();
AboutBox->Free();
}
//———————-Зашифрование файла—————————————
void __fastcall TTester::N10Click(TObject *Sender)
{
FILE *norm, *shifr; // исходный и зашифрованный файлы
OpenDialog->Title="Зашифровать файл…";
if (OpenDialog->Execute()) norm=fopen(OpenDialog->FileName.c_str(),"r");
if (SaveDialog->Execute()) shifr=fopen(SaveDialog->FileName.c_str(),"w");
do
{
fputc(fgetc(norm)+20, shifr); // шифровка методом сдвига кодов в ASCII
}
while(!feof(norm));
fclose(norm);
fclose(shifr);
}
//—————————Показ хинтов( да / нет )—————————-
void __fastcall TTester::N2Click(TObject *Sender)
{
N2->Checked=!N2->Checked;
open_bit->ShowHint=!open_bit->ShowHint;
Exit_bit->ShowHint=!Exit_bit->ShowHint;
reset_bit->ShowHint=!reset_bit->ShowHint;
}
//———————————Шрифт вопроса———————————
void __fastcall TTester::N13Click(TObject *Sender)
{
TFont *Font=new TFont;
if(FontDialog->Execute())
Font->Assign(FontDialog->Font);
question->Font=Font;
delete Font;
}
//—————————-Шрифт ответов————————————-
void __fastcall TTester::N14Click(TObject *Sender)
{
if(FontDialog->Execute()) FontAns->Assign(FontDialog->Font);
AnswerBox->Font=FontAns;
}
//——————————————————————————
void __fastcall TTester::N17Click(TObject *Sender)
{
if(ColorDialog1->Execute())vopros->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N18Click(TObject *Sender)
{
if(ColorDialog1->Execute())otveti->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N19Click(TObject *Sender)
{
if(FontDialog->Execute()) Next_q->Font=FontDialog->Font;
}
//—————————————————————————
void __fastcall TTester::N20Click(TObject *Sender)
{
if(ColorDialog1->Execute())StatusBar->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N22Click(TObject *Sender)
{
if(FontDialog->Execute()) vopros->Font=FontDialog->Font;
}
//—————————————————————————
void __fastcall TTester::N23Click(TObject *Sender)
{
if(FontDialog->Execute()) otveti->Font=FontDialog->Font;
}
//—————————————————————————
void __fastcall TTester::N25Click(TObject *Sender)
{
if(ColorDialog1->Execute()) QuestionBox->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N26Click(TObject *Sender)
{
if(ColorDialog1->Execute())AnswerBox->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N27Click(TObject *Sender)
{
if(ColorDialog1->Execute())Panel1->Color=ColorDialog1->Color;
}
//—————————————————————————
void __fastcall TTester::N9Click(TObject *Sender)
{
Application->CreateForm(__classid(TToHelp), &ToHelp);
ToHelp->ShowModal();
ToHelp->Free();
}
//—————————————————————————
Рис. П2. 2.Файл kurs.h – заголовочный файл.
//—————————————————————————
#ifndef kursH
#define kursH
//—————————————————————————
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ActnList.hpp>
#include <DBActns.hpp>
#include <ComCtrls.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
//—————————————————————————
TList *List;
typedef struct
{
TLabel *Label;
TCheckBox *Check;
} Rec;
class TTester : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *Help1;
TListBox *ListBox;
TProgressBar *ProgressBar;
TLabel *Label1;
TMenuItem *N2;
TOpenDialog *OpenDialog;
TMenuItem *N6;
TMenuItem *N7;
TMenuItem *N8;
TPanel *Panel1;
TStatusBar *StatusBar;
TButton *Next_q;
TBitBtn *reset_bit;
TBitBtn *open_bit;
TMenuItem *N3;
TFontDialog *FontDialog;
TLabel *vopros;
TBitBtn *Exit_bit;
TMenuItem *N5;
TMenuItem *N9;
TMenuItem *N10;
TMenuItem *N11;
TMenuItem *N12;
TMenuItem *N13;
TMenuItem *N14;
TMenuItem *N15;
TSaveDialog *SaveDialog;
TScrollBox *QuestionBox;
TLabel *otveti;
TSplitter *Splitter1;
TScrollBox *AnswerBox;
TLabel *question;
TMenuItem *N4;
TMenuItem *N16;
TMenuItem *N17;
TMenuItem *N18;
TMenuItem *N20;
TColorDialog *ColorDialog1;
TMenuItem *N21;
TMenuItem *N22;
TMenuItem *N23;
TMenuItem *N19;
TMenuItem *N24;
TMenuItem *N25;
TMenuItem *N26;
TMenuItem *N27;
void __fastcall N8Click(TObject *Sender);
void __fastcall N6Click(TObject *Sender);
void __fastcall Next_qClick(TObject *Sender);
void __fastcall reset_bitClick(TObject *Sender);
void __fastcall Exit_bitClick(TObject *Sender);
void __fastcall N5Click(TObject *Sender);
void __fastcall N10Click(TObject *Sender);
void __fastcall N2Click(TObject *Sender);
void __fastcall N13Click(TObject *Sender);
void __fastcall N14Click(TObject *Sender);
void __fastcall N17Click(TObject *Sender);
void __fastcall N18Click(TObject *Sender);
void __fastcall N19Click(TObject *Sender);
void __fastcall N20Click(TObject *Sender);
void __fastcall N22Click(TObject *Sender);
void __fastcall N23Click(TObject *Sender);
void __fastcall N25Click(TObject *Sender);
void __fastcall N26Click(TObject *Sender);
void __fastcall N27Click(TObject *Sender);
void __fastcall N9Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TTester(TComponent* Owner);
};
//—————————————————————————
extern PACKAGE TTester *Tester;
//—————————————————————————
#endif
Рис. П2. 3. Файл AboutTestMe.cpp – форма “О программе”
//———————————————————————
#include <vcl.h>
#pragma hdrstop
#include "AboutTestMe.h"
//———————————————————————
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//———————————————————————
__fastcall TAboutBox::TAboutBox(TComponent* AOwner)
: TForm(AOwner)
{
}
//———————————————————————
Рис. П2. 4. Файл AboutTestMe.h – заголовочный файл
//—————————————————————————-
#ifndef AboutTestMeH
#define AboutTestMeH
//—————————————————————————-
#include <vcl\System.hpp>
#include <vcl\Windows.hpp>
#include <vcl\SysUtils.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Graphics.hpp>
#include <vcl\Forms.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Buttons.hpp>
#include <vcl\ExtCtrls.hpp>
#include <jpeg.hpp>
//—————————————————————————-
class TAboutBox : public TForm
{
__published:
TPanel *Panel1;
TImage *ProgramIcon;
TLabel *Nt;
TLabel *Version;
TLabel *Copyright;
TLabel *Comments;
TButton *OKButton;
TLabel *Label1;
private:
public:
virtual __fastcall TAboutBox(TComponent* AOwner);
};
//—————————————————————————-
extern PACKAGE TAboutBox *AboutBox;
//—————————————————————————-
#endif
Рис. П2 .5. Файл StatisTestMe.cpp – форма вывода результата
//—————————————————————————
#include <vcl.h>
#pragma hdrstop
#include "StatisTestMe.h"
//—————————————————————————
#pragma package(smart_init)
#pragma resource "*.dfm"
TStatistica *Statistica;
//—————————————————————————
__fastcall TStatistica::TStatistica(TComponent* Owner)
: TForm(Owner)
{
}
//—————————————————————————
void __fastcall TStatistica::StatisticaClick(TObject *Sender)
{
Close();
}
//—————————————————————————
Рис. П2. 6. Файл StatisTestMe.h – заголовочный файл
//—————————————————————————
#ifndef StatisTestMeH
#define StatisTestMeH
//—————————————————————————
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//—————————————————————————
class TStatistica : public TForm
{
__published: // IDE-managed Components
TButton *Statistica;
TMemo *Memo1;
void __fastcall StatisticaClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TStatistica(TComponent* Owner);
};
//—————————————————————————
extern PACKAGE TStatistica *Statistica;
//—————————————————————————
#endif
Рис. П2. 7. Файл TestMe.cpp – главный файл
//—————————————————————————
#include <vcl.h>
#pragma hdrstop
USERES("TestMe.res");
USEFORM("kurs.cpp", Tester);
USEFORM("AboutTestMe.cpp", AboutBox);
USEFORM("StatisTestMe.cpp", Statistica);
USEFORM("ToHelpc.cpp", ToHelp);
//—————————————————————————
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TTester), &Tester);
Application->CreateForm(__classid(TAboutBox), &AboutBox);
Application->CreateForm(__classid(TStatistica), &Statistica);
Application->CreateForm(__classid(TToHelp), &ToHelp);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//—————————————————————————
Рис. П2. 8. Файл ToHelpc.cpp – форма с помощью
//———————————————————————
#include <vcl.h>
#pragma hdrstop
#include "ToHelpc.h"
//———————————————————————
#pragma resource "*.dfm"
TToHelp *ToHelp;
//———————————————————————
__fastcall TToHelp::TToHelp(TComponent* AOwner)
: TForm(AOwner)
{
}
//———————————————————————
Рис. П2. 9. Файл ToHelpc.h – заголовочный файл
//—————————————————————————-
#ifndef ToHelpcH
#define ToHelpcH
//—————————————————————————-
#include <vcl\System.hpp>
#include <vcl\Windows.hpp>
#include <vcl\SysUtils.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Graphics.hpp>
#include <vcl\Forms.hpp>
#include <vcl\Controls.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Buttons.hpp>
#include <vcl\ExtCtrls.hpp>
//—————————————————————————-
class TToHelp : public TForm
{
__published:
TButton *OKButton;
TMemo *Memo1;
private:
public:
virtual __fastcall TToHelp(TComponent* AOwner);
};
//—————————————————————————-
extern PACKAGE TToHelp *ToHelp;
//—————————————————————————-
#endif
