1、初级程序员下午试题-9 及答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【算法说明】 某英汉词典文件包含 N个记录(N1),每个记录有两个字段:一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。 本算法用于维护、更新该英汉词典文件。维护、更新的方法是:首先输入一个英文单词及其汉语解释,然后在该词典中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该词典的适当位置,使各记录仍按英文单词的词典顺序排列。 【算法】 第一步 读入英汉词典
2、文件,并将读入的 N个英文单词依次存放在字符串数组 ENG中,将相应的汉语解释依次存放在字符串数组 CN中。数组元素 CN(i)给出了数组元素 ENG(i)的解释。 第二步 输入英文单词及其汉语解释,将它们分别存放在字符串变量 E和 C中。若 E为空串或都是空格,则转向第四步。 第三步 根据变量 E的值,用二分法在数组 ENG中查找。具体步骤如下: 11L,NH 2INT(L+H)/2)K 3若 E=ENG(K),则CCN(K),转向第二步 若 EENG(K),则 K-1U (1) /U;若 EENG(K),则 K+1U (2) /U 4若 HL 则 对 I=N,L,-1(始值,终值,增量)循
3、环执行: ENG(I)ENG(I+1) CN(I)CN(I+1) 然后,将 E和 C分别存入U (3) /U和U (4) /U,N+1N 最后转向第二步 否则,转向U (5) /U 第四步 将数组 ENG和 CN输出,形成新的英汉词典文件,算法结束。(分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.【说明】 函数 MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数 n转换成 B(2B16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把 B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C 代码中的
4、符号常量及栈的类型定义如下: #define MAXSIZE 32 typedef struct int * elem; /*栈的存储区*/ int max; /*栈的容量,即栈中最多能存放的元素个数*/ int top; /*栈顶指针*/ Stack; 【代码】 int InitStack(Stack * S,int n) /*创建容量为 n的空栈*/ S - elem = (int*) malloc(n*sizeof(int); if(S - elem = NULL) return-1 S-max=n;U (1) /U=0;return 0; int Push (Stack * s,int
5、 item) /*将整数item压入栈顶*/ if(S-top=S-max)printf(“Stack is full! /n“);return-1; U(2) /U= item; return 0 int StackEmpty(Stack S) return(! S. top)? 1:0; /*判断栈是否为空*/ int Pop(Stack * S) /*栈顶元素出栈*/ if(! S-top) printf(“Pop an empty stack! /n“) ;return -1; return U(3) /U; void MultibaseOutput(long n,int B) int
6、 m;Stack S if (InitStack( return; do if( Push( return; n= U(5) /U; while(n!=0); while(!StackEmpty(S) /*输出 B进制的数*/ m = Pop( if(m10) printf(“%d“,m) ;/*小于 10,输出数字*/ else printf(“%c“,m+55); /*大于或等于 10,输出相应的字符*/ printf( “/n“) ; (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 void rcr(int a,int n,int k)的功能是:
7、将数组 a中的元素 s09n-1循环向右平移 k个位置。 为了达到总移动次数不超过 n的要求,每个元素都必须只经过一次移动到达目标位置。在函数 rcr中用如下算法实现:首先备份 a0的值,然后计算应移动到 a0的元素的下标 p,并将 aP的值移至 a0;接着计算应移动到 ap的元素的下标 q,并将 aq的值移至 ap;依次类推,直到将a0的备份值移到正确位置。 若此时移动到位的元素个数已经为 n,则结束;否则,再备份 a1的值,然后计算应移动到 a1的元素的下标 p,并将 ap的值移至 91;接着计算应移动到 ap的元素的下标q,并将 aq的值移至 ap;依次类推,直到将 a1的备份值移到正确
8、位置。 若此时移动到位的元素个数已经为 n,则结束;否则,从 a2开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。 例如,数组 a中的 6个元素如图 1(a)所示,循环向右平移两个位置后元素的排列情况如图 1(b)所示。 (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.要求执行该段程序后能弹出一个对话框,对话框中有“确定”和“取消”按钮,以及一个带问号的图标,并要求第一个按钮为默认按钮。 Private Sub Form_Load() MsgBox“要重新输入吗?“_,“询问“ End Sub(分数:15.00)_五、B试题五/B(总题数:1,分数:15.
9、00)5.【说明】本应用程序是一个乘法计算器,其运行窗口如图 2所示。(分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 请完成下列 Java程序。程序的执行结果是生成一个具有一个 TextField类型的对象 in、 Button类型的对象 btn和 Label类型的对象 out图形用户界面,程序的功能是计算用户输入数的平方,如图 3所示。 (分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)7.【说明】 请编写一个函数 int SeqSearch(int list,int start,int n,int key),该函数从start开始,在
10、大小为 n的数组 list中查找 key值,返回最先找到的 key值的位置,如果没有找到则返回-1。请修改程序中画线部分的错误并将不同情况下的输出结果补充完整。 【程序】 文件 search.cpp的内容如下: #include iostream. h int SeqSearch( int list ,int start,int n,int key) for(int i=start;i=n;i+) /(1) if( listi = key)/(2) return i; return -1; void main( ) int A10 int key,count=0,pos; cout “ Ent
11、er a list of 10 integers:“; for(pos=0;pos10;pos+) cin A; /(3) cout “ Enter a key; “; cin key; pos=0; while( pos = SeqSearch ( A, pos, 10, key) !=-1 ) count +; pos +; coutkey“occurs“ count (count!=1?“ times“:“ time“) “ in the list,“ endl; 第一种情况:输入 2 3 12 6 8 45 8 33 7输入 key:8 输出:U (4) /U 第二种情况:输入 2 3
12、 126 8 45 8 33 7输入 k6y:9 输出:U (5) /U(分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)8.【说明】 以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件 test.txt中,然后从该文件读出字符串并显示出来。 【程序】 #include stdio. h main( ) FILE * fp; char str100; int i=0; if(fp=fopen(“text.txt“U (1) /U) =NULL) printf(“cant open this file. /n“) ;exit(0) ;
13、printf(“ input astring: /n“ ); gest(str); while( stri ) if(stri =a fputc(stri,U (3) /U); i+; fclose(fp); fp=fopen(“ test.txt“,U (4) /U); fgets(str, 100, fp); printf(“%s/n“ ,str); U (5) /U; (分数:15.00)_初级程序员下午试题-9 答案解析(总分:120.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【算法说明】 某英汉词典文件包含 N个记录(N1),每个记录有两个字段:
14、一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。 本算法用于维护、更新该英汉词典文件。维护、更新的方法是:首先输入一个英文单词及其汉语解释,然后在该词典中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该词典的适当位置,使各记录仍按英文单词的词典顺序排列。 【算法】 第一步 读入英汉词典文件,并将读入的 N个英文单词依次存放在字符串数组 ENG中,将相应的汉语解释依次存放在字符串数组 CN中。数组元素 CN(i)给出了数组元素 ENG(i)的解释。 第二步 输入英文单词及其汉语解释,将
15、它们分别存放在字符串变量 E和 C中。若 E为空串或都是空格,则转向第四步。 第三步 根据变量 E的值,用二分法在数组 ENG中查找。具体步骤如下: 11L,NH 2INT(L+H)/2)K 3若 E=ENG(K),则CCN(K),转向第二步 若 EENG(K),则 K-1U (1) /U;若 EENG(K),则 K+1U (2) /U 4若 HL 则 对 I=N,L,-1(始值,终值,增量)循环执行: ENG(I)ENG(I+1) CN(I)CN(I+1) 然后,将 E和 C分别存入U (3) /U和U (4) /U,N+1N 最后转向第二步 否则,转向U (5) /U 第四步 将数组 EN
16、G和 CN输出,形成新的英汉词典文件,算法结束。(分数:15.00)_正确答案:()解析:H (2)L (3)ENG(L)或等价表达式 (4)CN(L)或等价表达式 (5)(2) 解析 H,L 分别是二分法查找的上界和下界,所以(1)和(2)应分别填入 H,L。(3)和(4)处是将 L之后的元素依次后移以后,将 E和 C分别存入 L处,所以(3)和(4)处应分别填入 ENG(L)和 CN(L)或其他等价表达式,比如 ENG(H+1)。(5)处是HL,这说明查找表未空,需要转向(2)继续查找。二、B试题二/B(总题数:1,分数:15.00)2.【说明】 函数 MultibaseOutput(lo
17、ng n,int B)的功能是:将一个无符号十进制整数 n转换成 B(2B16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把 B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C 代码中的符号常量及栈的类型定义如下: #define MAXSIZE 32 typedef struct int * elem; /*栈的存储区*/ int max; /*栈的容量,即栈中最多能存放的元素个数*/ int top; /*栈顶指针*/ Stack; 【代码】 int InitStack(Stack * S,int n) /*创建容量为 n的空栈*/ S - elem
18、= (int*) malloc(n*sizeof(int); if(S - elem = NULL) return-1 S-max=n;U (1) /U=0;return 0; int Push (Stack * s,int item) /*将整数item压入栈顶*/ if(S-top=S-max)printf(“Stack is full! /n“);return-1; U(2) /U= item; return 0 int StackEmpty(Stack S) return(! S. top)? 1:0; /*判断栈是否为空*/ int Pop(Stack * S) /*栈顶元素出栈*/
19、 if(! S-top) printf(“Pop an empty stack! /n“) ;return -1; return U(3) /U; void MultibaseOutput(long n,int B) int m;Stack S if (InitStack( return; do if( Push( return; n= U(5) /U; while(n!=0); while(!StackEmpty(S) /*输出 B进制的数*/ m = Pop( if(m10) printf(“%d“,m) ;/*小于 10,输出数字*/ else printf(“%c“,m+55); /*
20、大于或等于 10,输出相应的字符*/ printf( “/n“) ; (分数:15.00)_正确答案:()解析:(1)S-top (2)S-elemS-top+ (3)S-elem-S-top (4)n%B (5)n/B 解析 (1)此处初始化栈顶指针,即 S-top=0。(2)此处语句是入栈操作,即先将入栈元素放入栈顶,然后修改栈顶指针。(3)此处语句是出栈操作,即修改栈顶指针,然后弹出栈顶元素。(4)此处语句求得将要入栈的数字,即用 n%B得到 B进制下第一位数字。(5)此处语句修改 n的大小以继续求得更高位的数字。三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 voi
21、d rcr(int a,int n,int k)的功能是:将数组 a中的元素 s09n-1循环向右平移 k个位置。 为了达到总移动次数不超过 n的要求,每个元素都必须只经过一次移动到达目标位置。在函数 rcr中用如下算法实现:首先备份 a0的值,然后计算应移动到 a0的元素的下标 p,并将 aP的值移至 a0;接着计算应移动到 ap的元素的下标 q,并将 aq的值移至 ap;依次类推,直到将a0的备份值移到正确位置。 若此时移动到位的元素个数已经为 n,则结束;否则,再备份 a1的值,然后计算应移动到 a1的元素的下标 p,并将 ap的值移至 91;接着计算应移动到 ap的元素的下标q,并将
22、aq的值移至 ap;依次类推,直到将 a1的备份值移到正确位置。 若此时移动到位的元素个数已经为 n,则结束;否则,从 a2开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。 例如,数组 a中的 6个元素如图 1(a)所示,循环向右平移两个位置后元素的排列情况如图 1(b)所示。 (分数:15.00)_正确答案:()解析:(1)k 或 k!=0 (2)(j-k+n)%n或(t-k+n)%n (3)j (4)at或等价表达式 (5)i+或等价表达式 解析 (1)判断 k执行 k=k%n后是否为 0,即是否是 n的倍数,应填入 k或 k!=0。(2)j 表示要移动到 at的元素的位置,于
23、是 j和 t的关系为 j=(t-k+n)%n;当执行完 j=i,t=i 后,j=t,于是此处可填入(j-k+n)%n 或(t-k+n)%n。(3)将 aj移动到 at后,需要将 t 指向 j,即此处填入 j。(4)将暂存在 temp中的值移动到 at中。即此处填入 at或等价表达式。(5)此处 while循环的递增条件,显然应该是 i+或其他等价表达式。四、B试题四/B(总题数:1,分数:15.00)4.要求执行该段程序后能弹出一个对话框,对话框中有“确定”和“取消”按钮,以及一个带问号的图标,并要求第一个按钮为默认按钮。 Private Sub Form_Load() MsgBox“要重新输
24、入吗?“_,“询问“ End Sub(分数:15.00)_正确答案:()解析:VbOkCancel+VbQuestion+VbDefaultButtonl解析 该题考查的是输出消息函数 MsgBox()的知识,要求考生熟练运用该函数中的参数。在 Visual Basic程序设计中,输出消息函数 MsgBox()的格式是:Msgbox(提示,按钮,标题)“提示”项是必选项,是消息框中出现的文字说明,如该程序中的“要重新输入吗?”字样。“按钮”项是可选项。这个值可以决定消息框中按钮数目及形式、图标的样式以及默认按钮等内容。表 1列出了消息框上内容及符号常数的对应关系。B 表 1 消息框符号对照表/
25、B 组 符号常数 消息框上的对应内容VbOkOnly “确定”按钮VbOkCancel “确定”和“取消”按钮VbAbortRetrylgnore“终止”、“重试”和“忽略”按钮VbYesNoCancel “是”、“否”和“取消”按钮VbYesNo “是”和“否”按钮VbRetryCancel “重试”和“取消”按钮 VbCritical “中止”图标VbQuestion “问号”图标VbExclamation “惊叹号”图标VbInformation “i”图标 VbDefaultButton1 第一个按钮为默认按钮VbDefaultButton2 第二个按钮为默认按钮VbDefaultBu
26、tton3 第三个按钮为默认按钮VbDefaultButton4 第四个按钮为默认按钮五、B试题五/B(总题数:1,分数:15.00)5.【说明】本应用程序是一个乘法计算器,其运行窗口如图 2所示。(分数:15.00)_正确答案:()解析:(1)False (2)cmdMultiply (3)Val(txt1.Text)*Val(txt2.Text)或其等价形式 (4)cmdClear-Click (5)End或 Unload frmMultiply或其等价形式 解析 (1)空处需要填写文本框 3的 Enabled属性,在说明中已经指出用户不能在“积”对应的文本框中输入数据,因此其 Enabl
27、ed属性为“False”。 (2)空处需要填写按钮 1(运算按钮)的名称,从程序代码的 Private Sub cmdMaltiply_Click()事件中,可以判断按钮 1的名称为“cmdMultiply”。 (3)空处所在语句是进行乘积运算,由于文本框的文字是字符类型,不能直接进行乘积运算,先要将它转换成数据型再进行乘积运算。因此(3)空处应当填写“Val(txt1.Text)*Val(txt2.Text)”或其等价形式。 (4)空处需要填写一个事件的名称,从下面的代码可以看出这是“清空”按钮 Click事件所完成的工作,“清空”按钮的名称为“cmdClear”,因此(4)空应填写“cmd
28、Clear_Click”。 (5)空处需要填写退出应用程序的语句。在 VB中,这样的语句有很多,常用有两个,一个是“End”,另一个“Unload窗口名称”。六、B试题六/B(总题数:1,分数:15.00)6.【说明】 请完成下列 Java程序。程序的执行结果是生成一个具有一个 TextField类型的对象 in、 Button类型的对象 btn和 Label类型的对象 out图形用户界面,程序的功能是计算用户输入数的平方,如图 3所示。 (分数:15.00)_正确答案:()解析:(1)new AppFrame() (2)ActionListener (3)ActionEvent (4)Int
29、eger,parseInt(s);或等价形式 (5)WindowEvent 解析 生成类 AppFrame的对象。实现接口 ActionListener。按钮动作事件类名。将字符串 a转化为整数并赋给变量 d。窗口事件类名。七、B试题七/B(总题数:1,分数:15.00)7.【说明】 请编写一个函数 int SeqSearch(int list,int start,int n,int key),该函数从start开始,在大小为 n的数组 list中查找 key值,返回最先找到的 key值的位置,如果没有找到则返回-1。请修改程序中画线部分的错误并将不同情况下的输出结果补充完整。 【程序】 文件
30、 search.cpp的内容如下: #include iostream. h int SeqSearch( int list ,int start,int n,int key) for(int i=start;i=n;i+) /(1) if( listi = key)/(2) return i; return -1; void main( ) int A10 int key,count=0,pos; cout “ Enter a list of 10 integers:“; for(pos=0;pos10;pos+) cin A; /(3) cout “ Enter a key; “; cin
31、 key; pos=0; while( pos = SeqSearch ( A, pos, 10, key) !=-1 ) count +; pos +; coutkey“occurs“ count (count!=1?“ times“:“ time“) “ in the list,“ endl; 第一种情况:输入 2 3 12 6 8 45 8 33 7输入 key:8 输出:U (4) /U 第二种情况:输入 2 3 126 8 45 8 33 7输入 k6y:9 输出:U (5) /U(分数:15.00)_正确答案:()解析:(1)for(int i=start;in;i+) (2)if
32、(listi=key) (3)cinApos (4)8 occurs 2 times in the list (5)9 occurs 0 time in the list 解析 数组下标从 0开始,所以 n次循环要在i=n-1时结束,而不是在 i=n时结束。判断是否相等使用“=”,一个等号是赋值。将输入数字逐个赋给A的 pos处的元素。8 出现 2次,注意结果中的 times。9 出现 0次,注意结果中的 time。八、B试题八/B(总题数:1,分数:15.00)8.【说明】 以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件 test.txt中,然后从
33、该文件读出字符串并显示出来。 【程序】 #include stdio. h main( ) FILE * fp; char str100; int i=0; if(fp=fopen(“text.txt“U (1) /U) =NULL) printf(“cant open this file. /n“) ;exit(0) ; printf(“ input astring: /n“ ); gest(str); while( stri ) if(stri =a fputc(stri,U (3) /U); i+; fclose(fp); fp=fopen(“ test.txt“,U (4) /U);
34、fgets(str, 100, fp); printf(“%s/n“ ,str); U (5) /U; (分数:15.00)_正确答案:()解析:(1)W (2)stri-a+A (3)fp (4)r (5)fclose(fp) 解析 程序运行后,首先打开文件test.txt用于写入,因此(1)空填 w。 程序从键盘读入字符串到变量 str中,对 str中每个字符,如是小写字母,则将其转换成大写字母。(2)空是小写字母转换大写字母的操作。(3)空是将 str中的字符写入文件 text.txt中。 str 中所有字符处理完后,关闭文件 test.txt(对应语句是 fclose (fp),然后重新以读方式打开,因此(4)空填 r,将 test.txt中的内容读到 str中并显示输出后,关闭文件 test.txt,即(5)空填 fclose(fp)。