Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по типизированным файлам.   Найти похожие ветки 

 
ЭлЭрДжи   (2010-01-03 13:31) [0]

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


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


>  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. А то в этом коде всего три строки отвечающие логике поставленной задачи.


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

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


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


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

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


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


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

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


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


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

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


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


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

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


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


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

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


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

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


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


> ЭлЭрДжи   (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 17:05) [9]

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


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


> Плохиш ©   (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:32) [11]


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

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


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


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

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


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


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

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

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


 
12 ©   (2010-01-04 17:55) [14]

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


 
Anatoly Podgoretsky ©   (2010-01-04 18:01) [15]

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

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


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


> 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 19:41) [17]

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

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


 
12 ©   (2010-01-05 08:52) [18]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
2-1261998166
citizen
2009-12-28 14:02
2010.03.07
Дескрипторы дочерних окон


2-1262706738
Zalm
2010-01-05 18:52
2010.03.07
Работа с IStorage


15-1260399563
wl
2009-12-10 01:59
2010.03.07
Линукс - зачем?


2-1262284745
Zimmin
2009-12-31 21:39
2010.03.07
Как упростить ввод повторяющихся записей? ADO+Access


15-1261387411
Юрий Зотов
2009-12-21 12:23
2010.03.07
Регулярные выражения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский