您的位置:首页 > 其它

第五周 【项目2 - 对象作为数据成员】和【项目3-用多文件组织多个类的程序】

2015-04-06 17:26 204 查看
问题描述:

【项目2 - 对象作为数据成员】

回想Engineer类的数据成员,有眼镜、背包等。某Engineer的眼镜、背包,是Glass、Bag类的对象。类中的数据成员,其类型可以是简单类型,也可以是类。通过这种方式,将某些类组合到另外的类中,当作其中的一个“部件”使用。

本项目设计一个三角形类,其数据成员不再是三角形三条边的边长,而是三角形的三个顶点。利用设计的三角形类,输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。

提示:(1)这个问题需要用到两个类,顶点类参照项目1中的CPoint类;(2)三角形类参考下面CTriangle类的声明;(3)充分利用CPoint类中已有的代码实现;(4)关于三条边长的处理,可以增加三个私有属性,在初始化时求出来备用。当然,也可以在需要用到时再计算。


将项目2用“一个项目多个文件”的方式实现,其中两个类的声明放在同一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。



[cpp] view
plaincopyprint?





class CTriangle

{

public:

CTriangle(CPoint &X,CPoint &Y,CPoint &Z):A(X),B(Y),C(Z){} //给出三点的构造函数

void setTriangle(CPoint &X,CPoint &Y,CPoint &Z);//

float perimeter(void);//计算三角形的周长

float area(void);//计算并返回三角形的面积

bool isRightTriangle(); //是否为直角三角形

bool isIsoscelesTriangle(); //是否为等腰三角形

private:

CPoint A,B,C; //三顶点

};

代码:

main.cpp:

#include <iostream>
#include "CPoint.h"
#include "CTriangle.h"
using namespace std;
int main()
{
    CPoint A,B,C;
    A.input();
    B.input();
    C.input();
    CTriangle s(A,B,C);
    cout<<"该三角形的周长为:"<<s.perimeter()<<",面积为:"<<s.area()<<endl<<endl;
    cout<<"该三角形"<<(s.isRightTriangle()?"是":"不是")<<"直角三角形"<<endl;
    cout<<"该三角形"<<(s.isIsoscelesTriangle()?"是":"不是")<<"等腰三角形"<<endl;
    return 0;
}


CPoint.h:

#ifndef CPOINT_H
#define CPOINT_H
#include "CPoint.h"
#include <cmath>
class CPoint
{
private:
  double x;  // 横坐标
  double y;  // 纵坐标
public:
  CPoint(double xx=0,double yy=0){x=xx;y=yy;};
  double Distance1(CPoint p) const; //两点之间的距离(一点是当前点——想到this了吗?,另一点为p)
  double Distance0() const;          // 到原点(0,0)的距离
  double Distance2() const{return fabs(y);};          //到x轴的距离
  double Distance3() const{return fabs(x);};          //到y轴的距离
  CPoint SymmetricAxis(char style) const;//style取'x','y'和'o'分别表示按x轴, y轴, 原点对称
  void input();  //以x,y 形式输入坐标点
  void output(); //以(x,y) 形式输出坐标点
};
#endif // CPOINT_H


CPoint.cpp

#include <iostream>
#include <cmath>
#include "CPoint.h"
#include "CTriangle.h"
using namespace std;
void CPoint::input()
{
  char ch1,ch2,ch3;
  cout<<"请输入坐标点(格式x,y)\n";
  while(1)
  {
    cin>>ch1>>x>>ch2>>y>>ch3;
    if (ch2==','&&ch1=='('&&ch3==')') break;
    cout<<"输入的数据格式不符合规范,请重新输入\n";
  }
}
void CPoint::output()
{
  cout<<"("<<x<<", "<<y<<")"<<endl;
}
double CPoint::Distance0() const
{
    return sqrt(x*x+y*y);
}
double CPoint::Distance1(CPoint p) const
{
  double d;
  d=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
  return d;
}
CPoint CPoint::SymmetricAxis(char style) const
{
  CPoint p(this->x,this->y);//用复制构造函数时,写作p(*this)
  switch(style)
  {
  case 'x':
    p.y=-y; break;
  case 'y':
    p.x=-x; break;
  case 'o':
    p.x=-x;p.y=-y;
  }
  return p;
}


CTriangle.h
#ifndef CTRIANGLE_H
#define CTRIANGLE_H
#include "CPoint.h"
class CTriangle
{
public:
  CTriangle(CPoint &X,CPoint &Y,CPoint &Z):A(X),B(Y),C(Z){}; //给出三点的构造函数
  void setTriangle(CPoint &X,CPoint &Y,CPoint &Z){A=X;B=Y;C=Z;}//
  float perimeter(void);//计算三角形的周长
  float area(void);//计算并返回三角形的面积
  bool isRightTriangle(); //是否为直角三角形
  bool isIsoscelesTriangle(); //是否为等腰三角形
private:
  CPoint A,B,C; //三顶点
};
#endif // CTRIANGLE_H
CTriangle.cpp
<pre name="code" class="cpp">#include <iostream>
#include <cmath>
#include "CPoint.h"
#include "CTriangle.h"
using namespace std;
float CTriangle::perimeter(void)
{
    return A.Distance1(B)+A.Distance1(C)+B.Distance1(C);
}
float CTriangle::area(void)
{
    float sum=(A.Distance1(B)+A.Distance1(C)+B.Distance1(C))/2;
    return sqrt(sum*(sum-A.Distance1(B))*(sum-A.Distance1(C))*(sum-B.Distance1(C)));
}
bool CTriangle::isRightTriangle()
{
    float a=A.Distance1(B),b=A.Distance1(C),c=B.Distance1(C),temp;
    (a>b)?:(temp=a,a=b,b=temp);
    (b>c)?:(temp=b,b=c,c=temp);
    cout<<a<<'\t'<<b<<'\t'<<c<<'\12';
    if(abs(a*a-b*b-c*c)<1e-7)
           return true;
    else return false;

}
bool CTriangle::isIsoscelesTriangle()
{
    float a=A.Distance1(B),b=A.Distance1(C),c=B.Distance1(C),temp;
    (a>b)?:(temp=a,a=b,b=temp);
    (b>c)?:(temp=b,b=c,c=temp);
    if(a-b<1e-7||a-c<1e-7||b-c<1e-7)
        return true;
    else return false;
}



运行结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: