Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите с конструктором тестов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
glebik
нужна прога - конструктор тестов на pascal
в ней используются разные типы вопросов,программа создаёт и проводит тест cool.gif . помогите пожалуйста ,если есть готовая прога или наработки. smile.gif
glebik
Напишу потробней. Эта прога предназначена:1)человек может вводить в неё вопросы и варианты ответов причём вопросы могут быть
разными. с 1 прав. ответом, с несколькими. вопрос на сортировку.соответствие 2) а вторая часть проводит этот самый тест.
вообще получается что программы будет две:одна для 1 части,другая для 2.
mega_chok.gif
glebik
Мне сказали как должна выглядеть процедура ввода.
В проге используются типы вопросов: 1) непосредственный ввод(при этом вопрос может иметь нес
колько правильных ответов-синоним,например Пушкин и А.С. Пушкин оба являются правильными и тд)
2) один правильный из нескольких(причём эти несколько не постоянное а вводится)
3) несколько правильных из нескольких(опять же эти несколько не постоянное а вводится)
4)на соответствие
5)на сортировку
У меня есть описание записи которую необходимо использовать для реализации процедуры:
type test=record
vopros: string[50] (текст вопроса)
typ: [1..5] (выбор типа вопроса)
kolotv: byte(кол-во ответов, вводится)
otvety: array [1..100] of string;(ответы)
prav: array [1..100] of string;(правильные ответы)
Необходимо чтобы эта процедура была универсальной для любого вопроса.
Как это сделать? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
blink.gif
volvo
glebik, хотя бы по одному примеру вопросов каждого типа (с ответами, разумеется) приведи...

Это первое. Второе: та структура, которую ты привел - это строго задано, и отступать от этого никак нельзя, или могут быть другие решения? (Я бы, например, предпочел сделать запись с вариантами, если у тебя есть несколько типов вопросов, а храниться они должны в одной структуре).
Артемий
Хотелось-бы узнать:
1. После заполнения данной записи, что с ней делается? Она записываетсяв файл, и потом прога номер 2 считывает из файла этот вопрос и варианты? Или как?
2. Пользователь может задавать несколько вопросов или только один? blink.gif

Добавлено через 0.00001 сек.
Ой прости volvo, когда писал вопрос, твоего ответа еще не было... smile.gif
Гость
Ладно! 1)тип непосредственный ввод(Вопрос: кто написал "война и мир"? Ответ:Толстой. Л.Н Толстой . Толстой Л.Н - все 3 ответа верны
какой бы мы не ввели при решении)
2) один правильный из нескольких (Вопрос:кто написал "война и мир"? варианты
ответов:1)Пушкин 2)Лермонтов 3)Толстой 4)Карамзин Прав.ответ:
Толстой)
3) несколько правильных из нескольких (Вопрос:Столицей какой страны является Лондон? варианты
ответов:1)Англия 2)Великобритания 3)Польша 4)Россия
Прав.ответ:1 и 2
4)на соответствие(это помоему самый неприятный тип)
Составить соответствие(страна-столица):
1)Англия 1)Москва
2)Украина 2)Киев
3)Россия 3) Лондон
Прав.ответ:1-3,2-2,3-1

5)на сортировку
Задание:Расположите события в хронологической последоват-ти(от самого раннего к более позднему):
1)Война с Наполеоном
2)Великая Отечественная Война
3)"Ледовое побоище"
Прав.ответ:3.1.2
-----------------------------------------------------------------------------------
Что касается структуры процедуры. то это не обязательный вариант.
можно и по другому. но только желательно чтобы вся вводимая информация хранилось в 1-м файле.
Что касается кол-ва вопросов. то их кол-во задётся при создании теста.Прога номер 2 считывает из файла эти вопросы и варианты.

