Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по типизированным файлам. [D7]


ЭлЭрДжи ©   (2010-01-03 13:31:00) 

Задача: найти в файле типа 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;


12   (2010-01-05 08:52:00) [1]

2Плохиш
поиск шаблона во множестве
какая разница какого и в каком


Anatoly Podgoretsky   (2010-01-04 19:41:00) [2]

> Плохиш  (04.01.2010 18:08:16)  [16]

При таком объявление, в файле тоже Integer, что туда не пихай, единственная проблема - длина файла должна быть кратна 4


Плохиш   (2010-01-04 18:08:00) [3]


> Anatoly Podgoretsky ©   (04.01.10 18:01) [15]
>
> > Плохиш  (04.01.2010 17:54:13)  [13]
>
> Структура приведена file of Integer;

Это приведена жалаемая структура, а ждём ту, которая действительно в файле.

> 12 ©   (04.01.10 17:55) [14]

Какое отношение строки имеют к file of Integer?


Anatoly Podgoretsky   (2010-01-04 18:01:00) [4]

> Плохиш  (04.01.2010 17:54:13)  [13]

Структура приведена file of Integer;


12   (2010-01-04 17:55:00) [5]

http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8


Плохиш   (2010-01-04 17:54:00) [6]


> Германн ©   (04.01.10 17:40) [12]

> Ты не обратил внимание на else

Хм, действительно :-(
[1], [3], [11] снимаются. Будем ждать структуру файла.


Германн   (2010-01-04 17:40:00) [7]


> если считанное значение отличается от k, выходит из цикла
> и перезаписывает это значение старым k

Ты не обратил внимание на else


Плохиш   (2010-01-04 17:32:00) [8]


> Германн ©   (04.01.10 17:15) [10]

Первое значение файла он читает в i, следующее значение читает в k, если последовательность, то он каждое следующее значение читает в iи сравнивает с k, если считанное значение отличается от k, выходит из цикла и перезаписывает это значение старым k, после чего идёт в начало, считывает в k и далее. Вопрос, куда делось последнее считанное в цикле repeat значение i?


Германн   (2010-01-04 17:15:00) [9]


> Плохиш ©   (04.01.10 17:02) [8]
>
> Замени это барахло
>
> >      repeat
> >        Read(f,i);   // записываем в i последующие эл-ты
> > до конца серии
> >      until not(i=k);
> >
>
> на
>
> while not eof(f) and (i=k) do read(f, k);
>
>
> PS. В своём коде ты теряешь первое изменившееся значение.
>

Ничего там не теряется. Нет только проверки на конец файла.


Не занят   (2010-01-04 17:05:00) [10]

Видимо файл ОЧЕНЬ длинный :(


Плохиш   (2010-01-04 17:02:00) [11]


> ЭлЭрДжи   (03.01.10 15:12) [2]
>
>

Замени это барахло

>      repeat
>        Read(f,i);   // записываем в i последующие эл-ты
> до конца серии
>      until not(i=k);
>

на

while not eof(f) and (i=k) do read(f, k);


PS. В своём коде ты теряешь первое изменившееся значение.


Плохиш   (2010-01-04 16:57:00) [12]


> Германн ©   (04.01.10 16:52) [6]

Так там вообще " По видимому, код не работает" ;-) Такоя философская ветка...


> ЭлЭрДжи   (03.01.10 15:12) [2]

Пример файла приведи.


Германн   (2010-01-04 16:52:00) [13]


> Плохиш ©   (04.01.10 16:49) [5]

Тогда была бы ошибка. А ее пока нет :)


Плохиш   (2010-01-04 16:49:00) [14]


> Германн ©   (04.01.10 03:06) [4]

Хм, неужели ты как и автор считаешь, что при выполнении его цикла repeat, файл не может неожиданно закончиться?


Германн   (2010-01-04 03:06:00) [15]


> ЭлЭрДжи   (03.01.10 13:31)

На первый взгляд алгоритм правильный. Может проблема с файлом? Ты сам его записывал? (Редко где можно найти file of Integer);


Плохиш   (2010-01-04 00:48:00) [16]


> в k читаю все следующие до тех пор пока они не равны будут.
>  

Врать не надо.


ЭлЭрДжи   (2010-01-03 15:12:00) [17]

я прочитал 1й символ, потом следующий. потом, если они равны, в k читаю все следующие до тех пор пока они не равны будут. Если они не равны опять присваиваю тот новый символ i и остальные читаю в k.
Тут проблема не в алгоритме, а в том, что я даже если вывожу элемент i куда нибудь, он мне выводит 859059252 с k также. Переменная kolvo нулевая. Может я неправильно по символам читаю?


Плохиш   (2010-01-03 14:00:00) [18]


>  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;
>

Начал читать в k следующие элементы, вот и продолжай их читать в k и сравнивать с i. А то в этом коде всего три строки отвечающие логике поставленной задачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо