нужна прога - конструктор тестов на pascal в ней используются разные типы вопросов,программа создаёт и проводит тест . помогите пожалуйста ,если есть готовая прога или наработки.
glebik
12.02.2007 1:39
Напишу потробней. Эта прога предназначена:1)человек может вводить в неё вопросы и варианты ответов причём вопросы могут быть разными. с 1 прав. ответом, с несколькими. вопрос на сортировку.соответствие 2) а вторая часть проводит этот самый тест. вообще получается что программы будет две:одна для 1 части,другая для 2.
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;(правильные ответы) Необходимо чтобы эта процедура была универсальной для любого вопроса. Как это сделать? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
volvo
14.02.2007 21:28
glebik, хотя бы по одному примеру вопросов каждого типа (с ответами, разумеется) приведи...
Это первое. Второе: та структура, которую ты привел - это строго задано, и отступать от этого никак нельзя, или могут быть другие решения? (Я бы, например, предпочел сделать запись с вариантами, если у тебя есть несколько типов вопросов, а храниться они должны в одной структуре).
Артемий
14.02.2007 21:29
Хотелось-бы узнать: 1. После заполнения данной записи, что с ней делается? Она записываетсяв файл, и потом прога номер 2 считывает из файла этот вопрос и варианты? Или как? 2. Пользователь может задавать несколько вопросов или только один?
Добавлено через 0.00001 сек. Ой прости volvo, когда писал вопрос, твоего ответа еще не было...
Гость
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:Спасибо за интерес к моей проблеме!
Артемий
14.02.2007 23:32
По первому - надо все-таки вводить количество правильных ответов (допутим их 4 - Толстой. Л.Н Толстой . Толстой Л.Н,Карамзин) или скоко ответов просто, стоко ответов и правильных?(допутим их 3 - Толстой. Л.Н Толстой . Толстой Л.Н - все правильные, и получается скоко ответов просто - стоко и правильных)
Артемий
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.появился твой. я обязательно проанализирую твою процедуру и напишу вопросы или своё мнение. Спасибо огромное!
Артемий
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 все наши данные, которые мы заполнили, то есть всю запись с введенными данными...
Добавлено через 59 сек. Прости нет времени доделать пункт 4 и 5, но volvo дал хороший код, попробуй им....
Гость
15.02.2007 17:52
Спасибо за прогу Volvo , я посмотрел её, сначала она показалась мне трудной, но внимательно посмотрев увидел, что она довольно понятная. Но каким образом её можно упростить?
volvo
15.02.2007 18:10
Цитата
каким образом её можно упростить?
Я знал, что ты это спросишь... Смотри:
описываем функцию (можно - прямо локально в самой процедуре 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;
все конструкции вида:
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.
Артемий
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 , честно говоря просто не ожедал, что кто-то вообще откликнется на мою прозьбу. А тут такая большая помощь с вашей стороны , побольше бы таких отзывчивых людей... Теперь я займусь 2-ой прогой и уж простите меня за назойливость, но наверняка у меня будут трудности и вопросы, поэтому я расчитываю на вашу помощь. Если вы не будете мне помогать то я не обижусь, ведь вы итак много зделали для меня. СПАСИБО!!!!!!
glebik
16.02.2007 19:33
Начал писать прогу исрузу столкнулся с проблемами: 1) Volvo ты что-то писал об обработке 1-го типа по Левинштейну, впервые слышу, как это реализовать? 2)Ёще не знаю как обработать 4 и 5 типы вопрсов. Подскажите, что делать, пожалуйста!
volvo
16.02.2007 20:09
Цитата
об обработке 1-го типа по Левинштейну
Нет, я уже посмотрел - это не совсем подойдет... Дело в том, что функция похожести двух строк, например, для "L.N. Tolstoy" и "Tolstoy L.N." выдаст, что строки похожи на 14%, а этого очень мало... Надо искать другой путь... Например, задавать список слов, котовые должны быть в ответе, и потом каждое слово из введенного пользователем ответа проверять на присутствие в шаблоне... Например, для твоего варианта, подойдет так: Шаблонный ответ: "Толстой Лев Л. Н." тогда, если отвечающий введет, например, "Лев Толстой" - то проверяем: отдельно Лев есть в шаблонной строке? Есть. Отдельно Толстой есть? Есть... Все, значит, правильно ответил... Точно так же будет, если введут "Л. Толстой" и если "Л. Н. Толстой" - все эти варианты будут признаны правильными, посколько из 2-х или 3-х слов ответа нет ни одного НЕсовпадения с шаблоном...
Идея понятна? Для большей гарантии я бы еще перед сравнением строк переводил их ОБЕ в верхний или нижний регистр (функция для этого есть здесь: Строки - называется StrLower или StrUpper)...
С обработкой четвертого и пятого типов вопросов вообще нет проблем: в четвертом ты точно так же, как я показывал, просишь пользователя ввести R.ans_count пар чисел, а в пятом - столько же целых чисел, и потом просто сравниваешь введенные пары/числа с тем, что хранится соответственно в R.good_ans4 или R.good_ans5... Если есть ПОЛНОЕ совпадение - ответ правильный, иначе - неверно...
Артемий
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 в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test комп выдаёт ошибку:Structure too large. И вообще за что Ban: array [1..10] of Test отвечает? И что такое label 10?
volvo
17.02.2007 16:30
Цитата
в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test комп выдаёт ошибку:Structure too large.
А дело все в том, что Артемий2 никак не хочет понять, что для проверки работы программ из этого раздела НЕЛЬЗЯ пользоваться Дельфи... Турбо Паскаль не позволит выделить во-первых, одну структуру размером больше 65520 байт (а Ban имеет размер 80540 байт), а во-вторых, сумма всех размеров статических переменных не должна превышать те же самые 65520 байт...
Артемий
17.02.2007 18:54
Руки мне надо поотбивать.... Очень сорри, больше так не буду... Глебик, вот пахалка: Первая:
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. Label10 - это метка для оператора безусловного перехода goto.
volvo
17.02.2007 19:39
glebik, если тебе все-таки интересна реализация моего метода - см. у меня на сайте: Здесь
glebik
18.02.2007 3:07
Нет слов просто СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
Привет , это снова я появилась новая проблема с конструктором тестов. Программа Volvo отличная, но проблема в том что мне необходимо чтоб 2-я часть программы перемешивала ответы. А в программе ответы в файл записываются числами , как их перемешать чтоб всё работало я не знаю. Помогите!
-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
Спасибо за помощь , но я не понял при помощи этих изменений я могу перемешивать варианты любого типа вопросов(1 не надо), а то 2-й тип я только для примера указал?
Алена
21.03.2007 15:22
Если бы ты говорил сразу, что ты хочешь получить, а не так как ты делаешь - в час по чайной ложке, то все было бы намного проще... Да, с помощью подобных изменений можно добиться того, что тебе надо, но делать этого я не буду... Потому, что потом опять выяснится, что надо добавить еще немного, потом - еще, и в итоге программа превратится в совершенно непонятную вещь, состоящую целиком из костылей, только для того, чтобы она отработала тестовый пример, сдать ее и забыть.
Я программы для "сдать и забыть" не пишу. Нужна помощь - говори СРАЗУ и ПОЛНОСТЬЮ, какие изменения тебе нужно внести в программу.
glebik
21.03.2007 18:35
Прошу прощения за безграмотную постановку вопроса . Вообще мне нужно чтобы варианты перемешивались при выводе( в типах с 2-5) и всё вообщем-то никаких добавок и не надо.
glebik
22.03.2007 22:26
Сроки поджимают. Помогите кто нибудь!!!!!!!!!!!!!!!!!!!!!!
Артемий
22.03.2007 22:41
ну так что сложного посчитать сколько там в файле этих вариантов и сгенерировать вывод случайных чисел, а по числу уже смотреть, какой вопрос под этим номером выводить..
glebik
24.03.2007 12:05
Если бы я мог это сделать я бы и просить не стал. Я в Паскале полный ноль. Ну если это так легко и просто то помогите если не трудно.
Артемий
24.03.2007 12:58
Тогда приведи полный код того,что ты используешь..
glebik
24.03.2007 15:37
Всё что у меня есть это программа Volvo, ссылка как ты знаешь есть в этой теме. У него в программе правильные ответы записываются числами. Мне нужно просто чтоб при выводе вариантов ответов они перемешивались случайным образом (2-5 типы). И всё вообщем-то.
glebik
27.03.2007 19:55
Неужели никто не поможет... Помогите, работу послезавтра показывать надо!
volvo
27.03.2007 20:19
Вечером (после 20-00 по GMT +2)... Раньше не вернусь...
Оно работает (тестировал) со всеми вариантами вопросов, единственное, что не стал делать - это переводить это опять на русский, смотри, где есть изменения (я подскажу, изменения - в добавлении в самом начале типа 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 с.
Спасибо Volvo за помощь. Я написал модуль для твоей проги, но он чо то не работает помогите пожалуйста ошибку найти.
volvo
12.04.2007 22:35
"Чо-то не работает" я не принимаю... говори конкретно, "Чо" у тебя не работает, и при каких условиях.
Я тестовый файл уже удалил, у меня все работало, а заново вводить даже десяток вопросов не хочу. Потому, что я тебе уже сказал выше: ты должен был сказать СРАЗУ, что ЭТО будет еще и разбиваться на модули. Ты молчал? Чего теперь тебе надо?
glebik
14.04.2007 14:13
Прошу прощения что сразу не говорил о модуле. Мы тока прошли модули и нам дали новое задание написать их для своих программ. Конкретно в TEST.pas не работает get_quest(rec).
glebik
15.04.2007 21:59
Ну пожалуйста помогите! Если бы я знал про модули, я бы сразу предупредил о них, но мне 4 дня назад сказали что теперь ещё и модуль подавай. Я ведь не прошу писать его за меня, я написал его. По книге писал, вроде верно делал. Но как говорится 1-й блин комом. Не могу точно сказать где именно ошибка, знал бы может сам бы исправил. В TEST.pas не работает get_quest(rec) что-то не так с переменной.
Bikiev
21.05.2007 23:47
Прога отличная! мне именно она и нужна! но в ней графики не хватает! кто может помогите! для второй части,где сам тест проводится, там бы интерфейсик, чтоб самому не печатать ответы а просто отмечать мышкой иили клавиатурой. помогите,очень надо!
Bikiev
29.05.2007 1:07
ну неужели никто не поможет....
volvo
29.05.2007 1:15
Эта программа больше не поддерживается... Она изначально создавалась такой, какая она сейчас, и изменять ее интерфейс полностью на графический я не буду.
мисс_граффити
29.05.2007 1:16
Тема закрыта.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.