1、二级 C 语言机试 93 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充 main 函数,该函数的功能是:计算三名学生学科的平均成绩。 例如,当 scoreNM=83.5,82,86,65,67,80,91.5,84, 99,95,90,95,86,95,97时,五门学科的平均分为:84.5 89.5 85.3 86.3 86.3。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在 main 函数的横线上填入所编写的若干表达式或语句。 试题程序: # includestdio, h #defin
2、e N 3 #define M 5 main ( ) int i,j; static float score N M= 83.5, 82,86, 65,67, 80,91.5,84,99,95, 90, 95, 86, 95, 97 ; static float bbN; clrscr (); for ( i=0; iM; i+) bbi=0.0; for(i=0;iU 【1】 /U;i+) for(j=0;jU 【2】 /U;j+) bb j+=score i j; for (i=0; iM; i+) print f (“ /nsubject%d/taverage=%5.1 f“, i+1,
3、U 【3】 /U); return 0; (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:统计字符串 substr 在字符串 srt 中出现的次数。例如,若字符串为 aaas 1 kaaas,子字符串为 as,则应输出 2。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio.h fun (char *str, char *substr) int i, j, k, num=0; /*found*/ for (i
4、=0, str i, i+) for (j=i, k=O; substr k=str j ; k+, j + ) if (substr k+l= /0) num+; break; return num; main ( ) char str80,substr80; printf(“Input a string: “); gets (str); printf(“Input a sbustring: “); gets (substr); printf (“%d/n “, fun (str, substr) );(分数:30.00)填空项 1:_三、B编程题/B(总题数:1,分数:40.00)3.假定
5、输入的字符串中只包含字母和*号。请编写函数 fun(),它的功能是:删除字符串中所有的*号。在编写函数时,不得使用 C 语言中提供的字符串函数。 例如,若字符串中的内容为*A*BC*DEF*G*,删除后,字符串中的内容则应当是 ABCDEFG。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: # includeconio, h # includestdio, h void fun (char *a) main ( ) char s81; printf (“Enter a string: /n“); g
6、ets (s); fun(s); printf (“The string after deleted: /n“); puts (s); (分数:40.00)_二级 C 语言机试 93 答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充 main 函数,该函数的功能是:计算三名学生学科的平均成绩。 例如,当 scoreNM=83.5,82,86,65,67,80,91.5,84, 99,95,90,95,86,95,97时,五门学科的平均分为:84.5 89.5 85.3 86.3 86.3。 注意:部分源程序给出如下。 请勿改动主函数
7、 main 和其他函数中的任何内容,仅在 main 函数的横线上填入所编写的若干表达式或语句。 试题程序: # includestdio, h #define N 3 #define M 5 main ( ) int i,j; static float score N M= 83.5, 82,86, 65,67, 80,91.5,84,99,95, 90, 95, 86, 95, 97 ; static float bbN; clrscr (); for ( i=0; iM; i+) bbi=0.0; for(i=0;iU 【1】 /U;i+) for(j=0;jU 【2】 /U;j+) bb
8、 j+=score i j; for (i=0; iM; i+) print f (“ /nsubject%d/taverage=%5.1 f“, i+1,U 【3】 /U); return 0; (分数:30.00)填空项 1:_ (正确答案:1N 2M (3)bbi/N)解析:解析 填空 1:由循环体中的 scoreij可以推断出,变量 i 的取值范围是从 0 到 N-1。填空2:由循环体中的 scoreij也可以推断出,变量 j 的取值范围是从 0 到 M-1。填空 3:各科的平均分等于各科的总分除以学生人数,此时数组 bb 中保存的是各科的总分,所以要除以 N 得到各科的平均分。二、B
9、改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:统计字符串 substr 在字符串 srt 中出现的次数。例如,若字符串为 aaas 1 kaaas,子字符串为 as,则应输出 2。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio.h fun (char *str, char *substr) int i, j, k, num=0; /*found*/ for (i=0, str i, i+) for (j=i, k=O; substr k=st
10、r j ; k+, j + ) if (substr k+l= /0) num+; break; return num; main ( ) char str80,substr80; printf(“Input a string: “); gets (str); printf(“Input a sbustring: “); gets (substr); printf (“%d/n “, fun (str, substr) );(分数:30.00)填空项 1:_ (正确答案:错误:for(i=0,srti,i+) 正确:for(i=0;stri;i+))解析:解析 从字符串 s 中找出子字符串的方
11、法是:从第 1 个字符开始,对字符串进行遍历;若 s 串的当前字符等于 t 串的第 1 个字符,两字符串的指针自动加 1,继续比较下一个字符;若比较至字符串的结尾,则跳出循环;若 s 串的字符和 t 串的字符不对应相同,则继续对 s 串的下一个字符进行处理。三、B编程题/B(总题数:1,分数:40.00)3.假定输入的字符串中只包含字母和*号。请编写函数 fun(),它的功能是:删除字符串中所有的*号。在编写函数时,不得使用 C 语言中提供的字符串函数。 例如,若字符串中的内容为*A*BC*DEF*G*,删除后,字符串中的内容则应当是 ABCDEFG。 注意:部分源程序给出如下。 请勿改动主函
12、数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入所编写的若干语句。 试题程序: # includeconio, h # includestdio, h void fun (char *a) main ( ) char s81; printf (“Enter a string: /n“); gets (s); fun(s); printf (“The string after deleted: /n“); puts (s); (分数:40.00)_正确答案:()解析:void fun(char. *a) int i, j=0; for (i=0;a i !=/0;i+) if (ai 1=*) a j+=a i; /*若不是要删除的字符*则留下*/ a j =/ 0; /*最后加上字符结束符*/ 解析 同样的问题我们在前面也碰到过,本题中是删除多余字符(*)。所以用循环从字符串的开始往后一个一个进行比较,若不是要删除的字符(用 ifai!=*)来控制)则留下。注意下标变量 j 要从 0 开始,最后还要加上字符串结束符/0。