文件操作与模板编程题 #1(C++程序设计第7周)

问题描述

实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

注意,只能写一个类模版,不能写多个。

#include 
using namespace std;
// 在此处补充你的代码
int main()
{
    CArray3D<int> a(3,4,5);
    int No = 0;
    for( int i = 0; i < 3; ++ i )
        for( int j = 0; j < 4; ++j )
            for( int k = 0; k < 5; ++k )
                a[i][j][k] = No ++;
    for( int i = 0; i < 3; ++ i )
        for( int j = 0; j < 4; ++j )
            for( int k = 0; k < 5; ++k )
                cout << a[i][j][k] << ",";
return 0;
}

输入

输出

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

样例输入

样例输出

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,

提示

提示:类里面可以定义类,类模版里面也可以定义类模版。例如:

class A
{
    class B {

    };
};

template
class S
{
    T x;
    class K {
        T a;
    };
};

PS:这道题还是废了点时间的,尤其算法1中刚开始写的为屏蔽部分的代码,编译成功,运行会出错,至今仍不清楚错误在哪(可能需要重载赋值运算符,默认的又有什么作用?)。**算法2是网上看到的,写的很好,摘抄如下。

源码
算法1

#include 
using namespace std;
// 在此处补充你的代码
template 
class CArray3D
{
public:
    template <class T1>
    class CArray2D
    {
    private: 
        T1 *a1;//指向二维数组的指针
        int row;//数组行数
        int column;//数组列数
    public:
        CArray2D():a1(NULL),row(0),column(0) {}
        CArray2D(int paraRow, int paraColumn):row(paraRow),column(paraColumn) { a1 = new T1[row*column];}
        void set(int paraRow, int paraColumn)
        {
            row = paraRow;
            column = paraColumn;
            a1 = new T1[row*column];
        }
        ~CArray2D(){if(a1) delete[] a1;}
        T1* operator[](int i) {return a1+i*column;}//重载的实际上是第二维的[], 第一维的[]直接调用int型一维数组的定义
    };
private:
    CArray2D *ptr;
public:
    CArray3D():ptr(NULL) {}
    CArray3D(int z, int y, int x)
    {
        ptr = new CArray2D[z];
        for (int m = 0; m < z; m++)
        {
            ptr[m].set(y,x);
//          CArray2D a(y, x);
//          ptr[m] = a;
        }
    }
    CArray2D& operator[](int i){return ptr[i];}
    ~CArray3D(){if (ptr){delete[] ptr;}}
};
int main()
{
    CArray3D<int> a(3,4,5);
    int No = 0;
    for( int i = 0; i < 3; ++ i )
        for( int j = 0; j < 4; ++j )
            for( int k = 0; k < 5; ++k )
                a[i][j][k] = No ++;

    for( int i = 0; i < 3; ++ i )
        for( int j = 0; j < 4; ++j )
            for( int k = 0; k < 5; ++k )
                cout << a[i][j][k] << ",";
    return 0;
}

算法2

#include 
using namespace std;

template 
class CArray3D
{
public:
    template <class T1>
    class CArray2D
    {  
    public:
        template <class T2>
        class CArray1D
        {  
        public:
            CArray1D()
            {
                a = NULL;
            }
            void set(int n)
            {
                if(a) delete[]a;
                a = new T[n];
            }
            T2 &operator[](int i)
            {
                return a[i];
            }
            ~CArray1D(){delete []a;}
        private:
            T2 * a;

        };
        CArray2D()
        {
            a1 = NULL;
        }
        void set(int m, int n)
        {
            a1 = new CArray1D [m];
            for(int i = 0; i < m; i ++)
                a1[i].set(n);
        }
        ~CArray2D()
        {delete [] a1;}
        CArray1D & operator[](int i)
        {
            return a1[i];
        }
    private:
        CArray1D  * a1; 
    };
    CArray3D(int p, int m, int n)
    {
        a2 = new CArray2D [p];
        for(int i = 0; i < p; i ++)
            a2[i].set(m,n);
    }
    ~CArray3D(){delete[] a2;}
    CArray2D& operator[](int i)
    {
        return a2[i];
    }
private:
    CArray2D *a2;
};

int main()
{
    CArray3D<int> a(3,4,5);
    int No = 0;
    for( int i = 0;i < 3; ++ i )
        for(int j = 0; j < 4; ++j )
            for(int k = 0; k < 5; ++k )
                a[i][j][k]= No ++;

    for( int i = 0;i < 3; ++ i )
        for(int j = 0; j < 4; ++j )
            for(int k = 0; k < 5; ++k )
                cout<< a[i][j][k] << ",";

    return 0;
}

你可能感兴趣的:(程序设计与算法,文件操作与模板,算法,源码)