一、题目
编写一个类模板,保存一组序列数据(该序列数据可以是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函数创建动态数组
③使用类模板,且在类外定义成员函数时要在声明类的后面加<虚拟类型名>,然后再加双冒号
④析构函数在主函数结束前才调用
⑤定义对象时类名后要加<虚拟类型名>
⑥数组容量要随插入删除函数及时变化