【真题1】 下列给定程序中,函数fun()的功能是:用下面的公式求π 的近似值, 直到最后一项的绝对值小于指定的数(参数num)为止。 π/4≈1-1/3+1/5-1/7+… 例如,程序运行后,输入0.0001,则程序输出3.1414。 试题程序: #include < math.h >#include < stdio.h >float fun(float num) { int s; float n,t, pi; t=1;pi=0;n=1;s=1; while(__1__ >=num) { pi=pi+t; n=n+2; s=-s; t=__2__; } pi=pi*4; __3__; } main() { float n1, n2; printf("Enter a float number: "); scanf("%f",&n1); n2=fun(n1); printf("%6.4f\n ",n2); } (2011年2月) 解析: 填空1:函数fun()中while语句的含义是:当新的一项大于给定参数 时,循环累计,计算s的值。而题目要求是最后一项的绝对值小于给定参数, 因此循环条件应当为while(fabs(t) >=num),而非while(t >=num) 。 填空2:由函数可知,t是作为级数的每一项的值的变量来定义的,s 是分子变 量,n 是分母变量。 填空3:很明显,这是一个实型函数,应该返回一个实型值,由题意可知应返回 pi。 答案:【1】fabs(t) 【2】s/n; 【3】return pi 【真题2】 给定程序modi.c 中,函数fun 的功能是:从n 个学生的成绩中统计出 低于平均分的学生人数,此人数由函数值返回。平均分存放在形参aver 所指的存储 单元中。 例如,若输入8 名学生的成绩,输入形式如下: 80.5 60 72 90.5 98 51.5 88 64 则低于平均分的学生人数为4(平均分为:75.5625)。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < conio.h >#include < stdio.h >#define N 20 int fun(float *s,int n ,float *aver) {float ave,t=0.0; int count=0,k,i; for (k=0;k< n;k++) /************found************/ t=s[k]; ave=t/n; for (i=0;i< n;i++) if(s[i]< ave) count++; /************found************/ *aver=&ave; return count; } main() {float s[30],aver; int m,i; clrscr(); printf("\nPlease enter m:");scanf("%d",&m); printf("\nPlease enter %d mark :\n",m); for(i=0;i< m;i++) scanf("%f",s+i); printf("\nThe number of strudents : %d \n",fun(s,m,&aver)); printf("Ave=%f\n",aver); } 解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错 误的重要前提。 程序中的重要思想如下: 1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当 是float型的; 2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊 的。 本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;"只是 将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当 书写为"t=t+s[k];",实现学生分数的不断累加; 本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个 float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者 不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的 目的。 【真题3】 请编写一个函数 void fun(int m, int k, int xx[]),该函数的功能是: 将大于整数 m 且紧靠 m 的 k 个素数存入数组 xx 传回。 运行时输入17, 5,则应 输出:19, 23, 29, 31, 37。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < conio.h >#include < stdio.h >void fun(int m, int k, int xx[]) {……} main() { int m, n, zz[1000] ; clrscr() ; printf( "\nPlease enter two integers:") ; scanf("%d%d", &m, &n ) ; fun( m, n, zz) ; for( m = 0 ; m < n ; m++ ) printf("%d ", zz[m]) ; printf("\n") ; } (2011年2月) 解析: 本题的考核点是统计素数的数目。 解题思路: 1、建立循环,鉴别大于整数m 且紧靠m 的整数是否为素数(素数是指只能被 1 和它自身整除的数),如果是,通过变量p将该素数存入数组xx[]; 2、在通过循环寻找素数的同时,变量j不断记录查找到的素数的数目,一旦发 现找到的素数的数目已经与用户要求的一致,便停止查找新的素数。 #include < conio.h > #include < stdio.h > /*本题中的for()循环用来判断一个数是否为素数,由于个数只能是k个所以用 do-while循环来控制。*/ void fun(int m, int k, int xx[]) { int i,j=0,p=m+1; do {for( i=2; i< p; i++) if(p%i==0) break; /*判断p是否为素数*/ if(i >=p) /*如果p为素数,则将p的值存入数组xx[]中*/ xx[j++]=p; p++; }while(j< k); } |