首页 > 其他分享 >用虚函数分别计算各种图形的面积

用虚函数分别计算各种图形的面积

时间:2023-04-18 20:45:35浏览次数:43  
标签:函数 area double height shapes Shape 计算 图形 public

一、问题描述:

定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),用虚函数分别计算各种图形的面积,并求出它们的和。要求用基类指针数组。使它的每一个元素指向一个派生类的对象。PI=3.1415926

输入格式:

请在这里写输入格式。例如:输入在一行中给出9个大于0的数,用空格分隔,分别代表圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。

输出格式:

请在这里描述输出格式。例如:输出所有图形的面积和,小数点后保留3位有效数字。

输入样例:

在这里给出一组输入。例如:

12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
 

输出样例:

在这里给出相应的输出。例如:

total of all areas = 578.109

 

二、设计思路:

  1. 设计基类Shape;
  2. 设计5个派生类;
  3. 主函数创建指针数组,指向派生类;
  4. 输入数据;
  5. 输出结果;
  6. 删除动态分配数组。

三、流程图:

 

四、伪代码实现:

//基类Shape
virtual  area() = 0
virtual ~Shape()
//派生类Circle
PI <-3.1415926
area为PI*r*r
//正方形
area为a*a//a为边长
//长方形
area为width * height
//梯形
area为(topline + baseline) * height / 2
//三角形
area为base * height / 2
//主函数
Shape* shapes[5]
shapes[0] = new Circle(r)
shapes[1] = new Square(a)
shapes[2] = new Rectangle(w, h1)
shapes[3] = new Trapezoid(tl, bl, h2)
shapes[4] = new Triangle(b, h3)
total<-0;
for i=0 to 4
do total += shapes[i]->area()
end
for i=0 to 4
do delete shapes[i]

 

五、代码实现:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 class Shape
  5 {
  6 public:
  7     virtual double area() = 0;
  8     virtual ~Shape(){}
  9 };
 10 //派生类
 11 class Circle:public Shape//圆形
 12 {
 13 private:
 14     double r;//半径
 15 public:
 16     Circle(double _r):r(_r){}
 17     const double PI = 3.1415926;
 18     double area()
 19     {
 20         return PI * r * r;
 21     }
 22     ~Circle(){}
 23 };
 24 class Square:public Shape//正方形
 25 {
 26 private:
 27     double a;//边长
 28 public:
 29     Square(double _a):a(_a){}
 30     double area()
 31     {
 32         return a * a;
 33     }
 34     ~Square(){}
 35 };
 36 class Rectangle:public Shape//长方形
 37 {
 38 private:
 39     double width, height;
 40 public:
 41     Rectangle(double w,double h):width(w),height(h){}
 42     double area()
 43     {
 44         return width * height;
 45     }
 46     ~Rectangle(){}
 47 };
 48 class Trapezoid:public Shape//梯形
 49 {
 50 private:
 51     double topline, baseline, height;
 52 public:
 53     Trapezoid(double t,double b,double h):topline(t),baseline(b),height(h){}
 54     double area()
 55     {
 56         return (topline + baseline) * height / 2;
 57     }
 58     ~Trapezoid(){}
 59 };
 60 class Triangle:public Shape//三角形
 61 {
 62 private:
 63     double base, height;
 64 public:
 65     Triangle(double b,double h):base(b),height(h){}
 66     double area()
 67     {
 68         return base * height / 2;
 69     }
 70     ~Triangle(){}
 71 };
 72 
 73 int main()
 74 {
 75     Shape* shapes[5];
 76     double r;//圆的半径
 77     double a;//正方形的边长
 78     double w, h1;//矩形的宽和高
 79     double tl, bl, h2;//梯形的上底下底和高
 80     double b, h3;//三角形的底和高
 81     cin >> r;
 82     cin >> a;
 83     cin >> w >> h1;
 84     cin >> tl >> bl >> h2;
 85     cin >> b >> h3;
 86     shapes[0] = new Circle(r);
 87     shapes[1] = new Square(a);
 88     shapes[2] = new Rectangle(w, h1);
 89     shapes[3] = new Trapezoid(tl, bl, h2);
 90     shapes[4] = new Triangle(b, h3);
 91     double total=0;
 92     for (int i = 0; i < 5; i++)
 93     {
 94         total += shapes[i]->area();
 95     }
 96     printf("total of all areas = %.3lf", total);
 97     for (int i = 0; i < 5; i++)
 98     {
 99         delete shapes[i];
100     }
101     return 0;
102 }

 

