【问题标题】:How to properly fill an NxN matrix如何正确填充 NxN 矩阵
【发布时间】:2021-08-21 05:00:25
【问题描述】:

我一直在尝试创建一个 NxN 方阵(方阵的大小由用户确定),但似乎遇到了问题。显示的矩阵实际上是一个对称矩阵,这不是我想要的,因为我希望能够让每个值都保存一个唯一的整数。任何帮助是极大的赞赏。这是我的代码:

#include <stdio.h>

int main()
{
    int i;
    int j;
    int size = 1;
    int array [size][size];
    
    printf ("Enter the size you would like for the nxn matrix: ");
    scanf ("%d", &size);
    
    printf ("Now enter elements into the matrix. \n");
    
    for (i = 0; i < size; i++)
    {
       for (j = 0; j < size; j++)
       {
          printf ("[%d][%d] = ", i, j);
          scanf ("%d", &array [i][j]);
       }
    }
    printf ("------------------------\n\n");
    
    printf ("the matrix is: \n\n");
    
    for (i = 0; i < size; i++)
    {
       for (j = 0; j < size; j++)
       {
          printf ("  %d  ", array [i][j]);
       }
       printf ("\n");
    }
    return (0);
}

【问题讨论】:

  • int array [size][size]; 是一个固定大小的数组。它不会因为您稍后更改 size 变量的值而更改大小。要么将该行移到scanf 之后,要么最好仍然使用动态分配。
  • 不能只对 printf 和 scanf 使用 array[i][j] 语法,因为编译器不知道下一行从哪里开始
  • @Edmund:如果您使用支持 C99、C11 或 C18 的编译器(并且您应该使用这样的编译器 - 没有太多充分的理由使用仅支持 C90 的编译器,这标准是 30 岁!),并且如果在扫描和验证 size 之后代码被固定为定义 array,那么您可以完美地使用 array[i][j] 表示法。如果你想使用malloc() 来避免堆栈溢出,你可以写int (*array)[size] = malloc(size * size * sizeof(array[0][0]));(并检查它是否成功)并且仍然使用array[i][j] 表示法。这是一个指向 VLA 的指针。

标签: arrays c for-loop linear-algebra


【解决方案1】:
#include <stdio.h>  
#include <stdlib.h>

int main()
{
    // Create variables
    int i, j, size;
    
    // Create 2D array
    printf ("Enter the size you would like for the nxn matrix: ");
    scanf ("%d", &size);
    int *array = (int *)malloc(size * size * sizeof(int)); 
    
    // Fill 2D array with values
    printf ("Now enter elements into the matrix. \n");
    for (i = 0; i < size; i++)
    {
       for (j = 0; j < size; j++)
       {
          printf ("[%d][%d] = ", i, j);
          scanf ("%d", &array[i * size + j]);
       }
    }
    printf ("------------------------\n\n");
    
    // Display values of 2D array
    printf ("the matrix is: \n\n");
    for (i = 0; i < size; i++)
    {
       for (j = 0; j < size; j++)
       {
          printf ("%d", array[i * size + j]);
       }
       printf ("\n");
    }
    
    free(array);
    return (0);
}

【讨论】:

  • 您应该解释您所做的更改。您应该检查大小上的scanf() 是否有效,并且用户给出的数字是合理的(严格来说是正数,而且不要太大——可能高达 1024)。由于您使用malloc(),因此您不必担心堆栈溢出,而使用 VLA,您必须担心这一点。您应该检查循环中的scanf() 操作是否正常工作;您不必验证这些数字。打印矩阵时,您需要在每行的数字之间放置一些空格。 (我个人的喜好:在打印的换行符之前不需要空格。)
  • 您应该考虑使用for (int i = 0; i &lt; size; i++) 进行循环控制。那么就不需要在函数顶部声明i(或j)了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多