365文库
登录
注册
2

国二考试题目

186阅读 | 8收藏 | 20页 | 打印 | 举报 | 认领 | 下载提示 | 分享:
2
国二考试题目第1页
国二考试题目第2页
国二考试题目第3页
国二考试题目第4页
国二考试题目第5页
国二考试题目第6页
国二考试题目第7页
国二考试题目第8页
国二考试题目第9页
国二考试题目第10页
国二考试题目第11页
国二考试题目第12页
国二考试题目第13页
国二考试题目第14页
国二考试题目第15页
国二考试题目第16页
国二考试题目第17页
国二考试题目第18页
国二考试题目第19页
国二考试题目第20页
福利来袭,限时免费在线编辑
转Pdf
right
1/20
right
下载我编辑的
下载原始文档
收藏 收藏
搜索
下载二维码
App功能展示
海量免费资源 海量免费资源
文档在线修改 文档在线修改
图片转文字 图片转文字
限时免广告 限时免广告
多端同步存储 多端同步存储
格式轻松转换 格式轻松转换
用户头像
derAugenste 上传于:2024-06-24
机试真题 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 10 arrout ( 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 个数*/ } else printf("%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, int below[]) { 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 >int fun( 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], int b[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 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 ( "
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 11 void 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); else t=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 80 void 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;/*从前往后顺序
tj