нужна прога - конструктор тестов на pascal
в ней используются разные типы вопросов,программа создаёт и проводит тест . помогите пожалуйста ,если есть готовая прога или наработки.
Напишу потробней. Эта прога предназначена:1)человек может вводить в неё вопросы и варианты ответов причём вопросы могут быть
разными. с 1 прав. ответом, с несколькими. вопрос на сортировку.соответствие 2) а вторая часть проводит этот самый тест.
вообще получается что программы будет две:одна для 1 части,другая для 2.
Мне сказали как должна выглядеть процедура ввода.
В проге используются типы вопросов: 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;(правильные ответы)
Необходимо чтобы эта процедура была универсальной для любого вопроса.
Как это сделать? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
glebik, хотя бы по одному примеру вопросов каждого типа (с ответами, разумеется) приведи...
Это первое. Второе: та структура, которую ты привел - это строго задано, и отступать от этого никак нельзя, или могут быть другие решения? (Я бы, например, предпочел сделать запись с вариантами, если у тебя есть несколько типов вопросов, а храниться они должны в одной структуре).
Хотелось-бы узнать:
1. После заполнения данной записи, что с ней делается? Она записываетсяв файл, и потом прога номер 2 считывает из файла этот вопрос и варианты? Или как?
2. Пользователь может задавать несколько вопросов или только один?
Добавлено через 0.00001 сек.
Ой прости volvo, когда писал вопрос, твоего ответа еще не было...
Ладно! 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;
Я бы делал так (если тебя заинтересует ТАКОЙ вариант - пиши, будем развивать дальше, это не так сложно, как кажется на первый взгляд, если сделать парочку маленьких дополнительных процедур, объем приведенного фрагмента сократится вдвое):
Как видишь, никаких обработок ошибок (кроме контроля границ номеров) не производится, что дает мне, например, возможность, ввести все 3 одинаковых индекса для вопроса 5-го типа... Это все будет добавлено в дальнейшем, если ты вообще захочешь эту программу продолжить...
{ максимально возможное количество ответов на вопрос ... }
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.
Прежде всего спасибо за помощь!
Посмотрел твой набросок, очень даже неплохо, но у меня появились
вопросы:
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; {И дальше по старому...}
Спасибо за прогу Volvo , я посмотрел её, сначала она показалась мне трудной,
но внимательно посмотрев увидел, что она довольно понятная.
Но каким образом её можно упростить?
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);
Если никто не возражает, покажу свой способ..
(тут как и раньше в 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;
Volvo и Артемий2 , честно говоря просто не ожедал, что кто-то вообще откликнется на мою
прозьбу. А тут такая большая помощь с вашей стороны , побольше бы таких отзывчивых
людей...
Теперь я займусь 2-ой прогой и уж простите меня за назойливость, но наверняка у меня
будут трудности и вопросы, поэтому я расчитываю на вашу помощь.
Если вы не будете мне помогать то я не обижусь, ведь вы итак много зделали для меня.
СПАСИБО!!!!!!
Начал писать прогу исрузу столкнулся с проблемами:
1) Volvo ты что-то писал об обработке 1-го типа по Левинштейну, впервые слышу,
как это реализовать?
2)Ёще не знаю как обработать 4 и 5 типы вопрсов.
Подскажите, что делать, пожалуйста!
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
Артемий2 в твоей 1-й проге , при запуске в строчке Ban: array [1..10] of Test
комп выдаёт ошибку:Structure too large. И вообще за что Ban: array [1..10] of Test отвечает?
И что такое label 10?
Руки мне надо поотбивать.... Очень сорри, больше так не буду...
Глебик, вот пахалка:
Первая:
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
glebik, если тебе все-таки интересна реализация моего метода - см. у меня на сайте:
http://volvo71.narod.ru/tasks.htm#test_constr
Нет слов просто СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Volvo в 4-м типе вопросов есть проблема, я не понял структуру его ввода.
Например, при вводе теста я выбрал 4-й тип и 4 варианта ответов, мне казалось что
комп должен спросить 2 пары соответствий(первый - второй), но он запрашивает 4 пары, почему?
Ну, если у тебя 4 варианта ответов, КАЖДЫЙ из которых состоит из одной опции, а не из ПАРЫ "первый столбец - второй столбец" (как у меня сделано, более логично, не так ли? Если есть 4 варианта - это значит, 4 пары соответствий, или я должен догадаться, что если я ввел 3 варианта решений, то введу полтора соответствия?), тогда да - надо вводить n / 2 пар...
Это уже додумывай сам, я привел ПРИМЕР решения программы, а не программу "под ключ".
Привет , это снова я появилась новая проблема с конструктором тестов. Программа Volvo отличная, но проблема в том что мне необходимо чтоб 2-я часть программы перемешивала ответы. А в программе ответы в файл записываются числами , как их перемешать чтоб всё работало я не знаю. Помогите!
Перемешивала ответы - это что значит? Может, перемешивала вопросы? То есть, тебе нужно чтобы случайно выбирался один вопрос из всех ранее введенных?
Вопросы тоже надо перемешать(но это второстепенно).
Важнее перемешать варианты. Напишу на примере.
Пусть тип вопроса 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(false, new_ans);
ans2:
begin
print_options(true, new_ans);
writeln;
write('your choice: '); readln(choice);
// вот тут теперь сравнивается не с R.good_ans2, а с new_ans
get_answer := (choice = new_ans);
end;
Спасибо за помощь , но я не понял при помощи этих изменений я могу перемешивать варианты любого типа вопросов(1 не надо), а то 2-й тип я только для примера указал?
Если бы ты говорил сразу, что ты хочешь получить, а не так как ты делаешь - в час по чайной ложке, то все было бы намного проще... Да, с помощью подобных изменений можно добиться того, что тебе надо, но делать этого я не буду... Потому, что потом опять выяснится, что надо добавить еще немного, потом - еще, и в итоге программа превратится в совершенно непонятную вещь, состоящую целиком из костылей, только для того, чтобы она отработала тестовый пример, сдать ее и забыть.
Я программы для "сдать и забыть" не пишу. Нужна помощь - говори СРАЗУ и ПОЛНОСТЬЮ, какие изменения тебе нужно внести в программу.
Прошу прощения за безграмотную постановку вопроса . Вообще мне нужно чтобы варианты перемешивались при выводе( в типах с 2-5) и всё вообщем-то никаких добавок и не надо.
Сроки поджимают. Помогите кто нибудь!!!!!!!!!!!!!!!!!!!!!!
ну так что сложного посчитать сколько там в файле этих вариантов и сгенерировать вывод случайных чисел, а по числу уже смотреть, какой вопрос под этим номером выводить..
Если бы я мог это сделать я бы и просить не стал. Я в Паскале полный ноль. Ну если это так легко и просто то помогите если не трудно.
Тогда приведи полный код того,что ты используешь..
Всё что у меня есть это программа Volvo, ссылка как ты знаешь есть в этой теме.
У него в программе правильные ответы записываются числами. Мне нужно просто чтоб при выводе вариантов ответов они перемешивались случайным образом (2-5 типы). И всё вообщем-то.
Неужели никто не поможет... Помогите, работу послезавтра показывать надо!
Вечером (после 20-00 по GMT +2)... Раньше не вернусь...
Как и обещал - вот решение:
quest.pas ( 7.33 килобайт )
Кол-во скачиваний: 456
Оно работает (тестировал) со всеми вариантами вопросов, единственное, что не стал делать - это переводить это опять на русский, смотри, где есть изменения (я подскажу, изменения - в добавлении в самом начале типа TArrType, добавлена функция find_shuffle, изменена функция print_options, ну, и естественно во всех трех случаях - вопросы №2, №3, №5 /в четвертом порядок не важен/ изменилась обработка полученного от пользователя ответа...)
Можно было еще немного пошаманить и убрать совсем первый параметр в print_options, но это уже сам, если хочешь...
О терминологии:
Спасибо Volvo за помощь. Я написал модуль для твоей проги, но он чо то не работает
помогите пожалуйста ошибку найти.
Прикрепленные файлы
tyyy.rar ( 18.31 килобайт )
Кол-во скачиваний: 159
"Чо-то не работает" я не принимаю... говори конкретно, "Чо" у тебя не работает, и при каких условиях.
Я тестовый файл уже удалил, у меня все работало, а заново вводить даже десяток вопросов не хочу. Потому, что я тебе уже сказал выше: ты должен был сказать СРАЗУ, что ЭТО будет еще и разбиваться на модули. Ты молчал? Чего теперь тебе надо?
Прошу прощения что сразу не говорил о модуле. Мы тока прошли модули и
нам дали новое задание написать их для своих программ. Конкретно в TEST.pas
не работает get_quest(rec).
Ну пожалуйста помогите! Если бы я знал про модули, я бы сразу предупредил о них, но мне 4 дня назад сказали что теперь ещё и модуль подавай. Я ведь не прошу писать его за меня, я написал его. По книге писал, вроде верно делал. Но как говорится 1-й блин комом. Не могу точно сказать где именно ошибка, знал бы может сам бы исправил. В TEST.pas
не работает get_quest(rec) что-то не так с переменной.
Прога отличная! мне именно она и нужна! но в ней графики не хватает! кто может помогите! для второй части,где сам тест проводится, там бы интерфейсик, чтоб самому не печатать ответы а просто отмечать мышкой иили клавиатурой. помогите,очень надо!
ну неужели никто не поможет....
Эта программа больше не поддерживается... Она изначально создавалась такой, какая она сейчас, и изменять ее интерфейс полностью на графический я не буду.
Тема закрыта.