第十四周任务一

来源:互联网 发布:巨人网络注册 编辑:程序博客网 时间:2024/05/18 05:35

【题目】建立专门的数组类处理有关数组的操作
在下面代码的基础上,完成支持数组操作的类的设计,增强C++内置数组类型功能。

[cpp] view plaincopyprint?
  1. class MyArray  
  2. {  
  3. private:  
  4.     int *arr;       //用于存放动态分配的数组内存首地址  
  5.     int size;       //数组大小  
  6. public:  
  7.     MyArray(int sz=50);  
  8.     MyArray(int a[],int sz);    //由一个内置类型的数组初始化  
  9.     MyArray(const MyArray &A);  //复制构造函数  
  10.     ~MyArray(void);             //析构函数,注意释放空间  
  11.     MyArray&operator =(const MyArray &A); //重载“=”使得数组对象可以整体赋值  
  12.     int& operator[](int i);     //重载[],使得Array对象也可以如C++普通数组一样,用a[i]形式取出值【选做】  
  13.     bool operator == (MyArray& A);  //重载==,使得Array对象能整体判断两个数组是否相等(size相等且对应元素相等)  
  14.     MyArray operator + (MyArray& A);    //重载+,使两个Array对象可以整体相加(前提大小相等)【选做】  
  15.     friend ostream& operator << (ostream& out,MyArray& A);    //重载<<,输出数组  
  16.     int GetSize(void)const//取数组大小;  
  17.     void Resize(int sz);    //修改数组的大小,如果sz大于数组的原大小,增加的元素初始为;sz小于数组的原大小,舍弃后面的元素【选做】  
  18. };  
  19.   
  20. int main()  
  21. {   int a[10]={1,2,3,4,5,6,7,8,9,10};  
  22.     int b[10]={4,5,6,7,8,9,10,11,12,13};  
  23.     MyArray arr1(a,10);  
  24.     MyArray arr2(b,10);  
  25.     MyArray arr3(10);  
  26.     cout<<arr3;  
  27.     arr3 = arr1 +arr2;  
  28.     cout<<arr3;  
  29.     arr3.Resize(20);  
  30.     cout<<arr3;  
  31.     arr3.Resize(5);  
  32.     cout<<arr3;  
  33.     system("pause");  
  34.     return 0;  
  35. }   


【参考解答】

