Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ помогите с конструктором тестов

Автор: glebik 11.02.2007 16:29

нужна прога - конструктор тестов на pascal
в ней используются разные типы вопросов,программа создаёт и проводит тест cool.gif . помогите пожалуйста ,если есть готовая прога или наработки. smile.gif

Автор: glebik 12.02.2007 1:39

Напишу потробней. Эта прога предназначена:1)человек может вводить в неё вопросы и варианты ответов причём вопросы могут быть
разными. с 1 прав. ответом, с несколькими. вопрос на сортировку.соответствие 2) а вторая часть проводит этот самый тест.
вообще получается что программы будет две:одна для 1 части,другая для 2.
mega_chok.gif

Автор: glebik 14.02.2007 20:49

Мне сказали как должна выглядеть процедура ввода.
В проге используются типы вопросов: 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 14.02.2007 21:28

glebik, хотя бы по одному примеру вопросов каждого типа (с ответами, разумеется) приведи...

Это первое. Второе: та структура, которую ты привел - это строго задано, и отступать от этого никак нельзя, или могут быть другие решения? (Я бы, например, предпочел сделать запись с вариантами, если у тебя есть несколько типов вопросов, а храниться они должны в одной структуре).

Автор: Артемий2 14.02.2007 21:29

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

Добавлено через 0.00001 сек.
Ой прости volvo, когда писал вопрос, твоего ответа еще не было... smile.gif

Автор: Гость 14.02.2007 23:06

Ладно! 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:Спасибо за интерес к моей проблеме!

Автор: Артемий2 14.02.2007 23:32

По первому - надо все-таки вводить количество правильных ответов (допутим их 4 - Толстой. Л.Н Толстой . Толстой Л.Н,Карамзин) или скоко ответов просто, стоко ответов и правильных?(допутим их 3 - Толстой. Л.Н Толстой . Толстой Л.Н - все правильные, и получается скоко ответов просто - стоко и правильных)

Автор: Артемий2 14.02.2007 23:58

Вот,смотри я дам наброски, если что-то не так, то пиши! Данные записываются в 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 15.02.2007 0:22

Я бы делал так (если тебя заинтересует ТАКОЙ вариант - пиши, будем развивать дальше, это не так сложно, как кажется на первый взгляд, если сделать парочку маленьких дополнительных процедур, объем приведенного фрагмента сократится вдвое):


{ максимально возможное количество ответов на вопрос ... }
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-го типа... Это все будет добавлено в дальнейшем, если ты вообще захочешь эту программу продолжить...

Цитата
По первому - надо все-таки вводить количество правильных ответов
Я бы не стал этого делать (и как видишь, не сделал)... Поступаем проще - часть программы, ПРИНИМАЮЩАЯ ответ тестируемого, проверяет, допустим, схожесть строк (например, по Левинштейну) и по проценту похожести делает вывод: принимать или не принимать ответ как правильный...

Автор: Гость 15.02.2007 0:33

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


Автор: Артемий2 15.02.2007 0:40

Прости, вот поправка:

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 дал хороший код, попробуй им....

Автор: Гость 15.02.2007 17:52

Спасибо за прогу Volvo good.gif , я посмотрел её, сначала она показалась мне трудной,
но внимательно посмотрев увидел, что она довольно понятная.
Но каким образом её можно упростить? blink.gif

Автор: volvo 15.02.2007 18:10

Цитата
каким образом её можно упростить?
Я знал, что ты это спросишь... 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

Автор: Артемий2 15.02.2007 23:15

Если никто не возражает, покажу свой способ..
(тут как и раньше в 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 16.02.2007 1:54

Volvo и Артемий2 good.gif , честно говоря просто не ожедал, что кто-то вообще откликнется на мою
прозьбу. А тут такая большая помощь с вашей стороны , побольше бы таких отзывчивых
людей... yes2.gif
Теперь я займусь 2-ой прогой и уж простите меня за назойливость, но наверняка у меня
будут трудности и вопросы, поэтому я расчитываю на вашу помощь.
Если вы не будете мне помогать то я не обижусь, ведь вы итак много зделали для меня.
СПАСИБО!!!!!!
no1.gif

Автор: glebik 16.02.2007 19:33

Начал писать прогу исрузу столкнулся с проблемами: mega_chok.gif
1) Volvo ты что-то писал об обработке 1-го типа по Левинштейну, впервые слышу,
как это реализовать?
2)Ёще не знаю как обработать 4 и 5 типы вопрсов.
Подскажите, что делать, пожалуйста! blink.gif

Автор: volvo 16.02.2007 20:09

