C++ 学会运用对象数组、对象指针、this指针、对象作为函数参数、友元等特征进行程序设计。

一、问题描述:

(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;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值