P.S:Спасибо за интерес к моей проблеме!
Артемий
По первому - надо все-таки вводить количество правильных ответов (допутим их 4 - Толстой. Л.Н Толстой . Толстой Л.Н,Карамзин) или скоко ответов просто, стоко ответов и правильных?(допутим их 3 - Толстой. Л.Н Толстой . Толстой Л.Н - все правильные, и получается скоко ответов просто - стоко и правильных)
Артемий
Вот,смотри я дам наброски, если что-то не так, то пиши! Данные записываются в ban.dat.
(тут только по первым трем вариантам)
type
Test = record
Vopros: String[50];
Typ: Integer;
Kolotv: byte;
KolotvCor: byte;
Otvety: array [1..100] of string[40];
Prav: array [1..100] of string[40];
end;
var
count,i,i1,i2,countall,i3: Integer;
pravil: byte;
s: string[40];
T: Test;
F: file of Test;
Ban: array [1..1] of Test;
begin
writeln('Vvedite dannue: ');
writeln('Skoko voprosov budet?');
readln(countall);
for i3:=1 to countall do begin
writeln('Vopros: ',i3);
readln(T.Vopros);
writeln('Typ:');
writeln('1 - Neposredstvenny,2 - OneInMany,3 - ManyInMany,4 - Conformable,5 - Sortirovka');
readln(T.Typ);
writeln('Kolychestvo:');
readln(T.Kolotv);
for i1:= 1 to T.Kolotv do
begin
writeln('Otvet nomer ',i1);
readln(T.Otvety[i1]);
end;
case T.Typ of
1: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
2: begin writeln('Prav otvet: '); readln(T.Prav[1]); end;
3: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
end;
Assign(F,'ban.dat');
Rewrite(F);
for i:= 1 to 1 do
Write(F,Ban[i]);
end;
volvo
Я бы делал так (если тебя заинтересует ТАКОЙ вариант - пиши, будем развивать дальше, это не так сложно, как кажется на первый взгляд, если сделать парочку маленьких дополнительных процедур, объем приведенного фрагмента сократится вдвое):


{ максимально возможное количество ответов на вопрос ... }
const
max_answers = 10;
type
{ здесь описываем 5 типов ответов, каждый из них будет обраратываться по-своему }
QuestType = (ans1, ans2, ans3, ans4, ans5);
{ промежуточная структура, для хранения соответствий между двумя вариантами - для 4-го типа }
TS = record
first, second: integer;
end;

{ это - запись с вариантами... то, о чем я говорил выше }
TTest = record
quest: string[50];
ans_count: 1 .. max_answers;
answers: array[1 .. max_answers] of string[50];

case qType: QuestType of
ans1: (
good_ans1: string[50];
);
ans2: (
good_ans2: integer;
);
ans3: (
good_count3: 1 .. max_answers;
good_ans3: array[1 .. max_answers] of integer;
);
ans4: (
good_count4: 1 .. max_answers;
good_ans4: array[1 .. max_answers] of TS;
);
ans5: (
good_ans5: array[1 .. max_answers] of integer;
);
end;

{ заодно описываем и тип файла }
TestFile = file of TTest;

{ вот процедура ввода данных для каждого вопроса/ответа (результат вернется через R)}
procedure get_quest(var R: TTest);
var
i, X: integer;

begin
{ для начала - вводим сам вопрос }
write('Вопрос: '); readln(R.quest);

{ теперь - тип, к которому он относится (1 .. 5) ... }
write('type [1 .. 5]: ');
repeat
readln(X);
until (X >= 1) and (X <= 5);

{ ... и заносим этот тип сразу в структуру }
R.qType := QuestType(X - 1);

{
теперь в зависимости от типа, делаем соответствующие
запросы для ввода необходимых данных
}
case R.qType of
ans1:
begin { вопрос на непосредственный ввод ответа: }
R.ans_count := 0;
{ запросим только примерный ответ }
write('Ответ: '); readln(R.good_ans1);
end;
ans2 .. ans5:
begin
{ во всех остальных случаях надо знать количество вариантов ответов }
write('Сколько будет вариантов ответов [1 .. ', max_answers, '] ? :');
repeat
readln(X);
until (X >= 1) and (X <= max_answers);
R.ans_count := X; { заносим его в структуру }

{ и запрашиваем, собственно, сами варианты }
for i := 1 to R.ans_count do begin
write('Ответ №', i); readln(R.answers[i]);
end;
end;
end;

{ теперь переходим к заполнению всех необходимых полей }
writeln('good answers:');
case R.qType of
ans2: { Тип 2: вопрос с одним правильным ответом }
begin
write('Тип #2 - Введите номер правильного ответа:');
repeat
readln(X);
until (X >= 1) and (X <= R.ans_count);
R.good_ans2 := X; { сохраняем в структуре }
end;
ans3: { Тип 3: несколько правильных ответов }
begin
i := 1; { здесь у нас будет цикл }
repeat

write('Тип #3 - Введите очередной номер правильного ответа (0 для выхода)');
repeat
readln(X);
until (X >= 0) and (X <= R.ans_count);
if X <> 0 then begin { что-то было введено, кроме 0 - дописать это в список ответов }
R.good_ans3[i] := X;
inc(i);
end;

