Разработка программы «Тест по теоретической механике», страница 2


Разработка алгоритма

Сначала объявим все глобальные константы и переменные

const

n=50;// количество вопросов в базе

n1=30;// количество вопросов в тесте

n2=5;// количество вариантов ответа (4)

t=5400;// время теста в секундах

  type  // запись о билете

info=record

vopr:string[255];// вопрос

otv:array[0..3] of string[255]; //варианты ответов

end;

var

  FmZAS: TFmZAS;

  baza:array[0..n]of info;//исходный массив вопросов

  baza1:array[0..n1]of info;//выбранный массив вопросов

  baza2:array[0..n1]of info;//перемешанный выбранный массив вопросов

  otvet,// массив № ответов студента

  otvet1,// массив правильности  (1- да, 0 - нет)

  otvet2,//  массив № правильных ответов на вопросы

  nomer:array[0..n1]of integer;// массив, в который записываются номера выбранных вопросов

  fam,im,och,// фамилия, имя, отчество - переменные для регистрации

  o,o1,o2,o3:string[20];// переменные для анкеты

  t1,//переменная для включения таймера

  t2,// вспомогательная переменная, чтобы файл с вопросами не открывался несколько раз

  Ball,// количество баллов

  gr,// номер группы для регистрации

  i:integer;//текущий номер вопроса

  f,// в вспомогательный файл с расшифрованной базой ответов

  f1,// файл с результатами теста

  f2,// файл с ответами на анкету

  f3:text;// файл с базой вопросов(зашифрован)

опишем основные процедуры и действия

разработаем процедуру, которая будет выполняться при нажатии кнопки с № вопроса

procedure TFmZAS.Knopka;

begin

// сбрасываем переключатели ответов

FmTEST.RBVAR1.Checked:=false;

FmTEST.RBVAR2.Checked:=false;

FmTEST.RBVAR3.Checked:=false;

FmTEST.RBVAR4.Checked:=false;

// если ответ уже дан студентом, то устанавливаем соответствующий переключатель

if otvet[i]=1 then FmTEST.RBVAR1.Checked:=true else

if otvet[i]=2 then FmTEST.RBVAR2.Checked:=true else

if otvet[i]=3 then FmTEST.RBVAR3.Checked:=true else

if otvet[i]=4 then FmTEST.RBVAR4.Checked:=true;

FmTEST.LbNOMERVOPR.Caption:='Вопрос '+IntToStr(i+1);// выводим номер текущего вопроса

FmTEST.MmVOPR.Text:=baza2[i].vopr;// выводим вопрос в поле для вопроса

// выводим варианты ответов в соответствующие поля

FmTEST.MmOTV1.Text:=baza2[i].otv[0];

FmTEST.MmOTV2.Text:=baza2[i].otv[1];

FmTEST.MmOTV3.Text:=baza2[i].otv[2];

FmTEST.MmOTV4.Text:=baza2[i].otv[3];

end;

разработаем процедуру расшифровки файла

procedure TFmZAS.shifr;

var

x:char;// переменная для работы с одним символом

begin

assignfile(f3,'G:\Поекты\Курсовая\111');// связываем переменную f3 c файлом с зашифрованной базой вопросов

assignfile(f,'G:\Поекты\Курсовая\0000');//связываем переменную f c файлом, в который будут записываться расшифрованные ответы

reset(f3);// устанавливаем указатель на начало файла с вопросами

rewrite(f);// открываем вспомогательный файл для записи

while not eof(f3)do// пока файл не закончится

begin

read(f3,x);// считываем по одному символу

x:=chr(ord(x) xor 101);// сдвигаем орд буквы на 101

write(f,x);// записываем символы в вспомогательный файл

end;

closefile(f3);//закрываем файл с вопросами

closefile(f);// закрываем вспомогательный файл, с расшифрованными вопросами

end;

разработаем процедуру подсчета результатов

procedure TFmZAS.Podschet;

var

j:integer;// вспомогательная переменная

begin

ball:=0;// сбрасываем баллы

for j:=0 to n1-1 do // от 0 до числа количества вопросов в тесте - 1 делаем

if otvet[j]=otvet2[j] then // если  № ответа студента совпадает с № правильного ответа, то

begin

Ball:=Ball+1;//увеличиваем баллы на 1

otvet1[j]:=1;//в массив правильности записываем 1

end;

end;

при нажатии кнопки ДАЛЕЕ на форме заставке будут выполнятся следующие действия:

выбор из базы вопросов

перемешивание ответов

запись в соответствующие массивы вопросов и ответов

procedure TFmZAS.BtDALEEClick(Sender: TObject);//продолжить

var j,k,j1:integer;// вспомогательные переменные

variant:array [0..n2] of integer; // вспомогательный массив, в который записываются номера перемешенных ответов

a1:set of byte;// вспомогательное множество

b:info;// один билет

begin

Randomize;// включаем генератор случайных чисел

if t2<>1 then// если вспомогательная переменная не 1, то

begin

shifr;// запускается процедура расшифровки

AssignFile(f,'G:\Поекты\Курсовая\0000');//открываем расшифрованный  файл созданный в процедуре

Reset(f);// ставим указатель на начало

for j:=0 to n-1 do  //считываем 50 вопросов

begin

Readln(f,b.vopr);//вопрос

Readln(f,b.otv[0]);//правильный ответ

Readln(f,b.otv[1]);//неправильный ответ 1

Readln(f,b.otv[2]);//неправильный ответ 2

Readln(f,b.otv[3]);//неправильный ответ 3

baza[j]:=b;//записываем в исходный массив

end;

CloseFile(f);// закрываем файл

erase(f);// удаляем файл с расшифрованной базой вопросов

t2:=1;// вспомогательной переменной присваиваем 1

end;

//обнуляем номера выбранных вопросов

for j:=0 to n1-1 do // от 0 до 29

begin

nomer[j]:=-1;

end;

// выбираем 30 билетов

j:=0;

a1:=[];// делаем множество пустым

while j<>n1 do //пока количество вопросов в выбранном массиве неравно 10

begin

k:=Random(n-1);// выбираем случайным способом номер вопроса в пределах от 0 до 49

for j1:=0 to n1-1 do// от 0 до 29 делаем

begin

if  not(k in a1) then//если номера во множестве вопросов нет, то

begin

nomer[j]:=k;//записываем его в массив выбранных № вопросов

j:=j+1;//увеличиваем число

a1:=a1+[k];//записываем № в вспомогательное множество, чтобы этот номер не был вабран еще раз

break;// останавливаем

end;

end;

end;

for j:=0 to n1-1 do // от 0 до 9

begin

baza1[j]:=baza[nomer[j]];//записываем в массив выбранных воросов вопросы из основного массива, номера которых записанны в массиве с №  выбранных вопросов

end;

//обнуляем номера выбранных вопросов

for j:=0 to n2-1 do // от 0 до 4

begin

variant[j]:=-1;

end;

//перемешиваем варианты ответов

for j:=0 to n1-1 do // от 0 до 29

begin

a1:=[];// делаем множество пустым

j1:=0;

baza2[j].vopr:=baza1[j].vopr;// вопросы оставлям

while j1<>n2-1 do // пока j1 не 4 дулаем

begin

k:=random(n2-1);// случайным образом выбираем число от 0 до 4

if  not (k in a1) then // если этого числа во множестве нет, то

begin

variant[j1]:=k;//записываем в массив перемешанных ответов