проверить, если матрица симметрична, и я всегда получаю один и тот же результат - PullRequest
0 голосов
/ 16 января 2019

Я написал функцию, которая проверяет, является ли матрица симметричной. Если это так, он вернет 1, иначе 0. Всегда возвращает ноль. Я пытался выяснить, где ошибка, но мне все кажется правильным.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#define max 100

int Symmetrie (int matrix[][max]) {
  int i,j;
  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      if(matrix[i][j] != matrix[j][i]) {
        return 0;
      }
    }
  }
  return 1;
}

int main() {
  int x;
  int  square_matrix[][max]={{1,2,3,4}
    ,{2,2,5,6}
    ,{3,5,3,7}
    ,{4,6,7,4}
  };
  x= Symmetrie(square_matrix[4][4]);
  if(x==1) {
    printf("1");
  } else {
    printf("0");
  }
  return 0;
}

Функция должна возвращать 1, но возвращает ноль. Чего мне не хватает?

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Другие ответы уже показывают проблему, но я хотел бы отметить, что, используя синтаксис VLA, можно передать фактический размер массива функции. Также стоит отметить, что количество циклов может быть ограничено только одной половиной «матрицы»:

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

bool is_symmetric(size_t n, int matrix[n][n])
{
  for(size_t i = 0; i < n; ++i) {
    for(size_t j = 0; j < i; ++j) {
      //              ^^^^^
      if (matrix[i][j] != matrix[j][i]) {
        return false;
      }
    }
  }
  return true;
}

int main(void) {
  int  square_matrix[][4] = {
     {1,2,3,4}
    ,{2,2,5,6}
    ,{3,5,3,7}
    ,{4,6,7,4}
  };

  if( is_symmetric(4, square_matrix) ) {
    puts("The matrix is symmetric");
  } else {
    puts("The matrix is not symmetric");
  }
  return 0;
}
0 голосов
/ 16 января 2019

Как говорили другие, вы должны изменить:

x = Symmetrie(square_matrix[4][4]);

к этому:

x = Symmetrie(square_matrix);

Но , я хотел бы добавить и сказать, что вы могли бы легко найти его самостоятельно, просто добавив мелкий шрифт.

Простое printf("%d =?= %d", matrix[i][j], matrix[j][i]) прямо над if показало бы, что все цифры являются бессмысленными.

Или , как предложила @DanielH, некоторые компиляторы рассматривают это как предупреждение, и вы не должны их игнорировать. Для других компиляторов добавление -Wall в качестве флага компиляции также помогло бы вам это уловить.

0 голосов
/ 16 января 2019

Измените это:

x= Symmetrie(square_matrix[4][4]);

на это:

x = Symmetrie(square_matrix);

, поскольку ваш метод ожидает всю матрицу в качестве параметра, а не только элемент.

square_matrix[4][4] - это отдельный элемент матрицы, то есть элемент в 5-й строке и 5-м столбце.Конечно, это вызывает Неопределенное поведение (UB) , поскольку ваша матрица имеет 4 строки.

Что еще более важно, не игнорируйте сгенерированные предупреждения.Например, в GCC вы получите что-то вроде этого:

prog.c: In function 'main':
prog.c:24:32: warning: passing argument 1 of 'Symmetrie' makes pointer from integer without a cast [-Wint-conversion]
   24 |   x= Symmetrie(square_matrix[4][4]);
      |                ~~~~~~~~~~~~~~~~^~~
      |                                |
      |                                int
prog.c:5:20: note: expected 'int (*)[100]' but argument is of type 'int'
    5 | int Symmetrie (int matrix[][max]) {
      |                ~~~~^~~~~~~~~~~~~

, как вы можете видеть в Live Demo .

0 голосов
/ 16 января 2019

Изменить ваш звонок

x= Symmetrie(square_matrix[4][4]);

до

x= Symmetrie(&square_matrix[0][0]);

0 голосов
/ 16 января 2019

Нижеследующее утверждение должно быть изменено

x= Symmetrie(square_matrix[4][4]);

до

x= Symmetrie(square_matrix);

square_matrix[4][4] - это всего лишь один элемент по указанным индексам. Вместо этого передайте адрес.

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