until X = 0; { ввели 0 - надо выходить из цикла }
end;
ans4: { Тип 4 - соответствия }
begin
write('Тип #4 - введите пары (первый - второй)');
for i := 1 to R.ans_count do begin
write('первый:');
repeat
readln(X);
until (X >= 1) and (X <= R.ans_count);
R.good_ans4[i].first := X;
write('второй:');
repeat
readln(X);
until (X >= 1) and (X <= R.ans_count);
R.good_ans4[i].second := X;
end;
end;
ans5: { Тип 5 - сортировка }
begin
write('Тип #5 - введите правильно отсортированные номера ответов:');
for i := 1 to R.ans_count do begin
write('должен быть №', i);
repeat
readln(X);
until (X >= 1) and (X <= R.ans_count);
R.good_ans5[i] := X;
end;
end;
end;

end;

var
Rec: TTest;
F: TestFile;

begin
get_quest(Rec);

{ собственно, здесь - запись структуры в файл, все это делать в цикле }
end.
Как видишь, никаких обработок ошибок (кроме контроля границ номеров) не производится, что дает мне, например, возможность, ввести все 3 одинаковых индекса для вопроса 5-го типа... Это все будет добавлено в дальнейшем, если ты вообще захочешь эту программу продолжить...

Цитата
По первому - надо все-таки вводить количество правильных ответов
Я бы не стал этого делать (и как видишь, не сделал)... Поступаем проще - часть программы, ПРИНИМАЮЩАЯ ответ тестируемого, проверяет, допустим, схожесть строк (например, по Левинштейну) и по проценту похожести делает вывод: принимать или не принимать ответ как правильный...
Гость
Прежде всего спасибо за помощь!
Посмотрел твой набросок, очень даже неплохо, но у меня появились
вопросы:
1)Что такое Ban: array [1..1] of Test и почему 1..1?
2)И в конце
for i:= 1 to 1 do
Write(F,Ban[i]);
Непонятное для меня место.
Ответь , если не сложно.
-------------------------------------------------------------------------------
Volvo пока писал ответ Артемию2.появился твой. я обязательно
проанализирую твою процедуру и напишу вопросы или своё мнение.
Спасибо огромное!

Артемий
Прости, вот поправка:
Ban[1]:=T; {И дальше по старому...}

Добавь это между end; и Assign(F,'ban.dat');

Добавлено через 4 мин.
Цитата
1)Что такое Ban: array [1..1] of Test и почему 1..1?

Массив с одной записью нашего Test=record. 1..1 потому что делаем в цикле, и я не вижу смысла делать несколько записей, хватит одной..
Цитата
2)И в конце for i:= 1 to 1 doWrite(F,Ban[i]);Непонятное для меня место.

Сдесь мы записываем в ban.dat все наши данные, которые мы заполнили, то есть всю запись с введенными данными... smile.gif

Добавлено через 59 сек.
Прости нет времени доделать пункт 4 и 5, но volvo дал хороший код, попробуй им....
Гость
Спасибо за прогу Volvo good.gif , я посмотрел её, сначала она показалась мне трудной,
но внимательно посмотрев увидел, что она довольно понятная.
Но каким образом её можно упростить? blink.gif
volvo
Цитата
каким образом её можно упростить?
Я знал, что ты это спросишь... smile.gif Смотри:
  1. описываем функцию (можно - прямо локально в самой процедуре get_quest, можно - глобально, как хочешь... Вернее - зависит от того, будет ли она использоваться еще где-нибудь. Пока можно сделать локально, как только возникнет необходимость в ее использовании в других процедурах - вынести и сделать глобальной)

      function get_integer(const title: string;
    range_start, range_finish: integer): integer;
    var X: integer;
    begin
    write(title + '[', range_start, ' .. ', range_finish, ']');

    repeat
    readln(X);
    until (X >= range_start) and (X <= range_finish);

    get_integer := X;
    end;
  2. все конструкции вида:
            write('Сколько будет вариантов ответов [1 .. ', max_answers, '] ? :');
    repeat
    readln(X);
    until (X >= 1) and (X <= max_answers);
    R.ans_count := X;

    заменяем на:
            R.ans_count := get_integer('Сколько будет вариантов ответов? ', 1, max_answers);
