
全国及四川二级C语言上机题目.doc
97页C 语言全国及四川二级上机题目解析1全国及四川二级C语言上机题目第一套一、填空题请补充fun函数,fun函数的功能是求m的阶乘请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句注意:部分源程序给出如下 # include long fun(int m) {if(___1___)return (m*fun(___2___));return ___3___; } main() {printf(“8!=%ld\n“,fun(8)); }二、改错题下列给定程序的功能是:读入一个整数n(2≤n≤5000) ,打印它的所有为素数的因子例如,若输入整数1234,则应输出:2、617请修改程序中的错误,使程序能得出正确的结果注意:不要改动main函数,不能增行或删行,也不能更改程序的结构 # include # include /*******error*********/ Prime(int m); {int j,p;p=1; /*******error*********/for(j=2;j # include # include int fun(int point[],int n,int high[]) { } main() {int j,m,high[9];int point[9]={50,60,65,70,75,80, 88,90,95};FILE *out;m=fun(point,9,high);printf(“\nHigh the average point are :“);out=fopen(“outfile.dat“,“w“);for(j=0;j1(2)m-1(3)1【一起来审题】(1)该程序功能是对阶乘的实现。
其中,阶乘的计算公式定义为: m m!=m*(m-1)*(m-2)*…*1 m>1 m!=1 m=1 公式分为参数m是1和大于1的两种情况,例如,1的阶乘1!=1;5的阶乘5!=5×4×3×2×12)从已给部分源程序的main主函数开始入手,主函数执行printf输出语句,该语句调用自定义的fun函C 语言全国及四川二级上机题目解析3数,并将数值8传递给fun函数的m参数其中fun函数就是对阶乘算法的实现3)进入fun函数,根据前面的定义,它对阶乘算法的实现可以分为两种情况,一是当m>1时,应该用什么程序来实现阶乘的计算;二是当m=1时,函数直接返回1即可解题思路】第一空:if(___1___)是要根据m的取值来判断使用何种阶乘的计算公式的这里根据第2句递归调用语句,可知该语句是用来计算当m>1时的阶乘因此第一空if语句里面的条件应该是满足m>1所以,第一空应填m>1第二空:return (m*fun(___2___))很显然是采用递归函数来实现阶乘的计算,所以,第二空应填m-1第三空:return ___3___该语句是要实现当m=1时的阶乘计算所以,第三空应填1主要考点】递归函数。
二、改错题【答案及难度指数】★★ (1)Prime(int m)(2)if(!(m%j))【一起来审题】(1)整数n的素数因子为整除n的所有素数,但不含n本身素数是指能被1和本身整除的正整数(>1) ,所以判别n是否为素数,只要用2、3、…、n-1这些数逐个去除n,观察余数是否为0即可,只要有一次相除余数为0,n就不是素数,否则n为素数因此,求整数n的素数因子,要从求整数n的因子和判断该因子是否为素数的两方面来看2)从已给定源程序的main主函数开始入手,核心部分是循环判断if((!(n%i)) “在程序中显然是一个函数,因此应将后面的分号去掉2)第二个标识下面的for语句最简单的应用形式为:for(循环变量赋初值;循环条件;循环变量增值)语句显然if语句后面缺少括号,因此,if !(m%j)改为if(!(m%j))该题主要考查标点符号、运算符、基本定义主要考点】if条件语句;函数定义三、编程题【答案及难度指数】★★ int j,k=0,average=0; for(j=0;javerage) //逐个判断每个分数是否大于平均分{high[k]=point[j];//将高于平均分的人放入high数组k++; //统计大于平均分的人数} return k; 【一起来审题】(1)该程序功能是返回高于平均分的人数。
它的解题思路可以分解为以下几步:求总分→求平均分→逐C 语言全国及四川二级上机题目解析4个元素与平均分比较→统计高于平均分的人数2)从已给部分源程序的main主函数开始入手,核心函数fun(point,9,high)中的参数由题目可知,point存放着m个人的成绩,high存放高于平均分的分数另外,根据point的定义,可知9为point数组中元素的个数,传给函数fun中的参数n解题思路】进入fun函数,根据前面的分析:首先,定义变量average,通过循环,用average+=point[j]计算总分数,然后通过average/=n;语句来计算平均分其次,通过循环,让每个分数和平均分比较,高于平均分数的分数给high[](high[k]=point[j];) 在进行以上循环的同时,定义了一个变量k,每当发现一个大于平均分的分数,k自动加1(k++;) 最后,返回k值,即是数组point[]中高于平均分的元素个数主要考点】数组操作;if条件语句;for循环语句第二套一、填空题请补充fun函数,该函数的功能是:判断一个年份是否为闰年例如,2007年不是闰年,2008是闰年请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:部分源程序给出如下 # include # include int fun(int n) {int flag=0;if(n%4==0)if(___1___)flag=1;if(___2___)flag=1;return ___3___; } main() {int year;printf(“Input the year:“);scanf(“%d“,if(fun(year))printf(“%d is a leap year.\n“,year);elseprintf(“%d is not a leap year.\n“,year); }二、改错题下列给定程序中,fun函数的功能是:根据形参n,计算如下公式的值C 语言全国及四川二级上机题目解析5n1 41 31 211sL例如,若输入5,则应输出2.28333请修改程序中的错误或在横线处填上适当的内容并把横线删除,使它能计算出正确的结果注意:不要改动main函数,不能增行或删行,也不能更改程序的结构 # include # include double fun(int n) {double s=1.0;int i;/******error**********/for(i=2;i # include void fun(int *b,int *m) {} main() { int a[500],m,i;FILE *out;fun(a,out=fopen(“outfile.dat“,“w“);for(i=0;i int fun(int a,int b,int c) {int temp;temp=(a>b) ? (b>c ? b : (a>c ? c : ___1___)) :((a>c) ? ___2___ : ((b>c) ? c : ___3___));return temp; } main() {int x=121,y=456,z=333,mid;mid=fun(x,y,z);printf(“\nThe middle number is : %d\n“,mid); }二、改错题下列给定程序中,函数fun和quest的功能是:用二分法求方程2x3-4x2+3x-6=0的一个根,并要求绝对误差不超过0.001。
例如,若给m输入-50,给n输入30,则函数求得的一个根值为2.000请修改程序中的错误,得出正确的结果注意:不要改动main函数,不能增行或删行,也不能更改程序的结构 # include # include double quest(double x) {C 语言全国及四川二级上机题目解析8return (2*x*x*x-4*x*x+3*x-6); } double fun(double m,double n) {/********error********/int r;r=(m+n)/2;/********error********/while(fabs(n-m) # include void fun(int y,int b[],int *m) {} main() { int y,a[500],m,j;FILE *out;printf(“\nPlease input an integer number:\n“);scanf(“%d“,fun(y,a,for(j=0;jb) ? (b>c ?“表示a> b>c,根据题目要求,则中间值为b,若只是满足第一个“?“前面的条件,而c>b,则选择执行“(a>c ? c : ___1___)“,当a>c时取值c,所以ac) ?“是对a、c的比较选择,第三空处的“(b>c) ? c“根据b、c的判断,题目已经给出了c,所以这里应该是a,这样第三空中对于b、c的判断选择缺少b,所以这里填“b“,同样也可以根据第一空的逻辑关系进行分析,来填写第二空和第三空。
主要考点】选择语句二、改错题【答案及难度指数】★★ (1)double r; (2)while(fabs(n-m)>0.001)【一起来审题】(1)该题中函数功能是二分法求方程根其中,二分法的求根过程,是将含根区间平均分为两个小区间,然后判断哪个区间是含根区间在此基础上,将这里的小含根区间进一步划分为两个更小的区间,继续判断根所在区间继续细分下去,含根区间将划分地越来越小,区间的范围也越来越小经过多次细分后,就可以将此很小区间的中点近似为方程的根了2)从已给定源程序的main主函数开始入手,通过“result=fun(m,n);“语句调用fun函数求得方程根,其中fun函数对quest函数进行调用,对根进行判断解题思路】(1)fun函数要求返回方程的一个根,由return语句来实现,而函数fun是定义为double型的,但第一个标识下面的r却被定义为int类型所以“int r;“改为“double r;“2)检查while循环的控制表达式“(fabs(n-m)0.001)“ 【主要考点】变量定义;逻辑关系答案及难度指数】★★★ int j=1,i=0,k=0,*s=b; for(j=0;j int fun(int a,int b,int c) {int temp;temp=(a>b) ? (b>c ? b : (a>c ? c : ___1___)) :((a>c) ? ___2___ : ((b>c) ? c : ___3___));return temp; } main() {int x=121,y=456,z=333,mid;mid=fun(x,y,z);printf(“\nThe middle number is : %d\n“,mid); }C 语言全国及四川二级上机题目解析11二、改错题下列给定程序中,函数fun和quest的功能是:用二分法求方程2x3-4x2+3x-6=0的一个根,并要求绝对误差不超过0.001。
例如,若给m输入-50,给n输入30,则函数求得的一个根值为2.000请修改程序中的错误,得出正确的结果注意:不要改动main函数,不能增行或删行,也不能更改程序的结构 # include # include double ques。