多态图形

实验要求:

定义平面图形类Shape,至少包含虚函数(或纯虚函数)成员getPerimeter()、getArea()、getClassName()和Draw();类Line, Trapezoid, Triangle, Circle分别表示线段、梯形、三角形和圆形。Rectangle继承自Trapezoid表示矩形,Square继承自Rectangle表示正方形。重载派生类的Draw()函数完成使用*打印对应图形。
在main中使用vector《Shape *》 管理多个上述对象,并定义函数DrawShapes(const vector 《Shape *》 & v)画出所有v中的图形。
(选做)考虑使用控制台类控制输出位置,组成复杂图形(暂时未实现)

Shape.h

 1 #pragma once
 2 #include<iostream>
 3 using namespace std;
 4 #define Pi 3.14
 5 class Shape
 6 {
 7 public:
 8     Shape(void);
 9     virtual float getPerimeter();
10     virtual float getArea();
11     virtual char* getClassName();
12     virtual void Draw();
13
14     ~Shape(void);
15 };

Shape.cpp

 1 #include "Shape.h"
 2
 3
 4 Shape::Shape(void)
 5 {
 6 }
 7     float Shape::getPerimeter()
 8     {
 9             return 1;
10     };
11     float Shape::getArea()
12     {
13             return 1;
14     };
15     char* Shape::getClassName()
16     {
17             return "True";
18     };
19     void Shape::Draw()
20     {
21
22     };
23
24
25 Shape::~Shape(void)
26 {
27 }

Line.h

 1 #pragma once
 2 #include"Shape.h"
 3 class Line:public Shape
 4 {
 5 public:
 6     Line(float l);
 7     float getPerimeter();
 8     float getArea();
 9     char* getClassName();
10     void Draw();
11     ~Line(void);
12 private:
13     float l;
14 };

Line.cpp

 1 #include "Line.h"
 2
 3
 4 Line::Line(float x):l(x)
 5 {
 6 }
 7 float Line::getPerimeter()
 8 {
 9     return l;
10 }
11 float Line::getArea()
12 {
13     return 0;
14 }
15 char* Line::getClassName()
16 {
17     return "Line";
18 }
19 void Line::Draw()
20 {
21     for(int i=0;i<(int)l;i++)
22         cout<<"*";
23 }
24
25 Line::~Line(void)
26 {
27 }

Circle.h

 1 #pragma once
 2 #include"Shape.h"
 3 class Circle:public Shape
 4 {
 5 public:
 6     Circle(float x);
 7     float getPerimeter();
 8     float getArea();
 9     char* getClassName();
10     void print_char(int x1,int x2);
11     void Draw();
12     ~Circle(void);
13 private:
14     float semidiameter;
15 };

Circle.cpp

 1 #include "Circle.h"
 2
 3
 4 Circle::Circle(float x):semidiameter(x)
 5 {
 6 }
 7 float Circle::getPerimeter()
 8 {
 9     return 2*Pi*semidiameter;
10 }
11 float Circle::getArea()
12 {
13     return Pi*semidiameter*semidiameter;
14 }
15 char* Circle::getClassName()
16 {
17     return "Circle";
18 }
19 void Circle::print_char(int x1,int x2)
20 {
21     int i;
22     // 计算这一行的宽度,终端最多显示80列
23     int n = max(x1, x2) + 1;
24     n = n > 80 ? 80 : n;
25     for (i = 0; i < n; i++)
26     {
27         if (i == x1 || i == x2)
28             printf("*");
29         else
30              printf(" ");
31     }
32      printf("\n");
33 }
34 void Circle::Draw()
35 {
36     int r=(int)semidiameter;
37     int x1, x2, y;
38    int d = 2 * r;
39     int offset;
40     for(y = 0; y <= d; y++)
41      {
42          /*终端字符宽高比为2:1*/
43         offset = (int)(0.5 + sqrt((double)(r*r - (y-r)*(y-r)))*2.0);
44         x1 = d - offset;
45         x2 = d + offset;
46         print_char(x1, x2);
47     }
48 }
49
50 Circle::~Circle(void)
51 {
52 }