Итого - можно сделать 7 подобных замен, а это значит, что больше 30 строк заменится всего на 7. yes2.gif
Артемий
Если никто не возражает, покажу свой способ..
(тут как и раньше в dat файл, а из него потом можно считать данные...)
type
Test = record
Vopros: String[50];
Typ: Integer;
Kolotv: byte;
KolotvCor: byte;
Variants: array [1..100] of string[40];
Kolonky1: array [1..100] of string[40];
Kolonky2: array [1..100] of string[40];
Otvety: array [1..100] of string[40];
Prav: array [1..100] of string[40];
end;
label 10;
var
count,i,i1,i2,countall,i3,i4,i5,i6,i7,i8: Integer;
pravil,koll,variantsByte: byte;
s: string[40];
T: Test;
F: file of Test;
Ban: array [1..10] of Test;
begin
i4:=0;
Assign(F,'ban.dat');
Rewrite(F);
writeln('Vvedite dannue: ');
writeln('Skoko voprosov budet?');
readln(countall);
for i3:=1 to countall do begin
writeln('Vopros: ',i3);
readln(T.Vopros);
writeln('Typ:');
writeln('1 - Neposredstvenny,2 - OneInMany,3 - ManyInMany,4 - Conformable,5 - Sortirovka');
readln(T.Typ);
if T.Typ = 4 or 5 then goto 10;
writeln('Kolychestvo otvetov:');
readln(T.Kolotv);
for i1:= 1 to T.Kolotv do
begin
writeln('Otvet nomer ',i1);
readln(T.Otvety[i1]);
end;
10: case T.Typ of
1: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
2: begin writeln('Prav otvet: '); readln(T.Prav[1]); end;
3: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
4: begin writeln('Skoko kolonok?'); readln(koll); for i5:=1 to koll do begin writeln('Kolonka 1 variant ',i5);
readln(T.kolonky1[i5]); end; for i6:=1 to koll do begin writeln('Kolonka 2 variant ',i6);
readln(T.kolonky2[i6]); end; for i7:=1 to koll do begin writeln('Prav otvet ',i7,'?'); readln(T.Prav[i7]); end; end;
5: begin writeln('Skoko variantov?'); readln(variantsByte); for i8:=1 to variantsByte do begin writeln('Variant №',i8);
readln(T.Variants[i8]); end; writeln('Prav otvet?'); readln(T.prav[1]); end;
end;
i4:=i4+1;
Ban[i4]:=T;
Write(F,Ban[i4]);
end;
glebik
Volvo и Артемий2 good.gif , честно говоря просто не ожедал, что кто-то вообще откликнется на мою
прозьбу. А тут такая большая помощь с вашей стороны , побольше бы таких отзывчивых
людей... yes2.gif
Теперь я займусь 2-ой прогой и уж простите меня за назойливость, но наверняка у меня
будут трудности и вопросы, поэтому я расчитываю на вашу помощь.
Если вы не будете мне помогать то я не обижусь, ведь вы итак много зделали для меня.
СПАСИБО!!!!!!
no1.gif
glebik
Начал писать прогу исрузу столкнулся с проблемами: mega_chok.gif
1) Volvo ты что-то писал об обработке 1-го типа по Левинштейну, впервые слышу,
как это реализовать?
2)Ёще не знаю как обработать 4 и 5 типы вопрсов.
Подскажите, что делать, пожалуйста! blink.gif
volvo
Цитата
об обработке 1-го типа по Левинштейну
Нет, я уже посмотрел - это не совсем подойдет... Дело в том, что функция похожести двух строк, например, для "L.N. Tolstoy" и "Tolstoy L.N." выдаст, что строки похожи на 14%, а этого очень мало... Надо искать другой путь... Например, задавать список слов, котовые должны быть в ответе, и потом каждое слово из введенного пользователем ответа проверять на присутствие в шаблоне... Например, для твоего варианта, подойдет так:
Шаблонный ответ: "Толстой Лев Л. Н."
тогда, если отвечающий введет, например, "Лев Толстой" - то проверяем: отдельно Лев есть в шаблонной строке? Есть. Отдельно Толстой есть? Есть... Все, значит, правильно ответил... Точно так же будет, если введут "Л. Толстой" и если "Л. Н. Толстой" - все эти варианты будут признаны правильными, посколько из 2-х или 3-х слов ответа нет ни одного НЕсовпадения с шаблоном...

Идея понятна? Для большей гарантии я бы еще перед сравнением строк переводил их ОБЕ в верхний или нижний регистр (функция для этого есть здесь: Строки - называется StrLower или StrUpper)...

