1、初级程序员下午试题-2 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 下列流程图用于从数组 K中找出一切满足:K(I)+K(J)=M 的元素对(K(I),K(J)(1IJN)。假定数组 K中的 N个不同的整数已按从小到大的顺序排列,M 是给定的常数。 【流程图】 此流程图 1中,比较“K(I)+K(J):M”最少执行次数约为U (5) /U。 (分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.【说明】 函数 print(BinTreeNode*t; DateType DateType int i, t
2、op; top = 0;/置空栈 while(t! = NULL STtop. ptr = t; STtop. tag = 0; U(2) /U; if(t!= Null U(3) /U;i +) printf(“%d“ ,STtop. ptr -data); else while(U (4) /U) top-; if(top0) STtop. tag = 1; U (5) /U; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int le
3、n)的功能是:将线性表 A中关键码为 key1的结点开始的 len个结点,按原顺序移至线性表 B中关键码为 key2的结点之前,若移动成功,则返回 0;否则返回-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,pre
4、s; int k; if( ! La-next | ! Lb- next | en =0)return-1; p = La - next;prep = La; 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; U(3) /U; while(s s =s-next; if( ! s) return - t; /*表 B中不存在键值为 key2的结点*/ U(4
5、) /U=q- next; /*将表 A中的 len个结点删除*/ q-next=U (5) /U; pres - next = p; /*将 len个结点移至表 B */ return 0; (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.【说明】 将一正整数序列K1,K2,K9重新排列成一个新的序列,新序列中,比 K1小的数都在K1的前面(左面),比 K1大的数都在 K1的后面(右面),最后调用 writeDat()函数的新序列输出到文件out.dat中。 在程序中已给出了 10个序列,每个序列有 9个正整数,并存入数组 a109中,分别求出这 10个新序列。 例
6、:序列6,8,9,1,2,5,4,7,3 经重排后成为3,4,5,2,1,6,8,9,7 【函数】 #include stdio. h #include conio. h void jsValue( int a 10 9 ) int i,j,k,n,temp; int b9; for(i=0;i10;i+) temp=ai 0; k=8;n=0; for(j=8;j=0;j-) if(temp ai j)U (1) /U=aij; if(temp ai j)U (2) /U=aij; if(temp =ai j)U (3) /U= temp; for(j=0;j9;j+) aij =bj; v
7、oid 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,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; U (4) /U; for(i=0;i10;i+) for(j=0;j9;j+) printf(“%d“,ai j ); if(U (5) /U)prin
8、tf(“,“); printf(“ /n“ ); getch( ); (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.【说明】本应用程序的运行窗口如图 2所示。(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 设计一个类模板 SamPle用于对一个有序数组采用二分法查找元素下标。 【C+程序】 #include iostream. h #define Max 100 /最多元素个数 template class T class Sample T AMax: /存放有序数序 int n: /实际元素个数 public Sample( )
9、 /默认构造函数 Sample(T a ,int i); /初始化构造函数 int seek(T c); void disp( ) for(int i=0;i n;i +) coutAi “ “; coutendl: template class T Sample T: :Sample(T a ,int i) n=i: for( intj =0;j i;j + ) U (1) /U; template class T int Sample T : seek( T c) int low =0,high = n-1 ,mid; while(U (2) /U) mid = (low + high)/
10、2; if(U (3) /U) return mid; else if(U (4) /U) low=mid+|; else U (5) /U; return-1; void main( ) char a =“acegkmpwxz“; Sample char s(a, 1); cout“元素序列:“ ;s. disp( ); cout“元素g的下标:“s. seek(g) endl; (分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)7.【说明】 下面的程序的功能是利用实现 Runnable接口的方法来创建线程,并利用它来执行响应的一些操作。最后使得 m的执行结果:100,如
11、图 3。 (分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)8.【说明】 该应用程序是用来修改文本框中的字体属性,其运行窗口如图 4所示。 (分数:15.00)_初级程序员下午试题-2 答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 下列流程图用于从数组 K中找出一切满足:K(I)+K(J)=M 的元素对(K(I),K(J)(1IJN)。假定数组 K中的 N个不同的整数已按从小到大的顺序排列,M 是给定的常数。 【流程图】 此流程图 1中,比较“K(I)+K(J):M”最少执行次数约为U (5) /U。 (分
12、数:15.00)_正确答案:()解析:(1) (2) (3)I+1-I (4)J-1-J (5)N/2 解析 该算法的思路是:设置了两个变量 I和J,初始时分别指向数组 K的第一个元素和最后一个元素。如果这两个元素之和等于 M时,输出结果,并这两个指针都向中间移动;如果小于 M,则将指针 I向中间移动(因为数组 K已按从小到大的顺序排列);如果大于 M,则将指针 J向中间移动(因为数组 K已按从小到大的顺序排列)。当 IJ 时,说明所有的元素都搜索完毕,退出循环。 根据上面的分析,(1)、(2)空要求填写循环结束条件,显然,(1)空处应填写“”,(2)空处应填写“”。这里主要要注意 I=J的情
13、况,当 I=J时,说明指两个指针指向同一元素,应当退出循环。 (3)空在流程图有两处,一处是当 K(I)+K(J)=M时,另一处是当 K(I)+K(J)M 时,根据上面分析这两种情况都要将指针 I向中间移动,即“I+1-I”。同样的道理,(4)空处应填写“J-1-J”。 比较“K(I)+K(J):M”最少执行次数发生在第 1元素与第 N个元素之和等于 M、第 2元素与第 N-1个元素之和等于 M、,这样每次比较,两种指针都向中间移动,因此最小执行次数约为“N-2”。二、B试题二/B(总题数:1,分数:15.00)2.【说明】 函数 print(BinTreeNode*t; DateType D
14、ateType int i, top; top = 0;/置空栈 while(t! = NULL STtop. ptr = t; STtop. tag = 0; U(2) /U; if(t!= Null U(3) /U;i +) printf(“%d“ ,STtop. ptr -data); else while(U (4) /U) top-; if(top0) STtop. tag = 1; U (5) /U; (分数:15.00)_正确答案:()解析:(1)top+ (2)t=t-leftChild (3)i=top (4)top0 struct node * next; *LinkedL
15、ist; 【函数】 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 = La; while(pp = p - next; if( ! p) return - 1; /*在表 A中不存在键值为 key1的结点*/ q=p;k=1; while(q k+; if( ! q)return -1; /*表 A中不
16、存在要被删除的 len个结点*/ s = Lb - next; U(3) /U; while(s s =s-next; if( ! s) return - t; /*表 B中不存在键值为 key2的结点*/ U(4) /U=q- next; /*将表 A中的 len个结点删除*/ q-next=U (5) /U; pres - next = p; /*将 len个结点移至表 B */ return 0; (分数:15.00)_正确答案:()解析:(1)klen (2)q=q-next 或 q=(*q).next (3)pres=Lb (4)prep-next 或(*prep).next (5)
17、s 或pres-next 或(*pres).next 解析 (1)此处 while循环应当循环至 k等于 len结束,所以应填入klen。(2)此处语句表示链表前进一个结点,应填入 q=q-next 或 q=(*q).next。(3)此处语句为指针pres赋初值,使他指向 s的上一结点。(4)修改指针 prep,使 prep指向 q的下一结点。(5)此处语句为修改指针 q,q 指向 s或者 pres的下一结点,达到将 A中的 len个结点删除的目的。四、B试题四/B(总题数:1,分数:15.00)4.【说明】 将一正整数序列K1,K2,K9重新排列成一个新的序列,新序列中,比 K1小的数都在K
18、1的前面(左面),比 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 stdio. h #include conio. h void jsValue( int a 10 9 ) int i,j,k,n,temp; int b9; for(i=0;i10;i+) temp=ai 0; k=8;n=0; for(j=
19、8;j=0;j-) if(temp ai j)U (1) /U=aij; if(temp ai j)U (2) /U=aij; if(temp =ai j)U (3) /U= temp; for(j=0;j9;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,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,
20、9,1,8,2,6,4, 7,1,3,2,5,8,9,4,6 ; int i,j; U (4) /U; for(i=0;i10;i+) for(j=0;j9;j+) printf(“%d“,ai j ); if(U (5) /U)printf(“,“); printf(“ /n“ ); getch( ); (分数:15.00)_正确答案:()解析:(1)bk- (2)bn+ (3)bn (4)jsValue(a) (5)j=7 解析 在主函数中先要调用函数jsValue()对数组 a进行处理,所以(4)空应填入“jsValue(a)”。然后输出数组元素,同一行的元素之间用逗号分隔,所以(5)空
21、应填入“j=7”。 函数 jsValue()是将数组按题目要求进行排序。通过观察发现处理后的数组中元素的顺序与原来的顺序相反,并且每一行中没有与第一个数相同的数,所以是从后往前处理,也就是将每组从最后往前倒序逐个问第一个数比较,比它大的就放到临时数组 b中的最后,比它小的就放到临时数组 b中的最前面,以次类推,所以(1)空应填入“bk- -”,(2)空应填入“bn+,(3)空应填入“bn”。最后将 b数组赋给 a数组。五、B试题五/B(总题数:1,分数:15.00)5.【说明】本应用程序的运行窗口如图 2所示。(分数:15.00)_正确答案:()解析:(1)false (2)300 (3)En
22、abled (4)Label.Visible (5)false 解析 单击“闪烁”按钮后,文字才开始闪烁,所以初始时定时器并未启动,(1)处应填 false。定时器的时间间隔为 0.3秒,即 300毫秒,所以(2)处应填 300(Interval属性的单位是毫秒)。(3)单击“闪烁”按钮后,应启动定时器,所以修改Timerl的 Enable属性为 True。(4)定时器到时的时候,应当使 Label的是否可见属性(Visible)取反,所以(4)处应填 LabelVisible。(5)单击“停止”按钮后,要停止定时器,所以应修改 Timerl的 Enable属性为 false。六、B试题六/B
23、(总题数:1,分数:15.00)6.【说明】 设计一个类模板 SamPle用于对一个有序数组采用二分法查找元素下标。 【C+程序】 #include iostream. h #define Max 100 /最多元素个数 template class T class Sample T AMax: /存放有序数序 int n: /实际元素个数 public Sample( ) /默认构造函数 Sample(T a ,int i); /初始化构造函数 int seek(T c); void disp( ) for(int i=0;i n;i +) coutAi “ “; coutendl: tem
24、plate class T Sample T: :Sample(T a ,int i) n=i: for( intj =0;j i;j + ) U (1) /U; template class T int Sample T : seek( T c) int low =0,high = n-1 ,mid; while(U (2) /U) mid = (low + high)/2; if(U (3) /U) return mid; else if(U (4) /U) low=mid+|; else U (5) /U; return-1; void main( ) char a =“acegkmpw
25、xz“; Sample char s(a, 1); cout“元素序列:“ ;s. disp( ); cout“元素g的下标:“s. seek(g) endl; (分数:15.00)_正确答案:()解析:(1)Aj=aj (2)low=high (3)Amid=c (4)Amidc (5)high=mid-1 解析 在主函数中,首先由类模板实例化成 Samplechar模板类。(1)空所在处为构造函数的声明,将参数中的值赋值到类的成员变量中,所以(1)空应填入“Aj=aj”。 成员函数 seek()采用二分法查找元素下标,变量 low和 high分别表示查找区间的下标,如果查询到目标,则返回相
26、应的下标,若没有查询到,则其结束的条件即(2)空的内容为“low=high”。根据二分法的原理,当中间的元素恰好等于目标元素时,则返回其下标,所以(3)空应填入“Amid =c”;若中间的元素小于目标元素时,则 mid+1作为新的查找区间的起始下标,所以(4)空应填入“Amidc”;否则 mid-1作为新的查找区间的结束下标,所以(5)空应填入“high=mid-1”。七、B试题七/B(总题数:1,分数:15.00)7.【说明】 下面的程序的功能是利用实现 Runnable接口的方法来创建线程,并利用它来执行响应的一些操作。最后使得 m的执行结果:100,如图 3。 (分数:15.00)_正确
27、答案:()解析:(1)implements (2)ClassName (3)Exception (4)ClassName threadl=new ClassName(); (5)start 解析 此处为实现接口关键字。 此处应填类 ClassName的构造函数名,即 ClassName。此处应填异常类名 Exception。定义并初始化刘象 threadl。线程的启动函数。八、B试题八/B(总题数:1,分数:15.00)8.【说明】 该应用程序是用来修改文本框中的字体属性,其运行窗口如图 4所示。 (分数:15.00)_正确答案:()解析:(1)chkFontValue 或 chkFontVa
28、lue=1 (2)chkColor_Click (3)True (4)False (5)chkSize,Value 或 chkSizeValue=1 解析 (1)空需要填写修改字体的条件,当不选择“黑体”时,文字应是“宋体”,即 chkFontValue;1 时为黑体,因此(1)空应填入“chkFontValue=1”或“chkFontValue”。 (2)空要填写修改颜色的过程的名称,这应当是选择框 chkColor的 click事件。因此(2)空应填入“chkColor_Click”。 当不选择“斜体”时,文字采用正常字型。因此(3)、(4)空分别填入“True”、“False”。 当不选择“大小 16”时,字号为 9。因此(5)空处应填写“chkSize Value=1或“chkSizeValue”。