1、二级 C 语言-338 及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.函数 fun 的功能是:统计长整数 n 的各位上出现数字 1、2、3 的次数,并用外部(全局)变量c1、c2、c3 返回主函数。 例如,当 n=123114350 时,结果应该为:c1=3 c2=1 c3=2。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 请勿改动 main 函数和其他函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。 试题程序: #includestdio.h int c
2、1, c2, c3; void fun(long n) c1=c2=c3=0; while(n) /*found*/ switch( 1) /*found*/ case 1:c1+; 2; /*found*/ case 2:c2+; 3; case 3:c3+; n/=10; main() 10ng n=123114350L; fun(n); printf(“/nThe result:/n“); printf(“n=%ld c1=%d c2=%d c3=%d/n“, n, c1, c2, c3); (分数:30.00)二、程序改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fu
3、n 实现的功能是:统计一个无符号整数中各位数字值为 0 的个数,通过形参传回主函数,并把该整数中各位上最大的数字值作为函数值返回。例如,若输入无符号整数 30800,则数字值为 0 的位的个数为 3,各位上数字值最大的是 8。 请改正函数 fun 中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #includestdio.h int fun(unsigned n, int *zero) int count=0, max=0, t; do t=n%10; /*found*/ if(t=0) count+; if(maxt) m
4、ax=t; n=n/10; while(n); /*found*/ zero=count; return max; main() unsigned n; int zero, max; printf(“/nInput n(unsigned):“); scanf(“%d“, max=fun(n, printf(“/nThe result:max=%d zero=%d/n“, max, zero); (分数:30.00)三、程序设计题(总题数:1,分数:40.00)3.请编写函数 fun,其功能是:计算并输出下列多项式的值。 (分数:40.00)_二级 C 语言-338 答案解析(总分:100.00
5、,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.函数 fun 的功能是:统计长整数 n 的各位上出现数字 1、2、3 的次数,并用外部(全局)变量c1、c2、c3 返回主函数。 例如,当 n=123114350 时,结果应该为:c1=3 c2=1 c3=2。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:部分源程序给出如下。 请勿改动 main 函数和其他函数中的任何内容,仅在函数 fun 的横线上填入所编写的若干表达式或语句。 试题程序: #includestdio.h int c1, c2, c3; void fun(long n)
6、 c1=c2=c3=0; while(n) /*found*/ switch( 1) /*found*/ case 1:c1+; 2; /*found*/ case 2:c2+; 3; case 3:c3+; n/=10; main() 10ng n=123114350L; fun(n); printf(“/nThe result:/n“); printf(“n=%ld c1=%d c2=%d c3=%d/n“, n, c1, c2, c3); (分数:30.00)解析:(1)n%10 (2)break (3)break 解析 填空 1:要统计长整数 n 的各个位上出现数字 1、2、3 的次数
7、,就需要判断各个位上的数是多少。通过 n 除以 10 求余,可得到个位上的数,所以填入 n%10。 填空 2 和填空 3:switch 语句是多分支选择语句,在每个分支中要加入 break,不然会依次执行后面的分支。continue 语句的作用是结束当前分支的运行,而 break 语句的作用是结束整个 switch 语句的运行。二、程序改错题(总题数:1,分数:30.00)2.下列给定程序中,函数 fun 实现的功能是:统计一个无符号整数中各位数字值为 0 的个数,通过形参传回主函数,并把该整数中各位上最大的数字值作为函数值返回。例如,若输入无符号整数 30800,则数字值为 0 的位的个数为
8、 3,各位上数字值最大的是 8。 请改正函数 fun 中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #includestdio.h int fun(unsigned n, int *zero) int count=0, max=0, t; do t=n%10; /*found*/ if(t=0) count+; if(maxt) max=t; n=n/10; while(n); /*found*/ zero=count; return max; main() unsigned n; int zero, max; print
9、f(“/nInput n(unsigned):“); scanf(“%d“, max=fun(n, printf(“/nThe result:max=%d zero=%d/n“, max, zero); (分数:30.00)解析:(1)if(t=0) (2)*zero=count; 解析 (1)根据题意,此处应该是条件语句,而不是赋值语句,并且在条件表达式中不会出现“=”号。 (2)此处是指针赋值的一个简单错误,对指针指向的元素进行赋值应使用*号。三、程序设计题(总题数:1,分数:40.00)3.请编写函数 fun,其功能是:计算并输出下列多项式的值。 (分数:40.00)_正确答案:()解析:double fun(int n) double sum=0, tmp=1; int i; for(i=1; i=n; i+) tmp=tmp*i; sum+=1.0/tmp; return sum; 解析 本题要求计算并输出多项式的值,通式为:1/(1*2*n),在给出的参考程序中,由于函数的返回值为双精度型,所以定义 sum、tmp 为双精度型,再对符合条件的 n,使用中间变量 tmp 求出 1 到 n的累乘值,即题目中每个多项式中分子的值,再通过 sum+=1.0/tmp;计算出所有多项式之和,最终返回值。