设计目的
编写目的:
在实验二的基础上,定义形状类的基类(Shape),三个具体的形状类继承自该基类。形 状基类包括虚函数Display. GetAreaGetPerimeter。编写一个程序,随机生成N个形状类 对象,将这些对象放入Shape指针类型的数组中。程序能根据用户的输入,上下左右移动形 状(即修改形状对象的成员变量),并在显示器上输出移动后目标的新位置。
程序模块:
1.该系统可以按功能进行模块划分,其模块图如下:
系统模块图
其中:
class shape为基类,包含四个虚函数:
virtual void display()const =0;(纯虚函数)
virtual float GetArea()const {return 0.0;} virtual float GetPerimeter()const {return 0.0;} virtual int setdata(int){return 0;}
随机函数:
#include<time.h> srand((int)time(0)); r=1+rand()%(9-t); t=1+rand()%8;
c=N-t-r;
派生类 class Traingle public shape {public: protected:
}
派生类 class Rectanglepublic shape {public: protected:
派生类 class Circle : public shape {
public: protected:
移动坐标语句: switch(choice)
float up{
break; break; break; break;
case 72:
case 80:
case 75:
case 77:
测试结果和分析
过程中出现的问题和解决措施:
在根据用户输入移动形状对象的时候,刚开始无论怎样处理都只能移动最后一个形状对 象而之前的形状对象全部被最后一个对象所覆盖。分析后发现是由于局部变量的影响,每 一次循环后,本次的类对象都会被下一次所覆盖。因而使用了 new,解决了这个问题。
源程序清单
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define N 10    〃设置随机10个形状类
using namespace std;
class shape    〃声明基类shape,利用虚函数完成类的多态性
(
public:
virtual void display()const =0;
virtual float GetArea()const {return 0.0;}
virtual float GetPerimeter()const {return 0.0;}
virtual int setdata(int){return 0;}
);
class Traingle : public shape (
public:
Traingle(){x1=0;x2=0;x3=0;y1=0;y2=0;y3=0;}    〃定义构造函数
Traingle(float a1,float a2,float a3,float b1,float b2,float b3)    〃构造函数重载
{
x1=a1;x2=a2;x3=a3;
y1=b1;y2=b2;y3=b3;
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));    〃计算各边长
b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
};
virtual float GetArea()const;
virtual float GetPerimeter()const;
virtual void display()const;
virtual int setdata(int);
protected:
float x1,x2,x3,y1,y2,y3,a,b,c;
};
float Traingle ::GetArea()const {
float cosc,sinc;
cosc=(a*a+b*b-c*c)/(2*a*b);    //三角形面积公式
sinc=sqrt(1-cosc*cosc);
return (0.5*a*b*sinc);
}
float Traingle ::GetPerimeter()const
{ return (a+b+c);
}
void Traingle ::display()const
{
printf("\nTriangle((%.2f, %.2f), (%.2f, %.2f),(%.2f, %.2f))\n",x1,y1,x2,y2,x3,y3);
printf("面积 S=%,2f\n 周长 C=%.2f\n",GetArea(),GetPerimeter());
}