С обработкой четвертого и пятого типов вопросов вообще нет проблем: в четвертом ты точно так же, как я показывал, просишь пользователя ввести R.ans_count пар чисел, а в пятом - столько же целых чисел, и потом просто сравниваешь введенные пары/числа с тем, что хранится соответственно в R.good_ans4 или R.good_ans5... Если есть ПОЛНОЕ совпадение - ответ правильный, иначе - неверно...
Артемий
glebik, вот если надо, я набросал тестер, который на основе первого моего варианта считывает инфу из ban.bat и преобразут в тест, где пользователь сможет выполнять его....смотри...
type
Test = record
Vopros: String[50];
Typ: Integer;
Kolotv: byte;
KolotvCor: byte;
Variants: array [1..100] of string[40];
Kolonky1: array [1..100] of string[40];
Kolonky2: array [1..100] of string[40];
Otvety: array [1..100] of string[40];
Prav: array [1..100] of string[40];
end;
var
i,i2,i3,i4,i5,int,int2: integer;
labell: byte;
s,s2,s3,otvet: string;
ArrStrPrav: array [1..100] of string;
Ban: array [1..10] of Test;
F: file of Test;
T: Test;
begin
i:=0;
i3:=0;
i4:=0;
i5:=0;
writeln('Reading...');
assign(F,'ban.dat');
Reset(F);
while not Eof(F) do begin
i:=i+1;
Read(F,Ban[i]);
end;
for i2:=1 to i do begin
writeln('Vopros ',i2);
T:=Ban[i2];
writeln(T.Vopros);
case T.Typ of
1: begin repeat i3:=i3+1; s:=T.Prav[i3]; ArrStrPrav[i3]:=s; until s='';
readln(otvet);
for int:=1 to i3-1 do begin if otvet=ArrStrPrav[int] then begin
writeln('Otvet pravelen!'); labell:=0; end else labell:=labell+10; Continue; end;
if labell=10*(i3-1) then writeln('Otvet neveren!!'); end;
2: begin readln(otvet); if otvet=T.Prav[1] then writeln('Otvet veren!') else
writeln('Otvet neveren!'); end;
3: begin repeat i3:=i3+1; s:=T.Prav[i3]; ArrStrPrav[i3]:=s; until s='';
readln(otvet);
for int:=1 to i3-1 do begin if otvet=ArrStrPrav[int] then begin
writeln('Otvet pravelen!'); labell:=0; end else labell:=labell+10; Continue; end;
if labell=10*(i3-1) then writeln('Otvet neveren!!'); end;
4: begin writeln; writeln('Kolonka 1'); repeat i3:=i3+1; s:=T.kolonky1[i3]; writeln(s);
until s=''; writeln('Kolonka 2'); repeat i4:=i4+1; s2:=T.kolonky2[i4]; writeln(s2);
until s2=''; repeat i5:=i5+1; readln(otvet); ArrStrPrav[i5]:=otvet; s3:=T.Prav[i5];
until s3=''; for int2:=1 to i5-1 do begin if ArrStrPrav[int2]=T.Prav[int2] then begin
labell:=0; end else labell:=10; if labell=0 then begin writeln('Verno!!!');break; end
else writeln('Neverno!'); break; end; end;
5: begin repeat i3:=i3+1; s:=T.Variants[i3]; writeln(s); until s=''; readln(otvet);
if otvet=T.Prav[1] then writeln('Pravilno!') else writeln('Nepravilno!'); end;
end;
end;
readln
glebik
Артемий2 smile.gif в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test
комп выдаёт ошибку:Structure too large. И вообще за что Ban: array [1..10] of Test отвечает?
И что такое label 10? unsure.gif
volvo
Цитата
в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test
комп выдаёт ошибку:Structure too large.
А дело все в том, что Артемий2 никак не хочет понять, что для проверки работы программ из этого раздела НЕЛЬЗЯ пользоваться Дельфи... Турбо Паскаль не позволит выделить во-первых, одну структуру размером больше 65520 байт (а Ban имеет размер 80540 байт), а во-вторых, сумма всех размеров статических переменных не должна превышать те же самые 65520 байт...
Артемий
Руки мне надо поотбивать.... wacko.gif Очень сорри, больше так не буду... smile.gif give_rose.gif
Глебик, вот пахалка:
Первая:
type
Test = record
Vopros: String[50];
Typ: Integer;
Kolotv: byte;
KolotvCor: byte;
Variants: array [1..100] of string[40];
Kolonky1: array [1..100] of string[40];
Kolonky2: array [1..100] of string[40];
Otvety: array [1..100] of string[40];
Prav: array [1..100] of string[40];
end;
label 10;
var
count,i,i1,i2,countall,i3,i4,i5,i6,i7,i8: Integer;
pravil,koll,variantsByte: byte;
s: string[40];
T: Test;
F: file of Test;
begin
i4:=0;
Assign(F,'ban.dat');
Rewrite(F);
writeln('Vvedite dannue: ');
writeln('Skoko voprosov budet?');
readln(countall);
for i3:=1 to countall do begin
writeln('Vopros: ',i3);
readln(T.Vopros);
writeln('Typ:');
writeln('1 - Neposredstvenny,2 - OneInMany,3 - ManyInMany,4 - Conformable,5 - Sortirovka');
readln(T.Typ);
if T.Typ = 5 then goto 10;
if T.Typ = 4 then goto 10;
writeln('Kolychestvo otvetov:');
readln(T.Kolotv);
for i1:= 1 to T.Kolotv do
begin
writeln('Otvet nomer ',i1);
readln(T.Otvety[i1]);
end;
10: case T.Typ of
1: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
2: begin writeln('Prav otvet: '); readln(T.Prav[1]); end;
3: begin writeln('Skoko prav otvetov?'); readln(pravil); for i2:=1 to pravil do begin writeln('Pravel otvet nomer ',i2);
readln(T.Prav[i2]); end; end;
4: begin writeln('Skoko kolonok?'); readln(koll); for i5:=1 to koll do begin writeln('Kolonka 1 variant ',i5);
readln(T.kolonky1[i5]); end; for i6:=1 to koll do begin writeln('Kolonka 2 variant ',i6);
readln(T.kolonky2[i6]); end; for i7:=1 to koll do begin writeln('Prav otvet ',i7,'?'); readln(T.Prav[i7]); end; end;
5: begin writeln('Skoko variantov?'); readln(variantsByte); for i8:=1 to variantsByte do begin writeln('Variant ¹',i8);
readln(T.Variants[i8]); end; writeln('Prav otvet?'); readln(T.prav[1]); end;
end;
i4:=i4+1;
Write(F,T);
end;

