我希望输出是
7 4 1 2 5 8 9 6 3
但结果是
1 4 7 2 5 8 3 6 9
。我该如何修复它,其背后的逻辑是什么,以便我也可以打印反向波形图案?
#include<stdio.h>
int main() {
int m;
printf("enter no. of rows of 1st matrix:");
scanf("%d", &m);
int n;
printf("enter no. of columns of 1st matrix:");
scanf("%d", &n);
int a[m][n];
printf("\n enter the elements of 1st matrix");
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
// wave print
for(int j = 0; j < n; j++) {
if(n % 2 == 0) {
for(int i = 0; i < m-1; i++){
printf("%d ", a[i][j]);
}
}
else {
for(int i = 0 - 1; i<=n-1; i++) {
printf("%d ", a[i][j]);
}
}
printf("\n");
}
return 0;
}
这个条件
if(n % 2 == 0)
没有意义。相反,您需要检查变量
j
。
if(j % 2 == 0)
如果
j
是偶数,则对应的列必须从下到上输出,否则从上到下输出。
此外,您只能使用一个内部 for 循环。
这是一个演示程序。
#include <stdio.h>
int main( void )
{
enum { m = 3, n = 3 };
int a[m][n] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
for (size_t i = 0; i < n; i++)
{
size_t even = i % 2 == 0, top = 0, bottom = m;
for (size_t j = even ? bottom : top; j != (even ? top : bottom ); )
{
printf( "%d ", even ? a[--j][i] : a[j++][i] );
}
}
putchar( '\n' );
}
程序输出为
7 4 1 2 5 8 9 6 3
首先,我将附加图像的移动转换为行
r
和列c
索引(r
,c
):
(2, 0) (1, 0) (0, 0)
(0, 1) (1, 1) (2, 1)
(2, 2) (1, 2) (0, 2)
观察到移动较慢的值是列索引 (
c
),因此它一定是从 0
到 n-1
的另一个循环。
然后我查看了行索引
r
并观察到 initial
值和方向 (summand
) 取决于我们处于偶数列还是奇数列 (c % 2
)。如果甚至那么initial = M-1
和summand = -1
。否则initial = 0
和summand = 1
。由于只有两组值,您不妨将它们从循环中取出,现在循环变得非常小:
#include <stdio.h>
#define LAST(r, c) ((r) == 0 && (c) == N - 1)
int main(void) {
enum { N = 3, M = 3 }; // inspired by @VladfromMoscow
int a[M][N] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// wave print
const int initial[] = {M-1, 0};
const int summand[] = {-1, 1};
const char terminator[] = " \n";
for(int c = 0; c < N; c++)
for(int r = initial[c%2]; r >= 0 && r < M; r += summand[c%2])
printf("%d%c", a[r][c], terminator[LAST(r, c)]);
return 0;
}
和输出:
7 4 1 2 5 8 9 6 3