Разработка алгоритма
Сначала объявим все глобальные константы и переменные
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;//записываем в массив перемешанных ответов
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.