6-2对象作为数据成员

来源:互联网 发布:香港大学 专业 知乎 编辑:程序博客网 时间:2024/05/16 17:32
/** 作    者: 霍雨佳* 完成日期:2014 年4月1日* 版 本 号:v1.0* 问题描述:本项目设计一个三角形类,其数据成员不再是三角形三条边的边长,而是三角形的三个顶点。*           利用设计的三角形类,输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。* 样例输出:* 问题分析:(1)这个问题需要用到两个类,顶点类参照项目1中的CPoint类;*          (2)三角形类参考下面CTriangle类的声明;*          (3)充分利用CPoint类中已有的代码实现;*          (4)关于三条边的处理,可以增加三个私有属性,在初始化时求出来备用,也可以在需要时计算得到。*/#include <iostream>#include <cmath>#include <cstdlib>using namespace std;class CPoint{private:    double x;  // 横坐标    double y;  // 纵坐标public:    CPoint(double xx=0,double yy=0):x(xx),y(yy) {};//构造函数初始化    double Distance1(CPoint p) const;   // 两点之间的距离(一点是当前点,另一点为参数p)    void input();  //以x,y 形式输入坐标点    void output(); //以(x,y) 形式输出坐标点    void judge(CPoint X,CPoint Y,CPoint Z);//判断三点是否在同一直线上};void CPoint::input()  //以x,y 形式输入坐标点{    char c;    while(1)    {        cin>>x>>c>>y;        if(c!=',')        {            cout<<"输入格式有误,请重新输入"<<endl;        }        else            break;    }    x=x;    y=y;}void CPoint::output() //以(x,y) 形式输出坐标点{    cout<<"("<<x<<","<<y<<")"<<endl;}double CPoint::Distance1(CPoint p) const   // 两点之间的距离(一点是当前点,另一点为参数p){    double l;    l=sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));    return l;}void CPoint::judge(CPoint X,CPoint Y,CPoint Z)//判断三点是否在同一直线上{    double k,b;    k=(X.y-Y.y)/(X.x-Y.x);    b=X.y-X.x*k;    if(Z.y==(Z.x*k+b))    {        cout<<"三点在同一直线上不能构成三角形,退出"<<endl;        exit(1);    }}class CTriangle{public:    CTriangle(CPoint &X,CPoint &Y,CPoint &Z):A(X),B(Y),C(Z) {} //给出三点的构造函数!!!!!!!!    CTriangle(double m=0,double n=0,double z=0):a(m),b(n),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; //三顶点    double a,b,c; //三条边};void CTriangle::setTriangle(CPoint &X,CPoint &Y,CPoint &Z)//给三角形三边赋值{    double d1,d2,d3;    d1=X.Distance1(Y);    d2=Y.Distance1(Z);    d3=Z.Distance1(X);    a=d1;    b=d2;    c=d3;}float CTriangle::perimeter(void)//计算三角形的周长{    int l;    l=a+b+c;    return l;}float CTriangle::area(void)//计算并返回三角形的面积{    int s,p;    p=(a+b+c)/2;    s=sqrt(p*(p-a)*(p-b)*(p-c));    return s;}bool CTriangle::isRightTriangle() //是否为直角三角形{    double max;    bool f=0;    max=a;    if(max<b)    {        max=b;    }    if(max<c)    {        max=c;    }    if(max=a&&a*a==b*b+c*c)    {        f=1;    }    if(max=b&&b*b==a*a+c*c)    {        f=1;    }    if(max=c&&a*a+b*b==c*c)    {        f=1;    }    return f;}bool CTriangle::isIsoscelesTriangle() //是否为等腰三角形{    bool p=0;    if(a==b||b==c||c==a)    {        p=1;    }    return p;}int main(){    CPoint p,q,v,r;    CTriangle s;    double l,s1;    cout<<"请输入A B C三点的坐标x,y:"<<endl;    p.input();    q.input();    v.input();    cout<<"A B C三点的坐标分别为:"<<endl;    p.output();    q.output();    v.output();    s.setTriangle(p,q,v);    r.judge(p,q,v);    l=s.perimeter();    cout<<"三角形的周长为:"<<l<<endl;//计算三角形的周长    s1=s.area();//计算并返回三角形的面积    cout<<"三角形的面积为:"<<s1<<endl;    while(s.isRightTriangle())    {        cout<<"是直角三角形"<<endl;        break;    }    while(s.isIsoscelesTriangle())    {        cout<<"是等腰三角形"<<endl;        break;    }    cout<<endl;    return 0;}


运行结果:

     开始时忽略了三点在一条直线上的可能,现在也不够完美,

          构不成就直接退出了继续努力,使其构不成时可循环输入

0 0
原创粉丝点击