1、国家二级 C语言机试(操作题)模拟试卷 12及答案与解析 一、程序填空题 1 用筛选法可得到 2 n(n int fun(int n) int a10000, i, j, count=0; for (i=2; i #include void fun(int m, int k) int aa20, i; for(i=0 ; m; i+) /*found*/ aai=m k; m =k; for(; i; i一一 ) /*found*/ printf(“ d”, aai); main() int b, n; print f(“ nPlease enter a number and a base:
2、n”); scanf(“ d d”, n, b); fun(n, b); printf(“ n”); 三、程序设计题 3 编写函数 fun,它的功能是计算: S作为函数值返回。 在 C语言中可调用 log(n)函数求 In(n)。 log函数的引用说明是: double log(double x)。 例如,若 m的值为: 20, fun函数值为: 6 506583。 注意:部分源程序在文件 PROGl C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #inClude#inCludedouble fun(int m)main() void
3、 NONO(); printf(“ f n”, fun(20); NONO(); VOid NONO() *本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 * FILE *fp, *wf; int i, n; double s; fp=fopen(“in dat”, “r”); wf=fopen(“out dat”, “w”); for(i=0; i 国家二级 C语言机试(操作题)模拟试卷 12答案与解析 一、程序填空题 1 【正确答案】 (1)ai (2)ai (3)0 【试题解析】 fun函数的功能是用筛选法可得到 2 n(n10000)之间的所有素数 。 第一空:循环 “f
4、or(j=ai*2; j=n; j+=_1_)”中,循环变量 j的初始值从 ai的 2倍开始,下一次进入循环 j就是 ai的 3倍,第一空处是补充 j的变化情况,而 j每次都增加一个 ai,即第一空处应为 “ai”。 第二空:根据题意第二空处是从数表中找下一个非 0数,即在循环中比较 ai是否为 0,如果为 0的话, i+指向后一个数表元素,故第二空处应为 “ai”。 第三空:根据语句 “ count+; printf(count 15?“ 5d” “ n 5d”,ai); ”可知在满足条件之后计数变量 count自增,并且输出 ai,可知 ai是一个素数,由审题分析可知,经过筛选之后数表中非
5、 0的元素就是素数,故第三空处应为 “0”,即 ai不为 0的话就是素数。 二、程序修改题 2 【正确答案】 (1)aai=m k; (2)printf(“ d”, aai1); 【试题解析】 函数的功能是将十进制正整数 m转换成 k(2k9)进制数。 (1)第二个标识下的 “aai=m k; ”是进制的转换,应该是取余,所以第二 个标识下 “aai=m k; ”应该改为 “aai=m k; ”。 (2)数制转换处理过程中所得的结果,和实际要输出的结果顺序是相反的,所以必须对存放余数的数组反向输出。原题中 “printf(“ d”t aai); ”的下标有误。因为下标 i的起始值为 0,故反向输出时应该从 i-1开始,因此改为 “printf(“d”, aai1); ”。 三、程序设计题 3 【正确答案】 double s=0 0; int i; for(i=1; i =m; i+)s+=log(1 0*i); s=sqrt(s); return s; 【试题解析】 该程序功能是计算并输出多项式值。根据题干中给出的数列,首先推出每一项的表达式,然后再对多项式进行求值。 解题思路 (1)调用 log(n)函数求 ln(n)。 (2)对调用 log(n)进行累加求和,求得根号里的内容。 (3)最后调用 C语言的库函数 sqrt计算 (2)中求得值的平方根。