Помощь - Поиск - Пользователи - Календарь
Полная версия: Запись в файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
John
Привет ребята выручайте. У меня курсовик игра "о счастливчик". Я не могу написать
продедуру(функцию, незнаю) которая бы вводила в графическом режиме вопросы и записывала
их в файл:
1. В начале появляется прямоугольник в котором выбирается уровень сложности вопросов. Если
пользователь введет цифру 1 значит должен активироваться 1 файл( так и с цифро 2 -- актив. 2
файл, 3 -- актив. 3 файл).
2. Потом пользователь нажимает клавишу и появляется окно для ввода вопроса (все идет в
графическом режиме). И после ввода вопроса, нажимаем любую клавишу и этот вопрос
записывается в файл.
3. Потом после ввода вопроса пользователь нажимает клавишу и появляется окно для ввода
правильного ответа. И после ввода ответа, нажимаем любую клавишу и этот ответ записывается
в файл.
4. И так для 3 не правильных ответов.


Причем ввод идет в графическом режиме(тоесть нада продедура ввода текста в граф. режим).
Моя проблема в том что я не понимаю как записать и куда все эти вопросы( а их может быть много) и
ответы. И что бы при случайном выводе вопроса в графический режим ответы(и не правильные
ответы) тоже должны совпадать с этим вопросом).
volvo
Ты начинаешь не с того, с чего нужно начинать... Напиши сначала программу, которая будет стабильно работать в текстовом режиме, безо всяких финтифлюшек и рюшечек... А вот когда она заработает, тогда поменять процедуру ввода с текста на графику + изменить внешний вид интерфейса - дело получаса...

Цитата
Моя проблема в том что я не понимаю как записать и куда все эти вопросы
В файлы, куда ж еще?

type
tquest = record
question: string[50];
answers: array[1 .. 4] of string[30];
right_answer: byte;
end;


и создавай файл:
var f_in: file of tquest;
John
как их связать чтобы при выводе вопроса нужные ответы выводились. И right_answer: byte это зачем???
volvo
Читаешь из файла запись полностью, в ней сразу будут содержаться И вопрос И 4 варианта ответа... Вот их и выводи на экран.

Цитата
И right_answer: byte это зачем???
То есть, тебе не обязательно знать, КАКОЙ из ответов правильный? Вот тут будет храниться номер правильного ответа из 4-х приведенных вариантов.
мисс_граффити
Цитата
как их связать чтобы при выводе вопроса нужные ответы выводились.

они ж уже связаны в запись.
то есть тебе надо сделать
var zap: tquest;
...
writeln(zap.question);
for i:=1 to 4 do
writeln(zap.answers[i]);

John
мисс_граффити все так и делаю. Подскажите еще как несколько вопросов записать, а то они у меня один на другой накладываются..???
мисс_граффити
blink.gif
у меня ничего ни на что не накладывается
показывай, как делаешь
John
 
type
Tvopros=record
question: string;
answer: array [1..4] of string[30];
ranswer: byte;
end;

var
s1:Tvopros;
f1: file of Tvopros;
f2: file of Tvopros;
f3: file of Tvopros;
ch:char;

procedure vvod1; {ввод вопросов для 1 файла}
var
i:integer;
begin
writeln('Question???');
readln(s1.question);
readkey;
for i:=1 to 4 do
begin
writeln('answer', i);
readln(s1.answer[i]);
end;
assign(f1, 'D:\all\1.bin');
reset(f1);
write(f1, s1);
close(f1);
end;

procedure out; {процедура вывода вопросов и ответов}
var
i:integer;
begin
assign(f1, 'D:\all\1.bin');
reset(f1);
read(f1, s1);
writeln(s1.question);
for i:=1 to 4 do
writeln(s1.answer[i]);
end;



Да, еще если записано много вопросов как вывести любой из этого списка вопрос??? И подскажите как ranswer: byte работать куда это поместить??
volvo
Стоп... Ты что, для ввода КАЖДОГО вопроса используешь vvod1? Там же у тебя Reset... Само собой все вопросы будут писаться в первую запись... Надо в основной программе открыть файл, а в процедуре никаких Reset чтоб не было...
John
Цитата
Стоп... Ты что, для ввода КАЖДОГО вопроса используешь vvod1? Там же у тебя Reset... Само собой все вопросы будут писаться в первую запись... Надо в основной программе открыть файл, а в процедуре никаких Reset чтоб не было...

Не понял??? blink.gif
volvo
Скажем, так:

var
f1: file of Tvopros;
...

procedure vvod1; {ввод вопросов для 1 файла}
var
i:integer;
begin
write('Question???'); readln(s1.question);
readkey;
for i:=1 to 4 do
begin
write('answer', i, ': '); readln(s1.answer[i]);
end;
write(f1, s1)
end;

{ Основная программа: }
...
{ Открыл файл }
assign(f1, 'D:\all\1.bin');
reset(f1);

for i := 1 to 20 do begin
vvod1; { Вводишь 20 вопросов }
end;

{ Ввод окончен - файл можно закрыть }
close(f1);
...


Кстати, теперь можно выбрать случайный вопрос из файла очень просто:
n := random(filesize(f1));
seek(f1, n);
read(f1, s1);
John
А как сделать чтобы если вопрос раньше выводился то потом он не выводился???
Я так понимаю, что если номер вопроса будет равен предыдущему номеру выведенного вопроса, то тогда надо вывести другой вопрос. Только как это записать???
Tan
Я бы сделал массив булинов размером с количество вопросов. В моём компиляторе все элементы массива изначально принимаю значения False.
n := random(filesize(f1));
If ms[n + 1] = False then
begin
seek(f1, n);
read(f1, s1);
ms[n + 1] := True;
end else writeln ('Vopros uzhe bil');
John
Цитата
Я бы сделал массив булинов размером с количество вопросов

Это как??

ms: array [0..{максимальное количество вопросов}] of boolean;
volvo
Почему с 1? Индексация в файле начинается с 0, здесь тоже надо бы с нуля...
John
Опять с этими вопросами, как сделать так что бы эти вопросы блокировались после вывода. Просто как посоветовал Tan немного не то, надо что после того как вывелся вопрос, он блокировался до нового запуска..
Tan
ну возьми так как я тебе советовал только после else не выводи сообщение о том, что вопроса нет а так :
 else continue; 
то есть ничего не изменится и программа продолжит работу, организуй цикл.
John
Цитата
поменять процедуру ввода с текста на графику

Можете помочь.

Если использовать эту запись то для ввода я использую


procedure vvod;
var
s:string;
x,y:integer;
begin
s:='';
x:=72;
y:=88;
repeat
ch:=readkey;
case ch of
#0:
begin
ch:=readkey;
end;
#13:;

#8: if length(S)>0 then
begin
bar(x,y, x+textwidth(s), y+textheight(s));
s[0]:=chr(length(s)-1);
outtextxy(x, y, s);
end;
else
begin
s:=s+ch;
outtextxy(x,y, s);
end;
end;
until ch=#13;
end;




А как это связать с предыдущим???
John
Люди как сделать, помогите! blink.gif blink.gif blink.gif blink.gif ПОЖАЛУЙСТА.
John
Народ скажите тут мы в записи объявляли right_answer для того что знать правильный ответ. Так вот что надо присвоить right_answer
Допустим

var
s1: Tquestion;
begin
s1.right_answer:=???????????


Что надо написать???
John
Че сложно ответить???
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.