问答题 (一共5题,共5分)

1.

阅读以下问题说明、C 程序和函数,将解答填入答题纸的对应栏内。

【问题 1】

分析下面的C 程序,指出错误代码(或运行异常代码)所在的行号。

【C 程序】

初级程序员,章节练习,基础复习,案例分析

【问题 2】

函数inputArr(int a[], int n)的功能是输入一组整数(输入0或输入的整数个数达到n时结束)存入数组 a,并返回实际输入的整数个数。函数 inputArr 可以成功编译。但测试函数调用inputArr后,发现运行结果不正确。

请指出错误所在的代码行号,并在不增加和删除代码行的情况下进行修改,写出修改正确后的完整代码行,使之符合上述设计意图。

【C 函数】

初级程序员,章节练习,基础复习,案例分析

2.

阅读以下Java代码,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。【说明】进行两个整数之间的比较,由考生通过输入窗口分别输入两个整数,程序比较出结果。例如:先后输入的两个数分别为25和36。 比较结果显示: 25!=36 25<36 25<=36 【Java代码】 import javax.swing.JOptionPane; public class Java3 { public static void main(String args[]) { String (1) //用户输入第1个字符串 secondNuimber, //用户输入第2个字符串 result; //包含输出结果的字符串 int number1, //比较的第1个数 number2; //比较的第2个数 //读用户输入的第1个字符串 firstNumber= JOptionPane(2)("Enter first integer:"); //读用户输入的第2个字符串 secondNumber= JOpttionPane.showlnputDialog("Enter second integer:"); //将字符串类型转换成整数类型 number1=Integer.(3)(firstNumber); number2=Integer.parselnt(secondNumber); result=""; if((4)) result=number1+"=="+number2; if(number1!=number2) result=number1+"!=”"+number2; if(number1<number2) result=result+"\n"+number1+"<"+number2; if(numbe1>number2) result=result+"\n"+number1+">"+number2; if(number1<=number2) result=result+"\n"+number1+"<="+number2; if(number1>=number2) result=result+"\n"+number1+">="+number2; //显示结果 JOptionPane.(5)( null,result,"Comparison Results", JOptionPane.INFORMATION_MESSAGE.; //程序正常退出 System.exit(0); }}

3.

阅读以下说明和C函数,填充(1)~(5)的空缺,将解答填入答题纸的对应栏内。【说明】编写程序,对于从键盘输入的3个实数a、b、c,计算实系数一元二次方程的根并输出所求的根。 【函数】 #include<stdio.h> #include<stdlib.h> #include<math.h> Main() { float a,b,c,delta,x1,x2; printf("Enter a,b,c"); scanf("%f%f%f",&a,&b,&c)); if((1)) if((2)) printf("Input error!\n"); else printf("The single root is %f\n",(3)); else { delta=b*b-4*a*c; if((4)) { x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("x1=%8.2f\nx2=%8.2f\n",x1,x2,); } else if(delta==0) printf("x1=x2=%8.2f\n",(5)); else { Printf("z2=%8.2f+%8.2f*i\n",-b/(2*a),sqrt(-delta)/)(2*abs(a))); Printf("z2=%8.2f-%8.2f*i\n",-b/(2*a),sqrt(-delta)/(2*abs(a))); } }}

4.

阅读说明和流程图,填补流程图中的空缺(1)?(5),将答案填入答题纸对应栏内。【说明】本流程图用于计算菲波那契数列{a1=1,a2=1,…,an=an-1+an-2!n=3,4,…}的前n项(n>=2) 之和S。例如,菲波那契数列前6项之和为20。计算过程中,当前项之前的两项分别动态地保存在变量A和B中。【流程图】

初级程序员,模拟考试,2021年程序员模拟题1

5.

阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

【说明】

模式匹配是指给定主串t和子串s,在主串t中寻找子串s的过程,其中s称为模式。如果匹配成功,返回s在t中的位置,否则返回-1。

KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下:

1.在串t和串s中,分别设比较的起始下标i=j=0。

2.如果串t和串s都还有字符,则循环执行下列操作:

(1)如果j=-l或者t[i]=s[j],则将i和j分别加1,继续比较t和s的下一个字符;

(2)否则,将j向右滑动到next[j]的位置,即j =next[j]。

3.如果s中所有字符均已比较完毕,则返回匹配的起始位置(从1开始);否则返回-1。

其中,next数组根据子串s求解。求解next数组的代码已由get_next函数给出。

【C代码】

(1)常量和变量说明

t,s:长度为lt和ls的字符串

next:next数组,长度为ls

(2)C程序

#include <stdio.h>#include<stdlib.h>#include<string.h>/*求next[]的值*/void get_next( int*next, char *s, int ls) { inti=0,j=-1; next[0]=-1;/*初始化next[0]*/ while(i< ls){/*还有字符*/ if(j==-1lls[i]==s[j]){/*匹配*/ j++; i++; if(s[i]==s[j]) next[i]= next[j]; else Next[i]= j; }else j = next[j]; }} int kmp( int*next, char *t ,char *s, int lt, int ls ) { Inti= 0,j =0 ; while(i < lt && (1) ){ if(j==-1 || (2) ){ i++ ; j++ ; }else (3) ;}if (j >= ls)return (4) ;else return-1;}

【问题1】(8分)

根据题干说明,填充C代码中的空(1)~(4).

【问题2】(2分)

根据题干说明和C代码,分析出kmp算法的时间复杂度为(5)(主串和子串的长度分别为It和Is,用O符号表示)。

【问题3】(5分)

根据C代码,字符串"BBABBCAC"的next数组元素值为(6)(直接写素值,之间用逗号隔开)。若主串为"AABBCBBABBCACCD",子串为"BBABBCAC",则函数Kmp的返回值是(7)。