以波形打印矩阵的数字

问题描述 投票:0回答:2

我希望输出是

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;
}
c multidimensional-array nested-loops
2个回答
1
投票

这个条件

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

0
投票

首先,我将附加图像的移动转换为行

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
© www.soinside.com 2019 - 2024. All rights reserved.