1、二级 C语言机试-204 及答案解析(总分:100.00,做题时间:90 分钟)一、填空题(总题数:1,分数:30.00)在给定程序中,函数 fun的功能是:有 NN矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素置为 0。例如,若 N=3,有下列矩阵:1 2 34 5 67 8 9则计算结果为:1 0 06 5 010 14 9请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK1.C中。不得增行或删行,也不得更改程序的结构。文件 BLANK1.C内容如下:#include stdio.h#defi
2、ne N 4/*found*/void fun(int(*t) (1) )int i,j;for(i=1;iN;i+)for(j=0;ji;j+)/*found*/(2) =tij+tji;/*found*/(3) =0;void main( )int tN=21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10,i,j;printf(“/nThe original array: /n“);for(i=0;iN;i+)for(j=0;jN;j+)printf(“%2d“,tij);printf(“/n“); fun(t);printf(“/nThe re
3、sult is: /n“);for(i=0;iN;i+)for(j=0;jN;j+) printf(“%2d“,tij);printf(“/n“);(分数:30.00)填空项 1:_填空项 1:_填空项 1:_二、改错题(总题数:1,分数:30.00)1.给定程序 MODI1.C中函数 fun的功能是:将 s所指字符串中的字母转换为按字母顺序的后续字母(但 Z转换为 A,z 转换为 a),其他字符不变。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。文件 MODI1.C内容如下:#includestdio.h#includectyp
4、e.hvoid fun(char *s)/*found*/while(*s!=)if(*s=A gets(s);printf(“/n The string: /n/n“); puts(s);fun(s);printf(“/n/n Tile Cords: /n/n“);puts(s);(分数:30.00)填空项 1:_三、编程题(总题数:1,分数:40.00)2.请编写函数 fun,该函数的功能是:将 M行 N列的二维数组中的数据,按列的顺序依次存放到一维数组中。函数 fun中给出的语句仅供参考。例如,二维数组中的数据为:33 33 33 3344 44 44 4455 55 55 55则一维数
5、组中的内容应是:33 44 55 33 44 55 33 44 55 33 44 55注意:部分源程序在文件 PROG1.C中。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的若干语句。文件 PROG1.C内容如下:#includestdio.hvoid fun(int(*s)10,int *b,int *n,int mm,int nn)/*以下代码仅供参考*/int i,j,np=0; /*np 用作 b数组的下标*/void main( )int w1010=33,33,33,33,44,44,44,44,55,55,55,55,i,j;int a10
6、0=0,n=0;printf(“The matrix: /n“);for(i=0;i3;i+)for(j=0;j4;j+)printf(“%3d“,wij);printf(“/n“);fun(w,a, fun(t);printf(“/nThe result is: /n“);for(i=0;iN;i+)for(j=0;jN;j+) printf(“%2d“,tij);printf(“/n“);(分数:30.00)填空项 1:_ (正确答案:N)解析:填空项 1:_ (正确答案:tij)解析:填空项 1:_ (正确答案:tji)解析:解析 main 函数中定义了一个二维数组 t存放了一个 44矩
7、阵。在 main函数中调用 fun函数,实现对二维数组的相关操作。因为二维数组的每一行都是一个一维数组,且元素个数为 4,所以对应的形参 t必须是一个指向 4个元素一维数组的指针,因此第 1空处应填入N。题目中的二维数组很特殊,其中存放的是一个方阵,方阵的特点是:有一个主对角线,主对角下方称为下三角,上方称为上三角。如果用 tij表示下三角元素,则它的行下标 i和列下标 j的大小关系是:ji,与之对称的上三角元素可以表示成 tji。因此,在 fun函数中通过一个两重循环的嵌套,按行的方向遍历数组元素,由于 j循环的循环条件是 ji,所以 tij表示下三角元素,tji则表示对称的上三角元素。两数
8、相加的结果放在下三角中,所以第 2空处应填入 tij,上三角元素置为 0,所以第 3空处应填入 tji。二、改错题(总题数:1,分数:30.00)1.给定程序 MODI1.C中函数 fun的功能是:将 s所指字符串中的字母转换为按字母顺序的后续字母(但 Z转换为 A,z 转换为 a),其他字符不变。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。文件 MODI1.C内容如下:#includestdio.h#includectype.hvoid fun(char *s)/*found*/while(*s!=)if(*s=A gets(
9、s);printf(“/n The string: /n/n“); puts(s);fun(s);printf(“/n/n Tile Cords: /n/n“);puts(s);(分数:30.00)填空项 1:_ (正确答案:第 1处:将“while(*s!=)”改为“while(*s!=/0)”。第 2处:将“(*s)+;”改为“s+;”。)解析:解析 函数 fun中利用指针 s依次从字符串的第一个字符开始取出字符进行处理,当 s指向字符串结束标记时停止循环。所以第 1处是字符串处理错误,字符串的结束标记是/0,而不是。循环中取出当前 s指向的字符进行处理后,指针 s应该往后移动,指向下一个
10、字符,所以第 2处错误是指针使用错误,应该改为“s+;”,而不是 s指向的字符的 ASCII码自加 1。三、编程题(总题数:1,分数:40.00)2.请编写函数 fun,该函数的功能是:将 M行 N列的二维数组中的数据,按列的顺序依次存放到一维数组中。函数 fun中给出的语句仅供参考。例如,二维数组中的数据为:33 33 33 3344 44 44 4455 55 55 55则一维数组中的内容应是:33 44 55 33 44 55 33 44 55 33 44 55注意:部分源程序在文件 PROG1.C中。请勿改动主函数 main和其他函数中的任何内容,仅在函数 fun的花括号中填入你编写的
11、若干语句。文件 PROG1.C内容如下:#includestdio.hvoid fun(int(*s)10,int *b,int *n,int mm,int nn)/*以下代码仅供参考*/int i,j,np=0; /*np 用作 b数组的下标*/void main( )int w1010=33,33,33,33,44,44,44,44,55,55,55,55,i,j;int a100=0,n=0;printf(“The matrix: /n“);for(i=0;i3;i+)for(j=0;j4;j+)printf(“%3d“,wij);printf(“/n“);fun(w,a,&n,3,4)
12、;printf(“The A array: /n“);for(i=0;in;i+)printf(“%3d“,ai);printf(“/n/n“);(分数:40.00)_正确答案:(void fun(int (*s)10,int *b,int *n,int mm,int nn) /*以下代码仅供参考*/int i,j,np=0; /*np 用作 b数组的下标*/for(j=0;jnn;j+)for(i=0;imm;i+)bnp=sij;np+;*n=np;)解析:解析 函数 fun中,形参 s是一个指向由 10个元素组成的一维数组的指针,形参 b指向一个一维数组,形参 n带回一维数组 b的实际长
13、度,形参 mm传递二维数组的行数,nn 传递二维数组的列数。假设用 i表示二维数组的行下标,j 表示二维数组的列下标,要按列方向访问二维数组元素,需要两重循环,其中 j循环放在外层,i 循环放在内层。在循环中取出 sij对 bnp进行赋值。循环结束后,将 b数组的实际长度 np赋值给*n,通过 n将一维数组的长度带回到 main函数中。本题中最容易出错的地方就是两重循环的控制,首先循环的次序应该将 j放外层,i 放里层。其次,就是循环的条件,由于题目中举例是一个 3行 4列的二维数组,所以考生容易将条件写为“j4”、“i3”,这样的话,程序就只能处理3行 4列的二维数组,其他的二维数组调用该函
14、数就会出现错误结果,而且根本没有用到形参 mm和 nn。这是编程处理该题目时必须注意的问题。在上机考试的程序设计题目中,有些程序会给出一部分程序段供考生参考,考生可以直接使用,不必重新编写,例如本题中给出了一些变量的定义。在一些比较复杂的编程题中,这些参考程序会给我们提供一定的帮助,建议考生认真阅读。但是,如果考生有自己的编程算法、有自己的编程思路,这些程序段如果和自己的编程思路不太相符,也可以将其删掉,自己重新编写。归纳总结 本套试题的程序填空和程序设计题考查的是二维数组的处理。二维数组处理的关键是掌握好行列下标的变化规律,控制好循环。假设有如下定义:int aMN;用变量 i表示行下标,变
15、量 j表示列下标。如果要求按行的方向遍历二维数组,则循环应该写为:for(i=0;iM;i+)for(j=0;jN;j+) /*循环中对 aij进行处理*/如果要求按列的方向遍历二维数组,则循环应该写为:for(j=0;jN;j+)for(i=0;iM;i+) /*循环中对 aij进行处理*/如果只对某行元素进行处理,只需对列下标进行循环控制,行号不变;如果只对某列元素进行处理,只需对行下标进行循环控制,列号不变。假如二维数组表示的是一个 n阶方阵,则有如下规律:(1)主对角线元素:行列下标相等,元素可以表示为 aii。(2)反向对角线元素可以表示为:ain-i-1。(3)下三角元素如果表示成 aij,则与之对称的上三角元素可以表示成 aji。(4)如果只对下三角元素进行处理,则常用的循环是:for(i=0;in;i+)for(j=0;ji;j+)/*循环中对 aij进行处理*/