1、软件水平考试(初级)程序员下午(应用技术)模拟试卷 4及答案与解析 1 阅读下列说明和流程图,将应填入 (n)的语句写在对应栏内。【流程图】下面的流程图描述了对 16位二进制整数求补的算法。计算过程是:从二进制数的低位 (最右位 )开始,依次向高位逐位查看,直到首次遇到 “1”时,停止查看。然后,对该 “1”位左面的更高位 (如果有的话 ),逐位求反,所得的结果就是对原二进制数求补的结果。 例如:对二进制整数 10111001 10101000求补的结果是 01000110 01011000。 设 16位二进制整数中的各位 ,从低位到高位,依次存放在整型数组 BIT的 BIT1BIT16中。例
2、如,二进制整数 10111001 10101000存放在数组 BIT后,就有BIT11=0, BIT2=0, , BIT15=0, BIT16=1。 流程图 (如图 1所示 )中 (1)处按 “循环变量名:循环初值,增量,循环终值 ”格式描述。若流程图中存在空操作,则用 NOP表示。 2 阅读下列函数说明和 C代码,将应填入 (n) 处的字句写在对应栏内。 【说明】 函数 print(BinTreeNode*t; DateType DateType int i, top; top = 0;/置空栈 while(t! = NULL STtop. ptr = t; STtop. tag = 0;
3、(2); if(t!= Null (3);i +) printf(“%d“ ,STtop. ptr - data); else while(4) top-; if(top 0) STtop. tag = 1; (5); 3 阅读下列函数说明和 C函数,将 应填入 (n)处的字句写在对应栏内。 【说明】 函数 DelA_InsB(LinkedList La, LinkedList Lb, int key1, int key2, int len)的功能是:将线性表 A中关键码为 key1的结点开始的 len个结点,按原顺序移至线性表B中关键码为 key2的结点之前,若移动成功,则返回 0;否则返回
4、 -1。线性表的存储结构为带头结点的单链表, La为表 A的头指针, Lb为表 B的头指针。单链表结点的类型定义为 typedef struct node int key; struct node * next; *LinkedList; 【函数】 int DelA_InsB ( LinkedList La, LinkdeList Lb,int key1,int key2,int len) LinkedList p,q,s,prep,pres; int k; if( ! La- next | ! Lb- next | en =0)return-1; p = La - next;prep = L
5、a; while(pp = p - next; if( ! p) return - 1; /*在表 A中不存在键值为 key1的结点 */ q=p;k=1; while(q k+; if( ! q)return -1; /*表 A中不存在要被删除的 len个结点 */ s = Lb - next;(3); while(s s =s- next; if( ! s) return - t; /*表 B中不存在键值为 key2的结点 */ (4)=q- next; /*将表 A中的 len个结点删除 */ q- next=(5); pres - next = p; /*将 len个结点移至表 B *
6、/ return 0; 4 阅读以下说明和 C代码,将应填入 (n)处的字句写在对应栏内。 【说明】 将一正整数序列 K1, K2, , K9重新排列成一个新的序列,新序列中,比 K1小的数都在 K1的前面 (左面 ),比 K1大的数都在 K1的后面 (右面 ),最后调用writeDat()函数 的新序列输出到文件 out.dat中。 在程序中已给出了 10个序列,每个序列有 9个正整数,并存入数组 a109中,分别求出这 10个新序列。 例:序列 6, 8, 9, 1, 2, 5, 4, 7, 3 经重排后成为 3, 4, 5, 2, 1, 6, 8, 9, 7 【函数】 #include
7、stdio. h #include conio. h void jsValue( int a 10 9 ) int i,j,k,n,temp; int b9; for(i=0;i 10;i+) temp=ai 0; k=8;n=0; for(j=8;j=0;j-) if(temp ai j) (1)=aij; if(temp ai j) (2)=aij; if(temp =ai j) (3)= temp; for(j=0;j 9;j+) aij =bj; void main( ) int a10 9 = 6,8,9,1,2,5,4,7,3,3,5,8,9,1,2,6,4,7, 8,2,1,9,
8、3,5,4,6,7, 3,5,1,2,9,8,6,7,4, 4,7,8,9,1,2,5,3,6, 4,7,3,5,1,2,6,8,9, 9,1,3,5,8,6,2,4,7, 2,6,1,9,8,3,5,7,4, 5,3,7,9,1,8,2,6,4, 7,1,3,2,5,8,9,4,6 ; int i,j; (4); for(i=0;i 10;i+) for(j=0;j 9;j+) printf(“%d“,ai j ); if(5)printf(“,“); printf(“ n“ ); getch( ); 5 阅读以下应用说明及 Visual Basic程序代码,将应填入 (n)处的字句写在对应
9、栏内。【说明】 本应用程序是一个乘法计算器,其运行窗口如图 2所示。在该界面中, “被乘数 ”、 “乘数 ”以及“积 ”等文字为标签,相应的 3个输入输出数据框为文本框,此外还有 3个命令按钮。用户在 “被乘数 ”和 “乘数 ”相应的文本框内输入数据,再单击 “运算 ”按钮,便能在 “积 ”对应的文本框中看到相乘的结果;当用户单击 “清除 ”按钮时,就会清除各文本框中的数据;当用户单击 “关闭 ”按钮时就会关闭该窗口并退出应用程序。用户不能在 “积 ”对应的文本框中输入数据。 【属性设置】 各个对象、有关的属性名以及需要修改的属性值设计如下:【程序】 Private Sub cmdMultip
10、ly_Click( ) txt3. Text =Trim(Str (3) 加法运算获得和数 End Sub Private Sub (4) ( txt1. Text=“ “ 空字符串赋值给文本框 txt1的内容 txt2. Text=“ “ 空字符串赋值给文本框 txt2的内容 txt3. Text=“ “ 空字符串赋值给文本框 txt3的内容 End Sub Private Sub cmdClose_Click( ) (5) 退出应用程序 End Sub 6 阅读以下说明和 C+程序,将应填入 (n)处的字句写在对应栏内。 【说明】 以下程序的功能是设计一个栈类 stack T,并建立一个整
11、数栈。 【程序】 #include iostream. h #include stdlib. h const int Max =20; /栈大小 template class T class stack /栈元素数组 T sMax; /栈顶下标 int top; public: stack( ) top =-1; /栈顶初始化为 -1 void push( const T /item入栈 T pop( ); /出栈 int stackempty( ) const; /判断栈是否为 ; template class T void stack T :push(const T exit(1); to
12、p + stop = item; template class T T stack T :pop() T temp; if(top=(2) cout “栈为空,不能出栈操作 “ endl; exit(1); temp =stop; top -; return temp; template class T int stack T : stackempty( ) const return top = -1; void main( ) stack int st; int a =1,2,3,4,5; cout “整数栈 “ endl; cout “入栈序列 :“ endl; for(int i=0;i
13、 4;i +) cout ai “ “; (3); cout endl “出栈序列 “; while(4) tout (5) “ “; cout endl; 7 阅读以下说明和 Java代码,将解答写入对应栏内。 【说明】 下面是一个 Applet程序,其功能是输出已定义好的两个变量 x和 chr。请改正程序中的错误 (有下划线的语句 ),使程序能输出正确的结果。 注意:不改动程序的结构,不得增行或删行。 import java. awt.*; (1) (2) int x=10; (3) Label output1; Label output2; (4) output1 = new Label
14、(“定义 int类型变量 “+“x,的初值为 “+x); output2 = new Label(“定义 char类型变量 “+“chr,的初值为 “+chr); add(output1); add(output2); HTML HEAD TITLE ex34_3 /TITLE /HEAD BODY (5) width=400 height=400 /applet /BODY /HTML 软件水平考试(初级)程序员下午(应用技术)模拟试卷 4答案与解析 1 【正确答案】 (1)i: 1, 1, 16 (2)1- sw (3)0B ITi (4) NOP,或空操作 (5)1- BITi 【试题解
15、析】 该流程图的功能在说明中已经解释了,要解该题关键要搞清楚流程图中引用的变量 sw的含义。通过阅读流程图的说明和流程图可知,变量 sw主要用来定义是否已经找到某一位是 “1”:当 sw=0时,说明到目前为止还没有哪一位是 “1”,不需要对该位求反;当 sw=1时,说明已经有一位是 “1”,需要对该位求反。 先来看 (1)空。 (1)空是要写出循环变量名、循环初值、增量和循环终值,该题要从遍历整型数组 BIT的所有元素,从 BIT1开始到 BIT 16结束,再看流程图的第 1个判断用的变量是 i,这样就可判断循环变量名为 i,循环初值为 1,增量为1,循环终值为 16。这样 (1)空的答案为
16、“i:1,1,6”。 在这个循环中,当第 i位是 1时,即 BIT(i)=1,进入左分支。这时需要判断 sw值,若 sw=0,需要将 sw置为 1; “若 sw=1,需要对将 BIT(i)置为 0。这样 (2)空的答案为 “1- sw”; (3)空的答案为 “0- BITi”。 同样,当第 i位是。时,即 BIT(i)=0,进入右分支。这时需要判断 sw值,若sw=0,将不作任何 操作;若 sw=1,需要对将 BIT(i)置为 1。这样 (4)空的答案为“NOP”; (5)空的答案为 “1- BITi”。 2 【正确答案】 (1)top+ (2)t=t- leftChild (3)i=top
17、(4)top 0 & STtop.tag=1 (5)t=STtop.ptr- rightChild 【试题解析】 这个程序是一个典型二叉树后序遍历非递归算法的应用。算法的实现思路是:先扫描根结点的所有左结点并入栈;当找到一个结点的值为 x,则输入出栈里存放的数据,这些数据就是该结 点所有祖先结点;然后判断栈顶元素的右子树是否已经被后序遍历过,如果是,或者右子树为空,将栈顶元素退栈,该子树已经全部后序遍历过;如果不是,则对栈顶结点的右子树进行后序遍历,此时应把栈顶结点的右子树的相结点放入栈中。再重复上述过程,直至遍历过树中所有结点。 (1)、 (2)空年在循环就是扫描根结点的所有左结点并入栈,根
18、据程序中的栈的定义,栈空时 top=0,因此在入栈时,先将栈顶指针加 1,因此 (1)空处应填写“top+”或其等价形式, (2)空是取当前结点的左子树的根结点,因此应填写 “t=t-leftChild”。 (3)空所在循环是处理找到值为 x的结点,那么该结点的所有祖先结点都存放在栈中,栈中的栈底是二叉树的根,而栈顶元素是该结点的父结点,因此, (3)空处应填写 “i=top”。 (4)空所在循环是判断栈顶元素的右子树是否已经被后序遍历过,如果是,或者右子树为空,将栈顶元素退栈,这里要填写判断条件。 tag=0表示左子树, tag=1表示右子树,因此, (4)空处应填写 “top 0&ST t
19、op.tag=1”。 (5)空所在语句块是处理栈顶元素的右子树没有被后序遍历情况,则将右子树入栈,因此 (5)空处应填写 “t=STtop.ptr- rightChild”。 3 【正确答案】 (1)k len (2)q=q- next或 q=(*q).next (3)pres=Lb (4)prep- next或 (*prep).next (5)s或 pres- next或 (*pres).next 【试题解析】 (1)此处 while循环应当循环至 k等于 len结束,所以应填入 klen。 (2)此处语句表示链表前进一个结点,应填入 q=q- next或 q=(*q).next。 (3)此
20、处语句为指针 pres赋初值,使他指向 s的上一结点。 (4)修改指针 prep,使 prep指向 q的下一结点。 (5)此处语句为修改指针 q, q指向 s或者 pres的下一结点,达到将 A中的 len个结点删除的目的。 4 【正确答案】 (1)bk- (2)bn+ (3)bn (4)jsValue(a) (5)j =7 【试题解析】 在主函数中先要调用函数 jsValue()对数组 a进行处理,所以 (4)空应填入 “jsValue(a)”。然后输出数组元素,同一行的元素之间用逗号分隔,所以 (5)空应填入 “j =7”。 函数 jsValue()是将数组按题目要求进行排序。通过观察发现
21、处理后的数组中元素的顺序与原来的顺序相反,并且每一行中没有与第一个数相同的数,所以是从后往前处理,也就是将每组从最后往前倒序逐个问第一个数比较,比它大的就放到临时数组 b中的最后,比它小的就放到临时数组 b中的最前面,以次类推,所以 (1)空应填入 “bk- -”, (2)空应填入 “bn+, (3)空应填入 “bn”。最后将 b数组赋给 a数组。 5 【正确答案】 (1)False (2)cmdMultiply (3)Val(txt1.Text)*Val(txt2.Text)或其等价形式 (4)cmdClear-Click (5)End或 Unload frmMultiply或其等价形式 【
22、试题解析】 (1)空处需要填写文本框 3的 Enabled属性,在说明中已经指出用户不能在 “积 ”对应的文本框中输入数据,因此其 Enabled属性为 “False”。 (2)空处需要填写按钮 1(运算按钮 )的名称,从程序代码的 Private Sub cmdMaltiply_Click()事件中,可以判断按钮 1的名称为 “cmdMultiply”。 (3)空处所在语句是进行乘积运算,由于文本框的文字是字符类型,不能直接进行乘积运算,先要将它转换成数据型再进行乘积运算。因此 (3)空处应当填写“Val(txt1.Text)*Val(txt2.Text)”或其等价形式。 (4)空处需要填写
23、一个事件的名称,从下面的代码可以看出这是 “清空 ”按钮 Click事件所完成的工作, “清空 ”按钮的名称为 “cmdClear”,因此 (4)空应填写“cmdClear_Click”。 (5)空处需要填写退出应用程序的语句。在 VB中,这样的语句有很多,常用有两个,一个是 “End”,另一个 “Unload窗口名称 ”。 6 【正确答案】 (1)Max-1 (2)-1 (3)st.push(ai) (4)!st.stackempty() (5)st.pop() 【试题解析】 本题用类模板方式定义一个栈类,其中有两个私有数据成员:s(存放栈元素 )和 top(栈顶元素下标 ),以及 3个公有
24、成员函数: push(元素入栈 )、 Pop(元素出栈 )和 stackempty(判断栈是否为空 )。 在函数 push()中,首先要判断是否栈满。栈的大小为 Max,数组的下标从 。开始,所以栈满的条件是栈顶元素下标为 Max-1,所以 (1)空应填入 “Max-1”。同样,在函数 pop()中,首先要判断是否为空栈,由于栈顶初始化为 -1,所以 (2)空应填入 “-1”。 在主函数中,先进行入栈操作,所以 (3)空应填入 “st.push(a i)”。然后进行出栈操作,判断栈是否为空,调用对象的函数 stackempty(),所以 (4)空应填入“!st.stackempty()”。 (5)空处调用出栈函数,所以应填入 “st.pop()”。 7 【正确答案】 (1)import java.applet * (2)public class MyApplet extends Applet (3)char chr=R (4)public void init() (5) appletcode=“MyApplet class” 【试题解析】 创建 applet程序应导入包 applet。 applet程序类继承自类 Applet。声明字符型变量应当使用单引号。初始化函数必须是公有的。调用 applet类应当使用关键字 code。