Triangle.h

 1 #pragma once
 2 #include"Shape.h"
 3 #include<cmath>
 4 class Triangle:public Shape
 5 {
 6 public:
 7     Triangle(float d,float h);
 8     float getPerimeter();
 9     float getArea();
10     char* getClassName();
11     void Draw();
12     ~Triangle(void);
13 private:
14     float d,h;
15 };

Triangle.cpp

 1 #include "Triangle.h"
 2 Triangle::Triangle(float d,float h):d(d),h(h)
 3 {
 4 }
 5 float Triangle::getPerimeter()
 6 {
 7     return sqrt((d/2)*(d/2)+h*h)*2+d;
 8 }
 9 float Triangle::getArea()
10 {
11     return d*h/2;
12 }
13 char* Triangle::getClassName()
14 {
15     return "Triangle";
16 }
17 void Triangle::Draw()
18 {
19     //输出另外一种由星号组成的三角形(星号居中对齐)
20     int a=(int)h;//控制组成三角形的星号的行数
21     for(int i=1;i<a+1;i++)//控制行数
22     {
23         for(int j=a-i;j>=0;j--)
24         {
25             cout<<"  ";//这里是两个空格
26         }
27         for(int k=0;k<2*i-1;k++)//控制每行星号的个数。
28         {
29             if(i==0||i==a)
30             {
31                 cout<<"* ";//星号后加了一个空格(为使打印出一图形更直观)。
32             }
33             else
34             if(k==0||k==2*i-2)
35                 {
36                     cout<<"* ";
37                 }
38
39                 else
40                     cout<<"  ";
41         }
42         cout<<endl;
43     }
44 }
45 Triangle::~Triangle(void)
46 {
47 }

Trapezoid.h

 1 #pragma once
 2 #include"Shape.h"
 3 class Trapezoid:public Shape
 4 {
 5 public:
 6     Trapezoid(void);
 7     Trapezoid(float x1,float x2,float x3,float x4,float x5);
 8     float getPerimeter();
 9     float getArea();
10     char* getClassName();
11     void Draw();
12     ~Trapezoid(void);
13 private:
14     float a,b,c,d,e;
15 };

Trapezoid.cpp

 1 #include "Trapezoid.h"
 2
 3 Trapezoid::Trapezoid(void)
 4 {
 5
 6 }
 7 Trapezoid::Trapezoid(float x1,float x2,float x3,float x4,float x5)
 8 {
 9     a=x1;b=x2;c=x3;d=x4;e=x5;
10 }
11 float Trapezoid::getPerimeter()
12 {
13     return a+b+c+d+e;
14 }
15 float Trapezoid::getArea()
16 {
17     return a+b;
18 }
19 char* Trapezoid::getClassName()
20 {
21     return "Trapezoid";
22 }
23 void Trapezoid::Draw()
24 {
25
26     b=a;
27     for(c=1;c<=a;c++)
28
29     {
30
31     for(d=1;d<=a-c;d++)
32
33     printf(" ");
34
35     for(e=1;e<=b;e++)
36
37     if(c==1||c==a) printf("*");
38
39     else if(e==1||e==b) printf("*");
40
41     else printf(" ");
42
43     b=b+2;
44
45     printf("\n");
46
47     }
48 }
49
50 Trapezoid::~Trapezoid(void)
51 {
52 }

Rectangle.h

 1 #pragma once
 2 #include"Trapezoid.h"
 3 class Rectangle:public Trapezoid
 4 {
 5 public:
 6     Rectangle(float h,float j);
 7     Rectangle(void);
 8     float getPerimeter();
 9     float getArea();
10     char* getClassName();
11     void Draw();
12     ~Rectangle(void);
13 private:
14     float mi,mj;
15 };

