多态 模板 根据题意编程

1.试使用函数模板实现输出一个数组各元素的值,要求编写测试程序。

//使用模板函数
#include <iostream>
using namespace std;
//模板函数(通用函数)
template <class T> //表示T是一个模板参数类型
void print(T *array,int size)  
{
	for(int i=0;i<size;i++)
	{
		cout<<array[i];
		if(i<(size-1))
		{
			cout<<",";
		}
	}
	cout<<endl;
}
 
int main()
{
	const int max=5;
	int iArray[max]={10,20,30,40,50};
	float fArray[max]={1.1,1.2,1.3,1.4,1.5};
	const char *cArray[max]={"one","two","three","four","five"};
	print(iArray,max); //调用时确定T的类型
	print(fArray,max);
	print(cArray,max);
	return 0;
}

2.编写一个使用数组类模板 Array 对数组求最大值和求元素和的程序,要求编写出测 试程序。

【问题描述】

根据主函数代码,编写求一维数组中最大、最小元素及所有元素平均值的函数模板,使程序正确运行。

【输入形式】
【输出形式】
【样例输入】
【样例输出】
【样例说明】
【评分标准】

#include <iostream>
#include<iostream>
#include<cassert>
using namespace std;

//求一维数组中最大、最小元素及所有元素平均值的函数模板
template<typename T, int size = 10>
T GetValue(T *arr, T &max_value, T &min_value)
{
    double sum = 0;

    //取数组第一个元素为最大、最小值
    max_value = min_value = arr[0];

    for(int i=0;i<size;++i){
        sum += *(arr+i);
        if(*(arr+i)>max_value){ //比较找最大值
            max_value = *(arr+i);
        }
        if(*(arr+i)<min_value){ //比较找最小值
            min_value = *(arr+i);
        }
    }

    return (sum/size); //返回平均值
}

int main()
{
	int imax, imin;//分别保存最大、最小值
	double* pd = new double[5];
	assert(pd);
	for (int i(0); i < 5; i++)
		cin >> pd[i];

	int iarry[] = { -20,30,40,50,33,5,8,9,-7,0 };
	cout  << GetValue<int>(iarry, imax, imin) << endl;//返回平均值
	cout  << imax << "," << imin << endl;//输出最大、最小值

	double dmax, dmin;	
	cout <<GetValue<double, 5>(pd, dmax, dmin) << endl;//返回平均值
	cout << dmax << "," << dmin << endl;//输出最大、最小值

	return 0;
}


3. 编写程序,定义抽象基类 Shape(形状),由它派生出 2 个派生类: Circle(圆形)和 Square (正方形),用函数 ShowArea()分别显示各种图形的面积,要求用基类指针数组,数组的每个 元素指向一个派生类对象。

【问题描述】

根据给出的程序片段编程,使程序正确运行。由基类Shape派生出圆类Circle(数据成员:半径)、正方形类Square(数据成员:边长)、三角形类Triangle(数据成员:三条边边长),3个派生类都有输入和显示信息函数Input、Output,计算面积的函数Area,计算周长的函数Perim。【输入形式】
【输出形式】
【样例输入】
【样例输出】
【样例说明】
【评分标准】

#include <iostream>
#include<iomanip>
#include <cmath>
using namespace std;
const double PI = 3.14159;
//定义基类Shape
class Shape
{
public:
	virtual double Area() const
	{		return 0;		}
	virtual double Perim() const	
	{		return 0;	}
	virtual void Input() {}	
	virtual void Output() { }
	static void SetFormat()
	{		cout << setiosflags(ios::fixed) << setprecision(2);	}
protected:
	Shape(){}
};
class Circle :public Shape
{
protected:
    double r, area, perim;
public:
    void  Input();
    void  Output();
    double  Area()const;
    double  Perim()const;
};
void Circle::Input()
{
    cin >> r;
    area = PI * r * r;
    perim = 2 * PI * r;
}
void Circle::Output()
{
    cout << perim << "," << area << endl;
}
double Circle::Area()  const
{
    return area;
}
double Circle::Perim() const
{
    return perim;
}
class Square :public Shape
{
protected:
    double k, area, perim;
public:
    void  Input();
    void  Output();
    double  Area()const;
    double  Perim()const;
}; 
void Square::Input()
{
    cin >> k;
    area = k * k;
    perim = 4 * k;
}
void Square::Output()
{
    cout << perim << "," << area << endl;
}
double Square::Area()  const
{
    return area;
}
double Square::Perim()  const
{
    return perim;
}
class Triangle :public Shape
{
protected:
    double a, b, c, area, perim;
public:
    void  Input();
    void  Output();
    double  Area()const;
    double  Perim()const;
};
void Triangle::Input()
{
    cin >> a >> b >> c;
    double p = (a + b + c) / 2;
    area = sqrt(p * (p - a) * (p - b) * (p - c));
    perim = a + b + c;
}
void Triangle::Output()
{
    cout << perim << "," << area << endl;
}
double Triangle::Area()  const
{
    return area;
}
double Triangle::Perim() const
{
   
    return perim;
}


int main()
{
	Circle circle;
	Square square;
	Triangle triangle;
	Shape* pt[3] = { &circle,&square,&triangle };
	Shape::SetFormat();	
	//输入各图形数据,空白字符隔开
	for (int i = 0; i < 3; i++)
		pt[i]->Input();
	//输出各图形周长和面积,周长和面积值之间逗号隔开
	for (int i = 0; i < 3; i++)	
		pt[i]->Output();	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值