1、国家二级( C语言)机试模拟试卷 301及答案与解析 一、程序填空题( 30分) 1 给定程序中,函数 fun的功能是根据形参 i的值返回某个函数的值。当调用正确时,程序输出: x1=5 000000, x2=3 000000, x1*x1+x1*x2=40 000000 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的 BLANKl C中。 不得增行或删行,也不得更改程序的结构 ! #include double f1(double x) return x*x; double f2(double x, double y) Eeturn
2、x*y; /*found*/ 【 1】 fun(int i, double x, double y) if (i=1) /*found*/ Eeturn 【 2】 (x); else /*found*/ reLurn【 3】 (x, y); main() double x1=5, x2=3, r; r=fun(1, x1, x2); r+=fun(2, x1, x2); printf(“ nx1= f, x2= f, x1*x1+x1*x2= f n n“, x1, x2, r); 二、程序修改题( 30分) 2 给定程序 MODll C中函数 fun的功能是:将十进制正整数 m转换成 k(2
3、k9)进制数,并按高位到低位顺序输出。 例如,若输入 8和 2,则应输出 1000(即十进制数 8转换成二进制 表示是 1000)。 请改正 fun函数中的错误,使它能得出正确的结果。 注意:不要改动 main函数。不得增行或删行,也不得更改程序的结构 ! #include #include void fun(int m, int k) int aa20, i; for(i=0; m; i+) /*found*/ a6tai=m k; m =k, for(; i; i ) /*found*/ printf(“ d“, aai); main() int b; n; printf (“ nPlea
4、se enter a numberand a base: n“); scanf(“ d dtt, &n, &b); fun(n, b), printf(“ n“); 三、程序设计题( 40分) 3 请编写函数 fun,其功能是:计算并输出给定 10个数的方差:(即: 10个数的平均值 )其中 例如,给定的 10个数为95 0、 89 0、 76 0、 65 0、 88 0、 72 0、 85 0、 81 0、 90 0、 56 0,输出为 s=11 730729。 注意:部分源程序在文件 PROGl C中。 请勿改动主函数main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若
5、干语句。#include#includedouble fun(double x10)NONO() *请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * FILE*rf*wf; int i, j;doubles, x10; rf=fopen(“in dat“, “r“); wf=fopen(“out dat“, “w“); for(i=0 ; i 国家二级( C语言)机试模拟试卷 301答案与解析 一、程序填空题( 30分) 1 【正确答案】 (1)double (2)f1 (3)f2 【试题解析】 第一空:主函数内 fun函数的调用形式是 “r=fun(1, x1,
6、 x2): “, r是 double型变量,因此 fun函数的返回值是 double型,故第一空处应为“double“。 第二 空: “return 2(x); “被调用的函数只有一个参数,故第二空出为 “n“,返回x的平方值。 第三空: “return 3(x, y); “被调用的函数有 2个参数 x和 y,故第三空处应为“f2“,返回 x和 y的积。 二、程序修改题( 30分) 2 【正确答案】 (1)aai=m k; (2)printf(“ d“, aai一 1); 【试题解析】 (1)第二个标识下的 “aaim k; “是进制的转换,应该是取余,所以第二个标识下 “aai=m k; “
7、应该改为 -“aai=m k; “。 (2)数制转换处理过程中所得的结果,和实际要输出的结果顺序是相反的,所以必须对存放余数的数组反向输出。原题中 “printf(“ d, aai); “的下标有误。因为下标 i的起始值为 0,故反向输出时应该从 i-1开始,因此改为 “printf(“ dt“,aai-1); “。 三、程序设计题( 40分) 3 【正确答案】 int i; double avg=0 0, sum=0 0, abs=0 0, fc; for(i=0; i10 ; i+)sum+=xi; avg=sum 10; *计算平均值 * for(i=0; i10; i+) abs+=(xi-aVg)*(xi一 avg); fc=sqrt(abs 10); return fc; 【试题解析】 (1)首先计算 x的值,它的值是所有值累加求和的十分之一。 (2)根号下的部分是前面求得 x与当前项差的平方的累加和的十分之一。 (3)最后可以利用 C语言库函数 pow来计算平方根。