问题 问答题

【说明】
以下【C程序】能将自然数1,2,…,N2按蛇形方式逐个存入N阶矩阵。换言之,程序从anO开始到 aOn。为止(n=N-1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。
例如,当N=5时,程序输出结果如图2-12所示;当N=8时,程序输出结果如图2-13所示。


【C程序】
#include <stdio.h>
#define SIZE 10
int a[SIZE][SIZE], k;
main()
int i, j, n, N;
for (N = 3; N<=SIZE; N++)
k = 1;
makeArray (n = N-1);
printf ("\nN = %d;\n", n+1);
for (i = 0; i<=n; i++)
for (j = 0; j<=n; j++)
printf("%4d", a[i] [j]);
printf ("\n");


makeline (int row_start, int col_start, int row end)
/*完成矩阵一条斜线的整数填写*/
int i, j, sign = (1) ;
for (i = row_start, j = col start; (2) ; i += sign, j += sign)
a[i] [j] = k++;makeArray (int n)
/*完成矩阵每条斜线的整数填写*/
int d;
for (d = 1; d <= (3) ; d++)
if (d <= n)
if (d%2)
makeline ( (4) );
else
makeline ( (5) );
else
if (d%2)
makeline ( (6) );
else
makeline ( (7) );

答案

参考答案:(1)row_start<row_end1:-1 或((row end-row start)>0)*2-1或其他等价的代码形式
(2)(row-end-i)*sign>=0或其等价的代码形式
(3)2*n+1或其等价的代码形式
(4)n,d-1,n+1-d
(5)n+1-d,0,n
(6)2*n-d+1,n,0
(7)0,d n-1,2*n-d+1

解析:[要点解析]
这是一道要求读者掌握二维数组应用的程序设计题。本题的解答思路如下。
本程序由主函数main、函数makeline和函数makeArray组成。函数makeArray通过对函数makeline的调用,每次形成矩阵的一条斜线,直到完成整个矩阵。主函数main通过调用函数makeArray分别形成了1阶至10阶(由常量SIZE决定)的蛇形矩阵,并将其输出。
函数makeline的3个参数分别为起点的行号、列号及终点的行号。sing是行列号的增量。当从人上到右下方填数时,变量sing值为1,此时终点行号(row_end)大于起点行号(row_start);当从右下方到左上方填数时,变量sing值为-1,此时终点行号小于起点行号。(1)空缺处所填写内容的功能是对变量sing赋值,应填入“row_start<row_end1:-1”,或“((row_end-row_start)>0)*2-1”,或其他等价的代码形式。
函数makeline中的for循环是对斜线的元素进行赋值。(2)空缺处是循环的结束条件,所填入的内容是“(row_end-i)*sign>=0”。
函数makeArray通过多次调用makeline形成矩阵的各条斜线。顺序是从左下角填起,第奇数条斜线从右下方向左上方填写,第偶数条斜线从左上方向右下方填。对于第d条斜线,如果在主对角线左下(即 d<=n),其左上角的行号、列号分别为n+1-d和0,右下角的行号、列号分别为n和d-1。而(4)、(5)空缺处所填写的语句是处理主对角线左下的各条斜线,根据斜线方向和起止位置,应分别填入“n,d-1, n+1-d”和“n+1-d,0,n”。
如果在主对角线右上,其左上角的行号、列号分别为0和d-n-1,右下角的行号、列号分别为2*n -d+1和n。(6)、(7)空缺处所填写的语句是处理主对角线右上的各条斜线。根据斜线方向利起止位置,应分别填入“2*n-d+1,n,0”和“0,d-n-1,2*n-d+1”。
需要注意的是:函数makeArray中的n不是阶数N,而是N-1。函数makeArray通过调用函数makeline形成矩阵的2*n+1条斜线。而(3)空缺处是控制for循环的终值,其所填写的内容是“2*n+1”。

单项选择题
判断题