1、二级 C 语言机试 31 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请完成函数 fun(),它的功能是:用选择法对数组中 n 个元素按从大到小的顺序进行排序。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在下划线上填入所需的内容。 #includestdio.h #define N 20 void fun(int a,int n) int i,j,t,p; for(j=0;jn-1;U 1 /U) p=j; for(i=j;in;i+) if(aiU 2 /Uap p=i; t=ap; ap=a
2、j; aU 3 /U=t; main() int aN=11,32,-5,2,14,i,m=5; for(i=0;im;i+) printf(“%d/n“,ai); fun(a,m); for(i=0;im;i+) printf(“%d“ai); (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.给定程序 MODllC 中函数 fun 的功能是:输出 M 行 M 列整数方阵,然后求两条对角线上各元素之和,返回此和数。 #inCludecoMo.h #inCludestdio.h #dehne M 5 /*found*/ int fun(int n,int x
3、x) int i,j,sum=0; printf(“/n The%dx%d matrix:n“M,M); for(i=0;iM;i+) for(j=0;jM;j+) /*found*/ printf(“%f“,xxij);printf(“/n“); for(i=0;in;i+) sum+=xxii+XXin-i-1; return(sum); main( ) int aaMM=1,2,3,4,5),4,3,2,1,0), 6,7,8,9,0,9,8,7,6,5,3,4,5,6,7; clrscr( );printf(“/n The sum Of all elements On 2 diagna
4、ls is %d.“fun(M,aa); (分数:30.00)填空项 1:_三、B设计题/B(总题数:1,分数:40.00)3.请编写函数 fun,它的功能是:求任意两个正整数的最小公倍数和最大公约数,最小公倍数放在指针变量 bei 所指的变量中,最大公约数放在指针变量 yue 所指的变量中。 注意:部分源程序在文件 PROG1.C中。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 void fun(int m,int n,int*bei,int *yue) int s=l,i; if(mn)s=m;m=n;n=S; for(i=2,s=1
5、;im i+) if(m%i=0)jn-1;U 1 /U) p=j; for(i=j;in;i+) if(aiU 2 /Uap p=i; t=ap; ap=aj; aU 3 /U=t; main() int aN=11,32,-5,2,14,i,m=5; for(i=0;im;i+) printf(“%d/n“,ai); fun(a,m); for(i=0;im;i+) printf(“%d“ai); (分数:30.00)填空项 1:_ (正确答案:void fun(int a,int n))解析: int i,j,t,p; for(j=0;jn-1;j+) p=j; for(i=j;in;i
6、+) if(aiap) p=i; t=ap; aP=aj; aj=t; 解析 程序的基本思路是依次用当前取得的元素和它后面的其他元素进行比较,这样在比较完后,可以保证当前位置的当前元素存放着最大数。按同样方法取得次最大数。空白 1 处填 j+,循环变量 j 依次增 1,取出每个数;空白 2 处填,按照题目要求是从大到小排序:空白 3 处填 j,借助中间变量交换两个数。二、B改错题/B(总题数:1,分数:30.00)2.给定程序 MODllC 中函数 fun 的功能是:输出 M 行 M 列整数方阵,然后求两条对角线上各元素之和,返回此和数。 #inCludecoMo.h #inCludestdi
7、o.h #dehne M 5 /*found*/ int fun(int n,int xx) int i,j,sum=0; printf(“/n The%dx%d matrix:n“M,M); for(i=0;iM;i+) for(j=0;jM;j+) /*found*/ printf(“%f“,xxij);printf(“/n“); for(i=0;in;i+) sum+=xxii+XXin-i-1; return(sum); main( ) int aaMM=1,2,3,4,5),4,3,2,1,0), 6,7,8,9,0,9,8,7,6,5,3,4,5,6,7; clrscr( );pr
8、intf(“/n The sum Of all elements On 2 diagnals is %d.“fun(M,aa); (分数:30.00)填空项 1:_ (正确答案:int fun(int n,int xx) 改为 int fun(int n,int xxM))解析:printf(“%f,xxij); 改为 printf(“%d,“xxij); 解析 二维数组作为函数形参时,二维长度不可缺省,只能省略一维的长度。在格式输出函数中,血型数据输出时对应的控制符是%d.三、B设计题/B(总题数:1,分数:40.00)3.请编写函数 fun,它的功能是:求任意两个正整数的最小公倍数和最大公
9、约数,最小公倍数放在指针变量 bei 所指的变量中,最大公约数放在指针变量 yue 所指的变量中。 注意:部分源程序在文件 PROG1.C中。请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。 void fun(int m,int n,int*bei,int *yue) int s=l,i; if(mn)s=m;m=n;n=S; for(i=2,s=1;im i+) if(m%i=0)&(n%i=0) *yue=s; *bei=S*m*n; main( ) int a,b,beishu,yueshu; chscr( ); printf(“ple
10、ase input a,b:“);scanf(“%d,%d,“&a,&b); fun(a,b,&beishu,&yueshu); printf(“a,b beishu:%d/n“,beishu); printf(“a,b yueshu:%d/n“,Yueshu); (分数:40.00)_正确答案:()解析:void fun(int m,int n,int*bei,int*yue) int s=l,i; if(mn)s=m;m=n;n=s; for(i=2,s=1;im;i+) if(m%i=0)&(n%i=0) m=m/i; n=n/i; s=s*i: i=1: *yue=s;*bei=s*m*n; 解析 本题考查编程解决一般数学问题的能力。本题函数 fun 的实现了拐除法,在 2 m 之间从小到大依次取数 i 同时整除 m 和 n,若能整除,则累乘到 s 中,最后的 s 就是最大公约数,s*m*n 就是最小公倍数。