标签:函数,area,double,height,shapes,Shape,计算,图形,public
From: https://www.cnblogs.com/tljx-cen/p/17331025.html

相关文章

  • C语言实现回调函数标准方式
    #include<iostream>#defineOFFSET1000usingnamespace::std;intbuttonId;//定义回调函数的类型【注意,这里只是用type定义,回调函数一般是作为另一个函数的形式参数的,只注重类型,而调用的时候需要具体实现】typedefvoid(*someCallback)(int);//回调函数的具体实现v......
  • maven : 无法将“maven”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
    解决思路:1、打开CMD,测试Java、mvn等命令是否能够运行,如果不能运行那就是Java环境的问题,参考:Java初学教程进行配置;2、如果上一步没问题,右键IDEA,以管理员身份运行即可。......
  • 计算中常用函数
    计算时中常用到一些函数,整理一下<algorithm>......
  • Python ArcPy批量计算多时相遥感影像的各项元平均值
      本文介绍基于Python中ArcPy模块,对大量长时间序列栅格遥感影像文件的每一个像元进行多时序平均值的求取。  在遥感应用中,我们经常需要对某一景遥感影像中的全部像元的像素值进行平均值求取——这一操作很好实现,基于ArcMap软件或者简单的Python代码就可以实现;但有时候,我们会......
  • 关于将常量数组或某一函数单独或一起放在FLASH某一位置
    第一种情况:将数组或某一函数单独放在FLASH某个位置,具体配置如下图。.text1:{.=ALIGN(4);*(.text1)*(.text1.*).=ALIGN(4);}>FLASH1AT>FLASH1__attribute__((section(".text1")))voidCPUDelay(volatileuint32_t......
  • 0001笔记【并行计算】CUDA在现代C++中如何运用?看这一个就够了
    目录SM(流多处理器)和板块(block)一个板块会被调度到一个SM上,直到执行结束常用函数cudaMalloc在显存上分配内存cudaMallocHost在主存上分配锁页内存cudaMemcpy在主存和显存之间拷贝数据cudaMallocManagerd统一内存优化时间依赖和空间依赖线程太多不行:防止寄存器打翻(registerspill)......
  • 【Vue2.x源码系列06】计算属性computed原理
    上一章Vue2异步更新和nextTick原理,我们介绍了JavaScript执行机制是什么?nextTick源码是如何实现的?以及Vue是如何异步更新渲染的?本章目标计算属性是如何实现的?计算属性缓存原理-带有dirty属性的watcher洋葱模型的应用初始化在Vue初始化实例的过程中,如果用户options选......
  • 人工智能、大数据、云计算、机器学习和深度学习,主要有什么关系?
    这些概念是当下的热点,它们本身并不复杂。相信我的回答能让你对这些概念以及它们之间的联系有一个清晰的了解。我的主要研究方向是大数据和人工智能,所以机器学习、深度学习、云计算等技术也都接触过。这些概念之间也确实有很多关联,下面我主要从应用的角度来阐述一下他们之间的联系。......
  • 【内附源码和文档】基于C++14异步蒙特卡洛工具函数
    Simple-Monte-Carlo-Tool-Function这是一个使用C++实现的简单的异步蒙特卡洛算法工具函数C++标准:C++14使用autores=MonteCarlo(sample_nums,check_sample_funtion,generate_sample_funtion,…args);doublep=res.get();std::cout<<p<<std::endl;sample_nums:需要生成的样......
  • 目前国内云计算发展过程中,主要有哪些误区?
    中国云计算市场确实非常火爆,不管是政府还是行业用户、企业,但目前在云计算实施过程中有很多误区:一是重实施、轻规划和咨询,从CIO反馈的情况来看,云计算开始实施时,前期的评估、规划、咨询很少;二是重硬件、轻软件,一谈到云就是买服务器、存储、网络设备,只重视服务器的虚拟化;三是重概念......