请编写函数fun,该函数的功能是:将M行N列的二维数组中的数据,按列的顺序依次存放到一维数组中。函数fun中给出的语句仅供参考。
例如,二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应是:
33 44 55 33 44 55 33 44 55 33 44 55
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C内容如下:
#include<stdio.h>
void fun(int(*s)[10],int *b,int *n,int mm,int nn)
/*以下代码仅供参考*/
int i,j,np=0; /*np用作b数组的下标*/
void main( )
int w[10][10]=33,33,33,33,44,44,44,44,55,55,55,55,i,j;
int a[100]=0,n=0;
printf("The matrix: \n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)printf("%3d",w[i][j]);
printf("\n");
fun(w,a,&n,3,4);
printf("The A array: \n");
for(i=0;i<n;i++)printf("%3d",a[i]);
printf("\n\n");
参考答案:void fun(int (*s)[10],int *b,int *n,int mm,int nn) {
/*以下代码仅供参考*/
int i,j,np=0; /*np用作b数组的下标*/
for(j=0;j<nn;j++)
for(i=0;i<mm;i++){
b[np]=s[i][j];np++;{
*n=np;
}
解析: 函数fun中,形参s是一个指向由10个元素组成的一维数组的指针,形参b指向一个一维数组,形参n带回一维数组b的实际长度,形参mm传递二维数组的行数,nn传递二维数组的列数。假设用i表示二维数组的行下标,j表示二维数组的列下标,要按列方向访问二维数组元素,需要两重循环,其中j循环放在外层,i循环放在内层。在循环中取出s[i][j]对b[np]进行赋值。循环结束后,将b数组的实际长度np赋值给*n,通过n将一维数组的长度带回到main函数中。本题中最容易出错的地方就是两重循环的控制,首先循环的次序应该将j放外层,i放里层。其次,就是循环的条件,由于题目中举例是一个3行4列的二维数组,所以考生容易将条件写为“j<4”、“i<3”,这样的话,程序就只能处理3行4列的二维数组,其他的二维数组调用该函数就会出现错误结果,而且根本没有用到形参mm和nn。这是编程处理该题目时必须注意的问题。
在上机考试的程序设计题目中,有些程序会给出一部分程序段供考生参考,考生可以直接使用,不必重新编写,例如本题中给出了一些变量的定义。在一些比较复杂的编程题中,这些参考程序会给我们提供一定的帮助,建议考生认真阅读。但是,如果考生有自己的编程算法、有自己的编程思路,这些程序段如果和自己的编程思路不太相符,也可以将其删掉,自己重新编写。
[归纳总结] 本套试题的程序填空和程序设计题考查的是二维数组的处理。二维数组处理的关键是掌握好行列下标的变化规律,控制好循环。
假设有如下定义:int a[M][N];用变量i表示行下标,变量j表示列下标。
如果要求按行的方向遍历二维数组,则循环应该写为:
for(i=0;i<M;i++)
for(j=0;j<N;j++){
… /*循环中对a[i][j]进行处理*/
}
如果要求按列的方向遍历二维数组,则循环应该写为:
for(j=0;j<N;j++)
for(i=0;i<M;i++){
… /*循环中对a[i][j]进行处理*/
}
如果只对某行元素进行处理,只需对列下标进行循环控制,行号不变;如果只对某列元素进行处理,只需对行下标进行循环控制,列号不变。
假如二维数组表示的是一个n阶方阵,则有如下规律:
(1)主对角线元素:行列下标相等,元素可以表示为a[i][i]。
(2)反向对角线元素可以表示为:a[i][n-i-1]。
(3)下三角元素如果表示成a[i][j],则与之对称的上三角元素可以表示成a[j][i]。
(4)如果只对下三角元素进行处理,则常用的循环是:
for(i=0;i<n;i++)
for(j=0;j<i;j++){
…/*循环中对a[i][j]进行处理*/
}