Вторая:
type
Test = record
Vopros: String[50];
Typ: Integer;
Kolotv: byte;
KolotvCor: byte;
Variants: array [1..100] of string[40];
Kolonky1: array [1..100] of string[40];
Kolonky2: array [1..100] of string[40];
Otvety: array [1..100] of string[40];
Prav: array [1..100] of string[40];
end;
var
i,i2,i3,i4,i5,int,int2: integer;
labell: byte;
s,s2,s3,otvet: string;
ArrStrPrav: array [1..100] of string;
F: file of Test;
T: Test;
begin
i:=0;
i3:=0;
i4:=0;
i5:=0;
writeln('Reading...');
assign(F,'ban.dat');
Reset(F);
while not Eof(F) do begin
i:=i+1;
Read(F,T);
end;
Close(F);
assign(F,'ban.dat');
Reset(F);
for i2:=1 to i do begin
Read(F,T);
writeln('Vopros ',i2);
writeln(T.Vopros);
case T.Typ of
1: begin repeat i3:=i3+1; s:=T.Prav[i3]; ArrStrPrav[i3]:=s; until s='';
readln(otvet);
for int:=1 to i3-1 do begin if otvet=ArrStrPrav[int] then begin
writeln('Otvet pravelen!'); labell:=0; end else labell:=labell+10; Continue; end;
if labell=10*(i3-1) then writeln('Otvet neveren!!'); end;
2: begin readln(otvet); if otvet=T.Prav[1] then writeln('Otvet veren!') else
writeln('Otvet neveren!'); end;
3: begin repeat i3:=i3+1; s:=T.Prav[i3]; ArrStrPrav[i3]:=s; until s='';
readln(otvet);
for int:=1 to i3-1 do begin if otvet=ArrStrPrav[int] then begin
writeln('Otvet pravelen!'); labell:=0; end else labell:=labell+10; Continue; end;
if labell=10*(i3-1) then writeln('Otvet neveren!!'); end;
4: begin writeln; writeln('Kolonka 1'); repeat i3:=i3+1; s:=T.kolonky1[i3]; writeln(s);
until s=''; writeln('Kolonka 2'); repeat i4:=i4+1; s2:=T.kolonky2[i4]; writeln(s2);
until s2=''; repeat i5:=i5+1; readln(otvet); ArrStrPrav[i5]:=otvet; s3:=T.Prav[i5];
until s3=''; for int2:=1 to i5-1 do begin if ArrStrPrav[int2]=T.Prav[int2] then begin
labell:=0; end else labell:=10; if labell=0 then begin writeln('Verno!!!');break; end
else writeln('Neverno!'); break; end; end;
5: begin repeat i3:=i3+1; s:=T.Variants[i3]; writeln(s); until s=''; readln(otvet);
if otvet=T.Prav[1] then writeln('Pravilno!') else writeln('Nepravilno!'); end;
end;
end;
readln


P.S. Label 10 - это метка для оператора безусловного перехода goto.
volvo
glebik, если тебе все-таки интересна реализация моего метода - см. у меня на сайте:
Здесь
glebik
Нет слов просто СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lol.gif good.gif give_rose.gif smile.gif
glebik
Volvo в 4-м типе вопросов есть проблема, я не понял структуру его ввода.
Например, при вводе теста я выбрал 4-й тип и 4 варианта ответов, мне казалось что
комп должен спросить 2 пары соответствий(первый - второй), но он запрашивает 4 пары, почему?
volvo
Ну, если у тебя 4 варианта ответов, КАЖДЫЙ из которых состоит из одной опции, а не из ПАРЫ "первый столбец - второй столбец" (как у меня сделано, более логично, не так ли? Если есть 4 варианта - это значит, 4 пары соответствий, или я должен догадаться, что если я ввел 3 варианта решений, то введу полтора соответствия?), тогда да - надо вводить n / 2 пар...

