(考试)2017年大一下学期C++期末考试题目五

4005:类模板

Problem Description
定义一个类模板,包括一个由小到大排列的数据序列,数据元素个数等数据成员,以及构造函数、输出函数和删除函数等成员函数。其中,删除函数用来删除数据系列中相同的数据。

Input
输入数据有多组,每组占3行, 第一行是整数,第二行是实数,第三行是字符。每行的第一个数是整数,表示元素个数。

Output
对于每组输入数据,输出占3行,每行输出删除相同元素后剩下的元素,每个元素后都带有1个空格。具体见输出样例。

Sample Input

5 1 2 2 3 5
6 2.4 2.4 3.3 3.3 4 6
8 aabbccdd

Sample Output

1 2 3 5 
2.4 3.3 4 6 
a b c d

心得

定义类模板比较容易,声明模板类型 T ,然后将数组类型定义为 T 就好。
其实就个人感觉而言,这题在声明类模板上并没有什么难度,主要是如何给数组去重。因为题目中只涉及到了三个基本数据类型,所以只要用等号进行匹配就好。
在本次题目中,我们的数组是已经从小到大排序好了,所以我们可以这么比对:定义临时数组 newArr,遍历原始数组 arr,只要当前元素和下一个元素不相等,我们就认定当前元素不重复,将其纳入到 newArr 中,原始数组遍历完成后,将其指针指向 newArr (arr = newArr;)。

答案

#include <iostream>
#include <cstring>
using namespace std;
template<class T>
class array
{
private:
	int length;
	T *arr;
public:
	array(int length,T *s):length(length)
	{
		arr=new T[length];
		for(int i=0;i<length;i++)
			arr[i]=s[i];
	}
	void show()
	{
		for(int i=0;i<length;i++)
			cout<<arr[i]<<" ";
		cout<<endl;
	}
	void clear()
	{
		int top=0;
		T *newArr=new T[length];
		for(int i=0;i<length-1;i++)
		{
			if(arr[i]!=arr[i+1])
				newArr[top++]=arr[i];
		}
		if(newArr[top-1]!=arr[length-1])
			newArr[top++]=arr[length-1];
		length=top;
		arr=newArr;
	}
	~array()
	{
		delete[] arr;
	}
};
int main()
{
	int n,*a1;
	double *a2;
	char *a3;
	while(cin>>n)
	{
		a1=new int[n];
		for(int i=0;i<n;i++)
			cin>>a1[i];
		array<int> t1(n,a1);
		t1.clear();
		t1.show();
		
		cin>>n;
		a2=new double[n];
		for(i=0;i<n;i++)
			cin>>a2[i];
		array<double> t2(n,a2);
		t2.clear();
		t2.show();
		
        cin>>n;
		a3=new char[n];
		for(i=0;i<n;i++)
			cin>>a3[i];
		array<char> t3(n,a3);
		t3.clear();
		t3.show();
		
		delete[] a1,a2,a3;
	}
	return 0;
}
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值