{MegaTest by Shikari 25.11.2011}
uses crt, dos, strings;
const kolvo_symb_max=15000;{32767;}
kolvo_vopr_max_const=25;
kolvo_otv_max=6;
var
kolvo_oshibok,
kolvo_verno,
kolvo_vopr,
kolvo_vopr_max:integer;
kolvo_vopr_max_str:string;
f:text;
n_symb,
i,j,k:integer;
num_prav_otv,
numtemp_prav_otv:integer;{номер правильного ответа из базы}
num_otv:integer;{номер ответа введенный с клавиатуры}
s_ch: Array [0..kolvo_symb_max] Of Char;
a,b,
massiv_nomerov_zadannih_voprosov:array [1..kolvo_vopr_max_const] of integer;
massiv_oshibok:array [1..kolvo_vopr_max_const] of boolean;
n_numv_str: array [1..kolvo_vopr_max_const] of string;
n_symb_begin: array [1..kolvo_vopr_max_const] of integer;
n_textv_str,
s_str:string;
n_texto_str,
nold_texto_str,
ntemp_texto_str:array[0..kolvo_otv_max] of string;{текст вариантов ответов}
temp:integer;
function istr(i:longint):String;{перевод числа в строку}
var
s1:string[12];
begin
str(i,s1);
istr:=s1;
end;
function stri(s1:string):longint;{перевод строки в число}
var
i,code:integer;
begin
val(s1,i,code);
stri:=i;
end;
procedure statistics;
begin
clrscr;
TextColor(11);
TextBackground(1);
write('================================================================================');
TextColor(12);
writeln('Вопросов задано - '+istr(kolvo_vopr)+' из '+istr(kolvo_vopr_max)+
', сделано ошибок - '+istr(kolvo_oshibok)+
', правильных ответов - '+istr(kolvo_verno)+'.');
TextColor(11);
write('================================================================================');
TextColor(7);
TextBackground(0);
end;
begin
TextColor(7);
TextBackground(0);
clrscr;
randomize;
Assign(f, 'VOPR.TXT');
Reset(f);
{Read(f, s_ch);}
{max:=StrLen();}
{Разбиваем текст}
for i:= 0 to kolvo_symb_max do
begin
read(f,s_ch[i]);
s_str:=s_str+s_ch[i];
end;
for i:= n_symb to kolvo_symb_max do {символы}
begin
if (s_ch[i]='$') then {ищем ключ номера вопроса по ключу открытия [}
begin
for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытия ]}
begin
if (s_ch[j]='$') then
begin
n_symb:=j;{текущее положение считывающего курсора}
n_symb_begin[k]:=j;
{!!!+massiv nachalo voprosa i konec voprosa v simvolah}
break; {пока не закроем номер}
end;
kolvo_vopr_max_str:=kolvo_vopr_max_str+s_ch[j];
end;
break;
end;
end; {konec i}
kolvo_vopr_max:=stri(kolvo_vopr_max_str);{максимальное количество берем из файла}
{ writeln(kolvo_vopr_max);
kolvo_vopr_max:=kolvo_vopr_max_const;
writeln(kolvo_vopr_max);}
{Обрабатываем текст - номер вопроса имеет вид [N]}
k:=1; {количество вопросов}
n_symb:=0;
repeat
if (n_numv_str[k]='') then
begin
for i:= n_symb to kolvo_symb_max do {символы}
begin
if (s_ch[i]='{') then {ищем ключ номера вопроса по ключу открытия [}
begin
for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытия ]}
begin
if (s_ch[j]='}') then
begin
n_symb:=j;{текущее положение считывающего курсора}
n_symb_begin[k]:=j;
{!!!+massiv nachalo voprosa i konec voprosa v simvolah}
break; {пока не закроем номер}
end;
n_numv_str[k]:=n_numv_str[k]+s_ch[j];
end;
k:=k+1;
break;
end;
end; {konec i}
end;
until k>kolvo_vopr_max;
{Задаем начальные значения счетчиков}
kolvo_oshibok:=0;
kolvo_verno:=0;
kolvo_vopr:=0;
{Заполняем последовательность номеров вопросов}
for i:= 1 to kolvo_vopr_max do {вопросы}
begin
a[i]:=i;{массив номеров задаваемых вопросов}
b[i]:=0;
massiv_oshibok[i]:=true;{массив ошибок}
massiv_nomerov_zadannih_voprosov[i]:=0;
end;
{Сортируем в случайном порядке вопросы из всего списка}
i:=kolvo_vopr_max;{maximum otvetov}
j:=1;
repeat
temp:=random(i)+1;
b[j]:=a[temp];
a[temp]:=a[i];
i:=i-1;
j:=j+1;
until i=0;
repeat {отсюда перебираем вопросы}
{обнуление}
for i:= 0 to kolvo_symb_max do
begin
ntemp_texto_str[i]:='';
n_texto_str[i]:='';
nold_texto_str[i]:='';
end;
(*k:=random(kolvo_vopr_max)+1;{zadaem sluchayniy vopros}*)
{k opredelyaet s kakoy pozicii nachnetsa obrabotka voprosa}
{Esli takoy vopros est, to}
{if (n_numv_str[k]<>'') then writeln('!!!!'+istr(k));}
kolvo_vopr:=kolvo_vopr+1;{счетсик заданных вопросов}
k:=b[kolvo_vopr];{Текущий номер вопроса берем из последовательности}
massiv_nomerov_zadannih_voprosov[kolvo_vopr]:=b[kolvo_vopr];
{Обрабатываем текст - текст вопроса имеет вид [txt]}
for i:= n_symb_begin[k] to kolvo_symb_max do
begin
if (s_ch[i]='[') then {ищем ключ текста вопроса по ключу открытия [}
begin
for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытияr ]}
begin
if (s_ch[j]=']') then
begin
n_symb:=j;{текущее положение считывающего курсора}
break; {пока номер не закрыт}
end;
n_textv_str:=n_textv_str+s_ch[j];
end;
break;
end;
end;
{Обрабатывае текст - тект ответов имеет вид [txt]}
for k:= 1 to kolvo_otv_max do {номер ответа}
for i:= n_symb to kolvo_symb_max do
begin
{Неправильные ответы}
if (s_ch[i]='[') then {ishem klu4 texta voprosa po kluchu otkritiya [}
begin
for j:=i+1 to kolvo_symb_max do {vitaskivaem nomer voprosa u kluchu zakritiya ]}
begin
if (s_ch[j]=']') then
begin
n_symb:=j;{tekushee poloshenie kursora}
break; {poka nezakroem nomer}
end;
n_texto_str[k]:=n_texto_str[k]+s_ch[j];
end;
break;
end;
{Pravilniy otvet}
if (s_ch[i]='<') then {ishem klu4 texta voprosa po kluchu otkritiya <}
begin
for j:=i+1 to kolvo_symb_max do {vitaskivaem nomer voprosa u kluchu zakritiya >}
begin
if (s_ch[j]='>') then
begin
n_symb:=j;{tekushee poloshenie kursora}
num_prav_otv:=k;{vozvrashaem nomer pravilnogo otveta}
break; {poka nezakroem nomer}
end;
n_texto_str[k]:=n_texto_str[k]+s_ch[j];
end;
break;
end;
end;{konec cikolv k i i}
{Сохраняем старый массив ответов}
for i:= 1 to kolvo_otv_max do
begin
nold_texto_str[i]:=n_texto_str[i];
end;
{Ответы сортируем в случайном порядку}
i:=kolvo_otv_max;{максимум ответов}
j:=1;
repeat
temp:=random(i)+1;
ntemp_texto_str[j]:=n_texto_str[temp];
n_texto_str[temp]:=n_texto_str[i];
i:=i-1;
j:=j+1;
until i=0;
{В соответствии с новым выбором вытаскиваем новый правильный ответ}
for i:= 1 to kolvo_otv_max do
begin
{В соответствии с старым массивом}
if (ntemp_texto_str[i]=nold_texto_str[num_prav_otv]) then
begin
numtemp_prav_otv:=i;
break;
end;
end;
{Уравниваем временные переменные с реальными}
for i:= 0 to kolvo_otv_max do
begin
n_texto_str[i]:=ntemp_texto_str[i];
end;
num_prav_otv:=numtemp_prav_otv;
statistics;
{Выводим текст текущего вопроса}
TextColor(15);
TextBackground(0);
writeln('Вопрос N'+istr(massiv_nomerov_zadannih_voprosov[kolvo_vopr])+'. '+
n_textv_str);
TextColor(11);
TextBackground(0);
writeln('');
TextColor(14);
writeln('Варианты ответов:');
TextColor(7);
{Выводим список ответов}
TextColor(13); write('1. '); TextColor(7); writeln(n_texto_str[1]);
TextColor(13); write('2. '); TextColor(7); writeln(n_texto_str[2]);
TextColor(13); write('3. '); TextColor(7); writeln(n_texto_str[3]);
TextColor(13); write('4. '); TextColor(7); writeln(n_texto_str[4]);
TextColor(13); write('5. '); TextColor(7); writeln(n_texto_str[5]);
TextColor(13); write('6. '); TextColor(7); writeln(n_texto_str[6]);
writeln('');
TextColor(15);
write('Введите номер ответа (или 0 для выхода): ');
readln(num_otv);
if (num_otv=num_prav_otv) and (num_otv>0) then
begin
TextColor(11);
TextBackground(1);
writeln ('Правильно!');
kolvo_verno:=kolvo_verno+1;
massiv_oshibok[kolvo_vopr]:=false;
TextColor(7);
TextBackground(0);
write('Для продолжения нажмите, что душе угодно...');
repeat;
until keypressed;
end;
if (num_otv<>num_prav_otv) and (num_otv>0) then
begin
TextColor(12);
TextBackground(1);
writeln ('Ошибка, правильный ответ N'+istr(num_prav_otv));
kolvo_oshibok:=kolvo_oshibok+1;
massiv_oshibok[kolvo_vopr]:=true;
TextColor(7);
TextBackground(0);
write('Для продолжения нажмите, что душе угодно...');
repeat;
until keypressed;
end;
until (num_otv=0) or (kolvo_vopr=kolvo_vopr_max);
statistics;
{Вывод статистики по всем вопросам}
TextColor(10);
writeln('В итоге:');
for i:= 1 to kolvo_vopr do {вопросы}
begin
TextColor(11);
write(i);
TextColor(4);
write('('+istr(massiv_nomerov_zadannih_voprosov[i])+')');
TextColor(4);
write('=');
if (massiv_oshibok[i]=false) then
begin
TextColor(14);
write('V');
end;
if (massiv_oshibok[i]=true) then
begin
TextColor(12);
write('X');
end;
write(' ');
end;
TextColor(7);
TextBackground(0);
writeln('');
write('Нажмите ENTER для выхода ...');
readln;
end.