Помощь - Поиск - Пользователи - Календарь
Полная версия: Неповторное считывание
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
John
Рябета такая проблема. Я у меня в файл записаны вопросы и ответы
И при выводе он бывает считывает один и тот же вопрос (повторяет)
ТАк как это убрать?
вот так считывает и указатель на номер считывание ставит всегда в случайное положение, поэтому и повтор идет

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

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

Если до 256 элементов, то заводи множество, и при установке позиции запоминай ее во множестве, а при генерации - пропускай варианты, которые уже были...
John
Множества попробуем, спасибо
тогда придется использовать 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;

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

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

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

имхо, тут речь должна идти не о размере файла, а о количестве задаваемых за один запуск вопросов.
John
а что с множеством
volvo
Цитата
кстати, никогда не пробовала: может, массив множеств сделать?

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



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

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
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
благодарю вас всех, попробуем щас
мисс_граффити
Если много вопросов, можно делать хотя бы так:

{проверяла в Делфи, 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 2:26) *

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

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

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

проходить по всему массиву? тогда уж лучше список... вставлять на "правильное" место - будет быстрее искаться.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.