Цитата
об обработке 1-го типа по Левинштейну
Нет, я уже посмотрел - это не совсем подойдет... Дело в том, что функция похожести двух строк, например, для "L.N. Tolstoy" и "Tolstoy L.N." выдаст, что строки похожи на 14%, а этого очень мало... Надо искать другой путь... Например, задавать список слов, котовые должны быть в ответе, и потом каждое слово из введенного пользователем ответа проверять на присутствие в шаблоне... Например, для твоего варианта, подойдет так:
Шаблонный ответ: "Толстой Лев Л. Н."
тогда, если отвечающий введет, например, "Лев Толстой" - то проверяем: отдельно Лев есть в шаблонной строке? Есть. Отдельно Толстой есть? Есть... Все, значит, правильно ответил... Точно так же будет, если введут "Л. Толстой" и если "Л. Н. Толстой" - все эти варианты будут признаны правильными, посколько из 2-х или 3-х слов ответа нет ни одного НЕсовпадения с шаблоном...

Идея понятна? Для большей гарантии я бы еще перед сравнением строк переводил их ОБЕ в верхний или нижний регистр (функция для этого есть здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2361&view=findpost&p=33955 - называется StrLower или StrUpper)...

С обработкой четвертого и пятого типов вопросов вообще нет проблем: в четвертом ты точно так же, как я показывал, просишь пользователя ввести R.ans_count пар чисел, а в пятом - столько же целых чисел, и потом просто сравниваешь введенные пары/числа с тем, что хранится соответственно в R.good_ans4 или R.good_ans5... Если есть ПОЛНОЕ совпадение - ответ правильный, иначе - неверно...

Автор: Артемий2 16.02.2007 23:19

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 17.02.2007 15:15

Артемий2 smile.gif в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test
комп выдаёт ошибку:Structure too large. И вообще за что Ban: array [1..10] of Test отвечает?
И что такое label 10? unsure.gif

Автор: volvo 17.02.2007 16:30

Цитата
в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test
комп выдаёт ошибку:Structure too large.
А дело все в том, что Артемий2 никак не хочет понять, что для проверки работы программ из этого раздела НЕЛЬЗЯ пользоваться Дельфи... Турбо Паскаль не позволит выделить во-первых, одну структуру размером больше 65520 байт (а Ban имеет размер 80540 байт), а во-вторых, сумма всех размеров статических переменных не должна превышать те же самые 65520 байт...

Автор: Артемий2 17.02.2007 18:54

Руки мне надо поотбивать.... 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 17.02.2007 19:39

glebik, если тебе все-таки интересна реализация моего метода - см. у меня на сайте:
http://volvo71.narod.ru/tasks.htm#test_constr

Автор: glebik 18.02.2007 3:07

Нет слов просто СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
lol.gif good.gif give_rose.gif smile.gif

Автор: glebik 20.02.2007 23:13

Volvo в 4-м типе вопросов есть проблема, я не понял структуру его ввода.
Например, при вводе теста я выбрал 4-й тип и 4 варианта ответов, мне казалось что
комп должен спросить 2 пары соответствий(первый - второй), но он запрашивает 4 пары, почему?

Автор: volvo 21.02.2007 1:12

Ну, если у тебя 4 варианта ответов, КАЖДЫЙ из которых состоит из одной опции, а не из ПАРЫ "первый столбец - второй столбец" (как у меня сделано, более логично, не так ли? Если есть 4 варианта - это значит, 4 пары соответствий, или я должен догадаться, что если я ввел 3 варианта решений, то введу полтора соответствия?), тогда да - надо вводить n / 2 пар...

Это уже додумывай сам, я привел ПРИМЕР решения программы, а не программу "под ключ".

Автор: glebik 18.03.2007 16:14

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


Автор: -Volvo- 18.03.2007 16:20

Перемешивала ответы - это что значит? Может, перемешивала вопросы? То есть, тебе нужно чтобы случайно выбирался один вопрос из всех ранее введенных?

Автор: glebik 19.03.2007 2:35

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


Автор: Алена 19.03.2007 3:04

Смотри, что надо сделать: в функции 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 21.03.2007 15:03

Спасибо за помощь give_rose.gif , но я не понял при помощи этих изменений я могу перемешивать варианты любого типа вопросов(1 не надо), а то 2-й тип я только для примера указал? blink.gif

Автор: Алена 21.03.2007 15:22

Если бы ты говорил сразу, что ты хочешь получить, а не так как ты делаешь - в час по чайной ложке, то все было бы намного проще... Да, с помощью подобных изменений можно добиться того, что тебе надо, но делать этого я не буду... Потому, что потом опять выяснится, что надо добавить еще немного, потом - еще, и в итоге программа превратится в совершенно непонятную вещь, состоящую целиком из костылей, только для того, чтобы она отработала тестовый пример, сдать ее и забыть.

