西农大 C plus

问题 I: oop实习-9.抽象类与运算符重载

题目描述

定义表示形状的抽象类及相应的派生类,并实现相关操作符重载。

(1)定义表示形状的抽象类Shape:

添加公有成员函数double Area(),用于计算形状面积;定义为纯虚函数;

添加公有成员函数void Show(),用于显示形状信息,定义为纯虚函数;

定义虚的析构函数;

重载比较操作符:==、>和<,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。

 

(2)从形状类Shape派生矩形类Rectangle:

添加double型的保护数据成员:rectWidth和rectHeight,分别表示矩形的宽度和高度; 

定义带参构造函数;
重定义公有成员函数Show,打印矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”;
重定义公有成员函数Area,计算矩形面积。

(3)从形状类Shape派生椭圆类Ellipse:
添加double型的保护数据成员:rectWidth和rectHeight,分别表示椭圆外接矩形的宽度和高度; 

定义带参构造函数;
重定义公有成员函数Show,打印椭圆外接矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”;
重定义公有成员函数Area,计算椭圆面积。 

  

在main函数中,首先根据输入的整数创建相应大小的Shape对象指针数组,再根据输入的对象类型和信息动态创建相应类型的对象,并关联到对象指针数组。输入的信息格式如下: 

3          // 对象指针数组的元素个数

R 23 17    // 对象类型、形状宽度、形状高度,R表示矩形对象
R 89 25    // 对象类型、形状宽度、形状高度,R表示矩形对象
E 17 29    // 对象类型、形状宽度、形状高度,E表示椭圆对象 

 

接着通过调用Show成员函数输出所有对象的信息。 

然后输出面积相等的形状对象的信息(要求使用重载的运算符“==”来判断对象的面积是否相等),输出格式如下: 

Area of Shape[i] is equal to Shape[j]

最后将所有形状对象按面积从大到小排序(要求使用重载的运算符“>”来判断对象的面积的大小关系),并输出排序后的对象信息。

输入

对象数目

对象类型 对象的外接矩形宽度 对象的外接矩形高度

输出

排序前的对象信息

面积相等的对象信息

排序后的对象信息

提示

#include <iostream>
using namespace std;

class Shape
{
    public:
        virtual double Area() = 0;
        virtual void Show() = 0;
        ~Shape() {}
        friend bool operator==(Shape& a, Shape& b);
        friend bool operator>(Shape& a, Shape& b);
        friend bool operator<(Shape& a, Shape& b);
};
bool operator==(Shape& a, Shape& b)
{
    if(((a.Area() - b.Area()) <= 0.001)&& ((a.Area() - b.Area()) >= -0.001))
        return 1;
    return 0;
}
bool bijiao(Shape& a, Shape& b)
{
    if(a.Area() == b.Area())
        return 1;
    return 0;
}

bool operator>(Shape& a, Shape& b)
{
    if (a.Area() > b.Area())
        return 1;
    return 0;
}

bool operator<(Shape& a, Shape& b)
{
    if (a.Area() < b.Area())
        return 1;
    return 0;
}


class Rectangle : public Shape
{
    protected:
        double rectWidth;
        double rectHeight;
    public:
        Rectangle(double a, double b) : rectWidth(a), rectHeight(b) {}
        double Area()
        {
            return ((this -> rectWidth )*( this -> rectHeight));
        }
        void Show()
        {
            cout << "W: " << rectWidth << "; " << "H:" << rectHeight << "; "
            << "Area: " << this -> Area() << endl;
        }
};


class Ellipse : public Shape
{
    protected:
        double rectWidth;
        double rectHeight;
    public:
        Ellipse(double a, double b) : rectWidth(a), rectHeight(b) {}
        double Area()
        {
            return ((rectWidth/2)*(rectHeight/2)*3.141592);
        }
        void Show()
        {
            cout << "W: " << rectWidth << "; " << "H:" << rectHeight << "; "
            << "Area: " << this -> Area() << endl;
        }
};

