友元和类模板训练

一、题目

编写一个类模板,保存一组序列数据(该序列数据可以是int型、char型或者float型,提示:数据成员是一个一维数组,类型是虚拟类型参数),该类需要实现对序列数据输入、输出、求和、求平均、统计序列个数、排序、插入或者删除指定的数据等功能。在主函数中测试int、char和float型序列数据处理。

二、解题思路

①数据成员:指针、数组容量、数组大小 成员函数:有参构造函数、析构函数、输入函数、输出函数、求和函数、数组容量函数、数组大小函数、平均函数、排序函数、插入函数、删除函数

②构造函数:数组大小做形参,指针指向新开辟的对应大小数组

③插入函数:数组容量到达上限不能插入,否则插入到尾部,数组容量加一

④删除函数:形参是要删除的数据,查找到数据,依次将后面的数往前面移动一位,最后末尾数据归零,数组容量减一

⑤输入函数:根据需要输入小于等于数组大小的数据个数,为后面插入留有空间

⑥主函数依次测试int型、float型、插入、char型、删除

三、运行结果

四、代码

#include<iostream>

using namespace std;

template<class T>

class MB

{

private:

	T *arr;//指针指向开辟的数组

	int size_v;//数组容量

	int size_n;//数组大小

public:

	MB(int);

	~MB() { cout << "析构函数被调用……" << endl; };//析构函数

	void in_data();

	void out_data();

	T qiuhe();//求和

	int length(){return size_v;}//返回数据总个数

	int vol() { return size_n; }//返回数组大小

	double aver();//求平均

	void sort_line();//从小到大排序

	void insert_back(T val);//尾插

	void del_d(T num);//删除指定数据

};

template<class T>

MB<T>::MB(int size)

{

	cout << "有参构造函数被调用……" << endl;

	size_n = size;

	size_v = 0;

	arr = new T[size_n];//开辟对应大小的数组

}

template<class T>

void MB<T>::in_data()

{

	int flag = 1;

	int i = 0;

	cout << "请输入数据:";

	while (flag)

	{

		cin >> arr[i];

		++i;

		++size_v;//数组中输入的数据数加一,即容量减少一

		cout << "是否继续输入数据?(1/0)";

		cin >> flag;//结束标志

		if (size_n == size_v)  flag = 0;

	}

}

template<class T>

void MB<T>::out_data()

{

	int i = 0;

	cout << "输出数据如下:";

	while (i != size_v)

	{

		cout << arr[i] << " ";

		++i;

	}

	cout << endl;

}

template<class T>

T MB<T>::qiuhe()

{

	T sum = 0;

	int i = 0;

	while (i != size_v)

	{

		sum += arr[i];

		++i;

	}

	return sum;

}

template<class T>

double MB<T>::aver()

{

	T sum = qiuhe();

	int n = length();

	return (float)sum / n;

}

template<class T>

void MB<T>::sort_line()

{

	int i, j;

	T tmp;

	for (i = 0; i < size_v; ++i)

		for (j = i + 1; j < size_v; ++j)

			if (arr[i] > arr[j])

			{

				tmp = arr[i];

				arr[i] = arr[j];

				arr[j] = tmp;

			}

}

template<class T>

void MB<T>::insert_back(T val)

{

	//判断数组容量是否已经到达极限

	if (size_v == size_n)

	{

		cout << "容量已满" << endl;

		return;

	}

	else

	{

		arr[size_v] = val;

		++size_v;//更新大小

	}

}

template<class T>

void MB<T>::del_d(T num)

{

	int i = 0;

	while (i != size_v)

	{

		if (arr[i] == num)  break;//找到数据

		++i;

	}

	while (i != size_v)

	{

		arr[i] = arr[i + 1];

		++i;

	}

	arr[size_v] = 0;//清零最后一个数

	--size_v;//数组实际数据个数减一

	cout << "删除成功!" << endl;

}



int main()

{

	//测试 int 型

	MB<int> mb1(3);//对象数组数据成员 3 个元素,数据类型为 int

	mb1.in_data();//输入数组数据

	mb1.out_data();//输出数据

	cout << "数据总和:" << mb1.qiuhe() << endl;

	cout << "数据总个数:" << mb1.length() << endl;

	cout << "数组容量:" << mb1.vol() << endl;

	cout << "平均数:" << mb1.aver() << endl;

	mb1.sort_line();

	cout << "排序后,数据从小到大为:";

	mb1.out_data();

	cout << "……………………………………分割线……………………………………" << endl;

	//测试 float 型

	MB<float>mb2(4);

	mb2.in_data();//输入数组数据

	mb2.out_data();//输出数据

	cout << "数据总和:" << mb2.qiuhe() << endl;

	cout << "数据总个数:" << mb2.length() << endl;

	cout << "数组容量:" << mb2.vol() << endl;

	cout << "平均数:" << mb2.aver() << endl;

	mb2.sort_line();

	cout << "排序后,数据从小到大为:";

	mb2.out_data();

	//测试插入数据

	cout << "请输入要插入的数据:";

	float n;

	cin >> n;

	mb2.insert_back(n);

	cout << "插入数据后重新排列如下:";

	mb2.sort_line();

	mb2.out_data();

	//测试 char 型,删除数据

	MB<char>mb3(5);

	mb3.in_data();//输入数组数据

	mb3.out_data();//输出数据

	cout << "请输入要删除的数据:";

	char c;

	cin >> c;

	mb3.del_d(c);

	cout << "删除后:";

	mb3.out_data();

	return 0;

}

 五、总结

①根据类模板特点,在类外定义的每个成员函数前都要声明类模板

②通过指针结合new函数创建动态数组

③使用类模板,且在类外定义成员函数时要在声明类的后面加<虚拟类型名>,然后再加双冒号

④析构函数在主函数结束前才调用

⑤定义对象时类名后要加<虚拟类型名>

⑥数组容量要随插入删除函数及时变化

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值