1、二级 C 语言-302 及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.给定程序中,函数 fun 的功能是:在形参 SS 所指字符串数组中,查找含有形参 substr 所指子串的所有字符串并输出,若没找到则输出相应信息。ss 所指字符串数组中共有 N 个字符串,且串长小于 M。程序中库函数 strstr(s1,s2)的功能是在 s1 串中查找 s2 子串,若没有,函数值为 NULL,若有,为非 NULL。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 不得增行或删行,也不得更改程序的结构! 给定源程序: #inc
2、ludestdio.h #includestring.h #define N 5 #define M 15 void fun(char(*ss)M,char*substr) int i,find=0; /*found*/ for(i=0;i 1;i+) /*found*/ if(strstr(ssi, 2)!=NULL) find=1;puts(ssi);printf(“/n“); /*found*/ if(find= 3) printf(“/nDon“t found!/n“); main() char xNM=“BASIC“,“C langwage“,“Java“,“QBASIC“,“Acc
3、ess“,strM; int i; printf(“/nThe original string/n/n“); for(i=0;iN;i+)puts(xi);printf(“/n“); printf(“/nEnter a string for search:“); gets(str); fun(x,str); (分数:30.00)二、程序改错题(总题数:1,分数:30.00)2.给定程序中函数 fun 的功能是:求三个数的最小公倍数。 例如,给主函数中的变量 x1、x2、x3 分别输入 15 11 2,则输出结果应当是:330。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main
4、 函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #includestdio.h /*found*/ fun(int x,y,z) int j,t,n,m; j=1; t=j%x; m=j%y; n=j%z; while(t!=0|m!=0|n!=0) j=j+1; t=j%x; m=j%y; n=j%z; /*found*/ return i; main() int x1,x2,x3,j; printf(“Input x1 x2 x3:“); scanf(“%d%d%d“, printf(“x1=%d,x2=%d,x3=%d/n“,x1,x2,x3); j=fun(x1,x2,x
5、3); printf(“The minimal common multiple is:%d/n“,j); (分数:30.00)三、程序设计题(总题数:1,分数:40.00)3.假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参 n 给出了字符串的长度,形参 h 给出了字符串中前导*号的个数,形参e 给出了字符串中最后*号的个数。在编写函数时,不得使用 C 语言提供的字符串函数。 例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:A*BC*DEF*G。 请勿改动主函数 main 和其它函
6、数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 给定源程序: #includestdio.h void fun(char*a,int n,int h,int e) main() char s81,*t,*f;int m=0,tn=0,fn=0; printf(“Enter a string:/n“);gets(s); t=f=s; while(*t)t+;m+; t-; while(*t=“*“)t-;tn+; while(*f=“*“)f+;fn+; fun(s,m,fn,tn); printf(“The string after deleted:/n“);puts(s)
7、; (分数:40.00)_二级 C 语言-302 答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.给定程序中,函数 fun 的功能是:在形参 SS 所指字符串数组中,查找含有形参 substr 所指子串的所有字符串并输出,若没找到则输出相应信息。ss 所指字符串数组中共有 N 个字符串,且串长小于 M。程序中库函数 strstr(s1,s2)的功能是在 s1 串中查找 s2 子串,若没有,函数值为 NULL,若有,为非 NULL。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 不得增行或删行,也不得更改程序的结构!
8、 给定源程序: #includestdio.h #includestring.h #define N 5 #define M 15 void fun(char(*ss)M,char*substr) int i,find=0; /*found*/ for(i=0;i 1;i+) /*found*/ if(strstr(ssi, 2)!=NULL) find=1;puts(ssi);printf(“/n“); /*found*/ if(find= 3) printf(“/nDon“t found!/n“); main() char xNM=“BASIC“,“C langwage“,“Java“,“
9、QBASIC“,“Access“,strM; int i; printf(“/nThe original string/n/n“); for(i=0;iN;i+)puts(xi);printf(“/n“); printf(“/nEnter a string for search:“); gets(str); fun(x,str); (分数:30.00)解析:(1)N (2)substr (3)0 解析 填空 1:此处考查 for 循环语句中循环变量 i 的取值范围,题目指出共有 N 个字符串,所以 i 的取值范围为 0N-1。 填空 2:strstr(s1,s2)的功能是在 s1 串中查找 s
10、2 子串。题目要求在 ss 字符串数组中,查找 substr 所指的字符串,故应填 substr。 填空 3:此处使用 if 条件语句来判断查找结果,由 printf(“/nDon“t found!/n“)可知此处需填写没有找到的条件,即是 find=0。二、程序改错题(总题数:1,分数:30.00)2.给定程序中函数 fun 的功能是:求三个数的最小公倍数。 例如,给主函数中的变量 x1、x2、x3 分别输入 15 11 2,则输出结果应当是:330。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #inclu
11、destdio.h /*found*/ fun(int x,y,z) int j,t,n,m; j=1; t=j%x; m=j%y; n=j%z; while(t!=0|m!=0|n!=0) j=j+1; t=j%x; m=j%y; n=j%z; /*found*/ return i; main() int x1,x2,x3,j; printf(“Input x1 x2 x3:“); scanf(“%d%d%d“, printf(“x1=%d,x2=%d,x3=%d/n“,x1,x2,x3); j=fun(x1,x2,x3); printf(“The minimal common multip
12、le is:%d/n“,j); (分数:30.00)解析:(1)fun(int x,int y,int z)或 int fun(int x,int y,int z) (2)return j; 解析 (1)定义函数时,必须为每个形参分别定义变量类型。 (2)通过 return 语句将最小公倍数 j 返回主调函数。三、程序设计题(总题数:1,分数:40.00)3.假定输入的字符串中只包含字母和*号。请编写函数 fun,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参 n 给出了字符串的长度,形参 h 给出了字符串中前导*号的个数,形参e 给出了字符串中最后*号的个数。在编
13、写函数时,不得使用 C 语言提供的字符串函数。 例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:A*BC*DEF*G。 请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 给定源程序: #includestdio.h void fun(char*a,int n,int h,int e) main() char s81,*t,*f;int m=0,tn=0,fn=0; printf(“Enter a string:/n“);gets(s); t=f=s; while(*t)t+;m+; t-; while(*t=“
14、*“)t-;tn+; while(*f=“*“)f+;fn+; fun(s,m,fn,tn); printf(“The string after deleted:/n“);puts(s); (分数:40.00)_正确答案:()解析:void fun(char*a,int n,int h,int e) int i,j=0; for(i=h;in-e;i+)/*第一个字母和最后一个字母之间的字符全不删除*/ aj+=ai; aj=“/0“; /*在字符串最后加上结束标识*/ 解析 由于程序已经给出前导*号和尾部*号的个数,所以只要用循环语句将中间的字符保留起来。注意循环变量 i 的初值(h)和终止值(n-e),由于 h 和 e 分别表示 a 中的前导*号和尾部*号的个数,n 是字符串的长度,所以从 ah到 an-e-1之间的所有字符都要保留。循环结束后在新串的尾部加上结束符“/0“。