Rectangle.cpp

 1 #include "Rectangle.h"
 2
 3
 4 Rectangle::Rectangle(float h,float j):mi(h),mj(j)
 5 {
 6
 7 }
 8 Rectangle::Rectangle(void)
 9 {
10
11 }
12 float Rectangle::getPerimeter()
13 {
14     return (mi+mj)*2;
15 }
16 float Rectangle::getArea()
17 {
18     return mi*mj;
19 }
20 char* Rectangle::getClassName()
21 {
22     return "Rectangle";
23 }
24 void Rectangle::Draw()
25 {
26     int mi=(int)this->mi;
27     int mj=(int)this->mj;
28
29     for(int i=0;i<mi;i++)
30     {
31     for(int j=0;j<mj;j++)
32     {
33         if(i==0||i==mi-1)
34         cout<<"*";
35         else if(j==0||j==mj-1)
36         cout<<"*";
37         else
38         cout<<" ";
39     }
40     cout<<endl;
41     }
42 }
43 Rectangle::~Rectangle(void)
44 {
45 }

Square.h

 1 #pragma once
 2 #include"Rectangle.h"
 3 class Square:public Rectangle
 4 {
 5 public:
 6     Square(float a);
 7     float getPerimeter();
 8     float getArea();
 9     char* getClassName();
10     void Draw();
11     ~Square(void);
12 private:
13     float a;
14 };

Square.cpp

 1 #include "Square.h"
 2
 3
 4 Square::Square(float a):Rectangle(a,a)
 5 {
 6     this->a=a;
 7 }
 8 float Square::getPerimeter()
 9 {
10     return 4*a;
11 }
12 float Square::getArea()
13 {
14     return a*a;
15 }
16 char* Square::getClassName()
17 {
18     return "Square";
19 }
20 void Square::Draw()
21 {
22     //输出m行m列的空心正方矩形。
23     int m=(int)a;//m用来控制行列数。
24     for(int i=0;i<m;i++)//控制打印的行数
25     {
26         for(int j=0;j<m;j++)
27         {
28             if(i==0||i==m-1)
29             {
30                 cout<<"* ";//星号后有一个空格
31             }
32             else
33                 if(j==0||j==m-1)
34                 {
35                     cout<<"* ";
36                 }
37                 else
38                     cout<<"  ";
39         }
40         cout<<endl;
41     }
42 }
43
44 Square::~Square(void)
45 {
46 }

main.cpp

 1 #include<iostream>
 2
 3 #include"Circle.h"
 4 #include"Line.h"
 5 #include"Rectangle.h"
 6 #include"Shape.h"
 7 #include"Trapezoid.h"
 8 #include"Triangle.h"
 9 #include"Square.h"
10 #include"Circle.h"
11
12 #include<vector>
13
14 using namespace std;
15 void DrawShape(const vector <Shape*> &s)
16 {
17     for(int q=0;q<=5;q++)
18     {
19         s[q]->Draw();
20         cout<<endl<<endl;
21     }
22 }
23
24 void main()
25 {
26     vector <Shape*> vec (6);
27
28     Line lin(11);
29     vec[0] = &lin;
30
31     Trapezoid tra(6,6,8,10,12);
32     vec[1] = &tra;
33
34     Triangle tri(4,4);
35     vec[2]=&tri;
36
37     Circle cir(6);
38     vec[3]=&cir;
39
40     Rectangle rec(9,13);
41     vec[4]=&rec;
42
43     Square squ(7);
44     vec[5]=&squ;
45
46
47     DrawShape(vec);
48
49
50
51 }

时间: 2024-10-06 02:56:43

多态图形的相关文章

c++-多态小案例

多态小案例 C面向接口编程和C多态 函数类型语法基础 函数指针做函数参数(回调函数)思想剖析 函数指针做函数参数两种用法(正向调用.反向调用) 纯虚函数 抽象类 抽象类基本概念 抽象类在多继承中的应用 面向抽象类编程案例强化 面向抽象类编程案例强化 抽象类在多继承中的应用 抽象类基本概念 多态图形案例 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //抽象的图形类 class Shape { p

