1、国家二级 C语言机试(操作题)模拟试卷 714及答案与解析 一、程序填空题 1 用筛选法可得到 2 n(n 10000)之间的所有素数,方法是:首先从素数 2开始,将所有 2的倍数的数从数表中删去 (把数表中相应位置的值置成 0);接着从数表中找下一个非 0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下一个数等于 n为止。这样会得到一个序列: 2, 3, 5, 7, 11, 13, 17, 19, 23, 函数 fun用筛选法找出所有小于等于 n的素数,并统计素数的个数作为函数值返回。 请在程序的下划 线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件
2、夹下的 BLANK1 C中。不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 int fun(int n) 3 int a10000, i, j, count=0; 4 for(i=2, i =n;i+) ai=i; 5 i=2; 6 while(i n) 7 *found* 8 for(j=ai*2; j =n; j+=_1_) 9 aj=0; 10 i+; 11 *found* 12 while(_2_=0) 13 i+; 14 15 printf( nThe prime number between 2 to d n, n); 16 for (i=2;
3、i =n; i+) 17 *found* 18 if(ai!=_3_) 19 count+; printf(count%15? 5d: n%5d, ai); 20 return count; 21 22 main() 23 int n=20, r; 24 r=fun(n); 25 printf( nThe number of prime is: d n, r); 二、程序修改题 2 给定程序 MODI1 C中函数 fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 请改正函数 fun中指定部位的错误,使它能得出正确的结 果。注意:不要改动m
4、ain函数,不得增行或删行,也不得更改程序的结构 ! 1 #include stdio h 2 #include math h 3 void fun(int a, int *b, int *c) 4 int i, j, d, y; 5 for(i=3; i =a 2; i=i+2) 6 *found* 7 Y=1; 8 for(j=2; j =sqrt(double)i); j+ 9 if(i j=0)y=0; 10 if(y=1) 11 *found* 12 d=a-i; 13 for(j=2; j =sqrt(double)d); j+) 14 if(d j=0)y=0; 15 if(y=
5、1) 16 *b=i; *c=d; 17 18 19 20 main() 21 int a, b, c; 22 do 23 printf( nInput a: ); scanf( d, a); 24 while(a 2); 25 fun(a, b, c); 26 printf( n n d= d+ d n”, a, b, c); 27 三、程序设计题 3 请编写函数 fun,它的功能是:计算并输出 n(包括 n)以内能被 5或 9整除的所有自然数的倒数之和。 例如,在主函数中从键盘给 n输入 20后,输出为: s=0 583333。 注意:要求 n的值不大于 100。 部分源程序在文件 PRO
6、G1 C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 1 #include stdio h 2 double fun(int n) 3 4 5 6 NONO() 7 *请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 * 8 FILE *rf, *wf;int n, i; double s; 9 rf=fopen(in dat, r); 10 wf=fopen(“out dat, w); 11 for(i=0; i 10; i+) 12 fscanf(rf, d, n); 13 s=fun(n); 14 fpr
7、intf(wf, ”%1f n, s); 15 16 fclose(rf), fclose(wf); 17 18main() 19 int n; double s; 20 printf( nInput n: ); scanf( d, n); 21 s=fun(n); 22 printf( n ns= f n, s); 23 NONO(); 国家二级 C语言机试(操作题)模拟试卷 714答案与解析 一、程序填空题 1 【正确答案】 (1)ai (2)ai (3)0 【试题解析】 fun函数的功能是用筛选法可得到 2 n(n 10000)之间的所有素数。第一空:循环 “for(j=ai*2; i
8、=n; i+=_1_)”中,循环变量 j的初始值从 ai的 2倍开始,下一次进入循环 j就是 ai的 3倍,第一空处是补充 j的变化情况,而 j每次都增加一个 ai,即第一空处应为 “ai”。第二空:根据题意第二 空处是从数表中找下一个非 0,数,即在循环中比较 a嘲是否为 0,如果为 0的话, i+指向后一个数表元素,故第二空处应为 “ai”。第三空:根据语句 “count+;printf(count 15? %5d: n 5d, ai); )”可知在满足条件之后计数变量count自增,并且输出 ai,可知 ai是一个素数,由审题分析可知,经过筛选之后数表中非 0的元素就是素数,故第三空处应
9、为 “0”,即 ai不为 0的话就是素数。 二、程序修改题 2 【正确答案】 (1)y=1; (2)d=a-i; 【试题解析】 函数的功能是为一个偶数查找两个素数,这两个素数之和等于该偶数。 (1)第一标识下 “Y=1; ”变量 Y没有定义,编译时会提示出错。题中用标志 y区别 i是否是素数, y=1是素数, y=0不是素数。第一个标识下当 i是素数时, y最后的值就是进入循环结构前的初始化值 0,标识该值不是素数,所以 “Y=1; ”应该改为 “y=1; ”。 (2)在语句 “if(y=1)”中,应该是判断 (a-i)是否是素数,即 d应赋值 “a-i”而不是“d=a-i; ”,所以第二个标识下 “d=a-i: ”改为 “d=a-i; ”。 三、程序设计题 3 【正确答案】 1 int i; 2 double sum=0 0; 3 for(i=1; i =n; i+) 4 if(i 5=0 i 9=0) *被 5或 9整除 * 5 sum+=1 0 i; 6 return sum; 【试题解析】 程序功能是计算并输出 n(包括 n)以内能被 5或 9整除的所有自然数的倒数之和。 (1)首先,通过循环,判断小于等于 n的每一个整数是否符合题干中的要求。其中的判断条件能否被 5或者被 9整除为: i 5=0 i 9=0。 (2)然后求得符合 (1)要求的数的倒数的累加和。