Это уже додумывай сам, я привел ПРИМЕР решения программы, а не программу "под ключ".
glebik
Привет no1.gif , это снова я появилась новая проблема с конструктором тестов. Программа Volvo отличная, но проблема в том что мне необходимо чтоб 2-я часть программы перемешивала ответы. А в программе ответы в файл записываются числами , как их перемешать чтоб всё работало я не знаю. Помогите! blink.gif

-Volvo-
Перемешивала ответы - это что значит? Может, перемешивала вопросы? То есть, тебе нужно чтобы случайно выбирался один вопрос из всех ранее введенных?
glebik
Вопросы тоже надо перемешать(но это второстепенно).
Важнее перемешать варианты. Напишу на примере.
Пусть тип вопроса 1 правильный из многих вариантов.
Я ввожу вопрос: кто написал война и мир?( в голову нового ничо не полезло поэтому написал старый пример).
Пусть вариантов ответов 4.
1 glebik
2 лермонтов
3 толстой
4 Volvo
правильный ответ:3. если я правильно понял в файл записывается 3 ,а не толстой.
А теперь надо чтобы варианты при выводе вопроса на экран перемешались.
Это должно выглядеть так, я запускаю сам тест и на экране появ-ся:
кто написал война и мир?
1 лермонтов
2 glebik
3 Volvo
4 толстой (варианты перемешались)
Но в файле записана 3 и если я введу 4 то ответ правильным уже не будет(в этом сложность).

Алена
Смотри, что надо сделать: в функции get_answer есть вложенная процедура print_options, которая отвечает за вывод вариантов ответа... Так вот. Эту процедуру немного переделываем:
  procedure print_options(b: boolean; var new_ans: integer);
var
i, k, X: integer;
values: set of 1 .. max_answers;
shuffle: array[1 .. max_answers] of integer;
begin
// Добавляем перемешивание - shuffling
if b then begin
values := [];
for i := 1 to max_answers do begin
repeat
X := random(max_answers) + 1;
until not (X in values);
Include(values, X);
shuffle[i] := X;
end;

// и возвращаем новый правильный ответ
new_ans := shuffle[R.good_ans2];
end;

// ну, а здесь - распечатываем варианты ответа (в зависимости от B,
// или перемешанные, или нет)
for i := 1 to R.ans_count do begin
if b then k := shuffle[i] else k := i;
write(i:2, ') ', R.answers[k] + ' ');
end;
end;

Но этого недостаточно. Теперь надо еще переделать все вызовы print_options на вот такие:

во всех местах Case, кроме ans_2 перемешивать варианты не надо, поэтому вызываешь так:
print_options(false, new_ans);

а в случае ans_2, там где перемешать-таки надо, делаешь:

ans2:
begin
print_options(true, new_ans);
writeln;
write('your choice: '); readln(choice);

// вот тут теперь сравнивается не с R.good_ans2, а с new_ans
get_answer := (choice = new_ans);
end;

(new_ans - новая переменная, типа Integer)
glebik
Спасибо за помощь give_rose.gif , но я не понял при помощи этих изменений я могу перемешивать варианты любого типа вопросов(1 не надо), а то 2-й тип я только для примера указал? blink.gif
Алена
Если бы ты говорил сразу, что ты хочешь получить, а не так как ты делаешь - в час по чайной ложке, то все было бы намного проще... Да, с помощью подобных изменений можно добиться того, что тебе надо, но делать этого я не буду... Потому, что потом опять выяснится, что надо добавить еще немного, потом - еще, и в итоге программа превратится в совершенно непонятную вещь, состоящую целиком из костылей, только для того, чтобы она отработала тестовый пример, сдать ее и забыть.

Я программы для "сдать и забыть" не пишу. Нужна помощь - говори СРАЗУ и ПОЛНОСТЬЮ, какие изменения тебе нужно внести в программу.
glebik
Прошу прощения за безграмотную постановку вопроса wacko.gif . Вообще мне нужно чтобы варианты перемешивались при выводе( в типах с 2-5) и всё вообщем-то никаких добавок и не надо.
glebik

