Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Работа с файлами 
:(
    Опции темы
borjomi
Дата 1.3.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Помогите с прогой. smile  
Заполнить файл F целыми числами, полученными с помощью генратора случайных чисел. Из файла F получить файл G, исключив повторные вхождения чисел. Порядок следования чисел сохранять. 
PM MAIL   Вверх
Kuvaldis
Дата 1.3.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



borjomi, 
Каковы размеры файлов? От этого зависит сложность программы.  Если размеры не велики, то существуют способы получения РАЗЛИЧНЫХ псевдослучайных чисел без появления дубликатов


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
FireSnake
Дата 1.3.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 15.9.2006
Где: Украина, Донецк

Репутация: нет
Всего: 1



Код

program generator;

const n=10000;{количество генерируемых элементов}
var x,kol,temp,count,i:integer;
    a:array[1..maxint]of shortint;{массив меток, если a[i]=0, значит числа  i не было, если a[i]=1 знач число i было}
begin
    assign(output,'f.dat'); {перенапрявляем поток вывода в этот файл}
    rewrite(output);{открываем файл f.dat для записи предварительно все удалив}

    randomize; {задаем рандомность}
    writeln(n); 
    for i:=1 to n do
    begin
         x:=random(maxint);{генерим случайное число  диапазона integer(кажись от 0 до 32756)}
         write(x,' ');
    end;
    close(output); {закрываем файл}

    assign(input,'f.dat'); {перенапрявляем поток на считывание с этого  файла}
    reset(input); {открываем для чтения}
    assign(output,'g.sol'); {связываем поток вывода с файлом g.sol}
    rewrite(output); {удаляем его содержимое перед записью}

    readln(kol); {считываем количество элемнетов в файле}
    count:=0;
    for i:=1 to kol do
    begin
         read(temp);
         if a[temp]=0 then  {если такого элемента не было раньше, то мы почечаем что он был (a[temp]:=1) }
         begin
              a[temp]:=1;
              inc(count); {увеличиваем счетчик количества разных элементов}
         end;
    end;

    writeln(count);
    for i:=1 to maxint do if a[i]=1 then write(i,' '); {вывод в нужный нам файл}

    close(input);
    close(output);
end.


P.S. Описанный мною метод назваеться сортировкой подсчетом. Основной его плюс - это работа за время порядка O(N) т.е. за линейное. Минус - работает только для заранее известного диапазона значений (в данном случае это от 0 до 32756).Это значит что она требует памяти порядка N где N - это ширина диапазона Т.е. если мы захотим сгенеривать числа диапазона Longint 0...~2 147 000 000 , то сортировка подсчетом не покатит.

Добавлено @ 13:05 
Цитата

Порядок следования чисел сохранять.  

Вот голова садовая - не заметил.  В кусок кода:
Код

         if a[temp]=0 then  {если такого элемента не было раньше, то мы почечаем что он был (a[temp]:=1) }
         begin
              a[temp]:=1;
              inc(count); {увеличиваем счетчик количества разных элементов}
        end;

необходимо добавить строку 
Код

         if a[temp]=0 then  {если такого элемента не было раньше, то мы почечаем что он был (a[temp]:=1) }
         begin
              a[temp]:=1;
              inc(count); {увеличиваем счетчик количества разных элементов}
              b[count]:=temp;
         end;

а кусок:
Код

for i:=1 to maxint do if a[i]=1 then write(i,' '); {вывод в нужный нам файл}

заменить на 
Код

for i:=1 to count do write(b[i],' '); {вывод в нужный нам файл}

где b - массив, где хранятся все неповторяющиеся элементы из файла

Это сообщение отредактировал(а) FireSnake - 1.3.2007, 13:08
PM MAIL ICQ   Вверх
borjomi
Дата 15.3.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



а можно заменить OUTPUT и INPUT на что-нибудь другое. А томы это ещё не проходили, я этого не знаю. Когда меняю их на F и G - выдает ошибку 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.