【问题标题】:How to print main diagonal of matrix and how to fill matrix with random numbers如何打印矩阵的主对角线以及如何用随机数填充矩阵
【发布时间】:2016-11-02 01:22:50
【问题描述】:

我有矩阵a[i][j] 例如i = j = d(例如3)。如何用随机数填充它,然后我需要在矩阵上方和下方显示主对角线和另一个对角线。我发现的几乎所有示例都是针对 c++ 的,但我需要在 C 中完成。

我想过cycle,但我不知道如何使用它。根据我的想法,它应该指向a[0][0]i = 0i++i < dj=0j++j < d。这将是主对角线。另一个是i = di--j=0j++。因此它将采用两条对角线,然后通过printf 打印它

应该是这样的

1  6  11 16  - main diagonal

13 10 7  4   - additional diagonal

1  2   3   4

5  6   7   8

9  10  11  12  - random matrix

13 14  15  16

1  6  11  16 - main diagonal

13 10 7   4  - additional diagonal

【问题讨论】:

  • 使用循环和 rand?
  • 这些对角线有实际名称,您应该使用它们。 "Main diagonal" 很好,但我从未听说过您提到的另一个对角线称为“附加对角线”。次对角线,次对角线,....

标签: c matrix random cycle


【解决方案1】:

这是一个用随机数填充方阵,然后将主对角线和辅助对角线存储在两个数组中的版本。这两个数组在一个循环中同时填充。然后程序显示三个数组中每一个的内容。

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

int main(void)
{
    size_t d = 4;
    int a[d][d];
    int primary[d], secondary[d];
    size_t i, j;

    srand(time(NULL));

    /* Fill array with random numbers */
    for (i = 0; i < d; i++)
        for (j = 0; j < d; j++)
            a[i][j] = rand() % 100;

    /* Store diagonals */
    for (i = 0; i < d; i++) {
        primary[i] = a[i][i];
        secondary[i] = a[d - (i + 1)][i];
        }

    /* Display arrays */
    puts("2d Array:");
    for (i = 0; i < d; i++) {
        for (j = 0; j < d; j++) {
            printf("%-5d", a[i][j]);
        }
        putchar('\n');
    }
    putchar('\n');

    puts("Primary Diagonal:");
    for (i = 0; i < d; i++)
        printf("%-5d", primary[i]);
    printf("\n\n");

    puts("Secondary Diagonal:");
    for (i = 0; i < d; i++)
        printf("%-5d", secondary[i]);
    printf("\n\n");

    return 0;
}

这是一个示例运行:

2d Array:
65   59   91   10   
17   25   19   44   
94   77   68   21   
91   76   18   19   

Primary Diagonal:
65   25   68   19   

Secondary Diagonal:
91   77   19   10   

【讨论】:

  • 这个有效,但只有当我在 sizet_t d =4 之后添加#define d 4 时
  • @PAPAmidNIHGT-- 我不明白为什么会这样......我只是从上面的代码中复制并测试了它,它编译(gcc file.c -std=c99 -Wall -Wextra -pedantic) 在我的机器上没有错误或警告,并且运行良好。
【解决方案2】:

如果我错了,请纠正我,但您希望打印具有一定行数/列数的方阵的对角线?

// You could put this code in main() or another function
int z = 3; /* z here represents the number of rows/cols in the square matrix
int matrix[z][z];
int i = 0, j = 0;
srand(time(0)); /* Part of stdlib.h and time.h; this will suffice for pur purposes */
// Fix matrix with random values
for (; i < z; ++i) {
  for (j = 0; j < z; ++i) {
    matrix[i][j] = rand() % 100; /* Part of stdlib.h; use % with rand to keep it within a certain range */
  }
}
// Print matrix
for (i = 0; i < z; ++i) {
  for (j = 0; j < z; ++j) {
    printf("%i", matrix[i][j]);
  }
  printf("\n");
// Print top-left to bottom right diagonal
for (i = 0; i < z; ++i) {
  printf("%i", matrix[i][i]); /* Part of stdio.h */
}
printf("\n");
// Print other diagonal
for (i = z - 1; i >= 0; --i) {
  printf("%i", matrix[i][z - (i + 1)]);
}

为了解释它是如何工作的,它首先声明了一些变量。我选择 z 来表示列数和行数,但名称并不重要。 (从技术上讲,z 可以是 const,这可能是个好主意。)矩阵被声明为int matrix[z][z];这仅仅意味着矩阵由 z 行和 z 列组成。变量 i 和 j 的最后声明用于循环变量。

接下来要做的是使用srand() 为随机数生成器播种。 srand()rand() 都在头文件 stdlib.h 中定义。种子不是自动选择的;在这种情况下,我们使用来自 time.h 的time() 来播种它。然后,程序循环遍历矩阵并使用标准库函数rand()为其分配一个随机值。 Rand 返回一个从 0 到 RAND_MAX 的值;使用模数 (%) 来限制范围。

其他所有内容都应该在 cmets 中进行解释或不言自明,但请注意 printf() 的第一个参数是一个格式字符串(这里,%i 代表一个整数),它指定如何使用附加参数给它。

【讨论】:

  • 请查看rand()的接口;它与您使用它的方式不匹配。
  • 对不起;会解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多