Как сделать симметричную матрицу на языке Си - PullRequest
0 голосов
/ 05 декабря 2018

Для школьного проекта запрошенные функции - это построить симметричную матрицу, используя случайное число в [1100], я знаю, как построить матрицу и как это сделать, используя функцию rand () в C, однако я небудучи в состоянии сделать симметричный, это мой код:

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 голосов
/ 05 декабря 2018

Две ошибки:

  • непостоянная ошибка в размере матрицы: доступ будет идти не туда
  • вы перезаписываете все столбцы во всех строках, вместо того, чтобы заполнять толькотреугольник

Исправленный код:

#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 
0 голосов
/ 05 декабря 2018

Вы не получаете симметричную матрицу, потому что вы неправильно обращаетесь к индексу матрицы.Позвольте мне объяснить немного подробнее.

Используемая вами матрица имеет размер 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, так чтозначения в верхнем треугольнике матрицы генерируются случайным числом, а нижние значения треугольника заполняются значением в соответствующей симметричной ячейке в верхнем треугольнике.

Я думаю, что вы хотите задать вопрос, чтобы узнатьи поправиться, поэтому я ответил подробно с некоторыми дополнительными комментариями.Я надеюсь, что это было полезно.:)

0 голосов
/ 05 декабря 2018

Строка № 7: использовать

int matrix[size][size];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...