实验6:Problem B: 数组类(II)
Description
封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作:
1. Array::Array(int l)构造方法:创建一个长度为l的组对象。
2. Array::size()方法:返回Array对象中元素个数。
3. Array::put(int n)方法:按从大到小的顺序输出前n大元素,若数组长度小于n则从大到小输出全部元素。
4. 下标运算符:返回下标所指的元素。
-----------------------------------------------------------------------------
你设计一个模板数组类Array,使得main()函数能够正确运行。
函数调用格式见append.cc。
append.cc中已给出main()函数。
Input
输入的第一个整数n,表示有n组测试数据。
后面的每行以一个整数k开头,表示后面有k个同类型的数组元素。
数组元素有以下三种类型:整数、浮点数和字符,并且按固定的次序间隔出现。
Output
把输入的数组,按值从大到小输出前10个元素,若输入不足10个则全部输出。每行数据对应一个输出。格式见sample。
Sample Input
3 10 1 2 3 4 5 6 7 8 9 0 5 1.1 2.2 3.3 4.4 5.5 20 ABCDEGHIJMNPRSTUVWXY
Sample Output
9 8 7 6 5 4 3 2 1 0 5.5 4.4 3.3 2.2 1.1 Y X W V U T S R P N
HINT
Append Code
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 template <class T> 5 class Array{ 6 private: 7 T *p; 8 int length; 9 public: 10 Array(int l) 11 { 12 p=new T[l+1]; 13 length=l; 14 } 15 void put(int n) 16 { 17 int i; 18 for (int k=0;k<length-1;k++) 19 for (int j=k+1;j<length;j++) 20 if (p[k]<p[j]) 21 swap(p[k],p[j]); 22 23 if (n>=length) 24 { 25 for (i=0;i<length-1;i++) 26 cout<<p[i]<<" "; 27 cout<<p[i]<<endl; 28 } 29 else 30 { 31 for (i=0;i<n-1;i++) 32 cout<<p[i]<<" "; 33 cout<<p[i]<<endl; 34 } 35 } 36 int size() 37 { 38 return length; 39 } 40 T& operator[](int n) 41 { 42 return p[n]; 43 } 44 friend istream& operator >> (istream &is,Array &c) 45 { 46 T b; 47 is >> b; 48 return is; 49 } 50 ~Array() 51 { 52 delete[]p; 53 } 54 }; 55 56 int main() 57 { 58 int cases, len; 59 cin >> cases; 60 for(int ca = 1; ca <= cases; ca++) 61 { 62 cin >> len; 63 if(ca % 3 == 0) 64 { 65 Array<char> chr_arr(len); 66 for(int i = 0; i < chr_arr.size(); i++) 67 cin >> chr_arr[i]; 68 chr_arr.put(10); 69 } 70 if(ca % 3 == 1) 71 { 72 Array<int> int_arr(len); 73 for(int i = 0; i < int_arr.size(); i++) 74 cin >> int_arr[i]; 75 int_arr.put(10); 76 } 77 if(ca % 3 == 2) 78 { 79 Array<double> dbl_arr(len); 80 for(int i = 0; i < dbl_arr.size(); i++) 81 cin >> dbl_arr[i]; 82 dbl_arr.put(10); 83 } 84 } 85 }
代码2:
1 #include<iostream> 2 using namespace std; 3 template <class T> 4 class Array{ 5 private: 6 int len; 7 T *p; 8 public: 9 Array(int l){len=l;p=new T[l+1];}///为数组动态分配内存时,注意格式p=new T(l+1);如果用成 T *p=new T[l+1];会导致不能正常输入 10 int size(){return len;} 11 void put(int n) 12 { 13 int i,j; 14 for(i=0;i<len-1;i++) 15 for(j=i+1;j<len;j++) 16 { 17 if(p[j]>p[i]) 18 { 19 T temp=p[j]; 20 p[j]=p[i]; 21 p[i]=temp; 22 } 23 } 24 if(n>=len) 25 for(i=0;i<len;i++) 26 { 27 if(i!=len-1) 28 cout<<p[i]<<" "; 29 else 30 cout<<p[i]<<endl; 31 } 32 else 33 for(i=0;i<n;i++) 34 { 35 if(i!=n-1)///注意是n,不是len! 36 cout<<p[i]<<" "; 37 else 38 cout<<p[i]<<endl; 39 } 40 } 41 T &operator[](int n){return p[n];} 42 ///~Array(){delete []p;}///动态内存分配的数组要手动释放内存(不加析构函数OJ上也不会报错,但会导致内存泄露!) 43 ///friend istream &operator>>(istream &is,Array &c){T b;is>>b;return is;} 44 }; 45 int main() 46 { 47 int cases, len; 48 cin >> cases; 49 for(int ca = 1; ca <= cases; ca++) 50 { 51 cin >> len; 52 if(ca % 3 == 0) 53 { 54 Array<char> chr_arr(len); 55 for(int i = 0; i < chr_arr.size(); i++) 56 cin >> chr_arr[i]; 57 chr_arr.put(10); 58 } 59 if(ca % 3 == 1) 60 { 61 Array<int> int_arr(len); 62 for(int i = 0; i < int_arr.size(); i++) 63 cin >> int_arr[i]; 64 int_arr.put(10); 65 } 66 if(ca % 3 == 2) 67 { 68 Array<double> dbl_arr(len); 69 for(int i = 0; i < dbl_arr.size(); i++) 70 cin >> dbl_arr[i]; 71 dbl_arr.put(10); 72 } 73 } 74 }
向代码最深处出发~!