Помощь - Поиск - Пользователи - Календарь
Полная версия: Чтение с Txt файла по метке
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Foxett
Здравствуйте! Вот столкнулся с такой проблемой! Работаю в Делфи 7! Значит задача какова написать тест в который читает из файла вопросы и задает их пользователю из другого файла читает ответы это всё должно делаться случайным образом! Самое главное что всё это должно именно через файлы делаться так как база вопросов и ответов должны обновляться при надобности! Вобщем не могу найти способа читать с файла строку точнее даже вопрос по метке то есть
1: -----------------
2: -----------------
И потом Рандом просто выбирает число от 1 до 50 и выводит вопрос или если у кого есть другие идеи реализации то пожалуйста помогите! Вообще рэндом же по идее может повторить вопрос а мне надо чтоб не повторялись! Жду ответов! Заранее спасибо за помощь!
volvo
To: Foxett
Делай типизированный файл:
Type
TQuestion = Record
s: string[255]; { вопрос }
End;
Var
f: File Of TQuestion;

И для перехода на нужный вопрос пользуйся Seek-ом... Или тебе надо с текстовыми файлами велосипед изобрести?

Насчет Random:
Var 
numbers: Set Of Byte;
X: Byte;
...
numbers := [];
For i := 1 To 50 Do
numbers := numbers + [i];

While ... Do Begin
Repeat
X := Random(50);
Until X in numbers; { вопросы повторяться не будут }
numbers := numbers - [X];

{
Здесь, собственно читаешь вопрос №X из файла
и делаешь с ним, что надо
}
End;


P.S. Перенести в "Дельфи"?
Foxett
Спасибо! Но по ходу дела рождаются новые вопросы! Я впервые с таким сталкиваюсь просто! На счет типизированого файла можно подробнее? А то я не совсем понял как оно будет работать!
klem4
Использование типизированного файла дает преимущество в том, что можно осущесталять прямой доступ к i-й его записи с помощью seek, как ей пользоваться можешь прочитать на нешем FAQ . Для текстового файла возможность прямого доступа отсутствует. Вот еще банальный пример удобства использования типизированного файла

у тебя есть


type
TMatrix = array[1..10,1..10] of integer;
var
m : Tmatrix;
f : file of TMatrix;



после заполнения матрицы, для того чтобы сохранить ее в файле достаточно написать write(f, m); (а не делать это поэлементно)

далее можно с такойже легкостью прочитать матрицу из файла и работать с ней ... read(f,m);
volvo
Что именно непонятно? Как считать вопрос №X?
Var
f: File Of TQuestion;
Rec: TQuestion;
...
Seek(f, Pred(X)); { Отсчет ведется с 0, поэтому Pred }
Read(f, Rec);

Как записать обновленную базу данных? Пишешь маленькую программку (или процедуру):
Var Rec: TQuestion;

ReWrite(f);
For i := 1 To newN Do Begin { newN - число вопросов в новой базе }
{
Заносишь новые вопросы в строку S; кстати, их можно читать и из другого файла.
Эта процедура нужна только для того, чтобы записать их не в текстовый файл,
а в File Of TQuestion
}
ReadLn(s);
Rec.s := s;
Write(f, s);
End;

Это все только стандартными средствами Паскаля... Т.к. я не знаю, чем тебе разрешено пользоваться...
Romtek
Алгоритмов генерации неповторяющихся чисел я не знаю, но можно обойтись булевым массивом размером кол-ва вопросов. Каждый раз после генерации числа проверять в массиве, не генерировалось ли ранее.
С текстом проще работать через текстовые файлы, а не типизированные. Тогда нужно считать весь файл в память в массив структуры строк, а потом уже искать вопросы и ответы по индексам (генерируемым числам) этого массива.
Притом не стоит пренебрегать шифрованием текста, чтобы некоторые хитро-мудрые не подсмотрели результат.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.