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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2010, 20:07   #1
ЭлЭрДжи
Новичок
Джуниор
 
Регистрация: 03.01.2010
Сообщений: 2
По умолчанию Типизированные файлы (Delphi)

Задача: найти в файле типа integer кол-во серий повторяющихся эл-тов.
Т.е. как я понимаю, он должен брать 2 числа, сравнивать, увеличивать кол-во серий если они равны и не переходить к следующему увеличению пока последующие символы также равны этому, т.е. длится одна серия. По видимому, код не работает уже при побайтовом чтении, помогите, плз

Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  f:file of Integer;
  i,k,kolvo:Integer;
begin
  AssignFile(f, dlgOpen1.FileName);
  Reset(f);
  read(f,i);  //читаем 1й символ
  kolvo:=0;
  while not Eof(f) do      // до конца файла
  begin
    read(f,k); // читаем i+1 символ
    if i=k then 
    begin
      kolvo:=kolvo+1; //увеличиваем кол-во, если они равны
      repeat
        Read(f,i);   // записываем в i последующие эл-ты до конца серии
      until not(i=k);
    end
    else
    i:=k; //если не равны, присвоим i значение i+1 и цикл заново
  end;
  ShowMessage(IntToStr(kolvo));
end;


Тут проблема не в алгоритме, а в том, что я даже если вывожу элемент i куда нибудь, он мне выводит 859059252 с k также. Переменная kolvo нулевая. Может я неправильно по символам читаю?
ЭлЭрДжи вне форума Ответить с цитированием
Старый 04.01.2010, 08:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

сразу могу сказать,
алгоритм имеет гарантированную ошибку!
когда Вы внутри цикла крутите ещё один цикл чтения:
Код:
    repeat
        Read(f,i);   // записываем в i последующие эл-ты
где здесь проверка на окончание файла?! вот чтение и срубается по ошибке (чтение за пределом файла)

да и
read(f,i); //читаем 1й символ
тоже даст ошибку, если файл пуст!



p.s. я уже молчу о том, что если файл открыли, то его очень желательно закрыть через CloseFile(f);

вот решение: (вроде бы всё понятно )
Код:
var
  f:file of Integer;
  i,k,kolvoSeria, kolvo:Integer;
  indx : integer;
begin
  AssignFile(f, 'test0.bin');
  Reset(f);
  indx := 0;
  kolvo:=0;
  kolvoSeria := 1;
  while not Eof(f) do      // до конца файла
  begin
    inc(indx);
    if indx = 1 then
      //читали 1й символ - просто запомним его в k
      read(f,k)
    else begin
      read(f,i); // читаем i+1 символ
      if i=k then
        //увеличиваем кол-во в серии, если они равны
        inc(kolvoSeria)
      else
        // конец серии
        begin
          // если были повторы, посчитаем эту серию..
          if kolvoSeria > 1 then inc(kolvo);
          kolvoSeria := 1;
          k:= i;
        end;
    end
  end;
  // отработаем ситуацию, если серией заканичивается файл
  if kolvoSeria > 1 then inc(kolvo);

  ShowMessage('Всего серий повторяющихся чисел: '+IntToStr(kolvo));
end;

Последний раз редактировалось Serge_Bliznykov; 04.01.2010 в 09:29.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Типизированные файлы qwertytol Помощь студентам 2 02.06.2009 08:44
Типизированные файлы Ddr Общие вопросы Delphi 11 27.04.2009 20:38
Delphi. Типизированные/нетипизированные Файлы. dzhI Общие вопросы Delphi 7 11.02.2009 12:18
Типизированные файлы и Delphi Polina Помощь студентам 8 12.12.2007 18:40