Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2010, 16:54
ЭлЭрДжи ЭлЭрДжи вне форума
Прохожий
 
Регистрация: 03.01.2010
Сообщения: 4
Репутация: 10
По умолчанию Задача на типизированные файлы

Задача: найти в файле типа 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 нулевая. Может я неправильно по символам читаю?

Последний раз редактировалось ЭлЭрДжи, 03.01.2010 в 16:57.
Ответить с цитированием
  #2  
Старый 03.01.2010, 20:00
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Просто пиши это и все! Чтоб читать что то из строки - сперва надо чтоб строка сушествовало....
Код:
var
 f:textfile;
Ответить с цитированием
  #3  
Старый 03.01.2010, 20:06
ЭлЭрДжи ЭлЭрДжи вне форума
Прохожий
 
Регистрация: 03.01.2010
Сообщения: 4
Репутация: 10
По умолчанию

задача была на типизированный именно... Никак нельзя посимвольно из файла Integer читать?
Ответить с цитированием
  #4  
Старый 03.01.2010, 21:43
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Код:
var
  f:file of byte;
  i,k,kolvo:byte;
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #5  
Старый 03.01.2010, 22:39
ЭлЭрДжи ЭлЭрДжи вне форума
Прохожий
 
Регистрация: 03.01.2010
Сообщения: 4
Репутация: 10
По умолчанию

не примут так нужно с integer работать подскажите еще что-нибудь плз...
Ответить с цитированием
  #6  
Старый 03.01.2010, 23:01
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

залей сюда хотябы файл которую ты собираешься читать
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #7  
Старый 03.01.2010, 23:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все гораздо проще.
Читай сначала в массив, потом обработай данные в массиве и потом уже сохрани результат.

У тебя условие:
Тебе надо считать некоторое кол-во троек целых чисел, обработать их определенным образом, потом сохранить результат.

Я бы деле так:

Код:
type
  TIntClass = class
    a, b, c : Integer;
    procedure ReadInts(F : File Of Integer);
    procedure DoWork;
    procedure SaveInts(F : File Of Integer);
  end;

procedure TIntClass.ReadInts(F : File Of Integer);
begin
  Read(F,a);
  Read(F,b);
  Read(F.c);
end;

procedure TIntClass.SaveInts(F : File Of Integer);
begin
  Write(F,a);
  Write(F,c);
end;

procedure TIntClass.DoWork;
begin
  b := a;
  a := c;
  c := b;
end;

var
  In, Out : File Of Integer;
  Buf : TIntClass;
begin
  Buf := TIntClass.Create;
  AssignFile(In,'InFile.dat');
  AssignFile(Out,'OutFile.dat');
  Reset(In);
  Rewrite(Out);
  While Not EOF(In) Do
    Begin
      Buf.ReadInts(In);
      Buf.DoWork;
      Buf.SaveInts(Out);
    End;
  CloseFile(In);
  CloseFile(Out);
  Buf.Free;
end;

Чтение, обработка и сохранение вынесены в отдельный класс - так просто удобнее. Все то же можно сделать и без класса.
Ответить с цитированием
  #8  
Старый 03.01.2010, 23:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Так попробуйте:
Код:
program Project37;

{$APPTYPE CONSOLE}

uses
  SysUtils,Dialogs;
Var
  f: File of Integer;
  i,PrevValue,Value,SeriesLen,Series: Integer;

begin
AssignFile(f, 'c:\IntFile.dat');

Rewrite(f);
for i := 1 to 100
do begin
   if Random(2) = 1
   then Value := Random(100);
   Write(f, Value);
   end;
Close(f);

Reset(f);
Read(f, PrevValue);
Series := 0;
while not Eof(f)
do begin
    Read(f,Value);
    if Value <> PrevValue
    then begin
           if SeriesLen > 1
           then Inc(Series);
           PrevValue := Value;
           SeriesLen := 1;
           end
    else begin
          Inc(SeriesLen);
          end;
    end;
Close(f);
ShowMessage(IntToStr(Series));
end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025