Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. {MegaTest by Shikari 25.11.2011}
  2. uses crt, dos, strings;
  3.  const kolvo_symb_max=15000;{32767;}
  4.        kolvo_vopr_max_const=25;
  5.        kolvo_otv_max=6;
  6. var
  7.  
  8.  kolvo_oshibok,
  9.  kolvo_verno,
  10.  kolvo_vopr,
  11.  kolvo_vopr_max:integer;
  12.  kolvo_vopr_max_str:string;
  13.  f:text;
  14.  
  15.  n_symb,
  16.  i,j,k:integer;
  17.  num_prav_otv,
  18.  numtemp_prav_otv:integer;{номер правильного ответа из базы}
  19.  
  20.  num_otv:integer;{номер ответа введенный с клавиатуры}
  21.  
  22.  s_ch: Array [0..kolvo_symb_max] Of Char;
  23.  
  24.  a,b,
  25.  massiv_nomerov_zadannih_voprosov:array [1..kolvo_vopr_max_const] of integer;
  26.  massiv_oshibok:array [1..kolvo_vopr_max_const] of boolean;
  27.  
  28.  n_numv_str: array [1..kolvo_vopr_max_const] of string;
  29.  n_symb_begin: array [1..kolvo_vopr_max_const] of integer;
  30.  n_textv_str,
  31.  s_str:string;
  32.  
  33.  n_texto_str,
  34.  nold_texto_str,
  35.  ntemp_texto_str:array[0..kolvo_otv_max] of string;{текст вариантов ответов}
  36.  
  37.  temp:integer;
  38.  
  39. function istr(i:longint):String;{перевод числа в строку}
  40.  var
  41.   s1:string[12];
  42.  begin
  43.   str(i,s1);
  44.   istr:=s1;
  45.  end;
  46.  
  47. function stri(s1:string):longint;{перевод строки в число}
  48.  var
  49.   i,code:integer;
  50.  begin
  51.   val(s1,i,code);
  52.   stri:=i;
  53.  end;
  54.  
  55. procedure statistics;
  56.  begin
  57.   clrscr;
  58.   TextColor(11);
  59.   TextBackground(1);
  60.   write('================================================================================');
  61.   TextColor(12);
  62.   writeln('Вопросов задано - '+istr(kolvo_vopr)+' из '+istr(kolvo_vopr_max)+
  63.           ', сделано ошибок - '+istr(kolvo_oshibok)+
  64.           ', правильных ответов - '+istr(kolvo_verno)+'.');
  65.   TextColor(11);
  66.   write('================================================================================');
  67.  
  68.   TextColor(7);
  69.   TextBackground(0);
  70.  
  71.  end;
  72.  
  73. begin
  74.  TextColor(7);
  75.  TextBackground(0);
  76.  
  77.  clrscr;
  78.  
  79.  randomize;
  80.  
  81.  Assign(f, 'VOPR.TXT');
  82.  Reset(f);
  83.  {Read(f, s_ch);}
  84.  
  85.  {max:=StrLen();}
  86.  
  87.  {Разбиваем текст}
  88.  for i:= 0 to kolvo_symb_max do
  89.   begin
  90.    read(f,s_ch[i]);
  91.    s_str:=s_str+s_ch[i];
  92.   end;
  93.  
  94.   for i:= n_symb to kolvo_symb_max  do {символы}
  95.    begin
  96.     if (s_ch[i]='$') then {ищем ключ номера вопроса по ключу открытия [}
  97.      begin
  98.       for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытия ]}
  99.        begin
  100.         if (s_ch[j]='$') then
  101.          begin
  102.           n_symb:=j;{текущее положение считывающего курсора}
  103.           n_symb_begin[k]:=j;
  104.           {!!!+massiv nachalo voprosa i konec voprosa v simvolah}
  105.           break; {пока не закроем номер}
  106.          end;
  107.         kolvo_vopr_max_str:=kolvo_vopr_max_str+s_ch[j];
  108.        end;
  109.       break;
  110.      end;
  111.    end; {konec i}
  112.  
  113.  kolvo_vopr_max:=stri(kolvo_vopr_max_str);{максимальное количество берем из файла}
  114.  
  115. { writeln(kolvo_vopr_max);
  116.  kolvo_vopr_max:=kolvo_vopr_max_const;
  117.  writeln(kolvo_vopr_max);}
  118.  
  119.  {Обрабатываем текст - номер вопроса имеет вид [N]}
  120.  k:=1; {количество вопросов}
  121.  n_symb:=0;
  122.  repeat
  123.   if (n_numv_str[k]='') then
  124.    begin
  125.     for i:= n_symb to kolvo_symb_max  do {символы}
  126.      begin
  127.       if (s_ch[i]='{') then {ищем ключ номера вопроса по ключу открытия [}
  128.        begin
  129.         for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытия ]}
  130.          begin
  131.           if (s_ch[j]='}') then
  132.            begin
  133.             n_symb:=j;{текущее положение считывающего курсора}
  134.             n_symb_begin[k]:=j;
  135.             {!!!+massiv nachalo voprosa i konec voprosa v simvolah}
  136.             break; {пока не закроем номер}
  137.            end;
  138.           n_numv_str[k]:=n_numv_str[k]+s_ch[j];
  139.          end;
  140.         k:=k+1;
  141.         break;
  142.        end;
  143.      end; {konec i}
  144.     end;
  145.   until k>kolvo_vopr_max;
  146.  
  147.  {Задаем начальные значения счетчиков}
  148.  kolvo_oshibok:=0;
  149.  kolvo_verno:=0;
  150.  kolvo_vopr:=0;
  151.  
  152.  {Заполняем последовательность номеров вопросов}
  153.  for i:= 1 to kolvo_vopr_max do {вопросы}
  154.   begin
  155.    a[i]:=i;{массив номеров задаваемых вопросов}
  156.    b[i]:=0;
  157.    massiv_oshibok[i]:=true;{массив ошибок}
  158.    massiv_nomerov_zadannih_voprosov[i]:=0;
  159.   end;
  160.  
  161.  {Сортируем в случайном порядке вопросы из всего списка}
  162.  i:=kolvo_vopr_max;{maximum otvetov}
  163.  j:=1;
  164.   repeat
  165.    temp:=random(i)+1;
  166.    b[j]:=a[temp];
  167.    a[temp]:=a[i];
  168.    i:=i-1;
  169.    j:=j+1;
  170.   until i=0;
  171.  
  172.  repeat {отсюда перебираем вопросы}
  173.   {обнуление}
  174.   for i:= 0 to kolvo_symb_max do
  175.    begin
  176.     ntemp_texto_str[i]:='';
  177.     n_texto_str[i]:='';
  178.     nold_texto_str[i]:='';
  179.    end;
  180.  
  181.   (*k:=random(kolvo_vopr_max)+1;{zadaem sluchayniy vopros}*)
  182.   {k opredelyaet s kakoy pozicii nachnetsa obrabotka voprosa}
  183.   {Esli takoy vopros est, to}
  184.   {if (n_numv_str[k]<>'') then writeln('!!!!'+istr(k));}
  185.  
  186.   kolvo_vopr:=kolvo_vopr+1;{счетсик заданных вопросов}
  187.   k:=b[kolvo_vopr];{Текущий номер вопроса берем из последовательности}
  188.   massiv_nomerov_zadannih_voprosov[kolvo_vopr]:=b[kolvo_vopr];
  189.  
  190.   {Обрабатываем текст - текст вопроса имеет вид [txt]}
  191.   for i:= n_symb_begin[k] to kolvo_symb_max do
  192.    begin
  193.     if (s_ch[i]='[') then {ищем ключ текста вопроса по ключу открытия [}
  194.      begin
  195.       for j:=i+1 to kolvo_symb_max do {вытаскиваем номер вопроса по ключу закрытияr ]}
  196.        begin
  197.         if (s_ch[j]=']') then
  198.          begin
  199.           n_symb:=j;{текущее положение считывающего курсора}
  200.           break; {пока номер не закрыт}
  201.          end;
  202.         n_textv_str:=n_textv_str+s_ch[j];
  203.        end;
  204.       break;
  205.      end;
  206.    end;
  207.  
  208.   {Обрабатывае текст - тект ответов имеет вид [txt]}
  209.   for k:= 1 to kolvo_otv_max do {номер ответа}
  210.   for i:= n_symb to kolvo_symb_max do
  211.    begin
  212.     {Неправильные ответы}
  213.     if (s_ch[i]='[') then {ishem klu4 texta voprosa po kluchu otkritiya [}
  214.      begin
  215.       for j:=i+1 to kolvo_symb_max do {vitaskivaem nomer voprosa u kluchu zakritiya ]}
  216.        begin
  217.         if (s_ch[j]=']') then
  218.          begin
  219.           n_symb:=j;{tekushee poloshenie kursora}
  220.           break; {poka nezakroem nomer}
  221.          end;
  222.         n_texto_str[k]:=n_texto_str[k]+s_ch[j];
  223.        end;
  224.       break;
  225.      end;
  226.  
  227.     {Pravilniy otvet}
  228.     if (s_ch[i]='<') then {ishem klu4 texta voprosa po kluchu otkritiya <}
  229.      begin
  230.       for j:=i+1 to kolvo_symb_max do {vitaskivaem nomer voprosa u kluchu zakritiya >}
  231.        begin
  232.         if (s_ch[j]='>') then
  233.          begin
  234.           n_symb:=j;{tekushee poloshenie kursora}
  235.           num_prav_otv:=k;{vozvrashaem nomer pravilnogo otveta}
  236.           break; {poka nezakroem nomer}
  237.          end;
  238.         n_texto_str[k]:=n_texto_str[k]+s_ch[j];
  239.        end;
  240.       break;
  241.      end;
  242.  
  243.    end;{konec cikolv k i i}
  244.  
  245.   {Сохраняем старый массив ответов}
  246.   for i:= 1 to kolvo_otv_max do
  247.    begin
  248.     nold_texto_str[i]:=n_texto_str[i];
  249.    end;
  250.  
  251.   {Ответы сортируем в случайном порядку}
  252.   i:=kolvo_otv_max;{максимум ответов}
  253.   j:=1;
  254.   repeat
  255.    temp:=random(i)+1;
  256.    ntemp_texto_str[j]:=n_texto_str[temp];
  257.    n_texto_str[temp]:=n_texto_str[i];
  258.    i:=i-1;
  259.    j:=j+1;
  260.   until i=0;
  261.  
  262.   {В соответствии с новым выбором вытаскиваем новый правильный ответ}
  263.   for i:= 1 to kolvo_otv_max do
  264.    begin
  265.     {В соответствии с старым массивом}
  266.     if (ntemp_texto_str[i]=nold_texto_str[num_prav_otv]) then
  267.      begin
  268.       numtemp_prav_otv:=i;
  269.       break;
  270.      end;
  271.    end;
  272.  
  273.   {Уравниваем временные переменные с реальными}
  274.   for i:= 0 to kolvo_otv_max do
  275.    begin
  276.     n_texto_str[i]:=ntemp_texto_str[i];
  277.    end;
  278.   num_prav_otv:=numtemp_prav_otv;
  279.  
  280.  
  281.   statistics;
  282.  
  283.   {Выводим текст текущего вопроса}
  284.   TextColor(15);
  285.   TextBackground(0);
  286.   writeln('Вопрос N'+istr(massiv_nomerov_zadannih_voprosov[kolvo_vopr])+'. '+
  287.           n_textv_str);
  288.   TextColor(11);
  289.   TextBackground(0);
  290.   writeln('');
  291.   TextColor(14);
  292.   writeln('Варианты ответов:');
  293.   TextColor(7);
  294.  
  295.   {Выводим список ответов}
  296.   TextColor(13); write('1. '); TextColor(7); writeln(n_texto_str[1]);
  297.   TextColor(13); write('2. '); TextColor(7); writeln(n_texto_str[2]);
  298.   TextColor(13); write('3. '); TextColor(7); writeln(n_texto_str[3]);
  299.   TextColor(13); write('4. '); TextColor(7); writeln(n_texto_str[4]);
  300.   TextColor(13); write('5. '); TextColor(7); writeln(n_texto_str[5]);
  301.   TextColor(13); write('6. '); TextColor(7); writeln(n_texto_str[6]);
  302.  
  303.   writeln('');
  304.   TextColor(15);
  305.   write('Введите номер ответа (или 0 для выхода): ');
  306.   readln(num_otv);
  307.  
  308.   if (num_otv=num_prav_otv) and (num_otv>0) then
  309.    begin
  310.     TextColor(11);
  311.     TextBackground(1);
  312.     writeln ('Правильно!');
  313.     kolvo_verno:=kolvo_verno+1;
  314.     massiv_oshibok[kolvo_vopr]:=false;
  315.     TextColor(7);
  316.     TextBackground(0);
  317.     write('Для продолжения нажмите, что душе угодно...');
  318.     repeat;
  319.     until keypressed;
  320.    end;
  321.  
  322.   if (num_otv<>num_prav_otv) and (num_otv>0) then
  323.    begin
  324.     TextColor(12);
  325.     TextBackground(1);
  326.     writeln ('Ошибка, правильный ответ N'+istr(num_prav_otv));
  327.     kolvo_oshibok:=kolvo_oshibok+1;
  328.     massiv_oshibok[kolvo_vopr]:=true;
  329.     TextColor(7);
  330.     TextBackground(0);
  331.     write('Для продолжения нажмите, что душе угодно...');
  332.     repeat;
  333.     until keypressed;
  334.    end;
  335.  
  336.  until (num_otv=0) or (kolvo_vopr=kolvo_vopr_max);
  337.  
  338.  statistics;
  339.  
  340.  {Вывод статистики по всем вопросам}
  341.  TextColor(10);
  342.  writeln('В итоге:');
  343.  for i:= 1 to kolvo_vopr do {вопросы}
  344.   begin
  345.    TextColor(11);
  346.    write(i);
  347.    TextColor(4);
  348.    write('('+istr(massiv_nomerov_zadannih_voprosov[i])+')');
  349.    TextColor(4);
  350.    write('=');
  351.    if (massiv_oshibok[i]=false) then
  352.     begin
  353.      TextColor(14);
  354.      write('V');
  355.     end;
  356.    if (massiv_oshibok[i]=true) then
  357.     begin
  358.      TextColor(12);
  359.      write('X');
  360.     end;
  361.    write(' ');
  362.   end;
  363.  TextColor(7);
  364.  TextBackground(0);
  365.  writeln('');
  366.  write('Нажмите ENTER для выхода ...');
  367.  readln;
  368. end.
  369.