C++判断三角形类型,计算面积,周长。帮我改正一下,目前无法实现

C++判断三角形类型,计算面积,周长。帮我改正一下,目前无法实现#include<iostream> #include<cmath> using namespace std; class CTriangle { protected: double P[3];//储存边长 public: CTriangle(double l1=3,double l2=4,double l3=5);//设置边长 void check1(); void check(); double girth();//计算周长 double area();//计算面积 void arrange(double l1,double l2,double l3);//三边排序 };CTriangle t1; CTriangle::CTriangle(double l1,double l2,double l3) { P[0]=l1;P[1]=l2;P[2]=l3; } void CTriangle::check1() { double P[3]; int i,j; for(i=0;i<3;i++)//判断是否合理 { if(i!=2)//i可以为1或者0 j=i+1; else j=0; if(P[i]>=P[j]+P[3-(i+j)])cout<<"边长设置不合理!\n"; } } double CTriangle::girth() { return P[0]+P[1]+P[2]; } double CTriangle::area() { double w=(P[0]+P[1]+P[2])/2; double S=sqrt(w*(w-P[0])*(w-P[1])*(w-P[2])); return S; } void CTriangle::arrange(double l1,double l2,double l3)//边长排序 { double t; if(l1<l2){t=l1;l1=l2;l2=t;}; if(l2<l3){t=l2;l2=l3;l3=t;}; if(l1<l3){t=l1;l1=l3;l3=t;}; P[0]=l1;P[1]=l2;P[2]=l3; } void CTriangle::check() //判断三角形的种类 { if(P[0]*P[0]==P[1]*P[1]+P[2]*P[2])cout<<"直角三角形"; if(P[0]*P[0]<P[1]*P[1]+P[2]*P[2])cout<<"锐角三角形"; if(P[0]*P[0]>P[1]*P[1]+P[2]*P[2])cout<<"钝角三角形"; } int main() { cout<<"输入三角形的各边长:"; int a,b,c; cin>>a>>b>>c; CTriangle::CTriangle(a,b,c); cout<<"边长分别"<<a<<" "<<b<<" "<<c; t1.check1(); t1.arrange(a,b,c); t1.check(); t1.girth(); t1.area(); }

程序存在若干问题,依次列举如下:

    check1方法中的P数组不是类的成员,而是方法中的局部变量。由于没有对该局部变量初始化,所以其值是未定义的,校验的结果也是随机的。需去掉check1中的局部变量P的定义,使用类的成员P。

    arrange方法应该是想实现排序,这是由check方法的逻辑看出来的,排序结果应该是P[0]>=P[1]>=P[2]。但很可惜排序逻辑搞错了,应该依次比较l1<l2、l1<l3和l2<l3,但是这里把后两个顺序搞反了,最后的结果变成P[1]最大,导致了check方法结果不对。需改一下arrange方法的判断顺序。

    main函数中使用的t1是全局作用域定义的,而调用CTriangle类构造函数时,不会影响到已经创建的对象,导致t1的边长使用了默认值3、4、5,没有使用输入的a、b、c。应该在main方法中创建CTriangle类的t1对象,并用输入的边长a、b、c为其赋值。

    check1方法应该返回bool值,用以让main函数判断false时return结束程序。否则main函数在边长不合法的情况下还会继续执行后面的操作,不符合校验的逻辑。

以下是可以优化的点,不影响程序逻辑,但是优化后程序结构会更好:

    check方法在arrange方法将三边降序排序后进行,逻辑上问题不大,可以优化为if-elseif-else结构,更严谨一些。

    为了输出的美观,输出结束后需要增加换行操作endl。周长和面积计算的方法需使用cout输出,否则看不到输出结果。

附上修改后的程序,以供参考(其中将方法check1改为成valid,方便理解):

#include <iostream>
#include <cmath>

using namespace std;

class CTriangle {
protected:
    double P[3];
public:
    CTriangle(double l1 = 3, double l2 = 4, double l3 = 5);

    bool valid();

    void check();

    double girth();

    double area();

    void arrange(double l1, double l2, double l3);
};

CTriangle::CTriangle(double l1, double l2, double l3) {
    P[0] = l1;
    P[1] = l2;
    P[2] = l3;
}

bool CTriangle::valid() {
    int i, j;
    bool flag = true;
    for (i = 0; i < 3; i++) {
        if (i != 2)
            j = i + 1;
        else
            j = 0;
        if (P[i] >= P[j] + P[3 - (i + j)]) {
            cout << "边长设置不合理!" << endl;
            flag = false;
            break;
        }
    }
    return flag;
}

double CTriangle::girth() { return P[0] + P[1] + P[2]; }

double CTriangle::area() {
    double w = (P[0] + P[1] + P[2]) / 2;
    double S = sqrt(w * (w - P[0]) * (w - P[1]) * (w - P[2]));
    return S;
}

