一、问题描述:
(1)设计圆形、长方形、三角形类,计算周长和面积,声明他们的对象,并使用这些对象。
(2)声明(1)中类的对象数组、对象指针,并使用他们。
(3)声明area函数为他们的友元函数,实现计算面积的功能。
(4)设计交互和提示,用户可以“输入”图形、“查询”图形和“删除”图形,系统“输出“信息。
二、具体解决方法:
1、设计圆形类,需要注意的是声明友元函数并在类外定义。
class Circle
{
public:
Circle()
{
}
Circle(float radius)//Circle类的构造函数 初始化半径radius
{
if(radius>0)
{
this->radius=radius;
}
else
{
this->radius=1;
}
}
float getPerimeter()//计算圆的周长
{
return 2*E*radius;
}
friend float getArea1(Circle t1);//声明友元函数:计算圆的面积
private:
float radius;//圆的半径
};
float getArea1(Circle t1)
{
return E*t1.radius*t1.radius;//利用对象t1调用私有成员计算面积
}
2、设计长方形类
class Rectangle
{
public:
Rectangle()
{
}
Rectangle(float length,float width)//Rectangle类的构造函数 初始化长和宽
{
if(width<=0)
{
this->width=1;
}
else if(length<=0)
{
this->length=1;
}
else
{
this->width=width;
this->length=length;
}
}
float getPerimeter()//计算长方形的周长
{
return 2*width+2*length;
}
friend float getArea2(Rectangle t2);//声明友元函数:计算长方形的面积
private:
float width;//长方形的宽
float length;//长方形的长
};
float getArea2(Rectangle t2)
{
return t2.width*t2.length;//利用对象t2调用私有成员计算面积
}
3、设计三角形类,需要学会利用海伦公式去计算,已知三边求面积。
class Triangle
{
public:
Triangle()
{
}
Triangle(float side_1,float side_2,float side_3)//Triangle类的构造函数 初始化三角形的三条边
{//用if else语句保证三条边的长度大于0
if(side_1<=0)
{
this->side_1=1;
}
else if(side_2<=0)
{
this->side_2=1;
}
else if(side_3<=0)
{
this->side_3=side_3;
}
else
{
this->side_1=side_1;
this->side_2=side_2;
this->side_3=side_3;
}
}
float getPerimeter()//计算三角形的周长
{
return side_1+side_2+side_3;
}
friend float getArea3(Triangle t3);//声明友元函数:计算三角形的面积
private:
float side_1;//三角形的三条边
float side_2;
float side_3;
};
float getArea3(Triangle t3)
{
float s;
float area;//用海伦公式 利用三边来计算面积
s=t3.getPerimeter()/2;
area = sqrt(s * (s - t3.side_1)*(s - t3.side_2)*(s - t3.side_3) );//利用对象t3调用私有成员计算面积
return area;
}
4、测试程序。
int main()
{
cout<<"***你想输入的图形为:***"<<endl
<<"******圆形---请输入1***"<<endl
<<"****长方形---请输入2***"<<endl
<<"****三角形---请输入3***"<<endl
<<"******退出---请输入0***"<<endl<<endl;
//以下两行为规定输出格式,保留小数点后两位
//注意:设置精度语句只需写一次就可以了,对后面的数字都有效
cout.setf(ios::fixed);
cout<<setprecision(2);
int k=-1;
while(k!=0)
{
cout<<"请输入你的选择:";
cin>>k;
switch(k)
{
case 1://如为某个case分支定义并初始化一个变量,应该把变量定义在块内,确保后面的所有case标签都在变量的作用域之外。注意case后加{}!!!
{
//圆形
float R;//半径
int n;
cout<<"请输入你所需要输入的圆形的个数:"<<endl;
cin>>n;
Circle *a=new Circle[n]; //创建对象数组,每个元素都是一个Circle对象
cout<<"请输入圆形的半径(用空格隔开):"<<endl;
for(int i=0;i<n;i++)
{
cin>>R;
a[i]=Circle(R);
}
Circle *p1;//使用对象指针
for(int j=0;j<n;j++)
{
p1= &a[j];
cout<<"圆形"<<j+1<<"的周长为:"<<a[j].getPerimeter() <<endl;
cout<<"圆形"<<j+1<<"的面积为:"<<getArea1(a[j]) <<endl;
}
cout<<endl;
delete[] a;//删除整个对象数组,加上[]的作用是表示我要删除整个数组。在这个过程中,对象数组释放,调用析构函数
}
break;
case 2:
{
//长方形
float l;//长
float w;//宽
int n;
cout<<"请输入你所需要输入的长方形的个数:"<<endl;
cin>>n;
Rectangle *b=new Rectangle[2]; //创建对象数组,每个元素都是一个Rectangle对象
cout<<"请输入长方形的长和宽(用空格隔开):"<<endl;
for(int i=0;i<2;i++)
{
cin>>l>>w;
b[i]=Rectangle(l,w);
}
Rectangle *p2;//使用对象指针
for(int j=0;j<n;j++)
{
p2 = &b[j];
cout<<"长方形"<<j+1<<"的周长为:"<<p2->getPerimeter() <<endl;
cout<<"长方形"<<j+1<<"的面积为:"<<getArea2(b[j]) <<endl;
}
cout<<endl;
delete[] b;//删除整个对象数组
}
break;
case 3:
{
//三角形
float s1,s2,s3;
int n;
cout<<"请输入你所需要输入的三角形的个数:"<<endl;
cin>>n;
Triangle *c=new Triangle[2]; //创建对象数组,每个元素都是一个Triangle对象
cout<<"请输入三角形的三条边的边长(用空格隔开):"<<endl;
for(int i=0;i<n;i++)
{
cin>>s1>>s2>>s3;
c[i]=Triangle(s1,s2,s3);
}
Triangle *p3;
for(int j=0;j<n;j++)
{
p3 = &c[j];
cout<<"三角形"<<j+1<<"的周长为:"<<p3->getPerimeter() <<endl;
cout<<"三角形"<<j+1<<"的面积为:"<<getArea3(c[j]) <<endl;
}
delete[] c;//删除整个对象数组
cout<<endl;
}
break;
case 0:
{
k=0;//退出循环
}
break;
}
}
return 0;
}
三、完整代码展示。
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
#define E 3.14
//圆形类
class Circle
{
public:
Circle()
{
}
Circle(float radius)//Circle类的构造函数 初始化半径radius
{
if(radius>0)
{
this->radius=radius;
}
else
{
this->radius=1;
}
}
float getPerimeter()//计算圆的周长
{
return 2*E*radius;
}
friend float getArea1(Circle t1);//声明友元函数:计算圆的面积
private:
float radius;//圆的半径
};
float getArea1(Circle t1)
{
return E*t1.radius*t1.radius;//利用对象t1调用私有成员计算面积
}
//长方形类
class Rectangle
{
public:
Rectangle()
{
}
Rectangle(float length,float width)//Rectangle类的构造函数 初始化长和宽
{
if(width<=0)
{
this->width=1;
}
else if(length<=0)
{
this->length=1;
}
else
{
this->width=width;
this->length=length;
}
}
float getPerimeter()//计算长方形的周长
{
return 2*width+2*length;
}
friend float getArea2(Rectangle t2);//声明友元函数:计算长方形的面积
private:
float width;//长方形的宽
float length;//长方形的长
};
float getArea2(Rectangle t2)
{
return t2.width*t2.length;//利用对象t2调用私有成员计算面积
}
//三角形类
class Triangle
{
public:
Triangle()
{
}
Triangle(float side_1,float side_2,float side_3)//Triangle类的构造函数 初始化三角形的三条边
{//用if else语句保证三条边的长度大于0
if(side_1<=0)
{
this->side_1=1;
}
else if(side_2<=0)
{
this->side_2=1;
}
else if(side_3<=0)
{
this->side_3=side_3;
}
else
{
this->side_1=side_1;
this->side_2=side_2;
this->side_3=side_3;
}
}
float getPerimeter()//计算三角形的周长
{
return side_1+side_2+side_3;
}
friend float getArea3(Triangle t3);//声明友元函数:计算三角形的面积
private:
float side_1;//三角形的三条边
float side_2;
float side_3;
};
float getArea3(Triangle t3)
{
float s;
float area;//用海伦公式 利用三边来计算面积
s=t3.getPerimeter()/2;
area = sqrt(s * (s - t3.side_1)*(s - t3.side_2)*(s - t3.side_3) );//利用对象t3调用私有成员计算面积
return area;
}
//测试三个类
int main()
{
cout<<"***你想输入的图形为:***"<<endl
<<"******圆形---请输入1***"<<endl
<<"****长方形---请输入2***"<<endl
<<"****三角形---请输入3***"<<endl
<<"******退出---请输入0***"<<endl<<endl;
//以下两行为规定输出格式,保留小数点后两位
//注意:设置精度语句只需写一次就可以了,对后面的数字都有效
cout.setf(ios::fixed);
cout<<setprecision(2);
int k=-1;
while(k!=0)
{
cout<<"请输入你的选择:";
cin>>k;
switch(k)
{
case 1://如为某个case分支定义并初始化一个变量,应该把变量定义在块内,确保后面的所有case标签都在变量的作用域之外。注意case后加{}!!!
{
//圆形
float R;//半径
int n;
cout<<"请输入你所需要输入的圆形的个数:"<<endl;
cin>>n;
Circle *a=new Circle[n]; //创建对象数组,每个元素都是一个Circle对象
cout<<"请输入圆形的半径(用空格隔开):"<<endl;
for(int i=0;i<n;i++)
{
cin>>R;
a[i]=Circle(R);
}
Circle *p1;//使用对象指针
for(int j=0;j<n;j++)
{
p1= &a[j];
cout<<"圆形"<<j+1<<"的周长为:"<<a[j].getPerimeter() <<endl;
cout<<"圆形"<<j+1<<"的面积为:"<<getArea1(a[j]) <<endl;
}
cout<<endl;
delete[] a;//删除整个对象数组,加上[]的作用是表示我要删除整个数组。在这个过程中,对象数组释放,调用析构函数
}
break;
case 2:
{
//长方形
float l;//长
float w;//宽
int n;
cout<<"请输入你所需要输入的长方形的个数:"<<endl;
cin>>n;
Rectangle *b=new Rectangle[2]; //创建对象数组,每个元素都是一个Rectangle对象
cout<<"请输入长方形的长和宽(用空格隔开):"<<endl;
for(int i=0;i<2;i++)
{
cin>>l>>w;
b[i]=Rectangle(l,w);
}
Rectangle *p2;//使用对象指针
for(int j=0;j<n;j++)
{
p2 = &b[j];
cout<<"长方形"<<j+1<<"的周长为:"<<p2->getPerimeter() <<endl;
cout<<"长方形"<<j+1<<"的面积为:"<<getArea2(b[j]) <<endl;
}
cout<<endl;
delete[] b;//删除整个对象数组
}
break;
case 3:
{
//三角形
float s1,s2,s3;
int n;
cout<<"请输入你所需要输入的三角形的个数:"<<endl;
cin>>n;
Triangle *c=new Triangle[2]; //创建对象数组,每个元素都是一个Triangle对象
cout<<"请输入三角形的三条边的边长(用空格隔开):"<<endl;
for(int i=0;i<n;i++)
{
cin>>s1>>s2>>s3;
c[i]=Triangle(s1,s2,s3);
}
Triangle *p3;
for(int j=0;j<n;j++)
{
p3 = &c[j];
cout<<"三角形"<<j+1<<"的周长为:"<<p3->getPerimeter() <<endl;
cout<<"三角形"<<j+1<<"的面积为:"<<getArea3(c[j]) <<endl;
}
delete[] c;//删除整个对象数组
cout<<endl;
}
break;
case 0:
{
k=0;//退出循环
}
break;
}
}
return 0;
}