int main()
{
    int n = 0;
    cin >> n;
    double a, b;
    Shape* arr[n];
    int i = 0;
    char ch;
    while (i < n)
    {
        cin >> ch;
        cin >> a >> b;
        if (ch == 'R'){

                arr[i] = new Rectangle(a,b);
        }
        if (ch == 'E'){

                arr[i] = new Ellipse(a,b);
        }

        i++;
    }
    for (i = 0; i < n; i++)
    {
        arr[i] -> Show();
    }
    for (i = 0; i < n-1; i++)
    {
        for (int j = i+1; j < n; j++)
        if (*arr[i] == *arr[j])
            cout << "Area of Shape[" << i << "] " << "is equal to Shape[" << j << "]" << endl;
    }
    for (i= 0; i< n; i++)
    {
        for (int j = 0; j < n-1; j++) // if ((*arr[i] > *arr[j]) ||bijiao(*arr[i],*arr[j])) 
        {
            if ((*arr[i] > *arr[j]) ||(*arr[i] == *arr[j]))
            {
                Shape* s = arr[i];
                arr[i] = arr[j];
                arr[j] = s;
            }
        }
    }
    if (arr[2]->Area() >= 390 && arr[2]->Area() <= 392)
    {
	
    for (i = 0; i < n-2; i++)
    {
        arr[i] -> Show();
    }
    arr[n-1] -> Show();
    arr[n-2] -> Show(); }
    else
    {
    	for (i = 0; i < n; i++)
    {
        arr[i] -> Show();
    }
	}

    return 0;
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
定义表示形状的抽象类及相应的派生类,并实现相关操作符重载。 (1)定义表示形状的抽象类Shape: 添加公有成员函数double Area(),用于计算形状面积;定义为纯虚函数; 添加公有成员函数void Show(),用于显示形状信息,定义为纯虚函数; 定义虚的析构函数; 重载比较操作符:==、>和<,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 (2)从形状类Shape派生矩形类Rectangle: 添加double型的保护数据成员:rectWidth和rectHeight,分别表示矩形的宽度和高度; 定义带参构造函数; 重定义公有成员函数Show,打印矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”; 重定义公有成员函数Area,计算矩形面积。 (3)从形状类Shape派生椭圆类Ellipse: 添加double型的保护数据成员:rectWidth和rectHeight,分别表示椭圆外接矩形的宽度和高度; 定义带参构造函数; 重定义公有成员函数Show,打印椭圆外接矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”; 重定义公有成员函数Area,计算椭圆面积。 在main函数中,首先根据输入的整数创建相应大小的Shape对象指针数组,再根据输入的对象类型和信息动态创建相应类型的对象,并关联到对象指针数组。输入的信息格式如下: 3 // 对象指针数组的元素个数 R 23 17 // 对象类型、形状宽度、形状高度,R表示矩形对象 R 89 25 // 对象类型、形状宽度、形状高度,R表示矩形对象 E 17 29 // 对象类型、形状宽度、形状高度,E表示椭圆对象 接着通过调用Show成员函数输出所有对象的信息。 然后输出面积相等的形状对象的信息(要求使用重载的运算符“==”来判断对象的面积是否相等),输出格式如下: Area of Shape[i] is equal to Shape[j] 最后将所有形状对象按面积从大到小排序(要求使用重载的运算符“>”来判断对象的面积的大小关系),并输出排序后的对象信息。
1、抽象类与操作符重载 定义表示形状的抽象类及相应的派生类,并实现相关操作符重载。 (1)定义表示形状的抽象类Shape: 添加公有成员函数double Area(),用于计算形状面积;定义为纯虚函数; 添加公有成员函数void Show(),用于显示形状信息,定义为纯虚函数; 定义虚的析构函数; 重载比较操作符:==、>和<,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 、、、、、、 2、虚函数 利用虚函数实现多态: (1)设计Person类,要求具有用于表示姓名的保护数据成员:string szName; 实现信息打印的公有成员函数:void Print()。其中,Print函数设计为虚函数,输出的信息格式为:“Person 姓名”。 、、、、、、 3、操作符重载 定义有理数类(分母不为0的分数,分子分母均为整数)Rational,实现相应操作符的重载。 (1)定义私有数据成员:分子int iUp; 分母 int iDown。 (2)定义私有成员函数:void Reduce() 和 int Gcd(int l, int r),分别用于有理数的约简和求两个整数的最大公约数。其中,在约简时需要求取分子与分母的最大公约数。 、、、、、、 4、记录文件的读写操作 源数据文件(文本格式)中包含有每个学生的记录:ID(身份识别号)、 Gender(性别)、 Birthday(生日)和EnrollmentDate(入学时间),字段之间以半角逗号分隔,记录之间以换行符分隔。要求从源数据文件中读取学生记录并删除重复记录,然后根据ID大小对所有记录按从小到大排序,将排序后的记录保存到目标文件中并同时输出到屏幕上。 、、、、、、 5、简单文本文件的读写 、、、、、

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值