Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2010, 22:41   #1
mifomen
Help, если смогу!
Пользователь
 
Регистрация: 14.09.2009
Сообщений: 55
По умолчанию Типизированный файл с натуральными числами. Числа, встречающиеся 1 раз переписать в другой файл [Паскаль]

В файле натуральные числа. [файл типизированный | integer]
Числа встречающиеся 1 раз переписать в другой файл...

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

Подкиньте идейку..
Я помог =Нажми, НА ВЕСЫ.
Почему форум не поддерживает spoiler & spoiler2 ?
Если я вам помог, не будьте скупым R409586472993
mifomen вне форума Ответить с цитированием
Старый 16.12.2010, 01:12   #2
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

самое просто наверное создать двухмерный массив,
считывать последовательно из файла числа и, если этого числа нет в массиве, то добавлять его, если есть, то увеличивать во втором столбце количество вхождений этого числа в файл.
потом в цикле пробегать по всем элементам массива и если во втором столбце написано что число попадалось один раз то записывать его во второй файл, иначе пропускать
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 16.12.2010, 08:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

можно и так, как предложил MadReason

А можно использовать связный список.
Т.к. это динамическая структура - то память под него будет выделяться по мере необходимости...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.12.2010, 10:01   #4
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Вы конечно правы, но по правилам нельзя читать вот так файл в память. А если он 20 гигов весит? Тут ни массив ни список не поможет. Так что самый надежный способ - сортировка.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 16.12.2010, 14:11   #5
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

а почему бы не читать файл блоками? а при сортировке файла в 20гигов будет слишком много обращений к диску, наверное медленно будет.

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

брать первый элемент в файле, пробегать по всем остальным элементам файла и искать совпадение, если найдено, то удаляем совпадения и сам элемент из файла. потом берем второй элемент файла и так далее
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 16.12.2010, 14:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

to Gambler

Цитата:
Сообщение от Gambler
Вы конечно правы, но по правилам нельзя читать вот так файл в память. А если он 20 гигов весит?
А типизированный файл вообще может быть больше 2 (или 4-х) ГБ?!

И давайте начнём с начала...
по каким правилам нельзя?

Абстрактно? Для любой задачи, любой файл нельзя читать в память?
Например, если у Вас исходный текст модуля в Delphi будет 20 Гб - он откроется в IDE ? (если интересно - можете проверить).
А если 20 Гб текстовый файл - Вы его в стандартном блокноте Windows откроете?

тем более, если речь идёт о учебной задаче.
Думаю, вполне можно допустить задать ограничение на размер файла.
Проверять и если файл больше заданного размера - извините, подвиньтесь...
Любая учебная задача, если в ней явно не оговорены лимиты и ограничения - может трактовваться так, как удобнее реализовать в данной ОС, в данном языке программирования ПРОГРАММИСТУ, решающему задачу.

Это раз.

Второе. Вы предлагаете отсортировать файл...
Вы готовы отсортировать типизированный файл, НЕ ЧИТАЯ его в память? (целиком, разумеется). Методами внешней сортировки владеете?..
я уже не говорю о затратах времени и сил.

и последнее.
Задача ЭЛЕМЕНТАРНО и без всяких ограничений на размер (кроме ограничений файловой системы и структур доступа к типизированным файлам, разумеется), но при этом крайне НЕЭФФЕКТИВНО (в плане производительности и загрузки диска) решается так:
Код:
заводим индекс (указатель в файле (начало - ноль).
Пока не конец файла
  Становимся по индексу (seek(f, i);)
  читаем очередной элемент.
  проходим в цикле от 1-го до последнего элемента файла. (исключая текущий элемент, конечно).
  Если нашли совпадение - переход на следущую итерацию цикла (break)
      если не нашли - пишем найденное значение в выходной файл

  Переходим на следующий по порядку элемент файла ( inc(индекс); )
конец цикла.
всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.12.2010, 19:28   #7
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

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

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 16.12.2010, 22:00   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Gambler
Не стоит мне про это рассказывать. на факт остается фактом: Файл может быть любого размера.
для того, чтобы решить задачу, нужно использовать подходящие инструменты.
А ничего универсально в мире не бывает.
И, кстати, файл "любого размера" быть не может...
Если Вы не в курсе, размер файла ограничен используемой файловой системой. (эти ужасные программисты сделали БАГ и теперь нельзя создать файл неограниченного размера )

и ещё, Вы не ответили, пытались ли Вы открыть 20 Гб текстовый файл в блокноте (опять таки нерадивые индийские программисты писали блокнот взяв исходники из учебной задачи) или 20 Гб исходный .PAS файл пытались открыть в IDE Delphi ?


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


ладно. я согласен с Вами - спорить тут незачем, всё равно Вы останетесь при своём мнении, а я — при своём..

p.s.
Цитата:
Да вы больше сил потратили что бы пост написать )))
да ну бросьте! Какие уж тут траты сил! да и времени не так уж и много это заняло: десятипальцевый слепой метод набора - рулез форева!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчитать серии (повторяющие числа в последовательности) и записать в типизированный файл bunny Помощь студентам 4 06.12.2011 15:48
записать дату натуральными числами Alina5545 Общие вопросы C/C++ 12 13.04.2010 22:03
C++. Прочитать файл и вывести в другой файл каждую N-ую строку Straiker Помощь студентам 3 15.12.2009 05:49