как правильно заполнить матрицу nxn

Я пытался создать квадратную матрицу 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);
}
# arrays for-loop linear-algebra
Источник
  • 6
    int array [size][size]; это массив фиксированного размера. Он не меняет размер только потому, что вы позже измените значение переменной size Либо переместите эту строку, чтобы она находилась после scanf либо, что еще лучше, используйте динамическое размещение.
  • 0
    Вы не можете просто использовать синтаксис array [i] [j] для printf и scanf, потому что компилятор не знает, где начинается следующая строка
  • 1
    @Edmund: если вы используете компилятор, поддерживающий C99, C11 или C18 (и вы должны использовать такой компилятор - не так много веских причин использовать что-то, что поддерживает только C90, которому 30 лет в качестве стандарта! ), и если код фиксирован для определения array после size , то вы можете отлично использовать нотацию array[i][j] Если вы хотите использовать malloc() чтобы избежать переполнения стека, вы можете написать int (*array)[size] = malloc(size * size * sizeof(array[0][0])); (и убедитесь, что это было успешно) и по-прежнему используйте нотацию array[i][j] Это указатель на VLA.
Codelisting
за 0 против
#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);
}
  • 1
    Вы должны объяснить, что вы изменили. Вы должны проверить, что scanf() по размеру работает, и что число, указанное пользователем, является правдоподобным (строго положительным и не слишком большим - возможно, до 1024). Поскольку вы используете malloc() , вам не нужно беспокоиться о переполнении стека, тогда как с VLA вам нужно беспокоиться об этом. Вы должны проверить, что scanf() в цикле работают правильно; вам не нужно проверять числа. При печати матрицы необходимо ставить пробел между числами в каждой строке. (Мое личное bête noire: вам не нужен пробел перед печатными символами новой строки.)
  • 1
    Вам следует подумать об использовании for (int i = 0; i < size; i++) для элементов управления циклом. Тогда вам не нужно объявлять i (или j ) в верхней части функции.
Codelisting
Популярные категории
На заметку программисту