一、设计一个图形基类:Shape,在此基础上派生Rectangle、Circle、Triangle类。
1、Cirlce类基本信息:圆心坐标、半径;
Rectangle类基本信息:长、宽;
Triangle类基本信息:三个顶点坐标;
其中:成员变量为private属性,成员函数为public属性;
2、每个图形类有多个构造函数:缺省构造函数、带参数的构造函数;
3、每个图形类有计算图形的面积getArea(),显示图形的基本信息函数show(),修改基本信息的函数set(形参)。以Circle类为例:通过getArea()计算圆的面积,show()函数中显示圆心坐标、直径、周长、面积等基本信息;set(int x,int y, int r)函数可以修改圆心坐标和半径。
[实验提示]
1、各类图形面积的计算方法不同, 因此不能在基类Shape中统一确定计算的方法。
2、用虚函数实现不同图形面积的计算。在基类Shape中实现计算面积功能的函数为虚函数,在派生类中定义各自的同名函数实现具体功能。
3、要求:使用基类指针,通过基类指针调用确定的派生类对象中的面积计算函数,实现面积的计算。
[测试数据]
Circle:
圆心(30,45) 半径:35
Rectangle:
长:30 宽:53
Triangle:
顶点:(34,45)、(89,45)、(54,67)
#include <iostream>
#include<cmath>
using namespace std;
const float PI=(float)3.14159; //给出圆周率
class Shape{ //基类
public:
virtual double getArea(){}
virtual double getPerimeter(){}
virtual void Show(){}
};
class Triangle :public Shape //Triangle 类的定义
{
public: //外部接口
Triangle(); //无参构造函数
Triangle(int x1, int y1,int x2,int y2,int x3,int y3); //有参构造函数
void Set(int x1, int y1,int x2,int y2,int x3,int y3); //设置三个顶点
double getArea(); //计算三角形面积
double getPerimeter(); //计算三角形周长
void Show(); //取三条边长,三角形面积,三角形周长
private:
int xx1,yy1, xx2,yy2, xx3, yy3;
};
//类的实现
Triangle::Triangle() //无参构造函数初始化数据成员
{
xx1=0;yy1=0;xx2=0;yy2=0;xx3=0;yy3=0;
cout<<"无参构造函数被调用"<<endl;
}
Triangle::Triangle(int x1, int y1,int x2,int y2,int x3,int y3) //有参构造函数初始化数据成员
{
xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;
cout<<"有参构造函数被调用"<<endl;
}
void Triangle::Set(int x1, int y1,int x2,int y2,int x3,int y3) //设置三个顶点
{
xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;
}
double Triangle::getArea() //计算三角形的面积
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
return a*b*abs(abs(1-((a*a+b*b-c*c)/(2*a*b))*((a*a+b*b-c*c)/(2*a*b))))/2;
}
double Triangle::getPerimeter() //计算三角形的周长
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
return a+b+c;
}
void Triangle::Show() //显示三边长,面积,周长
{
double a,b,c;
a=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
b=sqrt((xx2-xx3)*(xx2-xx3)+(yy2-yy3)*(yy2-yy3));
c=sqrt((xx3-xx1)*(xx3-xx1)+(yy3-yy1)*(yy3-yy1));
cout<<"三边为:"<<a<<" "<<b<<" "<<c<<" "<<endl;
cout<<"面积:"<<getArea()<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
}
class Rectangle :public Shape //Rectangle类的定义
{
public: //外部接口
Rectangle(); //无参构造函数
Rectangle(int NewL, int NewW); //有参构造函数
void Set(int NewL,int NewW); //设置长度,宽度
double getArea();//计算矩形面积
double getPerimeter();//计算矩形周长
void Show(); //取长度 ,宽度 ,矩形面积,矩形周长
private: //私有数据成员
int Length,Width;
};
//类的实现
Rectangle::Rectangle() //无参构造函数初始化数据成员
{
Length=0;Width=0;
cout<<"无参构造函数被调用"<<endl;
}
Rectangle::Rectangle(int NewL, int NewW) //有参构造函数初始化数据成员
{
Length=NewL;Width=NewW;
cout<<"有参构造函数被调用"<<endl;
}
void Rectangle::Set(int NewL,int NewW) //设置长度,宽度
{
Length=NewL;Width=NewW;
}
double Rectangle::getArea() //计算矩形的面积
{
return Length*Width;
}
double Rectangle::getPerimeter() //计算矩形的周长
{
return 2*(Length+Width);
}
void Rectangle::Show() //显示长度 ,宽度 ,矩形面积,矩形周长
{
cout<<"长:"<<Length<<endl;
cout<<"宽:"<<Width<<endl;
cout<<"面积:"<<getArea()<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
}
class Circle :public Shape //Circle类的定义
{
public:
Circle(); //无参构造函数
Circle(int r); //有参构造函数
void set(int x,int y, int r); //设置圆心,半径
double getArea(); //取面积
double getPerimeter();//计算圆周长
void Show(); //显示圆心,直径,周长,面积
private:
int xx,yy, radius;
};
Circle::Circle() //无参构造函数初始化数据成员
{
radius=0;cout<<"无参构造函数被调用"<<endl;
}
Circle::Circle(int r) //有参构造函数初始化数据成员
{radius=r;cout<<"有参构造函数被调用"<<endl;}
void Circle::set(int x,int y, int r) //设置圆心,半径
{
xx=x;yy=y;radius=r;
}
double Circle::getPerimeter() //取面积
{
return 2*PI*radius;
}
double Circle::getArea() //取面积
{
return PI*radius*radius;
}
void Circle::Show() //显示 圆心,直径,周长,面积
{
cout<<"圆心:("<<xx<<","<<yy<<")"<<endl;
cout<<"直径:"<<2*radius<<endl;
cout<<"周长:"<<getPerimeter()<<endl;
cout<<"面积:"<<getArea()<<endl;
}
//主函数实现
int main() {
int x1,y1,x2,y2,x3,y3;
double a,b,c;
int x,y,r;
int L,W;
int which;
int flag = 1;
while(flag)
{
do {
cout << "0 == exit ,1 == Triangle, 2 == Rectangle, 3 == Circle"<<endl;
cin >> which;
}while (which < 0 || which > 3);
switch (which) {
case 0: {flag=0; break;}
case 1: {
cout<<"输入三个顶点:"<<endl;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
c=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
if((a+b)>c&&(a+c)>b&&(b+c)>a) //判断能否构成三角形
{
Triangle p(x1,y1,x2,y2,x3,y3); //声明 Triangle对象
p.Show();
}
else printf("输入错误!");
system("pause");
system("cls");
break;
}
case 2: {
cout<<"输入长、宽:"<<endl;
cin>>L>>W;
Rectangle K(L,W);
K.Show();
system("pause");
system("cls");
break;
}
case 3:
{
cout<<"输入圆心:";
cin>>x>>y;
cout<<"输入半径:" ;
cin>>r;
Circle C(r);
C.Show();
system("pause");
system("cls");
break;
}
if(flag==0) break;
}
}
return 0;
}