【问题2】
请说明函数CompactArr_vl存在的缺点。
可能由于动态内存申请操作失败而导致函数功能无法实现,没有释放动态数组空间(存在内存泄漏问题),时间和空间效率低。
本问题考察程序分析根本才能。
解决同一个问题会有多种不同的方法,务种方法都有其特点。
在本问题中,相比于函数CompactArr_v2,CompactArrvl的处理思路容易理解,由于数组a的数据需要复制给temp,然后再复制回来,因此需要更多的空间支持,处理速度时间也更长。
另外,其代码执行时也可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现,虽然发生这种情况的概率很低,但也有可能发生。
此外,数完毕前也没有释放所申请的内存块。
试题四
假设一个算术表达式中可以包含以下三种括号:
“(〞和“)〞、“[〞和“]〞及和“}〞,并且这三种括号可以按照任意的次序嵌套使用。
下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。
例如,表达式[a-(b-5)]*c[{}]中的括号是完全匹配的,而表达式[a-(b-5]))*c中的括号不是完全匹配的,因为“(〞与“]〞不能匹配,而且多了一个“)〞,即缺少一个与“)〞相匹配的“(〞。
函数ifMatched(charexpr[])的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式存储在字符数组expr中。
假设表达式中的括号完全匹配,那么该函数的返回值为Matched,否那么返回值为Mismatched。
该函数的处理思路如下:
(1)设置一个初始为空的栈,从左至右扫描表达式。
(2)假设遇上左括号,那么令其入栈;假设遇上右括号,那么需要与栈顶的左括号进展匹配。
(3)假设所遇到的右括号能与栈顶的左括号配对,那么令栈顶的左括号出栈'然后继续匹配过程;否那么返回Mismatched,完毕判断过程。
(4)假设表达式扫描完毕,同时栈变为空,那么说明表达式中的括号能完全匹配,返回Matchedo
函数ifMatched中用到了两种用户自定义数据类型BOOL和STACK,其中,BOOL类型的定义如下:
填补C函数中的空缺〔1)〜〔5)
(1)cptrH-或++cptr或cptr+=1或cptr=cptr+-l
(2)Push(&S,*cptr)
(3)Top(S)
(4)Pop(&S)
(5)IsEmpty(S)
此题考察c程序设计根本才能。
由于已经将表达式以字符串的形式存入字符数组expr,因此指针cptr就用于指示表达式中的每个字符。
显然,以下for语句用于扫描expr中的每个字符:
for(cptr=expr;*cptr!
=1\0';
(1))
因此,空〔1)处应填入cpti++或其等价形式。
空〔2)处进展处理的前提是遇到了左括号,因此,根据题目中对函数ifMatched的处理思路描绘,这时应进展压栈操作,即应填入Push(&S,*cptr),这里要注意函数调用时实参的形式。
由于弹栈操作不能返回栈顶元素,因此根据注释,空〔3)处需要读取栈顶元素,即应填入Top(S),空〔4)处填入Pop(&S)。
由于表达式扫描完毕且同时栈变为空,才说明表达式中的括号能完全匹配,因此,for语句的条件表达式*cptr!
=W不成立时表达式完毕,此时控制流可以到达空〔5)所在语句,在此需要判断栈的状态来决定括号是否完全匹配,即空〔5)处应填入IsEmpty(S)。
试题五
对某几何图形绘制工具进展类建模的结果如图5-1所示,其中Shape为抽象类(应至少包含一个纯虚拟〔virtual)函数),表示通用图形,Box表示矩形,Ellipse表示椭圆,Circle表示圆〔即特殊的椭圆〕,Line表示线条。
下面的C++代码用于实现图5-1所给出的设计思路,将其空缺处填充完好并编译运行,输出结果为:
填补C++代码中的空缺〔1)〜〔5)
(1)virtual
(2):
publicShape
(3):
publicEllipse
(4)newDiagram
(5)delete
此题考察C++语言程序设计的才能,涉及类和抽象类、对象、函数和虚函数的定义和相关操作,以及继承关系。
要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
先考察类图整体构造。
此题中根据类图定义了类:
Diagram、Shape、Box、Ellipse、Line和Circle。
其中Shape为抽象类,表示通用图形,抽象类中应至少包含一个纯虚拟(virtual)函数。
Box表示矩形,Ellipse表示椭圆,Line表示线条,三者都是Shape的子类,继承了Shape类,Circle表示圆〔即特殊的椭圆〕,继承了Ellipse。
抽象类Shape的定义中,需要通过使用virtual标识虚函数,voidpaintO=0;表示paint()是纯虚函数,其定义前必须添加virtual进展表示。
类Ellipse为Shape的子类,Circle为Ellipse的子类,需要在代码中表达出继承。
另外,在子类的构造函数中,调用父类的构造函数,所以继承的权限为public。
其语法为:
public后加类名。
类Diagram中没有定义构造函数,编译器生成一个缺省的构造函数,调用是釆用new关键字加类名。
使用完成之后,通过delete进展释放。
因此空〔1)需要表现出paint()函数为纯虚函数,即为virtual;空〔2)和空〔3)处添加继承父类,并且权限为public,即为:
publicShape和:
publicEllipse;空(4)处补充通过使用编译器生成的缺省构造函数创立对象,即newDiagram;空〔5)处通过delete释放new创立的对象diagram。
试题六
对某几何图形绘制工具进展类建模的结果如图6-1所示,其中Shape为抽象(abstract)类,表示通用图形,Box(矩形)、Ellipse(椭圆〕和Line(线条〕继承〔extends)了Shape类,其中,Circle表示圆〔即特殊的椭圆〕。
下面的Java代码用于实现图6-1所给出的设计思路,将其空缺处填充完好并编译运行,输出结果为:
填补Java代码中的空缺〔1)〜〔6)
(1)abstract或publicabstract
(2)abstract或publicabstract或protectedabstract
(3)extendsShape
(4)extendsEllipse
(5)eraseAShape(shapes[i])
(6)newDiagram()
此题考察Java语言程序设计的才能,涉及类和抽象类、对象、方法和抽象方法的定义和相关操作,以及继承关系。
要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
先考察类图整体构造。
此题中根据类图定义了类:
Diagram、Shape、Box、Ellipse、Line和Circle。
其中Shape为抽象类,表示通用图形,抽象类中应至少包含一个抽象(abstract)方法。
Box表示矩形,Ellipse表示椭圆,Line表示线条,三者都是Shape的子类,继承了Shape类,Circle表示圆〔即特殊的椭圆〕,继承了Ellipse。
抽象类Shape的定义中,需要通过使用abstract标识抽象方法,方法voidpaintO;没有实现体,表示paintO是抽象方法,其定义前必须添加abstract进展表示。
类Ellipse为Shape的子类,Circle为Ellipse的子类,需要在代码中表达出继承。
另外,在子类的构造方法中,需调用父类的构造方法,而在父类中没有不带参数的构造方法,必须使用super关键字显式地进展调用。
在Java中,继承的语法为extends后加类名。
类Diagram中没有定义构造方法,编译器生成一个缺省的构造方法,调用时釆用new关键字加缺省构造器方法。
因此空〔1)和
(2)需要表现出Shape为抽象类,paint()方法为抽象方法,即为abstract;.和〔3)处添加继承父类Shape,即extendsShape;空〔4)处补充继承父类Ellipse,即extendsEllipse;空〔5)处删除图形,即eraseAShape(shapes[i]),调用空〔6)通过使用编译器生成的缺省构造方法创立对象,即newDiagram()。