Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] Срочно помогите плиз найти ошибку в коде 

#1  20.04.10 18:31

[C++] Срочно помогите плиз найти ошибку в коде

Код: с++:

#include <iostream.h>
#include <conio.h>
#include <math.h>
 
void main()
{
double a,b,c,d,p,q,y1,y2,y3,r,z,D,f,v,u,w,x1,x2,x3;
int k;
clrscr();
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"c="; cin>>c;
cout<<"d="; cin>>d;
p=(1/3)*((3*a*c-b*b)/(3*a*a));
q=0.5*(((2*b*b*b)/(27*a*a*a))-((b*c)/(3*a*a))+d/a);
if (p==0)
 {
 y1=pow((-2*q),(1/3));
 y2=y1;
 y3=y1;
 k=0;
 }
else
{
 if (p!=0)
  {
  if (q>=0)
  r=sqrt(fabs(p));
  if(q<0)
  r=-sqrt(fabs(p));
  z=q/pow(r,3);
  }
 if (p<0)
  {
   D=q*q+p*p*p;
  if (D<=0)
   {
   f=acos(z);
   y1=-2*r*cos(f/3);
   y2=2*r*cos(M_PI/3-f/3);
   y3=2*r*cos(M_PI/3+f/3);
   k=0;
   }
  else
   {
   f=log(z+sqrt(z*z-1));
   y1=-2*r*cosh(f/3);
   u=r*cosh(f/3);
   v=sqrt(3)*r*sinh(f/3);
   k=1;
   }
  }
  else
   {
   f=log(z+sqrt(z*z+1));
   y1=-2*r*sinh(f/3);
   u=r*sinh(f/3);
   v=sqrt(3)*r*cosh(f/3);
   k=1;
   }
}
w=b/(3*a);
x1=y1-w;
if (k==0)
 {
 x2=y2-w;
 x3=y3-w;
 }
else
 {
 x2=u-w;
 x3=v;
 }
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2<<endl;
cout<<"x3="<<x3<<endl;
cout<<"k="<<k<<endl;
getch();
}


кароче при значении
a=2
b=3
c=1.5
d=-15.75



надо что бы x1=x2=x3 = 1.5 а у меня 0.5! Парни помогите плиз, а то бощка пухнет уже от этих уравнений и ветвлений!

Offline

#2  20.04.10 18:33

Re: [C++] Срочно помогите плиз найти ошибку в коде

вот где помогает TDD

Offline

#3  20.04.10 18:47

Re: [C++] Срочно помогите плиз найти ошибку в коде

Кранты.... я меняю

Код::

 y1=pow((-2*q),(1/3));

на

Код::

 y1=pow((-2*q),(1.0/3.0));

и во время исполнения вылетает ошибка....

Offline

#4  20.04.10 19:59

$up
Профиль

Re: [C++] Срочно помогите плиз найти ошибку в коде

double pow(x,y);
double x; возводимое число
double y; степень числа x

Если x отрицательное, а y не является целой, функция печатает сообщение об
ошибке DOMAIN в stderr, устанавливает errno в ERANGE и возвращает
либо положительное, либо отрицательное значение HUGE

Offline

#5  20.04.10 20:07

Re: [C++] Срочно помогите плиз найти ошибку в коде

1/3 не вернет 0.33, исправь на 1.0/3
Аналогично в других местах - делимое должно быть double, если я верно помню

Исправлено Muxa (20.04.10 20:08)

Offline

#6  20.04.10 21:53

Re: [C++] Срочно помогите плиз найти ошибку в коде

Вот у меня там Domain пишет)

Offline

#7  20.04.10 21:55

Re: [C++] Срочно помогите плиз найти ошибку в коде

парни помогите отладить плиз! У меня таблица есть щас выложу!

Offline

#8  20.04.10 21:58

Re: [C++] Срочно помогите плиз найти ошибку в коде

a    2.0    1.5    1.0    2.0
b    3.0    -3.0    4.0    -10.0
c    1.5    -7.5    -10.75    18.0
d    -15.75    9.0    7.5    -10.0
k    0    0    1    1
x1    1.5    -2.0    -6.0    1.0
x2    1.5    3.0    1.0    2.0
x3    1.5    1.0    0.5    1.0

Исправлено Yaha_KoD (20.04.10 21:59)

