Переделанный Код Наследование

vladis222

Active member
06.12.2011
31
0
#1
Здравствуйте, переделал вот код для программы с наследованием, работает, но когда вычисляет площадь, пишет: S=0,когда площадь не равна нулю. Помогите, понять, что за ошибка.
<!--shcode--><pre><code class='sq1'>#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<locale>

using namespace std;
const float PI=3.14f; //не знаю почему выделывается но можно вот так, компилятор хавает :)

class CPoint
{
protected:
float X,Y;
public:
CPoint(float iX,float iY);
~CPoint(){}
float GetX(); //Базовый класс-точка
float GetY();
};

class CCircle:public CPoint
{
private:
float Cx,Cy;
public:
CCircle(float iX,float iY,float iCx,float iCy);/*Класс-наследник Окружность*/
~CCircle(){}
float Square(float X, float Cx, float Y, float Cy);
};

CPoint::CPoint(float iX,float iY)
{
X=iX;
Y=iY;
}
float CPoint::GetX()
{
return X;
}
float CPoint::GetY()
{
return Y;
}
CCircle::CCircle(float iX, float iY,float iCx,float iCy):CPoint(iX,iY)
{
Cx=iCx;
Cy=iCy;
}
float CCircle::Square(float X,float Cx, float Y, float Cy)
{
float S;
S=PI*(pow((X-Cx),2)+pow((Y-Cy),2));
return S;
}
int main(void)
{
setlocale(LC_ALL,"Rus");
float X1,Y1,X2,Y2,C1x,C2x,C1y,C2y; float S1,S2,dif;
X1=Y1=X2=Y2=C1x=C2x=C1y=C2y=dif=0;
CCircle C1 = CCircle(X1,C1x,Y1,C1y);
CCircle C2 = CCircle(X2,C2x,Y2,C2y);
cout<<"Введите координаты точки первой окружности : ";
cin>>X1>>Y1;
cout<<"Введите координаты точки второй окружности : ";
cin>>X2>>Y2;
cout<<"Введите координаты центра первой окружности : ";
cin>>C1x>>C1y;
cout<<"Введите координаты центра второй окружности : ";
cin>>C2x>>C2y;
S1=C1.Square(X1,C1x,Y1,C1y);
S2=C2.Square(X2,C2x, Y2,C2y);
dif=S1-S2;
if(dif=0)
cerr<<"Ошибка. Площадь равна нулю";
else
{cout<<"Искомая площадь равна (кв.ед)\n";
cout<<dif;};
getch();
return 0;

}[/CODE]
 
B

BadWolf

#2
C++:
if(dif=0) // присваивает dif значение 0 - всегда!!!!
if (dif==0) // вот так правельно
 
R

rrrFer

#4
Код:
const float PI=3.14f;	//не знаю почему выделывается но можно вот так, компилятор хавает :)
В подключенном у Вас math.h определена константа M_PI и еще всякие, там же есть комментарий:
Код:
/* Definitions of useful mathematical constants
* M_E		- e
* M_LOG2E	- log2(e)
* M_LOG10E  - log10(e)
* M_LN2	 - ln(2)
* M_LN10	 - ln(10)
* M_PI	  - pi
* M_PI_2	 - pi/2
* M_PI_4	 - pi/4
* M_1_PI	 - 1/pi
* M_2_PI	 - 2/pi
* M_2_SQRTPI - 2/sqrt(pi)
* M_SQRT2	- sqrt(2)
* M_SQRT1_2 - 1/sqrt(2)
*/

#define M_E		2.71828182845904523536
#define M_LOG2E	1.44269504088896340736
#define M_LOG10E  0.434294481903251827651
#define M_LN2	 0.693147180559945309417
#define M_LN10	 2.30258509299404568402
#define M_PI	  3.14159265358979323846
Чтобы можно было использовать константы перед подключением math.h надо написать
#define _USE_MATH_DEFINES
потому что в math.h есть такой фрагмент:
Код:
#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)
#define _MATH_DEFINES_DEFINED
Вобщем, как-то так работает:
Код:
#define _USE_MATH_DEFINES
#include <math.h>
int main(){
double n = M_PI;
return 0;
}
Добавлено:
Код:
X1=Y1=X2=Y2=C1x=C2x=C1y=C2y=dif=0; 
CCircle C1 = CCircle(X1,C1x,Y1,C1y);
CCircle C2 = CCircle(X2,C2x,Y2,C2y);
cout<<"Введите координаты точки первой окружности : ";
cin>>X1>>Y1;
cout<<"Введите координаты точки второй окружности : ";
cin>>X2>>Y2;
cout<<"Введите координаты центра первой окружности : ";
cin>>C1x>>C1y;
cout<<"Введите координаты центра второй окружности : ";
cin>>C2x>>C2y;
S1=C1.Square(X1,C1x,Y1,C1y);
S2=C2.Square(X2,C2x, Y2,C2y);
Странная у Вас программа, ничего не изменится если написать
Код:
S1=C1.Square(X1,C1x,Y1,C1y);
S2=C1.Square(X2,C2x, Y2,C2y);
Поведение объекта должно определяться его текущим состоянием, у вас же текущее состояние ни на что не влияет.
Ваш класс эквивалентен такому:
Код:
class CCircle{
public:
float Square(float X, float Cx, float Y, float Cy);
};
В этом случае класс вообще ненужен.
 
R

rrrFer

#5
Вот о чем я:
Код:
#include<iostream>
#include<math.h>

using namespace std;
const float PI=3.14f;	//не знаю почему выделывается но можно вот так, компилятор хавает :)

class CCircle {
public:
float Square(float X, float Cx, float Y, float Cy);
};
float CCircle::Square(float X,float Cx, float Y, float Cy) {
return PI*(pow((X-Cx),2)+pow((Y-Cy),2));
}
int main(){
float X1,Y1,C1y,C1x; 
float S1,S2,dif;
CCircle C1;

cout<<"Vvedite koordinaty tochki pervojj okruzhnosti : ";
cin>>X1>>Y1;
cout<<"Vvedite koordinaty centra pervojj okruzhnosti : ";
cin>>C1x>>C1y;
S1 = C1 .Square(X1,C1x,Y1,C1y);

cout<<"Vvedite koordinaty tochki vtorojj okruzhnosti : ";
cin>>X1>>Y1;
cout<<"Vvedite koordinaty centra vtorojj okruzhnosti : ";
cin>>C1x>>C1y;
S2 = C1 .Square(X1,C1x,Y1,C1y);

dif=S1-S2;
if( 0 == dif )
cerr<<"Oshibka. Plosсhad' ravna nulyu";
else {
cout<<"Iskomaya plosсhad' ravna (kv.ed)\n";
cout<<dif;
}

return 0;
}
Думаю догадаетесь как и вовсе выкинуть отсюда класс.