![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
не примут так
нужно с integer работать подскажите еще что-нибудь плз... |
|
#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. |