Offline

#9  20.04.10 22:54

$up
Профиль

Re: [C++] Срочно помогите плиз найти ошибку в коде

Код: cpp:

	double a,b,c,d,p,q,y1,y2,y3,r,z,D,f,v,u,w,x1,x2,x3;
	int k;
	cout<<"a="; cin>>a;
	cout<<"b="; cin>>b;
	cout<<"c="; cin>>c;
	cout<<"d="; cin>>d;
	p=(1./3.)*((3.*a*c-b*b)/(3.*a*a));
	q=0.5*(((2.*b*b*b)/(27.*a*a*a))-((b*c)/(3.*a*a))+d/a);
	if (p==0)
	{
		y1=pow((-2.*q),(1./3.));
		y2=y1;
		y3=y1;
		k=0;
	}
	else
	{
		if (p!=0)
		{
			if (q>=0)
				r=sqrt(fabs(p));
			if(q<0)
				r=-sqrt(fabs(p));
			z=q/pow(r,3.);
		}
		if (p<0)
		{
			D=q*q+p*p*p;
			if (D<=0)
			{
				f=acos(z);
				y1=-2.*r*cos(f/3.);
				y2=2.*r*cos(M_PI/3.-f/3.);
				y3=2.*r*cos(M_PI/3.+f/3.);
				k=0;
			}
			else
			{
				f=log(z+sqrt(z*z-1.));
				y1=-2.*r*cosh(f/3.);
				u=r*cosh(f/3.);
				v=sqrt(3.)*r*sinh(f/3.);
				k=1;
			}
		}
		else
		{
			f=log(z+sqrt(z*z+1.));
			y1=-2*r*sinh(f/3.);
			u=r*sinh(f/3.);
			v=sqrt(3.)*r*cosh(f/3.);
			k=1;
		}
	}
	w=b/(3.*a);
	x1=y1-w;
	if (k==0)
	{
		x2=y2-w;
		x3=y3-w;
	}
	else
	{
		x2=u-w;
		x3=v;
	}
	cout<<"x1="<<x1<<endl;
	cout<<"x2="<<x2<<endl;
	cout<<"x3="<<x3<<endl;
	cout<<"k="<<k<<endl;


p.s. Все константы, которые используются в твоих вычислениях должны быть типа double (с плавающей точкой),
иначе произойдёт неявное приведение к int и ты потеряешь дробную часть.

Исправлено $up (20.04.10 23:10)

Offline

#10  20.04.10 23:47

Re: [C++] Срочно помогите плиз найти ошибку в коде

$up,  ты.... незнаю! ГЕНИЙ! или я такой тупой!! Ты мне скажи там ошибок много было????  Или там все дело в плавающей точке, я просто не пойму как там так получилось  все! Спасибо огромное тебе!

Offline

#11  21.04.10 00:03

$up
Профиль

Re: [C++] Срочно помогите плиз найти ошибку в коде

ошибок не было, только точки поставил и проверил.

Offline

#12  21.04.10 08:55

Re: [C++] Срочно помогите плиз найти ошибку в коде

автор, лучше забей на программинг

Offline

#13  21.04.10 09:11

Re: [C++] Срочно помогите плиз найти ошибку в коде

эээ.... Почему? потому что я в нем неочень?

Offline

#14  21.04.10 15:18

Re: [C++] Срочно помогите плиз найти ошибку в коде

я тебе написал, где ошибка, но ты это проигнорил... ждал когда за тебя код исправят?
если такую маленькую прогу не можешь отдебажжить, то дальше будет гораздо хуже

Offline

#15  21.04.10 18:19

Re: [C++] Срочно помогите плиз найти ошибку в коде

Ты не так понял) Я исправлял код так как ты написал, но все равно была ошибка типа DOMAIN поэтому я и не стал дальше делать, а потом там оказалось надо было плавающую точку сделать и все!

Offline

#16  23.04.10 10:49

Re: [C++] Срочно помогите плиз найти ошибку в коде

Если используешь типы float или double точку ставить надо,и это не секрет для всех)Если ты только начал прогать, то ладно, простительно, ну а если нет-то бросай это дело))

Offline

Программирование и БД » [C++] Срочно помогите плиз найти ошибку в коде 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.522 сек.
Выполнено 14 запросов.