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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2019, 21:03   #1
Космодемьян
 
Регистрация: 09.02.2019
Сообщений: 7
По умолчанию Написать процедуру удаления из из ТИПИЗИРОВАННОГО файла повторные вхождения одного и того же числа(паскаль)

Вообщем нельзя использовать более одного вложенного цикла)
Такая тема уже была, но там в коде 2 вложенных цикла, а мне так не надо
У меня программа получилась, но из-за неправильного алгоритма работает не правильно, помогите пожалуйста решить.
До меня не доходит как это сделать.
Я написал, и вот что-то типо этого должно быть, мне кажется я близок к решению
Код:
procedure del_repeat(name: string);
var
  f: t_file;
  a, b: integer;
  i, j, k, c: integer;
begin
  assign(f, name);
  reset(f);
  k := 0;
  c := 0;
  for i := 0 to filesize(f) - 2 do
  begin
    seek(f, i);
    read(f, a);
    for j := i + 1 to filesize(f) - 1 do
    begin
      k := j;
      seek(f, j);
      read(f, b);
      if a <> b then 
      begin
        k := k + 1;
        seek(f, k);
        write(f, b);
      end
      else c := c + 1;
    end;
  end;  
  seek(f, filesize(f) - c);
  truncate(f);
  close(f);
end;
Космодемьян вне форума Ответить с цитированием
Старый 16.02.2019, 21:15   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Во вложенном цикле нужно просто искать совпадение. Если нашел сразу Break. И оставить или нет запись в файле решать по выходу из вложенного цикла в зависимости от результата поиска
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2019, 21:20   #3
Космодемьян
 
Регистрация: 09.02.2019
Сообщений: 7
По умолчанию

Забыл, breake нельзя использовать.
breake не поможет если будет несколько повторов одного и того же числа, а мы выйдем из цикла
Входные данные: 1 2 3 2 2 3 3
Выходные должны быть: 1 2 3
Космодемьян вне форума Ответить с цитированием
Старый 16.02.2019, 21:24   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ты решаешь оставить или нет запись из внешнего цикла и не важно сколько там повторов в оставшейся части файла, важно есть они или нет. Нельзя Break использовать - не используй, считай все повторы. Глупое ограничение )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2019, 21:29   #5
Космодемьян
 
Регистрация: 09.02.2019
Сообщений: 7
По умолчанию

ну я примерно так и делал, только не могу допереть где исправить)
Вы не могли бы хоть примерно набросать код?)
Космодемьян вне форума Ответить с цитированием
Старый 16.02.2019, 21:30   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Космодемьян, постоянно дергать запись в файл - далеко не самое быстрое и эффективное решение.
Вы не рассматривали вариант прочитать файл целиком в память, там удалить повторы и результат сохранить в типизированный файл?
Или тут как раз стоит учебная задача, чтобы обучаемый научился "дёргать" файл?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.02.2019, 21:34   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Конечно дергать не хорошо, но если очень надо, то примерно так:
Код:
  c := 0;
  for i := 0 to filesize(f) - 1 do
  begin
    seek(f, i);
    read(f, a);
    k:=0;
    for j := i + 1 to filesize(f) - 1 do
    begin
      seek(f, j);
      read(f, b);
      if a = b then Inc(k);
    end;
    if k=0 then  begin
      seek(f, c);
      write(f, a);
      Inc(c);
    end;
  end; 
  seek(f, filesize(f) - c);
  truncate(f);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.02.2019, 21:40   #8
Космодемьян
 
Регистрация: 09.02.2019
Сообщений: 7
По умолчанию

Спасибо большое)
Космодемьян вне форума Ответить с цитированием
Старый 17.02.2019, 17:10   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

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

например, если в выходном файле задано 1 2 3 4 4 3 2 1
то в результирующем файле получим 4 3 2 1
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Используя очередь, написать процедуру или функцию,для вычисления среднего геометрического элементов типизированного файла (Паскаль BumBum4ik Помощь студентам 0 04.01.2014 18:12
Повторные вхождения слов Praud Помощь студентам 53 22.12.2013 18:03
процедура удаления данных из типизированного файла Mikheeva_Ksu Помощь студентам 0 21.06.2013 17:59
Написать процедуру удаления записи из файла. Pascal doomer74 Помощь студентам 0 08.03.2012 10:36
Дан файл, компоненты которого являются целыми числами. Преобразовать его, исключив повторные вхождения одного и того же Vikulyaa Помощь студентам 2 05.10.2011 19:15