void CTriangle::arrange(double l1, double l2, double l3) {
    double t;
    if (l1 < l2) {
        t = l1;
        l1 = l2;
        l2 = t;
    }
    if (l1 < l3) {
        t = l1;
        l1 = l3;
        l3 = t;
    }
    if (l2 < l3) {
        t = l2;
        l2 = l3;
        l3 = t;
    }
    P[0] = l1;
    P[1] = l2;
    P[2] = l3;
}

void CTriangle::check() {
    if(P[0]*P[0]==P[1]*P[1]+P[2]*P[2])
        cout<<"直角三角形";
    else if(P[0]*P[0]>P[1]*P[1]+P[2]*P[2])
        cout<<"钝角三角形";
    else
        cout<<"锐角三角形";
}

int main() {
    cout << "输入三角形的各边长:";
    double a = 0, b = 0, c = 0;
    cin >> a >> b >> c;
    cout << "边长分别为:" << a << " " << b << " " << c << endl;
    CTriangle t1(a, b, c);
    if (!t1.valid()) {
        return 1;
    }
    t1.arrange(a, b, c);
    t1.check();
    cout << "周长为:" << t1.girth() << endl;
    cout << "面积为:" << t1.area() << endl;
    return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

急急急,设计一个C++三角形类要求周长,面积,高等,可以显示,不合法时参数...
printf("\\n三角形的周长为:%.1f",c);printf("\\n三角形的面积为:%.1f",d);printf("\\n");printf("三角形的三个高分别是:");for(b=0;b<3;b++)printf("%.2f ",f[b]);printf("\\n");} }

关于C++知三边计算周长和面积
首先,你的三角形判定条件有误:应该是两边之和大于第三边,也就是说 if(i+j==l)应改成 if(i+j<=l)变量k定义了两次,不妥,这里,不要用int,如:h=p\/2; 因为h这int型,如果p=5,那么h=2;m=h*((h-i)*(h-j)*(h-l));这一句也会有数据丢失。。。

C++题 算三角形面积和周长 下面的过程要怎么改才对?
你把 int a,b,c;改成double a,b,c;或者把 scanf("%lf%lf%lf",&a,&b,&c);改成 scanf("%d%d%d",&a,&b,&c);因为你的变量的定义和输入不匹配

C++求高手!定义一个三角形类Ctriangle,求三角形的面积和周长。我写...
cout<<"三角形的面积:";ctriangle.display1();ctriangle.circumference();cout<<"三角形的周长:";ctriangle.display2();return 0;} 感觉你上面写了很多无用功,注释掉了,area加一个s变量,就可以运行了

用C++ 定义一个三角形类(Triangle)。属性为三条边,计算周长和面积。
首先,c++基本数据类型中没有“边”这个东东,如果LZ一定要用“边”做属性的话那最好是定义一个“边类”,class Side{}; 然后用类的组合来定义三角形类。边:由两个端点确定,所以边中的成员要包含两端点的坐标,由于端点没有必要用到函数,所以为了节约,用个2*2的数组Point[2][2]来储存端...

...判断abc能否构成三角形,若能,计算面积,用C++编写
if(a+b<=c||a+c<=b||b+c<=a) cout<<"无法构成三角形.\\n" else { p=(a+b+c)\/2.0; s=sqrt(p*(p-a)*(p-b)*(p-c)); cout<<"面积="<<s<<endl; } return 0;}

求编写一个C++程序,求直角三角形的面积和周长
include <iostream.h> include <math.h>void main(void){ double S=0,a=0,b=0,C=0;cout<<"请输入两直角边的值:"<<endl;cin>>a>>b;S = (a*b)\/2;C = a+b+sqrt(a*a+b*b);cout<<"直角三角形的面积为:"<<S<<endl;cout<<"直角三角形的周长为:"<<C<<endl;} ...

C++根据三角形三边求面积
int 类型的-1和double类型的-1.0是不等的。当条件三边长不成立时,函数TriangleArea(a,b,c)返回-1.000000,这和area==-1是不一会事的,你可以改成 if(area)cout<<'('<<a<<','<<b<<','<<c<<')'<<"不能构成三角形!"<<endl;else cout<<"三角形("<<a<<','<<b<<','<<...

用c++面向对象程序设计写一段求三角形周长和面积的代码?
throw "不能构成三角形,无法求周长";} static void cal(triangle &tr,enum type t){ try { switch(t){ case area:cout<<"面积:"<<tr.getarea()<<endl;break;case circumference:cout<<"周长:"<<tr.getcircumference()<<endl;break;} } catch(const char *ex){ cout<<ex<<endl;} ...

用C++设计一个类来求三角形的面积与周长
class Ctrinagle { private:int A,B,C;public:void SetRevised(int a,int b,int c){ A=a;B=b;C=c;if((A+B)>C&&(A-B)<C)cout<<"This is right\\n";else cout<<"wrong";} int ZC(){ return A+B+C;} float MJ(){int zc=ZC();return sqrt(zc\/2*(zc\/2-A)*(zc\/2-...

相似回答