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

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

Форум «Всё о Паскале» _ Задачи _ Неповторное считывание

Автор: John 8.06.2007 1:51

Рябета такая проблема. Я у меня в файл записаны вопросы и ответы
И при выводе он бывает считывает один и тот же вопрос (повторяет)
ТАк как это убрать?
вот так считывает и указатель на номер считывание ставит всегда в случайное положение, поэтому и повтор идет


randomize;
assign(f1, 'D:\BP\all\1.bin');
reset(f1);
n:=random(filesize(f1));
seek(f1,n);
read(f1, s1);
close(f1);


Автор: volvo 8.06.2007 2:10

Размер файла большой?

Если до 256 элементов, то заводи множество, и при установке позиции запоминай ее во множестве, а при генерации - пропускай варианты, которые уже были...

Автор: John 8.06.2007 2:19

Множества попробуем, спасибо
тогда придется использовать 2 множества
а насчет файла, вообще предполагается что больше 256 элементов
{------------------------}
посмотри пожалуйста, я просто в множествах не силен,а это последние действие к моему курсовику
множество задаю так


var
ms: set of 0..250;
begin
randomize;
assign(f1, 'D:\BP\all\1.bin');
reset(f1);
n:=random(filesize(f1));
while n in ms do n:=random(filesize(f1));
ms:=[n];
seek(f1,n);
read(f1, s1);
close(f1);
end;


Автор: мисс_граффити 8.06.2007 3:47

извращенный вариант: добавить к записи еще одно поле (логическое) с информацией о том, был ли элемент считан
проблема в том, что придется обнулять при завершении работы.
или можно завести отдельный файл, в котором в соответсвующем порядке будут записаны логические переменные....
или номера использованных вопросов (только искать долго будет.. а если по порядку - долго вставлять)
или сделать динамический список с номерами использованных ответов

Добавлено через 1 мин.
кстати, никогда не пробовала: может, массив множеств сделать? тогда можно будет хранить информацию о большом количестве вопросов.

Цитата
Размер файла большой? Если до 256 элементов, то заводи множество, и при установке позиции запоминай ее во множестве, а при генерации - пропускай варианты, которые уже были...

имхо, тут речь должна идти не о размере файла, а о количестве задаваемых за один запуск вопросов.

Автор: John 8.06.2007 3:49

а что с множеством

Автор: volvo 8.06.2007 3:57

Цитата
кстати, никогда не пробовала: может, массив множеств сделать?

Ты об этом: http://volvo71.narod.ru/faq_folder/set_type.htm#set_bigger ?



Добавлено через 1 мин.
Цитата
имхо, тут речь должна идти не о размере файла, а о количестве задаваемых за один запуск вопросов.
Правда? А что толку от количества задаваемых вопросов, если я первым же задаю вопрос №290... Запихнешь его номер во множество?

Автор: John 8.06.2007 4:00

народ так почему не работает
где ошибка


var
ms: set of 0..250;
begin
randomize;
assign(f1, 'D:\BP\all\1.bin');
reset(f1);
n:=random(filesize(f1));
while n in ms do n:=random(filesize(f1)); {вот тут наверно}
ms:=[n];
seek(f1,n);
read(f1, s1);
close(f1);
end;




Автор: volvo 8.06.2007 4:04

var 
ms: set of 0..250;
begin

ms := [];
randomize;
assign(f1, 'D:\BP\all\1.bin');
reset(f1);

// ... Здесь - какой-то цикл
repeat
n:=random(filesize(f1));
until not (n in ms);
ms:=ms + [n]; // <-- Вот тут...

seek(f1,n);
read(f1, s1);
// ... Конец цикла

close(f1);
end;

Автор: John 8.06.2007 4:07

благодарю вас всех, попробуем щас

Автор: мисс_граффити 8.06.2007 5:26

Если много вопросов, можно делать хотя бы так:


{проверяла в Делфи, TP нет под рукой}
var mas: array[0..1] of set of byte;
a: integer;
begin
a:=random(500); //в смысле, а - это номер твоего вопроса
include(mas[a div 255],a mod 255);
end;

почти хэш-таблица smile.gif)

если количество вопросов заранее неизвестно - массив не подойдет, придется динамическую структуру ваять.

Автор: Malice 8.06.2007 12:43

Цитата(мисс_граффити @ 8.06.2007 2:26) *

если количество вопросов заранее неизвестно - массив не подойдет, придется динамическую структуру ваять.

Тогда, как ты раньше правильно и сказала, лучше ориентироваться на кол-во задаваемых вопросов и заносить их в массив. Не так красиво проверка будет выглядеть, ну что ж..
ps а массив не с нуля ? smile.gif

Автор: мисс_граффити 8.06.2007 19:14

Цитата
а массив не с нуля

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

проходить по всему массиву? тогда уж лучше список... вставлять на "правильное" место - будет быстрее искаться.