Помощь - Поиск - Пользователи - Календарь
Полная версия: Неповторное считывание
Форум «Всё о Паскале» > 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
мисс_граффити
Цитата
а массив не с нуля

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

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