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

xiaoxiao2021-02-28  116

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; }
转载请注明原文地址: https://www.6miu.com/read-47224.html

最新回复(0)