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

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

Форум «Всё о Паскале» _ Задачи _ Запись в файл

Автор: John 30.04.2007 2:43

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


Причем ввод идет в графическом режиме(тоесть нада продедура ввода текста в граф. режим).
Моя проблема в том что я не понимаю как записать и куда все эти вопросы( а их может быть много) и
ответы. И что бы при случайном выводе вопроса в графический режим ответы(и не правильные
ответы) тоже должны совпадать с этим вопросом).


Прикрепленные файлы
Прикрепленный файл  file.PAS ( 2.3 килобайт ) Кол-во скачиваний: 266

Автор: volvo 30.04.2007 17:23

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

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

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


и создавай файл:
var f_in: file of tquest;

Автор: John 30.04.2007 18:20

как их связать чтобы при выводе вопроса нужные ответы выводились. И right_answer: byte это зачем???

Автор: volvo 30.04.2007 20:25

Читаешь из файла запись полностью, в ней сразу будут содержаться И вопрос И 4 варианта ответа... Вот их и выводи на экран.

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

Автор: мисс_граффити 30.04.2007 20:40

Цитата
как их связать чтобы при выводе вопроса нужные ответы выводились.

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


Автор: John 30.04.2007 22:48

мисс_граффити все так и делаю. Подскажите еще как несколько вопросов записать, а то они у меня один на другой накладываются..???

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

blink.gif
у меня ничего ни на что не накладывается
показывай, как делаешь

Автор: John 1.05.2007 1:50

 
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 1.05.2007 1:54

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

Автор: John 1.05.2007 2:11

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

Не понял??? blink.gif

Автор: volvo 1.05.2007 2:19

Скажем, так:

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 1.05.2007 19:14

А как сделать чтобы если вопрос раньше выводился то потом он не выводился???
Я так понимаю, что если номер вопроса будет равен предыдущему номеру выведенного вопроса, то тогда надо вывести другой вопрос. Только как это записать???

Автор: Tan 1.05.2007 19:23

Я бы сделал массив булинов размером с количество вопросов. В моём компиляторе все элементы массива изначально принимаю значения 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 1.05.2007 20:30

Цитата
Я бы сделал массив булинов размером с количество вопросов

Это как??

ms: array [0..{максимальное количество вопросов}] of boolean;

Автор: volvo 1.05.2007 20:40

Почему с 1? Индексация в файле начинается с 0, здесь тоже надо бы с нуля...

Автор: John 2.05.2007 22:46

Опять с этими вопросами, как сделать так что бы эти вопросы блокировались после вывода. Просто как посоветовал Tan немного не то, надо что после того как вывелся вопрос, он блокировался до нового запуска..

Автор: Tan 2.05.2007 22:58

ну возьми так как я тебе советовал только после else не выводи сообщение о том, что вопроса нет а так :

 else continue; 
то есть ничего не изменится и программа продолжит работу, организуй цикл.

Автор: John 3.05.2007 4:02

Цитата
поменять процедуру ввода с текста на графику

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

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


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 4.05.2007 22:29

Люди как сделать, помогите! blink.gif blink.gif blink.gif blink.gif ПОЖАЛУЙСТА.

Автор: John 14.05.2007 20:41

Народ скажите тут мы в записи объявляли right_answer для того что знать правильный ответ. Так вот что надо присвоить right_answer
Допустим


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


Что надо написать???

Автор: John 17.05.2007 0:48

Че сложно ответить???