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();
};
} ```
输出格式
得分分布:
- 若你完成了
CrossArray
类的构造函数
与析构函数
与InsertArrays
函数,你将得到$30\%$的分数。 - 在此基础上,若你额外完成了
At
函数,你将额外得到$10\%$的分数。“额外”的含义为,在评测At
的函数时,我们会用到先前的函数。 - 例如,你没有完成
InsertArrays
函数,而只完成了At
函数,那么你将不会得到At
函数的额外分数。如下的函数测评则会依次递进,你只有完成先前的函数,才有可能能拿到额外的分数。 CrossArray
的拷贝构造
对应额外$15\%$的分数。Append
函数对应额外$15\%$的分数。Greater
和IsSame
一同对应额外$10\%$的分数。AtArrays
对应额外$5\%$的分数。DoubleCrossLength
对应额外$15\%$的分数。- 另外,在机考时,虽然我们不做要求,但还是希望同学们能尽可能保持自身良好的工程习惯。
- 由于c++的语法,在类中只声明函数而没有实现该函数将会引发CE。
样例输入
无
样例输出
无
数据范围
对于CrossArray
类,保证数组并联的上限小于等于1000。
对于CrossArray
类里的每一个一维数组,长度保证小于等于10000。
Oops! 本题目还没有解答!
助教老师们编题的速度,已经超过了解题的速度!
OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。
如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!