20140416 triangle

这次作业本来没什么难的,但是中间卡在了虚继承上,浪费了不少时间。

题面如下:

We know that the triangle can be classified according to the classification angle or side.

Clearly, the right triangle is a triangle, isosceles triangle is a triangle. 
Isosceles right triangle is both a isosceles triangle and a right triangle.

Each triangle has three sides and can calculate its area

There are four classes Triangle, IsoscelesTriangle, RightTriangle and IsoscelesRightTriangle.

Both class IsoscelesTriangle and class RightTriangle inherits class Triangle.
Class IsoscelesRightTriangle inherits class IsoscelesTriangle and class RightTriangle.

All classes have the similar functions.

The base class Triangle is:



You should implement all the four classes.





中文题面:

我们知道三角形可以按照角度或者边长分类。
显然,直角三角形是三角形,等腰三角形是三角形,等腰直角三角形既是直角三角形也是等腰三角形。每个三角形都有三条边,可以计算面积。

现在有四个类:
class Triangle 三角形
class IsoscelesTriangle 等腰三角形
class RightTriangle 直角三角形
class IsoscelesRightTriangle 等腰直角三角形

class IsoscelesTriangle 和 class RightTriangle 继承 class Triangle,class IsoscelesRightTriangle 继承 class IsoscelesTriangle 和 class RightTriangle

类都有以下函数:
1.构造函数 输出Construct+类的名字,换行 例如“Construct Triangle\n”
2.void set(int aa, int bb, int cc) 设置三角形的三条边长
3.double area() 计算三角形面积,如果不是三角形,返回值为0
4.void check() 检查三边是否符合类名表示的三角形的要求
5.void print() 根据类名输出,如果符合类名表示的三角形,则输出“It is ”+ 类名 + “ 0-0\n”;如果不符合则输出“It is not ”+ 类名 + “ =-=\n”


代码如下:


main.cpp

#include <iostream>
#include <cmath>
#include "Triangle.h"
 
using std::cin;
using std::cout;
using std::endl;
 
int main() {
    int a, b, c;
    cin >> a >> b >> c;
 
    Triangle t;
    IsoscelesTriangle i;
    RightTriangle r;
    IsoscelesRightTriangle ir;
 
    Triangle* tri = &t;
    Triangle* iso =  &i;
    Triangle* rig = &r;
    Triangle* ist = &ir;
 
    tri -> set(a, b, c);
    iso -> set(a, b, c);
    rig -> set(a, b, c);
    ist -> set(a, b, c);
 
    cout << tri -> area() << endl;
    tri -> print();
    iso -> print();
    rig -> print();
    ist -> print();
 
  return 0;
}

Triangle.h

#ifndef TRIANGLE_H
#define TRIANGLE_H

class Triangle {
 public:
    Triangle();
    virtual void set(int aa, int bb, int cc);
    double area() const;
    virtual bool check() const;
    virtual void print() const;
 protected:
    int a, b, c;
};

class IsoscelesTriangle : virtual public Triangle {
 public:
    IsoscelesTriangle();
    virtual void set(int aa, int bb, int cc);
    virtual bool check() const;
    virtual void print() const;
 private:
    int a, b, c;
};

class RightTriangle : virtual public Triangle {    // 之前的错误是因为漏打了virtual
 public:
    RightTriangle();
    virtual void set(int aa, int bb, int cc);
    virtual bool check() const;
    virtual void print() const;
 private:
    int a, b, c;
};

class IsoscelesRightTriangle : public IsoscelesTriangle, public RightTriangle {
 public:
    IsoscelesRightTriangle();
    virtual void set(int aa, int bb, int cc);
    virtual bool check() const;
    virtual void print() const;
 private:
    int a, b, c;
};

#endif


Triangle.cpp

#include <iostream>
#include <cmath>
#include "Triangle.h"
using namespace std;

Triangle::Triangle() {
    cout << "Construct Triangle\n";
}

void Triangle::set(int aa, int bb, int cc) {
    a = aa;
    b = bb;
    c = cc;
}
bool Triangle::check() const {
    if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
        return true;
    } else {
        return false;
    }
}
double Triangle::area() const {
    double area, p, aa, bb, cc;
    if (this->check()) {
        aa = static_cast<double>(a);
        bb = static_cast<double>(b);
        cc = static_cast<double>(c);
        p = (a + b + c)/2.0;
        area = sqrt(p*(p-aa)*(p-bb)*(p-cc));
        return area;
    } else {
        return 0;
    }
}
void Triangle::print() const {
    if (this->check())
    cout << "It is Triangle 0-0\n";
    else
    cout << "It is not Triangle =-=\n";
}
IsoscelesTriangle::IsoscelesTriangle() : Triangle() {
    cout << "Construct IsoscelesTriangle\n";
    a = b = c = 0;
}
void IsoscelesTriangle::set(int aa, int bb, int cc) {
    a = aa;
    b = bb;
    c = cc;
}
bool IsoscelesTriangle::check() const {
    if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
        if ((a == b)||(a == c)||(b == c))
        return true;
        else
        return false;
    } else {
        return false;
    }
}
void IsoscelesTriangle::print() const {
    if (this->check())
    cout << "It is IsoscelesTriangle 0-0\n";
    else
    cout << "It is not IsoscelesTriangle =-=\n";
}
RightTriangle::RightTriangle() : Triangle() {
    cout << "Construct RightTriangle\n";
    a = b = c = 0;
}
void RightTriangle::set(int aa, int bb, int cc) {
    a = aa;
    b = bb;
    c = cc;
}
bool RightTriangle::check() const {
    if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
        if ((a*a + c*c == b*b)||(a*a + b*b == c*c)||(b*b + c*c == a*a))
        return true;
        else
        return false;
    } else {
        return false;
    }
}
void RightTriangle::print() const {
    if (this->check())
    cout << "It is RightTriangle 0-0\n";
    else
    cout << "It is not RightTriangle =-=\n";
}
IsoscelesRightTriangle::IsoscelesRightTriangle() : Triangle(), RightTriangle(),
         IsoscelesTriangle() {
    cout << "Construct IsoscelesRightTriangle\n";
    a = b = c = 0;
}
void IsoscelesRightTriangle::set(int aa, int bb, int cc) {
    a = aa;
    b = bb;
    c = cc;
}
bool IsoscelesRightTriangle::check() const {
    if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
        if ((IsoscelesTriangle::check()) && (RightTriangle::check()))
        return true;
        else
        return false;
    } else {
        return false;
    }
}
void IsoscelesRightTriangle::print() const {
    if (this->check())
    cout << "It is IsoscelesRightTriangle 0-0\n";
    else
    cout << "It is not IsoscelesRightTriangle =-=\n";
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值