C++ | 一道例题

题目

设计一个函数模板Average实现平均值的计算。编写程序提示用户输入一个班级中的学生人数n, 再提示用户依次输入n个人在英语课中的考试成绩,然后利用函数模板Average计算出平均成绩,并将结果显示出来。请使用Vector<T>类模板存储浮点数类型的考试成绩。一个运行结果示例如下:

填写代码

#include <iostream>
using namespace std;
#include"vector.h"

template<class T>
T Average(const Vector<T> a)
{
    T sum;
    for(int i=0;i<a.Size();i++) //n还没有输入,先用size函数
    {
        sum+=a[i];
    }
    return sum/a.Size();
}


int main() {
    cout<<"请输入班级人数:"<<endl;
    int n;
    cin>>n;
    Vector<float> a;
    cout<<"请依次输入学生的英语成绩:"<<endl;
    float f;
    for(int i=1;i<=n;i++)
    {
        cin>>f;
            cout<<"第"<<i<<"名同学的成绩为:"<<f<<endl;
        a.Push_back(f);
    }
    cout<<"该班英语平均成绩为:"<<Average(a)<<endl;
    return 0;

头文件

#ifndef VECTOR_H
#define VECTOR_H
#include<iostream>
#include<stdlib.h>
template<class T>
class Vector
{
private:
	T *data;						//指向动态数组指针
	int size;						//数组的数据元素个数
	int max;						//数组容量
	void Error(const char* cs)const
{cout<<cs<<endl;exit(1);}               //错误信息报告
public:
	enum{SPARE_MAX=16};				//枚举常量表示数组最小长度
	explicit Vector(int n=0):size(0),max(n+SPARE_MAX)
		{if(max>0) data=new T[max];}
      //复制构造函数
	Vector(const Vector& v):data(NULL),max(0){operator=(v);}	~Vector(void){delete[]data;}
	Vector& operator=(const Vector<T>& v);		//复制赋值函数
	T& operator[](int id){return(data[id]);}	//下标运算符函数
//常量型下标运算符函数	
const T& operator[](int id)const{return(data[id]);}	
bool Empty(void)const{return(size==0);}	//判空
	int Size(void)const{return(size);}		//求数据个数
	int Max(void)const{return(max);}			//求数组容量
	void Push_back(const T& item);			//尾插
	void Pop_back(void);				//尾删
	const T& Back(void)const;				//返回尾元素的引用
	const T& Front(void)const;				//返回首元素的引用
	void Clear(void){size=0;}			//清空。删除所有数据元素
	void Reserve(int newMax);	//扩大数组容量为newmax,保留原来数据
      //把数据个数增加为newsize,原来的数据保留,其余的值为item
	void Resize(int newSize,const T& item=T());	
//迭代器类型
	typedef T* iterator;			//迭代器
	typedef const T* const_iterator;		//指向const常量的迭代器
	iterator begin(){return &data[0];}	//使迭代器指向容器起始位置
	const_iterator begin()const{return &data[0];}
	iterator end(){return(&data[size]);}	//使迭代器指向容器结束位置
	const_iterator end()const{	return(&data[size]);}
	iterator Insert(iterator itr,const T& item);
	iterator Erase(iterator itr);
};

template<class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& v)//复制赋值函数
{
	if(max!=v.Max())  
	{
		delete[]data;
		max=v.max;
		data=new T[max];
	}
	size=v.Size();
	for(int i=0;i<size;i++)
			data[i]=v.data[i];
	return(*this);
}
template<class T>
void Vector<T>::Push_back(const T& item)  //尾插
{
	if(size==max)			//如果空间数据已满,就要先扩大容量
		Reserve(2*max+1);
	data[size++]=item;		//插入元素到尾部,数据个数增1
}

//删除指示器指向的元素
template<class T>				//模板参数表
			//返回值类型
typename Vector<T>::iterator Vector<T>::Erase(iterator itr)	
{
	if(size==0)				//检查是否是空表			
		Error("Erase:an empty Vector!");		
	if(itr<begin()||itr>end()-1)     //检查删除位置是否合法		
		Error("Erase: out of illegal!");
	for(iterator p=itr;p!=end();++p)
		*p=*(p+1);
	size--;
	return(itr);
}

//把元素item插入到指示器指向的位置
template<class T>				//模板参数表
typename  Vector<T>::iterator				//返回值类型
Vector<T>::Insert(iterator itr,const T& item)//把元素item插入到指示器指向的位置
{
	if(size==max)					
		Reserve(2*max+1);		//如果空间数据已满,就要先扩大容量
	if(itr<begin()||itr>end())	//检查插入位置是否合法
		Error("Insert:out of range");
	for(iterator p=end();p!=itr;--p)//从尾元素到插入位置上元素往后移动一个位置
		*p=*(p-1);
	*itr=item;					//插入元素到指定位置
	size++;						//数据个数增1
	return(itr);
}

template<class T>
void Vector<T>::Pop_back(void)	//尾删
{
	if(size==0)
		Error("Empty Vector!");
	size--;
}

template<class T>
const T& Vector<T>::Back(void)const//返回尾元素的引用
{
	if(size==0)
		Error("Empty Vector!");
	return(data[size-1]);
}
template<class T>
const T& Vector<T>::Front(void)const//返回起始元素的引用
{
	if(size==0)
		Error("Empty Vector!");
	return(data[0]);
}

template<class T>
void Vector<T>::Reserve(int newmax)							
{
	if(newmax<max)		//如果数组容量已满足,则返回
		return;
	T* old=data;			//保留原数组
	data=new T[newmax];		//重新分配新数组		
	for(int i=0;i<size;i++)	//把原数组中的数据复制到新数组
		data[i]=old[i];
	max=newmax;			//修改数组容量
	delete[]old;			//释放原数组空间			
}

//数据个数增为newsize,原数据保留,增加的数据元素初始化为item
template<class T>
void Vector<T>::Resize(int newsize,const T& item)				
{
	if(newsize>max)			//如果数据元素个数大于数组容量
		Reserve(newsize*2+1);	//扩大数组容量
	for(int i=size;i<newsize;i++)	//把增加的数据元素初始化为item
		data[i]=item;
	size=newsize;
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值