Сроки поджимают. Помогите кто нибудь!!!!!!!!!!!!!!!!!!!!!! mega_chok.gif
Артемий
ну так что сложного посчитать сколько там в файле этих вариантов и сгенерировать вывод случайных чисел, а по числу уже смотреть, какой вопрос под этим номером выводить..
glebik
Если бы я мог это сделать я бы и просить не стал. Я в Паскале полный ноль. Ну если это так легко и просто то помогите если не трудно. blink.gif
Артемий
Тогда приведи полный код того,что ты используешь..
glebik
blink.gif Всё что у меня есть это программа Volvo, ссылка как ты знаешь есть в этой теме.
У него в программе правильные ответы записываются числами. Мне нужно просто чтоб при выводе вариантов ответов они перемешивались случайным образом (2-5 типы). И всё вообщем-то. unsure.gif
glebik
blink.gif Неужели никто не поможет... Помогите, работу послезавтра показывать надо! unsure.gif
volvo
Вечером (после 20-00 по GMT +2)... Раньше не вернусь...
volvo
Как и обещал - вот решение:

Нажмите для просмотра прикрепленного файла

Оно работает (тестировал) со всеми вариантами вопросов, единственное, что не стал делать - это переводить это опять на русский, смотри, где есть изменения (я подскажу, изменения - в добавлении в самом начале типа TArrType, добавлена функция find_shuffle, изменена функция print_options, ну, и естественно во всех трех случаях - вопросы №2, №3, №5 /в четвертом порядок не важен/ изменилась обработка полученного от пользователя ответа...)

Можно было еще немного пошаманить и убрать совсем первый параметр в print_options, но это уже сам, если хочешь...
Ozzя
О терминологии:
Цитата
Непосредственный ввод.

Этот вид тестового задания называется - открытый однозначный (открытой формы) – это тип тестовых заданий с вводом единственного правильного ответа.
Цитата
Вопросы на сортировку

Этот вид тестового задания называется - вопрос на следование – тип тестовых вопросов на установление правильной последовательности.

Ну и рекомендуется в
Цитата
Вопрос на соответствие.
Пример вопроса: Составить соответствие (Cтрана - Cтолица):
1) Англия - 1) Москва
2) Украина - 2) Киев
3) Россия - 3) Лондон


такой вариант
Код

1. Англия                а. Москва
2. Украина              б. Киев
3. Россия                 в. Лондон


Подробнее читать в
Цитата
[Аванесов В.С., 1998] Аванесов В.С. Композиция тестовых заданий. Учебная книга для преподавателей вузов, учителей школ, аспирантов и студентов педвузов. 2 изд., испр. и доп. М.: Адепт, 1998. – 217 с.
[Аванесов В.С., 1994] Аванесов В.С. Научные основы тестового контроля знаний, М. Иссл. центр, 1994 .-135 с.


Реализация на TurboVision есть здесь:
http://pascal.sources.ru/incoming/control.zip
glebik
Спасибо Volvo за помощь. Я написал модуль для твоей проги, но он чо то не работает
помогите пожалуйста ошибку найти. unsure.gif
volvo
"Чо-то не работает" я не принимаю... говори конкретно, "Чо" у тебя не работает, и при каких условиях.

Я тестовый файл уже удалил, у меня все работало, а заново вводить даже десяток вопросов не хочу. Потому, что я тебе уже сказал выше: ты должен был сказать СРАЗУ, что ЭТО будет еще и разбиваться на модули. Ты молчал? Чего теперь тебе надо?
glebik
Прошу прощения что сразу не говорил о модуле. Мы тока прошли модули и
нам дали новое задание написать их для своих программ. Конкретно в TEST.pas
не работает get_quest(rec). blink.gif
glebik
Ну пожалуйста помогите! Если бы я знал про модули, я бы сразу предупредил о них, но мне 4 дня назад сказали что теперь ещё и модуль подавай. wacko.gif Я ведь не прошу писать его за меня, я написал его. По книге писал, вроде верно делал. Но как говорится 1-й блин комом. Не могу точно сказать где именно ошибка, знал бы может сам бы исправил. В TEST.pas
не работает get_quest(rec) что-то не так с переменной. unsure.gif
Bikiev
Прога отличная! good.gif мне именно она и нужна! но в ней графики не хватает! кто может помогите! для второй части,где сам тест проводится, там бы интерфейсик, чтоб самому не печатать ответы а просто отмечать мышкой иили клавиатурой. помогите,очень надо! unsure.gif
Bikiev
ну неужели никто не поможет.... unsure.gif mega_chok.gif
volvo
Эта программа больше не поддерживается... Она изначально создавалась такой, какая она сейчас, и изменять ее интерфейс полностью на графический я не буду.
мисс_граффити
Тема закрыта.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.