如何用C语言制作Simmetric矩阵

时间:2018-12-05 17:04:31

标签: c matrix

对于一个学校项目,要求的功能是在[1,100]中使用随机数构建对称矩阵,我知道如何构建矩阵以及如何使用C中的rand()函数来实现,但是我不是能够做到对称的代码,这是我的代码:

int size, num;
fflush(stdin);
system("cls");
printf("Build a simmetric matrix using random numbers\n\n");
printf("Insert matrix size: ");
scanf("%d", &size);
int matrix[size-1][size-1];
for(int i=0;i<size;i++){
    for(int j=0;j<size;j++){
        num = rand()%100+1;
        matrix[i][j]=num;
        matrix[j][i]=num;
    }
}
for(int i=0;i<size;i++){
    printf("\n\t");
    for(int j=0;j<size;j++){
        printf("%03d ", matrix[i][j]);
    }
}
printf("\n\nPress Enter to continue...");
system("pause >nul /nobreak");

它会根据要求构建一个正方形矩阵,但它不是对称的。

对于能帮助我完成代码或为我指明正确方向的任何帮助,我将深表感谢。

3 个答案:

答案 0 :(得分:0)

两个错误:

    矩阵大小的
  • 一一错误:访问将移到错误的位置
  • 您覆盖所有行中的所有列,而不是仅填充一个三角形

更正的代码:

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

int main(int argc, char **argv) {
  (void) argc;
  (void) argv;

  int size;

  printf("Build a symmetric matrix using random numbers\n\n");
  printf("Insert matrix size: ");
  scanf("%d", &size);

  /* ensure different result every time program is executed */ 
  srand(time(NULL));

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

  for (int i = 0;   i < size; i++) {
    printf("\n\t");
    for (int j = 0; j < size; j++) {
      printf("%03d ", matrix[i][j]);
    }
  }
  printf("\n");

  return(0);
}

示例输出:

Build a symmetric matrix using random numbers

Insert matrix size: 5

        084 087 016 087 063 
        087 078 094 093 028 
        016 094 036 050 091 
        087 093 050 022 060 
        063 028 091 060 064 

答案 1 :(得分:0)

由于没有正确访问矩阵索引,因此没有得到对称矩阵。让我详细解释一下。

您使用的矩阵的大小为size-1 x size-1,因此,如果size=5所分配的矩阵的大小为4x4,那么您实际上只有16个元素矩阵。 (您实际上需要25个元素)。

但是在遍历矩阵以进行填充时,您正在访问类似[4,4]的索引,这意味着(在逻辑上)矩阵应包含25个元素。 (但没有)。

因此,有两种方法可以消除此错误:

  • 您可以将for循环更改为for(int i=0;i<size-1;i++),以免意外访问元素。
  • 您可以将数组的大小增加到size x size,而不是size-1 x size-1

最终代码看起来像这样(我只发布了核心部分):

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

作为一种优化,您可以通过从j本身开始i的内循环来避免重写值,这样矩阵上三角中的值是由随机数生成的底部的三角形值将由上方三角形中对应的对称单元格中的值填充。

我认为您提出这个问题的目的是学习和变得更好,所以我在回答时多了一些额外的评论。我希望这可以帮到你。 :)

答案 2 :(得分:-1)

第7行: 使用

int matrix[size][size];