1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
нужна прога - конструктор тестов на pascal в ней используются разные типы вопросов,программа создаёт и проводит тест . помогите пожалуйста ,если есть готовая прога или наработки.
Сообщение отредактировано: glebik - 11.02.2007 14:13
Я бы делал так (если тебя заинтересует ТАКОЙ вариант - пиши, будем развивать дальше, это не так сложно, как кажется на первый взгляд, если сделать парочку маленьких дополнительных процедур, объем приведенного фрагмента сократится вдвое):
{ максимально возможное количество ответов на вопрос ... } 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-го типа... Это все будет добавлено в дальнейшем, если ты вообще захочешь эту программу продолжить...
Цитата
По первому - надо все-таки вводить количество правильных ответов
Я бы не стал этого делать (и как видишь, не сделал)... Поступаем проще - часть программы, ПРИНИМАЮЩАЯ ответ тестируемого, проверяет, допустим, схожесть строк (например, по Левинштейну) и по проценту похожести делает вывод: принимать или не принимать ответ как правильный...