Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2009, 08:09   #1
Chewing_dog
Новичок
Джуниор
 
Регистрация: 08.06.2009
Сообщений: 3
По умолчанию Почему после выполнения do-while, вложенного в if, инструкции дальше не выполняются?

Задача программы - поиск корня уравнения на [x1 ; x2]
при выполнении условия в первом if корень нормально отыскивается, в while не выполняется условие, программа выполняет последующие инструкции. Но при невыполнении условия в }while (abs(f)>k); все остананавливается.
Код:
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

main()
{
double a, b, c, d, e1, e2, e3;
double u, k;
double x;
double x1, x2;
double f, p;
double f1, f2;
double ft;
double pt;
double p1, p2;
double xp1, xp2;
double pu;
double fu;
double t;
double pp;
   cout<<"vvedite koefficienti [a, b, c, d, e1, e2, e3] v funkcii"<<endl;
   cout<<"y=a*(x+e1)+b*((x+e2)^2)+c*((x+e3)^3)+d"<<endl;
       cin>>a;
       cin>>b;
       cin>>c;
       cin>>d;
       cin>>e1;
       cin>>e2;
       cin>>e3;
   cout<<"vvedite oblast poiska kornya [x1 ; x2]"<<endl;
       cin>>x1;
       cin>>x2;
   cout<<"vvedite pogreshnost vichisleniya proizvodnoy i kornya"<<endl;
       cin>>u;
       u=abs(u);
       k=abs(u);
f1=a*(x1+e1)+b*pow((x1+e2),2)+c*pow((x1+e3),3)+d;
f2=a*(x2+e1)+b*pow((x2+e2),2)+c*pow((x2+e3),3)+d;
f=f1;
 if ((f1>0&&f2>0)||(f1<0&&f2<0))
  {xp2=x1;
 do
   {do
      {xp1=xp2;
       f=a*(xp1+e1)+b*pow((xp1+e2),2)+c*pow((xp1+e3),3)+d;
       p1=(a*(xp1+e1+u)+b*pow((xp1+e2+u),2)+c*pow((xp1+e3+u),3)+d-f)/u;
       xp2=xp1+100*u;
       f=a*(xp2+e1)+b*pow((xp2+e2),2)+c*pow((xp2+e3),3)+d;
       p2=(a*(xp2+e1+u)+b*pow((xp2+e2+u),2)+c*pow((xp2+e3+u),3)+d-f)/u;
      }while ((p1>0&&p2>0)||(p1<0&&p2<0));
          if (abs(p1)>k&&abs(p2)>k)
            {    x=xp1;
                 p=p1;
             do
               {if ((p>0&&p1>0)||(p<0&&p1<0))
                 {pt=p2;
                  t=xp2;
                 }else
                  {pt=p1;
                   t=xp1;
                  }
         x=x-p*(t-x)/(pt-p);
         f=a*(x+e1)+b*pow((x+e2),2)+c*pow((x+e3),3)+d;
         fu=a*(x+e1+u)+b*pow((x+e2+u),2)+c*pow((x+e3+u),3)+d;
         p=(fu-f)/u;
         pu=(a*(x+e1+2*u)+b*pow((x+e2+2*u),2)+c*pow((x+e3+2*u),3)+d-fu)/u;
         pp=(pu-p)/u;
               }while ((abs(p/pp)>k)||(abs(p)>k));
            }else
             {
               if (abs(a*(xp1+e1)+b*pow((xp1+e2),2)+c*pow((xp1+e3),3)+d)<k)
                {f=a*(xp1+e1)+b*pow((xp1+e2),2)+c*pow((xp1+e3),3)+d;
                }else
                  {f=a*(xp2+e1)+b*pow((xp2+e2),2)+c*pow((xp2+e3),3)+d;
                  }
             }
   }while (abs(f)>k); // вот именно в этом месте все выполнение и встает
  }else
    {x=x1;
             do
               {if ((f>=0&&f1>=0)||(f<0&&f1<0))
                 {ft=f2;
                  t=x2;
                 }else
                  {ft=f1;
                   t=x1;
                  }
         x=x-f*(t-x)/(ft-f);
         f=a*(x+e1)+b*pow((x+e2),2)+c*pow((x+e3),3)+d;
         p=(a*(x+e1+u)+b*pow((x+e2+u),2)+c*pow((x+e3+u),3)+d-f)/u;
               }while ((abs(f/p)>k)||(abs(f)>k));
    }
cout<<"x = "<<x<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Chewing_dog вне форума Ответить с цитированием
Старый 08.06.2009, 14:15   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

А не раньше встает?
цикл то пустой, он ничего не делает, или у этого неизвестного мне языка какой-то особый синтаксис...
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 08.06.2009, 16:59   #3
Chewing_dog
Новичок
Джуниор
 
Регистрация: 08.06.2009
Сообщений: 3
По умолчанию

Цитата:
А не раньше встает?
Останавливается имено после/при (не знаю) проверке
while (abs(f)>k);
т.к. прямо перед этой строчкой можно поставить
cout<<"x = "<<x<<endl;
и значение икса выведется (вполне адекватное)
Цитата:
цикл то пустой, он ничего не делает, или у этого неизвестного мне языка какой-то особый синтаксис...
Не знаю... самый обычный си, которому меня учили.
Стоп. Похоже дошел смысл высказывания.
там не
Код:
while ()
{
}
ипользовался, а
Код:
do
{
}while ()

Последний раз редактировалось Chewing_dog; 08.06.2009 в 17:09.
Chewing_dog вне форума Ответить с цитированием
Старый 09.06.2009, 06:44   #4
Chewing_dog
Новичок
Джуниор
 
Регистрация: 08.06.2009
Сообщений: 3
По умолчанию

Нашел.
Ошибка заключалась в оценке правильности найденного корня.
После отысканния предположительно корня, последняя проверка забраковывала результат (не достаточно близко f(x) к нулю), а т.к. дальше функция в бесконечность уходила процесс загинался.
Возник второй вопрос, есть еще оценки правильности, кроме
abs(f(x))<k && abs(f(x)/(df(x)/dx))<k && (abs((X(i-1)-Xi)=0) ??
Chewing_dog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение полученных данных после выполнения поиска Pirat_of Microsoft Office Access 1 14.05.2009 08:38
После ошибки продолжить работу дальше Shouldercannon Общие вопросы Delphi 2 21.04.2009 11:23
Button после выполнения ProgressBar }{oт@бь)ч Общие вопросы Delphi 7 25.01.2009 12:33
консоль закрывается сразу после выполнения последнего действия F4RR3LL Общие вопросы C/C++ 2 14.09.2008 20:43
Определить содержимое файла f после выполнения операторов Corwin88 Помощь студентам 11 02.06.2008 00:39