Я программы для "сдать и забыть" не пишу. Нужна помощь - говори СРАЗУ и ПОЛНОСТЬЮ, какие изменения тебе нужно внести в программу.

Автор: glebik 21.03.2007 18:35

Прошу прощения за безграмотную постановку вопроса wacko.gif . Вообще мне нужно чтобы варианты перемешивались при выводе( в типах с 2-5) и всё вообщем-то никаких добавок и не надо.

Автор: glebik 22.03.2007 22:26


Сроки поджимают. Помогите кто нибудь!!!!!!!!!!!!!!!!!!!!!! mega_chok.gif

Автор: Артемий2 22.03.2007 22:41

ну так что сложного посчитать сколько там в файле этих вариантов и сгенерировать вывод случайных чисел, а по числу уже смотреть, какой вопрос под этим номером выводить..

Автор: glebik 24.03.2007 12:05

Если бы я мог это сделать я бы и просить не стал. Я в Паскале полный ноль. Ну если это так легко и просто то помогите если не трудно. blink.gif

Автор: Артемий2 24.03.2007 12:58

Тогда приведи полный код того,что ты используешь..

Автор: glebik 24.03.2007 15:37

blink.gif Всё что у меня есть это программа Volvo, ссылка как ты знаешь есть в этой теме.
У него в программе правильные ответы записываются числами. Мне нужно просто чтоб при выводе вариантов ответов они перемешивались случайным образом (2-5 типы). И всё вообщем-то. unsure.gif

Автор: glebik 27.03.2007 19:55

blink.gif Неужели никто не поможет... Помогите, работу послезавтра показывать надо! unsure.gif

Автор: volvo 27.03.2007 20:19

Вечером (после 20-00 по GMT +2)... Раньше не вернусь...

Автор: volvo 28.03.2007 1:47

Как и обещал - вот решение:

Прикрепленный файл  quest.pas ( 7.33 килобайт ) Кол-во скачиваний: 456


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

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

Автор: Ozzя 6.04.2007 11:13

О терминологии:

Цитата
Непосредственный ввод.

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

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

Ну и рекомендуется в
Цитата
Вопрос на соответствие.
Пример вопроса: Составить соответствие (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 12.04.2007 21:56

Спасибо Volvo за помощь. Я написал модуль для твоей проги, но он чо то не работает
помогите пожалуйста ошибку найти. unsure.gif


Прикрепленные файлы
Прикрепленный файл  tyyy.rar ( 18.31 килобайт ) Кол-во скачиваний: 159

Автор: volvo 12.04.2007 22:35

"Чо-то не работает" я не принимаю... говори конкретно, "Чо" у тебя не работает, и при каких условиях.

Я тестовый файл уже удалил, у меня все работало, а заново вводить даже десяток вопросов не хочу. Потому, что я тебе уже сказал выше: ты должен был сказать СРАЗУ, что ЭТО будет еще и разбиваться на модули. Ты молчал? Чего теперь тебе надо?

Автор: glebik 14.04.2007 14:13

Прошу прощения что сразу не говорил о модуле. Мы тока прошли модули и
нам дали новое задание написать их для своих программ. Конкретно в TEST.pas
не работает get_quest(rec). blink.gif

Автор: glebik 15.04.2007 21:59

Ну пожалуйста помогите! Если бы я знал про модули, я бы сразу предупредил о них, но мне 4 дня назад сказали что теперь ещё и модуль подавай. wacko.gif Я ведь не прошу писать его за меня, я написал его. По книге писал, вроде верно делал. Но как говорится 1-й блин комом. Не могу точно сказать где именно ошибка, знал бы может сам бы исправил. В TEST.pas
не работает get_quest(rec) что-то не так с переменной. unsure.gif

Автор: Bikiev 21.05.2007 23:47

Прога отличная! good.gif мне именно она и нужна! но в ней графики не хватает! кто может помогите! для второй части,где сам тест проводится, там бы интерфейсик, чтоб самому не печатать ответы а просто отмечать мышкой иили клавиатурой. помогите,очень надо! unsure.gif

Автор: Bikiev 29.05.2007 1:07

ну неужели никто не поможет.... unsure.gif mega_chok.gif

Автор: volvo 29.05.2007 1:15

Эта программа больше не поддерживается... Она изначально создавалась такой, какая она сейчас, и изменять ее интерфейс полностью на графический я не буду.

Автор: мисс_граффити 29.05.2007 1:16

Тема закрыта.