[cpp] view plaincopyprint?
  1. #include <iostream>   
  2. using namespace std;  
  3. class MyArray  
  4. {  
  5. private:  
  6.     int *arr;       //用于存放动态分配的数组内存首地址  
  7.     int size;       //数组大小  
  8. public:  
  9.     MyArray(int sz=50);  
  10.     MyArray(int a[],int sz);    //由一个内置类型的数组初始化  
  11.     MyArray(const MyArray &A);  //复制构造函数  
  12.     ~MyArray(void);             //析构函数,注意释放空间  
  13.     MyArray&operator =(const MyArray &A); //重载“=”使得数组对象可以整体赋值  
  14.     int& operator[](int i);     //重载[],使得Array对象也可以如C++普通数组一样,用a[i]形式取出值【选做】  
  15.     bool operator == (MyArray& A);  //重载==,使得Array对象能整体判断两个数组是否相等(size相等且对应元素相等)  
  16.     MyArray operator + (MyArray& A);    //重载+,使两个Array对象可以整体相加(前提大小相等)【选做】  
  17.     friend ostream& operator << (ostream& out,MyArray& A);    //重载<<,输出数组  
  18.     int GetSize(void)const//取数组大小;  
  19.     void Resize(int sz);    //修改数组的大小,如果sz大于数组的原大小,增加的元素初始为;如果sz大于数组的原大小,舍弃后面的元素【选做】  
  20. };  
  21.   
  22. //以下为类成员函数的定义  
  23.   
  24. //构造函数  
  25. MyArray::MyArray(int sz)  
  26. {  
  27.     if(sz<=0)  
  28.     {  
  29.         cout<<"invalid Array Size!";  
  30.         exit(1);  
  31.     }  
  32.     size=sz;            //将元素个数赋值给变量size  
  33.     arr=new int[size];//动态分配内存,将size个int类型的元素空间分配出来  
  34.     for(int i=0; i<size; ++i)  
  35.         *(arr+i)=0;  
  36. }  
  37.   
  38. MyArray::MyArray(int a[],int sz)  
  39. {  
  40.     if(sz<=0)  
  41.     {  
  42.         cout<<"invalidArraySize";  
  43.         exit(1);  
  44.     }  
  45.     size=sz;//将元素个数赋值给变量size  
  46.     arr=new int[size];//动态分配内存,将size个int类型的元素空间分配出来  
  47.     for(int i=0; i<size; ++i)  
  48.         *(arr+i)=*(a+i);  
  49. }  
  50.   
  51. //析构函数  
  52. MyArray::~MyArray(void)  
  53. {  
  54.     delete []arr;  
  55. }  
  56.   
  57. //复制构造函数  
  58. MyArray::MyArray(const MyArray& A)  
  59. {  
  60.     //从对象A取得数组大小,并赋给当前对象成员  
  61.     int n=A.size;  
  62.     size=n;  
  63.     //为对象申请内存并进行出错检测  
  64.     arr=new int[n];  
  65.     //从对象A复制数组元素到本对象  
  66.     int *srcptr=A.arr;//X.arr是对象A的数组首地址  
  67.     int *destptr=arr;//arr是本对象中的数组首地址  
  68.     while(n--)  
  69.     {  
  70.         *destptr=*srcptr;  
  71.         destptr++;  
  72.         srcptr++;  
  73.     }  
  74. }  
  75.   
  76. //重载'='  
  77. MyArray& MyArray::operator =(const MyArray &A)  
  78. {  
  79.     int n=A.size;//取A数组的大小  
  80.     //如果本对象中的数组大小和A不同,则删除数组原有的内存,然后重新分配  
  81.     if (size!=n)  
  82.     {  
  83.         delete []arr;  
  84.         arr=new int[n];  
  85.         size=n;  
  86.     }  
  87.   
  88.     //从rhs向本对象复制元素  
  89.     int* destptr=arr;  
  90.     int* srcptr=A.arr;  
  91.     while(n--)  
  92.     {  
  93.         *destptr=*srcptr;  
  94.         destptr++;  
  95.         srcptr++;  
  96.     }  
  97.     return *this;//返回当前对象的引用  
  98. }  
  99.   
  100. //重载[]  
  101. int &MyArray::operator[](int n)  
  102. {  
  103.     if(n<0||n>size-1)  
  104.     {  
  105.         cout<<"indexOutOfRange"<<endl;  
  106.         exit(1);  
  107.     }  
  108.     return arr[n];  
  109. }  
  110.   
  111. bool MyArray::operator == (MyArray& A)  
  112. {  
  113.     bool eq=true;  
  114.     int n=A.size;   //取A数组的大小  
  115.     if (size!=n)   //大小是否一致  
  116.     {  
  117.         eq=false;  
  118.     }  
  119.     else  
  120.     {  
  121.         int* destptr=arr;  
  122.         int* srcptr=A.arr;  
  123.         while(n--)  
  124.         {  
  125.             if(*destptr!=*srcptr)  
  126.             {  
  127.                 eq=false;  
  128.                 break;  
  129.             }  
  130.             destptr++;  
  131.             srcptr++;  
  132.         }  
  133.     }  
  134.     return eq;//返回当前对象的引用  
  135. }  
  136.   
  137. MyArray MyArray::operator + (MyArray& A)  
  138. {  
  139.     int n=A.size;   //取A数组的大小  
  140.     if (size!=n)   //大小不一致不能相加  
  141.     {  
  142.         cout<<"not same size for add!"<<endl;  
  143.         exit(1);  
  144.     }  
  145.     MyArray a(n);  //指定size的数组  
  146.   
  147.     for (int i = 0; i < size; i++)  
  148.     {  
  149.         a[i]=arr[i]+A[i];  
  150.     }  
  151.     return a;//返回当前对象的引用  
  152. }  
  153.   
  154. ostream& operator << (ostream& out, MyArray& A)  
  155. {  
  156.     for (int i = 0; i < A.size; i++)  
  157.     {  
  158.         out<<A[i]<<'\t';  
  159.     }  
  160.     out<<endl;  
  161.     return out;  
  162. }  
  163.   
  164. //取当前数组大小  
  165. int MyArray::GetSize(void)const  
  166. {  
  167.     return size;  
  168. }  
  169.   
  170. //将数组大小修改为sz  
  171. void MyArray::Resize(int sz)  
  172. {  
  173.     if(sz<=0)  
  174.     {  
  175.         cout<<"invalidArraySize"<<endl;  
  176.         exit(1);  
  177.     }  
  178.     if(sz==size)  
  179.         return;  
  180.     int *newlist=new int[sz];  
  181.     for (int i = 0; i < sz; i++)  
  182.     {  
  183.         *(newlist+i)=0;  
  184.     }  
  185.     int n=(sz<=size)?sz:size;  
  186.     int *srcptr=arr;  
  187.     int *destptr=newlist;  
  188.     while(n--)  
  189.     {  
  190.         *destptr=*srcptr;  
  191.         destptr++;  
  192.         srcptr++;  
  193.     }  
  194.     delete []arr;  
  195.     arr=newlist;  
  196.     size=sz;  
  197. }  
  198.   
  199. int main()  
  200. {  
  201.     int a[10]={1,2,3,4,5,6,7,8,9,10};  
  202.     int b[10]={4,5,6,7,8,9,10,11,12,13};  
  203.     MyArray arr1(a,10);  
  204.     MyArray arr2(b,10);  
  205.     MyArray arr3(10);  
  206.     cout<<arr3;  
  207.     arr3 = arr1 +arr2;  
  208.     cout<<arr3;  
  209.     arr3.Resize(20);  
  210.     cout<<arr3;  
  211.     arr3.Resize(5);  
  212.     cout<<arr3;  
  213.     system("pause");  
  214.     return 0;  
  215. }   

原创粉丝点击