1、二级 C 语言-327 及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun 的功能是:在形参 ss 所指字符串数组中,查找含有形参 substr 所指子串的所有字符串,并输出,若没找到则输出相应信息。ss 所指字符串数组中共有 N 个字符串,且串长小于 M。程序中库函数 strstr(s1,s2)的功能是在 s1 串中查找 s2 子串第一次出现的位置,返回该位置的指针,找不到则返回空指针。 请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序
2、的结构! 试题程序: #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 langua
3、ge“, “Java“, “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,分数:30.00)2.下列给定程序中函数 fun 的功能是:求三个数的最小公倍数。 例如,若给主函数中的变量 x1、x2、x3 分别输入 15112,则输出结果应当是 330。 请
4、改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 试题程序: #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
5、, x2=%d, x3=%d/n“, x1, x2, x3); j=fun(x1, x2, x3); printf(“The minimal common multiple is: %d/n“, j); (分数:30.00)三、程序设计题(总题数:1,分数:40.00)3.规定输入的字符串中只包含字母和*号。请编写函数 fun,其功能是:只删除字符前导和尾部的*号,串中字母间的*号都不删除。形参 n 给出了字符串的长度,形参 h 给出了字符串中前导*号的个数,形参 e 给出了字符串中尾部*号的个数。在编写函数时,不得使用 C 语言提供的字符串函数。 例如,字符串中的内容为“*A*BC*DEF*
6、G*”,删除后,字符串中的内容应当是“A*BC*DEF*G”。注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 试题程序: #includestdio.h #includeconio.h void fun(char*a, int n, int h, int e) void 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+; /*m 为字符串的长度*/
7、 t-; /*指针 t 指向字符串尾部*/ while(*t=“*“) t-; tn+; /*指针 t 指向最后一个字母, tn 统计尾部“*“的个数*/ while(*f=“*“) f+; fn+; /*指针 f 指向第一个字母, fn 统计前导“*“的个数*/ fun(s, m, fn, tn); printf(“The string after deleted:/n“); puts(s); (分数:40.00)_二级 C 语言-327 答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.下列给定程序中,函数 fun 的功能是:在形参 ss
8、 所指字符串数组中,查找含有形参 substr 所指子串的所有字符串,并输出,若没找到则输出相应信息。ss 所指字符串数组中共有 N 个字符串,且串长小于 M。程序中库函数 strstr(s1,s2)的功能是在 s1 串中查找 s2 子串第一次出现的位置,返回该位置的指针,找不到则返回空指针。 请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 不得增行或删行,也不得更改程序的结构! 试题程序: #includestdio.h #includestring.h #define N 5 #define M 15 void fun(char(*ss)M,
9、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 language“, “Java“, “QBASIC“, “Access“, strM; int i; printf(“/nThe original string/n/n“); for(i=0
10、; 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 串中查找 s2 子串。题目要求在 ss 字符串数组中,查找 substr 所指的字符串,故应填 substr。 填空 3:此处使用 if 条件语句来判断
11、查找结果,由 printf(“/nDon“t found!/n“)可知此处需填写没有找到的条件,即是 find=0。二、程序改错题(总题数:1,分数:30.00)2.下列给定程序中函数 fun 的功能是:求三个数的最小公倍数。 例如,若给主函数中的变量 x1、x2、x3 分别输入 15112,则输出结果应当是 330。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 试题程序: #includestdio.h /*found*/ fun(int x, y, z) int j, t, n, m; j=1; t=j%x; m=j%
12、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 multiple is: %d/n“, j); (分数:30.00)解析:(1)fun(int x, int y, in
13、t z)或 int fun(int x, int y, int z) (2)return j; 解析 (1)定义函数时,必须为每个形参分别定义变量类型。 (2)通过 return 语句将最小公倍数 j 返回主调函数。三、程序设计题(总题数:1,分数:40.00)3.规定输入的字符串中只包含字母和*号。请编写函数 fun,其功能是:只删除字符前导和尾部的*号,串中字母间的*号都不删除。形参 n 给出了字符串的长度,形参 h 给出了字符串中前导*号的个数,形参 e 给出了字符串中尾部*号的个数。在编写函数时,不得使用 C 语言提供的字符串函数。 例如,字符串中的内容为“*A*BC*DEF*G*”,
14、删除后,字符串中的内容应当是“A*BC*DEF*G”。注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 试题程序: #includestdio.h #includeconio.h void fun(char*a, int n, int h, int e) void 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+; /*m 为字符串的长度*/ t-;
15、 /*指针 t 指向字符串尾部*/ while(*t=“*“) t-; tn+; /*指针 t 指向最后一个字母, tn 统计尾部“*“的个数*/ while(*f=“*“) f+; fn+; /*指针 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“。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1