矩阵有什么问题?

时间:2017-11-23 15:00:47

标签: c matrix

这段代码有什么问题? 我的任务是:创建一个大小为9x9的整数的矩形矩阵。用随机数填充矩阵。相对于垂直轴对称显示主对角线和侧对角线。预期结果的示例如下:matrix

Matrix :

20      20      76      65      93      76      16      2       85

6       87      78      43      48      81      71      90      38

10      12      35      77      48      88      24      53      7 

12      66      51      35      74      7       30      22      49

58      14      71      46      68      68      10      81      51

98      16      74      47      64      25      17      30      37

2       44      44      74      34      54      86      73      28

85      4       57      75      18      28      51      76      2 

35      17      53      76      15      91      83      85      72

The main and side diagonal:

85      20      76      65      93      76      16      2       20

6       90      78      43      48      81      71      87      38

10      12      24      77      48      88      35      53      7 

12      66      51      7       74      35      30      22      49

58      14      71      46      68      68      10      81      51

98      16      74      25      64      47      17      30      37

2       44      86      74      34      54      44      73      28

85      76      57      75      18      29      51      4       2 

72      17      53      76      15      91      83      85      35

但实际上程序只打印带有随机数的主矩阵,然后停止。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main()
{
    int a = 9;
    int matrix[a][a];
    int temp;
    int i, j, n;
    srand((unsigned)time(NULL));

    printf("Matrix : \n\n");
    for (i = 0; i < a; ++i) {
        for (j = 0; j < a; ++j) {
            matrix[i][j] = rand() % 100;
            printf("%d\t", matrix[i][j]);
        }
        printf("\n\n");
    }
    printf("The main and side diagonal:\n\n");
    for (i = 0; i < a; ++i) {
        temp = matrix[i][i];
        matrix[i][i] = matrix[i][(a - 1) - i];
        matrix[i][(a - 1) - i] = temp;
    }
    for (i = 0; i < a; ++i) {
        for (j = 0; j < a; ++j) {
            printf("Result:", matrix[i][j]);
            printf("\n\n\n");
            system("pause");
            return 0;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

你回到了你不应该去的地方。 (在计算的中间)。您应该在最终处理for循环后返回。

for (i = 0; i < a; ++i) {
        for (j = 0; j < a; ++j) {
            printf("Result:", matrix[i][j]); <--- Not printing element
            printf("\n\n\n");
            system("pause");
            return 0; <-----
        }
    }

应该是

for (i = 0; i < a; ++i) {
        for (j = 0; j < a; ++j) {
            printf("Result: %d ", matrix[i][j]); <----You forgot the
                                                //format specifier
            printf("\n\n\n");
            system("pause");

        }
    }
  return 0;<-----

当缩进是这样的时候,可读性受到了阻碍。你实现了错误的逻辑。

  • OP要求它在打印后停止&#34;结果&#34;那是因为你忘了在代码中放置格式说明符。这就是为什么没有印刷任何元素的原因。

Op想要相对于垂直轴对称地打印主对角线和侧对角线。

现在这就是打印部分的一切。

现在我们必须找到一种方法让我们区分哪一个是对角元素,哪一个不是。

令人惊讶的是,正在编写之前的交换逻辑的人应该知道答案。 (虽然目前还不清楚为什么OP换掉了它。)

现在所有元素matrix[p][q]都来自p=qp+q=a-1的对角线。 (请注意,matrix是一个方阵)。

但OP意味着打印矩阵

for (i = 0; i < a; ++i) {
        if( i == 0) printf("The main and side diagonal : \n");
        for (j = 0; j < a; ++j) {
            printf("%d\t", matrix[i][j]);
          }
        printf("\n");
    }
}

答案 1 :(得分:0)

使用功能。你打印矩阵两次;你应该有一个函数来打印你调用两次的矩阵。

使用这样的功能,您不会在代码的尾端出错。例如,您可以使用:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static void print_matrix(const char *tag, int size, int matrix[size][size])
{
    printf("%s (%dx%d):\n\n", tag, size, size);
    for (int i = 0; i < size; ++i)
    {
        const char *pad = "";
        for (int j = 0; j < size; ++j)
        {
            printf("%s%-2d", pad, matrix[i][j]);
            pad = "      ";
        }
        printf("\n\n");
    }
}

int main(int argc, char **argv)
{
    unsigned seed = time(0);
    int a = 9;
    int matrix[a][a];

    if (argc == 2)
        seed = atoi(argv[1]);
    srand(seed);
    printf("Seed: %u\n", seed);

    for (int i = 0; i < a; ++i)
    {
        for (int j = 0; j < a; ++j)
            matrix[i][j] = rand() % 100;
    }

    print_matrix("Matrix", a, matrix);

    for (int i = 0, j = a - 1; i < a; ++i, --j)
    {
        int temp = matrix[i][i];
        matrix[i][i] = matrix[i][j];
        matrix[i][j] = temp;
    }

    print_matrix("The main and side diagonal", a, matrix);

    return 0;
}

代码报告它使用的种子;这允许您通过指定要用作命令行参数的种子来重现任何运行。

示例输出:

Seed: 1511470282
Matrix (9x9):

11      39      3       88      98      63      75      81      76

93      9       60      22      45      50      46      58      65

13      99      25      43      14      57      44      70      65

30      57      55      0       37      84      47      49      40

60      28      46      1       96      78      33      20      9 

93      61      11      38      84      16      91      26      15

43      85      66      72      85      39      96      45      45

45      25      33      3       78      90      61      65      62

88      84      56      34      74      8       78      57      74

The main and side diagonal (9x9):

76      39      3       88      98      63      75      81      11

93      58      60      22      45      50      46      9       65

13      99      44      43      14      57      25      70      65

30      57      55      84      37      0       47      49      40

60      28      46      1       96      78      33      20      9 

93      61      11      16      84      38      91      26      15

43      85      96      72      85      39      66      45      45

45      65      33      3       78      90      61      25      62

74      84      56      34      74      8       78      57      88

交换过程,在不明显的情况下,交换第一行的第一个和最后一个元素,第二行和最后一个但第二行中的一个元素,依此类推,形成交换元素的X