1、国家二级 C语言机试(操作题)模拟试卷 351及答案解析(总分:6.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:2.00)1.给定程序中,函数 fun的功能是:将形参 n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。 例如,从主函数输入一个整数:27638496,函数返回值为:26846。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANK1C 中。 不得增行或删行,也不得更改程序的结构! #include unsigned long fun (unsigned long
2、 n) unsigned long x=0,s,i; int t; s=n; 1=_1_ ; while ( _2_ ) if (t2=0) s=s/10; return x; main () unsigned long n=1; while (n99999999 |n_二、程序修改题(总题数:1,分数:2.00)2.给定程序 MODI1C 中函数 fun的功能是:输出 M行 M列整数方阵,然后求两条对角线上元素之和,返回此和数。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 mam函数,不得增行或删行,也不得更改程序的结构! #include #define M 5 int f
3、un(int nr int xx ) int i,j,sum=0; printf(“/nThe d x d matrix:/n“, printf (“/n“) ; sum += xx i i+xx i nil ; return (sum) ; main () int aaM M= 1,2,3,4,5, 4,3,2,1,0 , 6,7,8,9,0,t 9,8,7,6,5, printf (“/nThe sum of all elements on 2 diagnals is d“,fun (M, aa) ; (分数:2.00)_三、程序设计题(总题数:1,分数:2.00)3.函数 fun的功能是
4、:将 a、b 中的两个两位正整数合并形成一个新的整数放在 c中。 合并的方式是:将a中的十位和个位数依次放在变量 c的千位和十位上,b 中的十位和个位数依次放在变量 c的个位和百位上。 例如,当 a=45,b=12。 调用该函数后,c=4251。 注意:部分源程序存在文件 PROG1C 中。数据文件 INDAT 中的数据不得修改。 请勿改动主函数 mam和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun (int a, int b, long *c) void NONO () /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文
5、件。 */ FILE *rfr *wf ; int i,a,b ; long C ; rf= fopen (“indat“,“r“); wf = fopen (“outdat“,“w“); for(i=0 ; i99999999 |n_正确答案:(正确答案:(1)1 (2)s (3)1*10)解析:解析:函数 fun的功能是将形参 n中,各位上为偶数的数取出,组成新数。 第一空:由“ifft2=0)x=x+t*i; i=_3_;”可知,如果 t是偶数,那么 t添加到返回值里面,比如第一次得到 t=2,那么 x=0+2*1;下一次得到了 t=4,那么此时 x的值应该是 2+2*10;再下一次得到
6、 t=2,那么 x=22+2 *100,即 x的值是在上一次值的基础上加上新得到的值乘以其权值,因此 i是代表权值。第一空处是初始化 i,第一次进入 if语句时,x 是个 1位数,此时权值 i应为 1,故第一空处应为“1”, 第二空:第二空处是填循环的终止条件,在循环体内,s 每次缩小 10倍,在最后一次进入循环的时候,s是一个一位数,s/10 之后 s变成 0,下次就不应该进入 while循环,因此 while循环的终止条件是 s不为0,故第二空处为“s”或“s! =0”。 第三空:由第一空的分析可知权值 i是在上一次的基础上增加 10倍,故第三空处应为“i*10”。二、程序修改题(总题数:
7、1,分数:2.00)2.给定程序 MODI1C 中函数 fun的功能是:输出 M行 M列整数方阵,然后求两条对角线上元素之和,返回此和数。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 mam函数,不得增行或删行,也不得更改程序的结构! #include #define M 5 int fun(int nr int xx ) int i,j,sum=0; printf(“/nThe d x d matrix:/n“, printf (“/n“) ; sum += xx i i+xx i nil ; return (sum) ; main () int aaM M= 1,2,3,4
8、,5, 4,3,2,1,0 , 6,7,8,9,0,t 9,8,7,6,5, printf (“/nThe sum of all elements on 2 diagnals is d“,fun (M, aa) ; (分数:2.00)_正确答案:(正确答案:(1) int fun (int n,int xx M) (2) printf(“ 4d“,xxij);)解析:解析:函数的功能是求两条对角线上各元素之和。 (1)第一个标识下 fun函数的定义中对于二维数组的定义在原题中并没有给出空间,所以将“int fun(int n,int xx)”改为“int fun(int n,int xxM)”
9、。 (2) fun 函数中 n是 mt型,C 语言输出语句中整型应该是d,所以第二个标识下“printf(“f“,xxij);“应该改为“printf(“4d“,xxij);”。三、程序设计题(总题数:1,分数:2.00)3.函数 fun的功能是:将 a、b 中的两个两位正整数合并形成一个新的整数放在 c中。 合并的方式是:将a中的十位和个位数依次放在变量 c的千位和十位上,b 中的十位和个位数依次放在变量 c的个位和百位上。 例如,当 a=45,b=12。 调用该函数后,c=4251。 注意:部分源程序存在文件 PROG1C 中。数据文件 INDAT 中的数据不得修改。 请勿改动主函数 ma
10、m和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #include void fun (int a, int b, long *c) void NONO () /*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *rfr *wf ; int i,a,b ; long C ; rf= fopen (“indat“,“r“); wf = fopen (“outdat“,“w“); for(i=0 ; i 10 ; i+) fscanf (rf, “d,d“, &a, &b); fun (a, b, &c); fprintf (wf, “a=d
11、,b=d,C=ld/n“, a,b,c); fclose (rf); fclose (wf); main() int a,b; long c;voici NONO (); printf(“Input a, b:“); scanf(“dd“, &a, &b); fun (af b, &c);printf( “The result is: oold/n“,c); NONO();(分数:2.00)_正确答案:(正确答案:*c= (a/10) *1000+ (b10)* 100+ (a10) *10+ (b/10);)解析:解析:(1)分解两位数的正整数 n的个位和十位数,可用 n10 和 n/10实现。 (2)设x0、x1、x2、x3 为一位数,则 x0、x110、x2100、x31000,可以分别使 x0、x1、x2、x3 构成个、十、百,千带权数,而 x0+x11 0+x2100+x31000构成四位数。本题最多只考虑四位数。