Skip to content

1410: 这是道工程题

题目

题目描述

助教发现上次机考写工程题的同学好像不是很多,为了鼓励大家尝试工程题,因此助教决定出一出大家已经学会的指针和类,相信大家都已经得心应手了吧。

本题描述如下:

你需要实现一个类:CrossArray

CrossArray类要实现为以int为元素的二维交错数组的功能。二维交错数组由若干个数组并联在一起,但每个数组彼此间长度不一定相同。

  • 注意:本题禁止使用任何库。

而更具体地,你需要实现的每个类的对外接口如下:

CrossArray类:

  • CrossArray(int lines): 构造函数,lines代表最多有多少个数组并联在一起,注意,此时二维交错数组中的每个一维数组都视为nullptr
  • CrossArray(const CrossArray & o): 拷贝构造函数,用o中的信息构造一个新的CrossArray类,新的类二维数组的每一个元素都应当与o的对应元素相同。

  • bool InsertArrays(const int * Input, int size): 插入数组函数,插入的数组大小为size,第i个插入的数组记它在二维数组里的下标为i-1,相当于用数组Input里的元素填充二维数组里的一维数组。若插入Input后总计存在的一维数组的数量超过了构造时的上限,则返回false,且该次插入不会发生;反之,返回true

  • void AppendArrays(const int * Input,int Line,int size): 增长数组函数,Line对应一维数组的下标,在该一维数组后增加Input数组,Input数组大小为size。保证该函数只会在已经Insert的数组后面Append并且保证Line合法。

  • CrossArray & WhichGreater(CrossArray & o): 比较大小函数,比较当前类的所有元素个数与o中的所有元素个数谁更大,返回更大的那个CrossArray;若二者相同元素个数,返回当前类。
  • bool IsSame(const CrossArray & o): 是否相同函数,比较当前类的空间与o是否属于同一块空间,若是,返回true;反之返回false

  • void DoubleCrossLength(): 翻倍空间函数,将CrossArray中的数组并联上限翻倍,保持原有的一维数组元素与下标不变,新增的一维数组均视为nullptr

  • const int * AtArray(int i): 取数组函数,返回下标为i的数组的首指针。若该数组为nullptr,则返回nullptr。保证i合法。

  • int & At(int i , int j): 取值函数,返回下标为i数组的第j个元素。i,j均为0-base,保证i,j合法。

  • 以及CrossArray类的析构函数。

输入格式

本次你实现的类将作为hpp被测试。请将如下部分的代码复制后,完成题目要求,并且注意检查内存泄漏。我们将调用如上提到的函数接口。你可以自己实现额外的函数以方便完成题目。

``` namespace sjtu { class CrossArray{ private: public: explicit CrossArray(int lines);

    CrossArray(const CrossArray & o);

    CrossArray & WhichGreater(CrossArray & o);

    bool IsSame(const CrossArray & o);

    bool InsertArrays(const int * Input, int size);

    void AppendArrays(const int * Input,int Line,int size);

    void DoubleCrossLength();

    const int * AtArray(int i);

    int & At(int i , int j);

    ~CrossArray();

};

} ```

输出格式

得分分布:

  1. 若你完成了CrossArray类的构造函数析构函数InsertArrays函数,你将得到$30\%$的分数。
  2. 在此基础上,若你额外完成了At函数,你将额外得到$10\%$的分数。“额外”的含义为,在评测At的函数时,我们会用到先前的函数。
  3. 例如,你没有完成InsertArrays函数,而只完成了At函数,那么你将不会得到At函数的额外分数。如下的函数测评则会依次递进,你只有完成先前的函数,才有可能能拿到额外的分数。
  4. CrossArray拷贝构造对应额外$15\%$的分数。
  5. Append函数对应额外$15\%$的分数。
  6. GreaterIsSame一同对应额外$10\%$的分数。
  7. AtArrays对应额外$5\%$的分数。
  8. DoubleCrossLength对应额外$15\%$的分数。
  9. 另外,在机考时,虽然我们不做要求,但还是希望同学们能尽可能保持自身良好的工程习惯。
  10. 由于c++的语法,在类中只声明函数而没有实现该函数将会引发CE。

样例输入

样例输出

数据范围

对于CrossArray类,保证数组并联的上限小于等于1000。

对于CrossArray类里的每一个一维数组,长度保证小于等于10000。

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!