机试真题
1、函数fun 的功能是:计算正整数n 的所有因子(1 和n 除外)之和作为函数值返回。 例如:n=120 时,函数值为239。
#include < conio.h >#include < stdio.h >int fun(int n){ int _1__,s=0;/*能整除n 的自然数即称为因子*/for (i=2;i< n;i++)if (n%i==0) s=___2__;return (s);}main() /*主函数*/{ printf("%d
",fun(120));}解析: 本题的考核点是计算n 所有因子的算法。解题思路:判断因子的方法是:能被n整除的数。由于题意中指明需将1和n除外,所以循环的范围应从2至n-1。答案:1: i 2: s+i
2、已知一个数列的前三项分别为0,0,1, 以后的各项都是其相邻的前三项之和。给定程序modi.c 中函数 fun 的功能是:计算并输出该数列前n项的平方根之和sum。n 的值通过形参传入。 例如,当n=10 时,程序的输出结果应为:23.197745。 请改正函数fun 中的错误,使程序能输出正确的结果。 注意:不要改动main 函数,#include < conio.h >#include < stdio.h >#include < math.h >/************found************/fun(int n){ double sum, s0, s1, s2, s; int k;sum = 1.0;if (n < = 2) sum = 0.0;s0 = 0.0; s1 = 0.0; s2 = 1.0;for (k = 4; k < = n; k++){ s = s0 + s1 + s2;sum += sqrt(s);s0 = s1; s1 = s2; s2 = s;}/************found************/return sum}main ( ){ int n;clrscr( );printf("Input N=");scanf("%d", &n);printf("%f
", fun(n) );}解析: 本题的考核点是C语言中的函数的入口参数和类型转换。C 语言规定,凡不加类型说明的函数,一律自动按整型处理。如果函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。根据题意,函数返回值为实型,所以第一处错误"fun(int n)"应改为"floatfun (int n)"或具有相同作用的句子。函数的返回值是通过函数中的return语句获得的。return 语句后面的括弧可以不要,但分号不能少,必须加分号。所以,第二处错误应改为"return sum;"或相同作用的句子。如果函数值的类型和return语句中表达式的 值不一致,则以函数类型为准。对数值型数据可以自动进行类型转换。即函数类型决定返回值的类型。本评析仅作参考。
3、请编写函数fun(),它的功能是求Fibonacci数列中小于t的最大的一个数,结果由函数返回。其中Fibonacci 数列F(n)的定义为 F(0)=0,F(1) =1,F(n)=F(n-1)+F(n-2) 例如:t=1000 时 ,函数值为987。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:#include < conio.h >#include < math.h >#include < stdio.h >int fun(int t){…… }main(){int n;clrscr();n=1000;printf("n=%d, f=%d
",n, fun(n)); }解析:int fun(int t){int a=1,b=1,c=0,i; /*a 代表第n-2 项,b 代表第n-1 项,c 代表第n 项*//*如果求得的数c 比指定比较的数小,则计算下一个Fibonacci 数,对a,b 重新置数*/do {c=a+b;a=b;b=c;}while (c< t); /*如果求得的数c 比指定比较的数大时,退出循环*/c=a; /*此时数c 的前一个Fibonacci 数为小于指定比较的数的最大的数*/return c;}
4、下列给定程序中,函数fun()的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如变量a初值为8,b 初值为3,程序运行后a 中的值为3,b 中的值为8。 试题程序:#include < conio.h >#include < stdio.h >int fun(int *x,int y){ __1___ t;t=*x;*x=y;return(t)__2__}main(){int a=3,b=8;printf("%d %d
",a,b);b=fun(__3__,b);printf("%d %d
",a,b);}
解析: 填空1:根据题目的意思,这里应该是声名一个新的变量t,由后面的赋值语句以及返回语句可以明白这个变量应该是整型的(因为函数的返回值类型是int)。填空2:根据题目的意思,此处是子函数的返回语句,由C 语言的知识,每个语句的结尾都应该使用";" 。填空3:fun()函数的调用方式说明fun()函数的参数应当为指针类型,即应该把变量的地址作为参数传递(符号"&"是取地址操作)。
答案:【1】int 【2】; 【3】&a
5、给定程序modi.c 中函数fun的功能是:求两个形参的乘积和商数,并通过形参返回调用程序。 例如输入:61.82 和 12.65,输出为: c =782.023000 d = 4.886957。 请改正 fun 函数中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,#include < stdio.h >#include < conio.h >/**********found**********/void fun ( double a, b, double x,y ){/**********found**********/x = a * b; y = a / b;}main ( ){ double a, b, c, d;clrscr( );printf ( "Enter a , b : ");scanf ( "%lf%lf", &a, &b );fun ( a , b, &c, &d ) ;printf (" c = %f d = %f
", c, d );}解析: 本题的考核点是C语言中函数的入口参数和指针的使用。函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和变量名,因此应该把程序中"void fun ( double a, b, double x,y )"语句改为"void fun ( double a,double b, double *x, double *y )"或相同作用的语句。从主函数里的" fun ( a , b, &c, &d ) ; "语句可以看出,fun 函数后两个参数应为长浮点型数据的指针,因此应该把程序中"x = a * b; y = a / b;"语句改为"*x = a * b; *y = a / b;"或相同作用的语句。
6、 请编一个函数float fun(double h),函数的功能是对变量h中的值保留2 位小数,并对第三位进行四舍五入(规定h 中的值为正数)。 例如:h 值为8.32433,则函数返回8.32; h 值为8.32533,则函数返回8.33。 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。#include < stdio.h >#include < conio.h >float fun(float h){……}main(){ float a;clrscr();printf("Enter a: ");scanf("%f",&a);printf("The original data is: ");printf("%f
",a);printf("The result: %f
",fun(a));}解析: 本题的考核点是类型转换与小数四舍五入的算法。 提示思路:先将原数值加上要保留位上的位权值的一半,再除以要保留位上的位权值,通过类型的转换将要舍去部分去掉,最后再通过类型转换将其转换为最终结果。float fun ( float h ){ long num;h=h+0.005;h=h*100;num=h; /*对h 求整*/h=num;h=h/100;return h; }
7、给定程序的功能是删除w 数组中下标为k 的元素中的值。程序中,调用了getindex、arrout 和arrdel三个函数,getindex 用以输入所删元素的下标函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为止。arrout 用以输出数组中的数据,arrdel进行所要求的删除操作。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。#include < stdio.h >#define NUM 10arrout ( int *w, int m ){ int k;/************found************/for (k = 0; k < ___1___; k++)printf ("%d ", w[k]);printf ("
");}arrdel ( int *w, int n, int k ){ int i;for ( i = k; i < n-1; i++ ) w[i] = w[i+1];n--;/************found************/return ___2___;}getindex( int n ){ int i;/************found************/___3___{ printf("
Enter the index [ 0< = i< %d ]: ", n );scanf ("%d",&i );} while( i < 0 || i > n-1 );return i;}main( ){ int n, d, a[NUM]={21,22,23,24,25,26,27,28,29,30};n = NUM;printf ("Output primary data :
"); arrout ( a,n );d = getindex( n ); n = arrdel ( a, n, d );printf ("Output the data after delete :
");arrout( a, n );}
解析: 本题的考核点是数组和循环语句是使用。题中第一个空填"m":"k< m"用于控制循环的结束。题中第二个空填"n":"return n "用于将n 返回给调用它的函数。题中第三个空填"do":循环有两种,当型和直到型。While为当型循环,do…while是直到型循环。答案:【1】m 【2】n 【3】do
8、给定程序modi.c 中,函数fun 的功能是:根据整型形参n,计算如下公式的值。 A1=1,A2=1/(1+A1),A3=1/(1+A2),……An=1/(1+An-1) 例如:若n=10,则应输出: 0.617977。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数,#include < conio.h >#include < stdio.h >/************found************/int fun(int n){ float A=1;int i;/************found************/for (i=2;i< n;i++)A=1.0/(1+A);return A;}main(){ int n;clrscr();printf("
Please enter n:");scanf("%d",&n);printf("A%d=%f
",n,fun(n));}解析: 本题着重考察考生对C 语言中函数的定义、引用和参数传递的掌握情况。本题中的第一个错误:由主函数中可知,函数fun返回的应为float或double型的值,所以程序中的语句"int fun(int n)"应改为"float fun(int n)"或"double fun(int n)";本题中的第二个错误:由题意可知,程序要求出An的值,循环的终止值应为n,所以程序中的语句"for (i=2;i< n;i++)"应改为"for (i=2;i< =n;i++)"或相同作用的语句。
9、请编写函数fun(),它的功能是:求出1 到1000 之内能被5 或13 整除、但不能同时被5 和13 整除的所有整数并将它们放在a 所指的数组中,通过n返回这些数的个数。 注意:部分源程序给出如下。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入所编写的若干语句。 试题程序:#include < conio.h >#include < stdio.h >void fun(int *a,int *n){……}main(){ int aa[1000], n, k;clrscr();fun(aa,&n);for(k=0;k< n;k++)if((k+1)%10==0){printf("%5d ",aa[k]);printf("
"); /*一行写10 个数*/}elseprintf("%5d ",aa[k]);}
解析:void fun(int *a,int *n){ int i,j=0;for(i=1;i< =1000;i++) /*求1 到1000 之内能被5 或13 整除、但不能同时被5 和13 整除的所有整数,并放入数组a 中*/if((i%5==0||i%13==0)&&i%65!=0)a[j++]=i;*n=j; /*传回满足条件的数的个数*/}注意本题题目是找出能被5 或13 整除但不能同时被5 和13 整除的所有整数。能同时被5 和13 整除的整数一定能被65整除,且不能被65 整除的数不一定就是能被5 或13 整除的数。所以可得出程序中的if()。按运算优先级可知(i%5==0||i%13==0),注意,两边必须要有小括号。
10、给定程序的功能是计算scroe 中m 个人的平均成绩aver,将低于aver的成绩放在below 中,通过函数名返回人数。例如,当score={10,20,30,40,50,60,70,80,90},m=9 时,函数返回的人数应该是4,below={10,20,30,40}。
#include < stdio.h >#include < string.h >int fun(int score[], int m, intbelow[]){ int i, j = 0 ;float aver = 0.0 ;for(i = 0 ; i < m ; i++) aver += score[i] ;aver /= (float) m ;for(i = 0 ; i < m ; i++)/**************found**************/if(score[i] < aver) below[j++] = ___1___ ;return j ;}main(){ int i, n, below[9] ;int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ;/**************found**************/n = fun(score, 9, ___2___) ;printf( "
Below the average score are: " ) ;/**************found**************/for (i = 0 ; i < n ; i++) printf("%d ", ___3___) ;}
解析: 本题的考核点是求平均值。解题思路:1、首先定义变量aver,用aver += score[i]计算总分数,用aver /= (float)m 来计算平均分;2、通过循环,计算出数组score[]中各个分数的总和,并放至aver中;3、根据由主函数传过来的m,计算平均分,并放至aver 中;4、通过循环,让每个分数和平均分比较,低于平均分的分数给below[];6、在以上循环的同时,定义了一个变量j,每当发现一个小于平均分的分数,j便自动加1;7、最后返回j值,即是数组score[]中低于平均分的元素个数。答案:【1】score[i] 【2】 below 【3】below[i]
11、给定程序modi.c 中,函数fun 的功能是:计算输出high 以内最大的10 个素数之和。high由主函数传给fun 函数。若high 的值为:100,则函数的值为:732。请改正程序中的错误,使它能得出正确结果。注意:不要改动main 函数,#include < conio.h >#include < stdio.h >#include < math.h >intfun( int high ){ int sum = 0, n=0, j, yes;/************found************/while ((high >= 2) && (n < 10){ yes = 1;for (j=2; j< =high/2; j++ )/************found************/if (high % j ==0 ){yes=0; break }if (yes) { sum +=high; n++; }high--;}return sum ;}main ( ){ clrscr( );printf("%d
", fun (100));}解析: 本题的考核点是C语言中一些规定的应用。本题中的第一处错误是:在C语言中,"{"和"}"应成对出现,所以程序中的语句" while ((high >=2)&&(n< 10)"应改为"while ((high >=2)&&(n<10))"或相同作用的语句。本题中的第二处错误是:C 语言中,";"是语句的一部分,是语句结束的标志,不可缺少,所以," if (high%j==0){yes=0;break}"应改为"if(high%j==0){yes=0;break;}"或相同作用的语句。
12、请编写函数fun,函数的功能是:实现B=A+A',即把矩阵A 加上A 的转置,存放在矩阵B 中。计算结果在main 函数中输出。例如,输入下面的矩阵: 其转置矩阵为:|1 2 3| |1 4 7||4 5 6| |2 5 8||7 8 9| |3 6 9|程序输出: |2 6 10||6 10 14||10 14 18|注意:部分源程序存在文件prog.c 中。请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。#include < conio.h >#include < stdio.h >void fun ( int a[3][3], intb[3][3]){……}main( ) /* 主程序 */{ int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, t[3][3] ;int i, j ;clrscr() ;fun(a, t) ;for (i = 0 ; i < 3 ; i++) {for (j = 0 ; j < 3 ; j++)printf("%7d", t[i][j]) ;printf("
") ;}}
解析: 本题的考核点是矩阵A加上A的转置算法。提示思路:A的转置即指原先在i行j列的元素现放置在j行i列上,通过一个两重循环即可求得矩阵与其转置的和。
void fun(int a[3][3],int b[3][3]){int i,j;for(i=0;i< 3;i++)for (j=0;j< 3;j++)b[i][j]=a[i][j]+a[j][i];/*按从行到列的顺序,求得矩阵与其转置的和*/}
13、给定程序的功能是计算并输出下列级数的前N 项之和SN,直到SN+1大于q 为止,q 的值通过形参传入。2 3 4 N+1SN =─ + ─ + ─ + … + ──1 2 3 N例如,若q 的值为50.0,则函数值为50.416687。#include < stdio.h >double fun( double q ){ int n; double s;n = 2;s = 2.0;/************found************/while (s ___1___ q){s=s+(double)(n+1)/n;/************found************/___2___ ;}printf("n=%d
",n);/************found************/___3___ ;}main ( ){printf("%f
", fun(50));}解析: 本题考查的是C 语言中简单算法的应用以及函数的调用。题中第一个空填"< =":根据题意,设置循环的结束条件。题中第二个空填"n++":根据题意,将变量n 的值自加1,以适应公式的变化。题中第三个空填"returns":通过return 语句将被调用函数中一个确定值带回主调函数中去。本评析仅作参考。答案:【1】< = 【2】n++ 【3】return s
14、给定程序modi.c 中函数 fun 的功能是:从 m 个学生的成绩中统计高于平均分的学生人数,此人数由函数值返回,aver返回平均分。请改正函数 fun 中的错误,使它能统计出正确的结果。注意:不要改动 main 函数,#include < conio.h >#include < stdio.h >#define N 20int 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 ( "
Please enter m: " ) ; scanf ("%d", &m ) ;printf ( "
Please enter %d mark :
", m ) ;for( i = 0 ; i < m ; i++ ) scanf ( "%f", s + i ) ;printf( "
The number of students : %d
" , fun ( s, m, &aver ) );printf( "Ave = %f
", aver ) ;}
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错误的重要前提。程序中的重要思想如下:1、要注意存放学生分数的数组是一个float型的数组,故总分和平均分都应当是float型的;2、函数fun()中的第三个形参是一个指针,这表示在未来赋值时的方法是特殊的。本题的第一个错误:在函数fun()第一个for 循环体中,语句"t = s[k] ;只是将t的值不断用不同学生的分数替代,这与计算总分的初衷相逆,这条语句应当书写为"t=t+s[k];",实现学生分数的不断累加;本题的第二个错误:语句"*aver = &ave ;"是不正确的,*aver 代表的是一个float型的变量,而&aver 则是函数中存放平均数的那个变量的内存地址,两者不匹配,应当改为"*aver = ave;",这样才可以实现通过aver 返回平均分的目的。
15、请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0 至9 岁年龄段的人数放在d[0]中,把10 至19 岁年龄段的人数放在d[1]中,把20 至29 岁年龄段的人数放在d[2]中,其余依此类推,把100 岁(含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。注意:部分源程序存在文件prog.c 中。请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。#include < stdio.h >#define N 50#define M 11void fun( int *a, int *b){……}double rnd(){ static t=29,c=217,m=1024,r=0;r=(r*t+c)%m; return((double)r/m);}main(){ int age[N], i, d[M];for(i=0; i< N;i++)age[i]=(int)(115*rnd());printf("The original data :
");for(i=0;i< N;i++) printf((i+1)%10==0?"%4d
":"%4d",age[i]);printf("
");fun( age, d);for(i=0;i< 10;i++)printf("%4d---%4d : %4d
",i*10,i*10+9,d[i]);printf(" Over 100 : %4d
",d[10]);}
解析: 本题的考核点是统计各年龄段人数的算法。解题思路:本题提供的参考程序,先对数组初始化,再通过for 循环和逗号表达式*(a+i)/10 >10?10:*(a+i)/10,将年龄整除10 后存放到数组d中,具体执行过程是判断年龄整除10后的值是否大于10,若大于10,则该逗号表达式的值等于10,即实现了将100 岁(含100)以上年龄的人数存放在d[10]中; 若不大于10,则该逗号表达式的值等于*(a+i)/10 的值,即实现了各个年龄段的人数的统计。void fun( int *a,int *b){int i;for(i=0;i< M;i++) /*初始化数组b中的每一个元素*/b[i]=0;for(i=0;i< N;i++) /*判断年龄整除10 后的值是否大于10,若大于10,则该逗号表达式的值等于10,否则等于*(a+i)/10 的值*/b[*(a+i)/10 >10?10:*(a+i)/10]++;}
16、规定输入的字符串中只包含字母和*号。函数fun 的功能是:将字符串中前面所有连续的*号全部移动到字符串的尾部。例如,字符串中的内容为:*******A*BC*DEF*G****,移动后,字符串中的内容应当是:A*BC*DEF*G***********。
#include < stdio.h >#include < conio.h >void fun(char *a){ char b[81];int i=0,j=0,s=0,k;while (a[i]__1____'*') /*统计原串串首连续*的个数*/{i++;s++;}while (a[i]) /*将从第一个非*字符开始至串尾的所有字符赋给字符串b*/{b[j]=a[i];j++;i++;}for (k=0;k< s;k++) /*串首连续*的个数追加其在字符串b 后*/{b[j]='*';j++;}b[j]=__2____;i=0;j=0;while (b[j]) /*将字符串b中的所有字符复制到a 字符串中覆盖原串*/{a[i]=b[j];i++;j++;}}main(){ char s[81],*p;printf("Enter a string:
");gets(s);fun(s);printf("The string after moveing:
");puts(s);}
解析: 本题的考核点是移动字符串中字符的算法。解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的所有字符赋给一字符串,再通过一循环生成串首连续*的个数个*追加其后,最后将新串覆盖原串。答案:【1】== 【2】' \ 0'
17、给定程序modi.c 中fun 函数的功能是:计算1+2+3+……+n 的和值。请改正程序中的错误,使它能得出正确结果。注意:不要改动main 函数,#include < stdio.h >/************found************/fun (int n){ double t;/************found************/if (n==0)return(1);elset=fun(n-1)+n;return t;}main(){ int n;printf("Enter n: "); scanf("%d",&n);printf("
s=%f
",fun(n));}
解析:本题着重考察考生对C 语言中递归算法的掌握情况。本题中的第一个错误:由主函数中可得,fun 函数应返回一个float或double型的值,所以程序中语句"fun (int n)"应改为"float fun (int n)"或相同作用的语句。本题中的第二个错误:由题意可知,求1 到n 的和,当n 为1 时和为1,不断递归,以此求出当n 为n 时的和值,所以程序中语句"if (n==0)"应改为"if n==1)"。
18、请编写一个函数 int un(int *s,int *t,int *k),用来求出数组中值最大的元素在数组中的下标并存放在k 所指的存储单元中,并且将最大值增添在数组的最后。形参t 所指存储单元中存放数组中数据的个数。例如,数组中的数据如下:876 675 896 101 301 401 980 431 451 777则输出最大值的下标为:6,数组中的内容为:876 675 896 101 301 401 980 431 451 777 980注意:部分源程序存在文件prog.c 中。请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。#include < stdio.h >#define N 80void fun(int *s,int *t,int *k){……}main(){ int a[N]={876,675,896,101,301,401,980,431,451,777},i,n,mi;n=10;printf("
The original data:
");for(i=0;i< n;i++)printf("%4d",a[i]);printf("
");fun(a,&n,&mi);printf("The index of max is: %d
",mi);printf("The result :
");for(i=0;i< n;i++)printf("%4d",a[i]);printf("
");}
解析: 本题的考核点是求数组中最大元素的下标,并将最大值增添在组的最后的算法。提示思路:先通过一指针变量来记录数组中最大值的下标,然后再将最大值放在数组的最后,使数组长度增1。void fun(int *s,int *t,int *k){ int i=0;*k=0;/*从前往后顺序