1、二级 C 语言机试 84 及答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充函数 fun(),该函数的功能是把数组 aa 中的奇数元素按原来的先后顺序放在原数组后面。 例如,输入“33,67,42,58,25,76,85,16,41,56”,输出结果“42,58,76,16,56,33,67,25,25,41。 注意:部分源程序给出如下。 请勿改动主函数 main 和具他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 10 void fu
2、n(int aa) int i, j=0,k 0; int bb IN; for (i 0; iN; i+) if (U 【1】 /U) bbk+ aai; else aa j+ =aa Ii; for(i=0; ik;U【2】 /U) aaj bbi; main ( ) int i; int aaN=33, 67, 42,58,25, 76, 85, 16, 41,56; clrscr (); printf(“/n* original list */n“); for (i=0; iN; i+) printf(“%4d“, aai); fun (aa); printf(“/n* new lis
3、t */n“); for (i=0; iN; i+) printf(“%4d“, aai); (分数:30.00)填空项 1:_二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:用递归算法计算斐波拉契级数列中第 n 项的值。从第一项起,斐波拉契级数序列为 1, 1,2,3,5,8,13,21,例如,若给 n 输入 7, 该项的斐波拉契级数值为 13。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdio.h long fun(int g) /*fo
4、und*/ switch(g); case 0:return 0; switch(g) case 1; case 2:return 1; return (fun(g-1)+fun(g-2); main() long fib; int n; printf(“Input n:“);scanf(“%d“, printf(“n-%d/n“,n); fib=fun(n); printf(“fib=%d/D/n“,fib); (分数:30.00)填空项 1:_三、B编程题/B(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构体数组 s 中,请编写函数 fu
5、n(),它的功能是:按分数的高低排列学生的记录,高分在前。 注意:部分源程序给出如下 请勿改动主函数main 和其他函数中的任何内容,仅在函数 fum 的花括号中填入所编写的若啡:语句。 试题程序: #include stdio.h #define N 16 typedef struct char num10; int s ; STREC; int fun (STREC a) main () STREC s IN = “GA005“, 85 , “GA003“, 76, “GA002“, 69, “GA004“, 85, “GA001“, 91, “GA007“, 72, “GA008“, 6
6、4, “GA006“, 87, “GA015“, 85, “GA013“, 91, “GA012“, 64, “GA014“, 91, “GA011“, 66, “GA017“, 64, “GA018“, 64, “GA016“, 72 ; int i; FILE *out; fun (s); printf(“The data after sorted :In“); for (i=0; iN; i+) if (i) %4=-0) /*每行输出 4 个学生记录*/ printf (“/n“); printf(“%s %4d“,si.num, si.s); printf (“/n“); out=f
7、open ( “out 16. dat“, “w“ ); for(i=0; iN; i+); if (i) %4=0 fprintf(out, “%4d“,si.s); fprintf(out, “/n“); fclose (out); (分数:40.00)_二级 C 语言机试 84 答案解析(总分:100.00,做题时间:90 分钟)一、B填空题/B(总题数:1,分数:30.00)1.请补充函数 fun(),该函数的功能是把数组 aa 中的奇数元素按原来的先后顺序放在原数组后面。 例如,输入“33,67,42,58,25,76,85,16,41,56”,输出结果“42,58,76,16,56
8、,33,67,25,25,41。 注意:部分源程序给出如下。 请勿改动主函数 main 和具他函数中的任何内容,仅在函数 fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include stdio.h #define N 10 void fun(int aa) int i, j=0,k 0; int bb IN; for (i 0; iN; i+) if (U 【1】 /U) bbk+ aai; else aa j+ =aa Ii; for(i=0; ik;U【2】 /U) aaj bbi; main ( ) int i; int aaN=33, 67, 42,58,25, 7
9、6, 85, 16, 41,56; clrscr (); printf(“/n* original list */n“); for (i=0; iN; i+) printf(“%4d“, aai); fun (aa); printf(“/n* new list */n“); for (i=0; iN; i+) printf(“%4d“, aai); (分数:30.00)填空项 1:_ (正确答案:1 aai%2!=0 或 aai%2=1)解析:2 i+,j+ 解析 填空 1:如果一个数对 2 求余,结果不为 0,也就是等于 1,则这个数为奇数,就把这个数先暂时存在数组 bb 中。否则这个数为偶
10、数,就存在数组 aa 中。填空 2:最后,将数组 bb 中的奇数都拷贝到数组 aa 中偶数的后面。每执行一次循环休,数组 aa 的下标 j 和数组 bb 的下标 i 都要加1。二、B改错题/B(总题数:1,分数:30.00)2.下列给定程序中,函数 fun()的功能是:用递归算法计算斐波拉契级数列中第 n 项的值。从第一项起,斐波拉契级数序列为 1, 1,2,3,5,8,13,21,例如,若给 n 输入 7, 该项的斐波拉契级数值为 13。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include stdi
11、o.h long fun(int g) /*found*/ switch(g); case 0:return 0; switch(g) case 1; case 2:return 1; return (fun(g-1)+fun(g-2); main() long fib; int n; printf(“Input n:“);scanf(“%d“, printf(“n-%d/n“,n); fib=fun(n); printf(“fib=%d/D/n“,fib); (分数:30.00)填空项 1:_ (正确答案:错误:switch(g); 正确:去掉分号)解析:(2)错误:case 1;case
12、2:return 1: 正确:case 1:case 2:return 1; 解析 C 语言中,Switch 语句之后不能有分号,并且 Case 语句常量后应用的是冒号。三、B编程题/B(总题数:1,分数:40.00)3.学生的记录由学号和成绩组成,N 名学生的数据已在主函数中放入结构体数组 s 中,请编写函数 fun(),它的功能是:按分数的高低排列学生的记录,高分在前。 注意:部分源程序给出如下 请勿改动主函数main 和其他函数中的任何内容,仅在函数 fum 的花括号中填入所编写的若啡:语句。 试题程序: #include stdio.h #define N 16 typedef str
13、uct char num10; int s ; STREC; int fun (STREC a) main () STREC s IN = “GA005“, 85 , “GA003“, 76, “GA002“, 69, “GA004“, 85, “GA001“, 91, “GA007“, 72, “GA008“, 64, “GA006“, 87, “GA015“, 85, “GA013“, 91, “GA012“, 64, “GA014“, 91, “GA011“, 66, “GA017“, 64, “GA018“, 64, “GA016“, 72 ; int i; FILE *out; fu
14、n (s); printf(“The data after sorted :In“); for (i=0; iN; i+) if (i) %4=-0) /*每行输出 4 个学生记录*/ printf (“/n“); printf(“%s %4d“,si.num, si.s); printf (“/n“); out=fopen ( “out 16. dat“, “w“ ); for(i=0; iN; i+); if (i) %4=0 fprintf(out, “%4d“,si.s); fprintf(out, “/n“); fclose (out); (分数:40.00)_正确答案:()解析:i
15、nt fun (STREC a) int i,j; STREC t; for (i=1; iN; i+) /*用冒泡法进行排序,进行N-1 次比较*/ for (j =0; jN-1; j+) / *在每一次比较中要进行 N-1 次两两比较*/ if(aj.saj+1.s) t=a j; a j =a j+1; a j+1 =t; /*按分数的高低排列学生的记录,高分在前*/ 解析 冒泡法算法思路:如果有 N 个数,则要进行 N-1 次比较,在每一次比较中要进行 N-1 次两两比较(这种算法较好理解但不是最精的)。所谓两两比较就是从头到尾依次将相邻两个数进行比较并将其中大的数放在前或在后(若要
16、求从小到大排序,则大的数要放在后。反之则对调),即两两比较后这两个数要形成题中所要求的顺序。由于总是从头到尾进行比较,所以第 1 次比较结束后,最大(或最小)数肯定在最后,第 2 次比较结束后,次最大(或次最小)数肯定在倒数的第 2 个数,依次类推,所以进行第一次比较时必须比较到最后一个数,而进行第 2 次比较时只要比较到倒数的第 2 个数即可,所以进行第 i 次比较时只需比较 N-i 次即可(这种算法较难理解,但它是最好的)。 选择法算法思路:如果有 N 个数则从头到倒数的第 2 个数一个一个往后走动,每走动 1 个数总是将这个数与其后的所有数进行比较并找出它们的最大(或最小)数,找出最大(
17、或最小)数后再将所得的最大(或最小)数与该数进行交换,交换后再走到下一个数依次交换到结束。此外,选择法还可用如下思路:如果有 N 个数,则从头到倒数的第 2 个数个一个往后走动,每走动一个数总是将这个数与其后的所有数进行两两比较,在比较时按顺序将进行比较的这两个数排序(即交换)。 插入法算法思路:先对头两个数进行排序。然后把第 3 个数插入到前两个数中,插入后前 3 个数依然有序;再把第 4 个数插入到前 3 个数中,插入后前 4 个数依然有序;依次插完所有的数。具体执行方式(假设从小到大排序):从第 2 个数开始往后一个一个走动直到最后。每走到 1 个数总是将该数(先将其存到 1 个临时变量
18、中)与其前面的数进行比较(比较的顺序总是从后往前进行),在比较时只要发现该数比被比较的数小,就将被比较的数往后移 1 位,然后该数还要冉与前 1 个数进行比较,亢到发现该数比被比较的数大或己比较到头(即第 1 个数的前面),并将该数存入当前被比较数的后 1 位(存储空间)。 如果有整型一维数组 a 其有 N 个元素,要求将其按从小到大排序。注意元素下标是从 0 始的。 冒泡法: for (i=1; iN; i+) for (j=0;N-1; j+) if (ajaj+1) t=aj ;a j=aj+1 ;aj+1=aj; 选择法 for (i=0 iN-1; i+) p=i; for(j i+1; jN; j+) if (apaj) p=j; ifp!=i) t=ai;ai=ap;ap=t; 插入法 for i=1; iN; i+ t=ai; for j=i-1; a jt j-) aj+1=aj; aj+1=t;