一,python简介

python历史 1,1989年圣诞节,Guido von Rossum开始编写python语言编译器 2,1991年2月,第一个python编译器诞生,是c语言实现的,后面又出现了c#和java版本,可以调用c库函数 3,1994年python1.0正式诞生 4,2000年10月 python2.0发布,实现完整版的垃圾回收,unicode支持,开发过程更加透明,社区影响力扩大,生态圈慢慢形成 5,2008年12月 python3.0发布,并不兼容2.0和之前的版本,但是许多项目还在2.0运行

JAVA程序设计(12.2)---- 多态、监听器初级应用:在窗口中绘制图形,可以选择圆形 正方形 线条

1.在800 *800 的窗口中加入3个按钮 可以选择当前的画笔画出什么样的图形 有圆 正方形 直线 三种 JFrame 监听器使用 内部类 匿名内部类 接口 多态 1.先做所有图形的抽象类 package com.lovo.homework; import java.awt.Color; import java.awt.Graphics; /** * 抽象类:图形 * @author Abe * 属性:起点坐标 终点坐标 颜色 */ public abstract class Figure {

对软件开发中uml建模的理解和图形整理(一)

由于uml(统一建模语言)在开发中经常会用到,特别是在软件开发中的OOAD阶段,因此要理解和使用uml显得尤为重要.在uml开始之前,咱先回顾一个OOAD.OOP的主要特征. OOAD:根据面向对象的方法学来对软件系统进行分析和设计的过程.它包括OOA 分析阶段和OOD设计阶段.其中分析阶段主要解决"What to do?"的问题,而设计阶段主要解决"How to do?"的问题.具体来说就是:在OOA分析阶段咱要做的主要工作就是建立对业务问题域的视图(建立模型).

【C++第十课】---继承和多态

一.函数的重写 什么叫函数的重写呢?在子类中和在父类中定义的函数类型是一样的就叫做函数的重写,注意这里的函数重写和函数重载的区别. 问题的引入:那么如果发生了函数的重写那该怎么办,编译器是如何解析的呢? 要想解决这个问题,那么我们首先得搞清楚到底什么是函数重写,下面举例说明: 1.在子类中定义与父类中原型相同的函数 2.函数重写只发生在父类与子类之间 #include <iostream> using namespace std; class Parent { public: void pri

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

多态的应用

/* 多态的应用: 1. 多态用于形参类型的时候,可以接收更多类型的数据 . 2. 多态用于返回值类型的时候,可以返回更多类型的数据. 多态的好处: 提高了代码的拓展性. 需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长. */ //图形类 abstract class MyShape{ public abstract void getArea(); public abstract void getLength(); } class Circle extends MySh

面向对象的三大基石(封装,继承和复合,多态)

转自 面向对象的三大基石面向对象的三大基石(封装,继承和复合,多态) 三大基石之一 封装 1.什么是封装? 封装(encapsulation)又叫隐藏实现(Hiding the implementation).就是只公开代码单元的对外接口,而隐藏其具体实现. 比如你的手机,手机的键盘,屏幕,听筒等,就是其对外接口.你只需要知道如何按键就可以使用手机,而不需要了解手机内部的电路是如何工作的.封装机制就像手机一样只将对外接口暴露,而不需要用户去了解其内部实现.细心观察,现实中很多东西都具有这样的特点

Java 多态的详解

1.什么是多态? 一个对象的多种状态 比如: 教师 a =老钟; 员工 b= 老钟; 2.多态体现 (1)Father类 非静态成员变量x 静态成员变量y 非静态方法eat,方法体输出父类信息 静态方法speak();方法体输出父类信息 (2):Son类 非静态成员变量x 静态成员变量y 非静态方法eat,方法体输出子类信息 静态方法speak();方法体输出子类信息 class Father { int x = 1; static int y = 2; void eat() { System.