1、二级 C语言分类模拟题 240及答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.用筛选法可得到 2n(n10000)之间的所有素数,方法是:首先从素数 2开始,将所有 2的倍数的数从数表中删去(把数表中相应位置的值置成 0);接着从数表中找下一个非 0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下一个数等于 n为止。这样会得到一个序列: 2,3,5,7,11,13,17,19,23, 函数 fun用筛选法找出所有小于等于 n的素数,并统计素数的个数作为函数值返回。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
2、果。 注意:源程序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #includestdio.h int fun(int n) int ai0000, i, j, count=0; for(i=2; i=n; i+) ai=i; i=2; while(in) /*found*/ for(j=ai*2; j=n; j+=_) aj=0; i+; /*found*/ while(_=0) i+; printf(“/nThe prime number between 2 to %d/n“, n); for(i=2; i=n; i+) /*found*/ if(ai!=_)
3、 count+; printf(count%15?“%5d“: “/n%5d“, ai); return count; main() int n=20, r; r=fun(n); printf(“/nThe number of prime is: %d/n“, r); (分数:30.00)_二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序
4、的结构! #includestdio.h #includemath.h void fun(int a, int *b, int*c) int i, j, d, y; for(i=3; i=a/2; i=i+2) /*found*/ Y=1; for(j=2; j=sqrt(double)i); j+) if(i%j=0) y=0; if(y=1) /*found*/ d=a-i; for(j=2; j=sqrt(double)d); j+) if(d%j=0) y=0; if(y=1) *b=i; *c=d;) main() int a, b, c; do printf(“/nInput a:
5、 “); scanf (“t%d“, while(a%2); fun(a, printf(“/n/n%d=%d+%d/n“, a, b, c); (分数:30.00)_三、程序设计题(总题数:1,分数:40.00)3.请编写函数 fun,它的功能是:计算并输出 n(包括 n)以内能被 5或 9整除的所有自然数的倒数之和。 例如,在主函数中从键盘给 n输入 20后,输出为:s=0.583333。 注意:要求 n的值不大于 100。 部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #includestdio.h
6、 double fun(int n) NONO() /*请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 */ FILE *rf, *wf; int n, i; double s; rf=fopen(“in.dat“, “r“); wf=fopen(“out.dat“, “w“); for(i=0; i10; i+) fscanf(rf, “%d“, s=fun(n); fprintf(wf, “%lf/n“, s); fclose(rf); fclose(wf); main() int n; double s; printf(“/nInput n: “); scan
7、f(“%d“, s=fun(n); printf(“/n/ns=%f/n“, s); NONO(); (分数:40.00)_二级 C语言分类模拟题 240答案解析(总分:100.00,做题时间:90 分钟)一、程序填空题(总题数:1,分数:30.00)1.用筛选法可得到 2n(n10000)之间的所有素数,方法是:首先从素数 2开始,将所有 2的倍数的数从数表中删去(把数表中相应位置的值置成 0);接着从数表中找下一个非 0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下一个数等于 n为止。这样会得到一个序列: 2,3,5,7,11,13,17,19,23, 函数 fun用筛选法找出所
8、有小于等于 n的素数,并统计素数的个数作为函数值返回。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在 下的 BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #includestdio.h int fun(int n) int ai0000, i, j, count=0; for(i=2; i=n; i+) ai=i; i=2; while(in) /*found*/ for(j=ai*2; j=n; j+=_) aj=0; i+; /*found*/ while(_=0) i+; printf(“/nThe prime number
9、between 2 to %d/n“, n); for(i=2; i=n; i+) /*found*/ if(ai!=_) count+; printf(count%15?“%5d“: “/n%5d“, ai); return count; main() int n=20, r; r=fun(n); printf(“/nThe number of prime is: %d/n“, r); (分数:30.00)_正确答案:()解析:(1)ai (2)ai (3)0 答案考生文件夹 解析 fun 函数的功能是用筛选法可得到 2n(n10000)之间的所有素数。 第一空:循环“for(j=ai*2;
10、 j=n; j+_)”中,循环变量 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是一个素数,由审题分析可知,经过筛选之后数表中非 0的元素就是素数,故第三空处
11、应为“0”,即 ai不为 0的话就是素数。 考点 循环的嵌套、一维数组。二、程序修改题(总题数:1,分数:30.00)2.给定程序 MODI1.C中函数 fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 请改正函数 fun中指定部位的错误,使它能得出正确的结果。 注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构! #includestdio.h #includemath.h void fun(int a, int *b, int*c) int i, j, d, y; for(i=3; i=a/2; i=i+2) /*fo
12、und*/ Y=1; for(j=2; j=sqrt(double)i); j+) if(i%j=0) y=0; if(y=1) /*found*/ d=a-i; for(j=2; j=sqrt(double)d); j+) if(d%j=0) y=0; if(y=1) *b=i; *c=d;) main() int a, b, c; do printf(“/nInput a: “); scanf (“t%d“, while(a%2); fun(a, printf(“/n/n%d=%d+%d/n“, a, b, c); (分数:30.00)_正确答案:()解析:(1)y=1; (2)d=a-i
13、; 答案考生文件夹 解析 函数的功能是为一个偶数查找两个素数,这两个素数之和等于该偶数。 (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; ”。 考点 循环的嵌套、运算符。三、程序设计题(总题数:1,分数:40.
14、00)3.请编写函数 fun,它的功能是:计算并输出 n(包括 n)以内能被 5或 9整除的所有自然数的倒数之和。 例如,在主函数中从键盘给 n输入 20后,输出为:s=0.583333。 注意:要求 n的值不大于 100。 部分源程序在文件 PROG1.C中。 请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。 #includestdio.h double fun(int n) NONO() /*请在此函数内打开文件,输入测试数据,调用 fun函数,输出数据,关闭文件。 */ FILE *rf, *wf; int n, i; double s;
15、rf=fopen(“in.dat“, “r“); wf=fopen(“out.dat“, “w“); for(i=0; i10; i+) fscanf(rf, “%d“, s=fun(n); fprintf(wf, “%lf/n“, s); fclose(rf); fclose(wf); main() int n; double s; printf(“/nInput n: “); scanf(“%d“, s=fun(n); printf(“/n/ns=%f/n“, s); NONO(); (分数:40.00)_正确答案:()解析:int i; double sum=0.0; for(i=1; i=n; i+) if(i%5=0|i%9=0) /*被 5或 9整除*/ sum+=1.0/i; return sum; 答案考生文件夹 解析 程序功能是计算并输出 n(包括 n)以内能被 5或 9整除的所有自然数的倒数之和。(1)首先,通过循环,判断小于等于 n的每一个整数是否符合题干中的要求。其中的判断条件能否被 5或者被 9整除为 i%5=0|i%9=0。 (2)然后求得符合(1)要求的数的倒数的累加和。 考点 for 循环结构、if 语句及其构成的选择。