![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Задача: найти в файле типа 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
|
||||
|
||||
![]() Просто пиши это и все! Чтоб читать что то из строки - сперва надо чтоб строка сушествовало....
Код:
var f:textfile; |
#3
|
|||
|
|||
![]() задача была на типизированный именно... Никак нельзя посимвольно из файла Integer читать?
|
#4
|
||||
|
||||
![]() Код:
var f:file of byte; i,k,kolvo:byte; Нет ничего не возможного. Вопрос только во времени... |
#5
|
|||
|
|||
![]() не примут так
![]() ![]() |
#6
|
||||
|
||||
![]() залей сюда хотябы файл которую ты собираешься читать
Нет ничего не возможного. Вопрос только во времени... |
#7
|
|||
|
|||
![]() Все гораздо проще.
Читай сначала в массив, потом обработай данные в массиве и потом уже сохрани результат. У тебя условие: Тебе надо считать некоторое кол-во троек целых чисел, обработать их определенным образом, потом сохранить результат. Я бы деле так: Код:
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
|
||||
|
||||
![]() Так попробуйте:
Код:
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. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |