Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильный цикл 
:(
    Опции темы
ACMilian
Дата 22.9.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Объясните, пожалуйста, почему в цикле 
Код

 While v < v1 do
      begin
      New(i3);
      i3^.v := FloatToStr(v);
      i3^.hmm := IntToStr(hmm);
      GCalList.Add( i3 );
      v := v + hv;
      hmm := hmm + hhmm;
      end;

Первый раз от v до v1 оно пробегает правильно, а когда 
снова возвращается к этому циклу, то уже бежит не до <v1,
а до =v1?

Это сообщение отредактировал(а) ACMilian - 22.9.2006, 14:31
PM MAIL ICQ   Вверх
TheCetus
Дата 22.9.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: 2
Всего: 2



покажи весь код
PM MAIL   Вверх
ACMilian
Дата 22.9.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Код

 if s=d7 then
  begin
  Here:
  Readln( t, s );
  Here2:
  if s=d2 then
  begin
    CloseFile(t);
    AssignFile( t, fname );
    Reset(t);
    while not eof(t) do
    begin
      Readln(t,s);
      Readln(t,s);
      Here3:
      Readln(t,s);
      if s=d2 then
      begin
      New(i3);
      i3^.v := FloatToStr(v);
      i3^.hmm := IntToStr(hmm);
      GCalList.Add(i3);
      goto theend;
      end;
      begin
      hmm  := StrToInt(GetNextTerm( s )) * 10;
      v := StrToFloat(GetNextTerm( s ));
      Readln(t,s);
      if s=d2
      then
      begin
      New(i3);
      i3^.v := FloatToStr(v);
      i3^.hmm := IntToStr(hmm);
      GCalList.Add(i3);
      goto theend;
      end;
      hmm1 := StrToInt(GetNextTerm( s )) * 10;
      v1 := StrToFloat(GetNextTerm( s ));
      rv := v1-v;
      hv := rv / 10;
      rhmm := hmm1-hmm;
      hhmm := rhmm div 10;
      While v < v1 do
      begin
      New(i3);
      i3^.v := FloatToStr(v);
      i3^.hmm := IntToStr(hmm);
      GCalList.Add( i3 );
      v := v + hv;
      hmm := hmm + hhmm;
       end;
      goto here3;
      end;
    end;
  end;
  while not eof(t) do
   begin
   begin
    hmm  := StrToInt(GetNextTerm( s )) * 10;
    v := StrToFloat(GetNextTerm( s ));
    Readln(t,s);
    if s=d2
    then
    goto here2;
    hmm1 := StrToInt(GetNextTerm( s )) * 10;
    v1 := StrToFloat(GetNextTerm( s ));
    rv := v1-v;
    hv := rv / 10;
    rhmm := hmm1-hmm;
    hhmm := rhmm div 10;
    While v < v1 do
    begin
     New(i3);
     i3^.v := FloatToStr(v);
     i3^.hmm := IntToStr(hmm);
     GCalList.Add( i3 );
     v := v + hv;
     hmm := hmm + hhmm;
     end;
    goto Here;
   end;
  end;
 end;

Вот код...
PM MAIL ICQ   Вверх
Yanis
Дата 22.9.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(ACMilian @  22.9.2006,  15:52 Найти цитируемый пост)
Вот код... 

smile
Жуть, а не код. Ты сам то в нём разбираешься?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ACMilian
Дата 22.9.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Разбираюсь smile, ведь я его писал. 
Ну чего там может так глючить? Первый раз всё проходит правильно, а 
потом для цикла видите ли v(0.0123) не равно v1(0.0123) и цикл идёт ёще на один заход...
PM MAIL ICQ   Вверх
Romikgy
Дата 22.9.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



а дебагом не пробовал?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ACMilian
Дата 22.9.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Извиняюсь, я новичок. А дебагом это как?, я пошагово смотрю.
PM MAIL ICQ   Вверх
Romikgy
Дата 22.9.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(ACMilian @  22.9.2006,  14:21 Найти цитируемый пост)
я пошагово смотрю. 

и что видишь ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ACMilian
Дата 22.9.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



То что в первый раз, когда v становится равным v1, цикл дальше не идёт,
потом переход на следующую строку. Снова приходим к этому циклу:
Код

 While v < v1 do
    begin
     New(i3);
     i3^.v := FloatToStr(v);
     i3^.hmm := IntToStr(hmm);
     GCalList.Add( i3 );
     v := v + hv;
     hmm := hmm + hhmm;
     end;

когда v становится равным v1...цикл пробегает ещё один раз и только на следующий раз, когда v уже больше v1 цикл прекращается.
Ничего не понимаю..
PM MAIL ICQ   Вверх
Romikgy
Дата 22.9.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



дык пошагово и посмотри что есть в переменых v & v1


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ACMilian
Дата 22.9.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Так я и говорю, что в них два одинаковых для человека числа 0.0123 и 0.0123(Навожу курсор при пошаговом)... Я читал если над числами производишь какие-то действия мат. операции, то для компа они уже будут чуточку различаться, надо что-то типа epsilon применять...может знаете как?
PM MAIL ICQ   Вверх
comtat
Дата 22.9.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

Репутация: 3
Всего: 71



Цитата(ACMilian @  22.9.2006,  16:05 Найти цитируемый пост)
два одинаковых для человека числа 0.0123 и 0.0123

тогда
Код

While v < v1 do

и перестает выполняться 



--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
Romikgy
Дата 22.9.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(ACMilian @  22.9.2006,  15:05 Найти цитируемый пост)
epsilon

намного ниже чем 
Цитата(ACMilian @  22.9.2006,  15:05 Найти цитируемый пост)
0.0123

, и имхо эта трабла только в сравнении с нулем


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ACMilian
Дата 22.9.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Но вроде как epsilon можно самому описывать, типа const epsilon = 0.00001; или нет?
PM MAIL ICQ   Вверх
Romikgy
Дата 22.9.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(ACMilian @  22.9.2006,  15:16 Найти цитируемый пост)
Но вроде как epsilon можно самому описывать, типа const epsilon = 0.00001; или нет? 

имхо ты от темы уходишь, создай еще одну тему и спроси можно ли менять эпсилон


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.