/* * 作 者: 霍雨佳 * 完成日期: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; }
运行结果:
开始时忽略了三点在一条直线上的可能,现在也不够完美,
构不成就直接退出了继续努力,使其构不成时可循环输入