2013-05-26 4 views
2

У меня есть матричная программа, которая до сих пор принимает входной файл и выражает числа в матрицах. Я также написал функцию, чтобы найти ее транспонирование, но я не могу понять, как сделать симметричную.C Matrix Program

я должен принимать только 3 входных параметров (MainMatrix [Макс] [Макс] MainTranspose [Макс] [Макс] и размер)

Она должна возвращать -1, если оно не является симметричным и 0 если он является.

Моя программа показывает все правильно, за исключением 1, которая говорит, что она не симметрична, когда ей ДОЛЖНО быть.

Я надеюсь, что один из вас, ребята, поможет мне в этом.

int Symmetry (int mainmatrix[max][max], int maintranspose[max][max], int size) { 
    double thesqrtSize = sqrt((double)Size); 
    double fract = thesqrtSize - floor(thesqrtSize); 
    if(fract > 0.0001) 
     return -1; 
    int isqrtSize = (int)thesqrtSize; 
    int i, j; 
    for(i=0;i<isqrtSize;i++){ 
     for(j=0;j<isqrtSize;j++) { 
      if(mainmatrix[i][j]!=maintranspose[i][j]) { 
       return -1; 
      } 
     } 
    } 
    return 0; 
} 
+6

Показать нас КОД –

+0

Положить немного усилий, добавить код .. –

+0

Не может помочь вам, если у нас нет кода и неудачного тестового примера. –

ответ

0

Номера с плавающей запятой, как известно, подвержены ошибкам округления. И если результат sqrt немного ниже ожидаемого результата, вызов floor сделает его (почти) 1. Попробуйте добавить 1 к размеру, прежде чем принимать квадратный корень. Это безопасно и гарантирует правильный результат при условии, что размер является квадратным числом.

Предлагаемое изменение:

double thesqrtSize = sqrt((double)(Size+1)); 

Очевидно, это означает, что ваш метод использования floor для проверки прямоугольности не будет работать. Я предлагаю кастинг в int, возведение в квадрат и сравнение с оригинальным размером, чтобы увидеть, одинаковы ли они.

+0

В какой строке вы говорите, что я должен добавить? –

+0

Для достаточно малых размеров, если 'Size' является квадратом, вычисленный квадратный корень будет точным во всех обычных аппаратных средствах. –

+0

Wow, который работал на тот, который показывал неправильный вывод, но у меня есть одно число (14) в матрице, и транспонирование этого тоже 14, но это не показывает его симметричность. Я предполагаю, что это потому, что матрица = транспонировать. –

0

Функция симметрии не нуждается в транспонированной матрице. Вы можете найти ответ без него:

int Symmetry (int mainmatrix[max][max], int size) { 
    int isqrtSize= (int)sqrt((double)size); 
    if(isqrtSize*isqrtSize!=size) 
     return -1; 
    int i, j; 
    for(i=0;i<isqrtSize;i++){ 
     for(j=0;j<isqrtSize;j++) { 
      if(mainmatrix[i][j]!=mainmatrix[j][i]) { 
       return -1; 
      } 
     } 
    } 
    return 0; 
} 

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

  • вы объявляете матрицу с максимальным размером
  • Вы заполняете верхний левый угол матрицы и проверить для симметричности
  • symmetry метода получает всю матрицу и попытайтесь выяснить размеры и проверить симметрию.

Теперь, пожалуйста, см. THIS CODE. Для этого я написал простую основную функцию. Как видите, это работает. Поэтому проблема должна заключаться в методе, который генерирует матрицу транспонирования или заданный размер в вашей программе.

Другая проблема с алгоритмом: вы не можете найти размеры из числа элементов. Матрица 8 * 2 содержит 16 элементов, поэтому метод будет видеть и обрабатывать ее, как будто это была 4 * 4-матрица. Если таких случаев нет, вы можете использовать приведенный выше код.

Но: Когда вы вызываете функцию симметрии, вы вычисляете размер как size=rows*columns, поэтому вы должны знать размеры матрицы. Это означает, что вы можете просто передать их своей функции. В этом случае вам не нужно выполнять вычисления sqrt и других значений с плавающей запятой, вам нужно только проверить входные параметры, если они равны. При этом функция будет выглядеть так:

int Symmetry (int mainmatrix[max][max], int rows, int cols) { 
    if(rows!=cols) 
     return -1; 
    int i, j; 
    for(i=0;i<rows;i++){ 
     for(j=0;j<cols;j++) { 
      if(mainmatrix[i][j]!=mainmatrix[j][i]) { 
       return -1; 
      } 
     } 
    } 
    return 0; 
} 
+0

Это не имеет никакого значения, поскольку вы можете сравнить либо основное, либо транспозированное (просто переключите переменные i и j) , Я не уверен, почему в одной из матриц с номером 14 говорится: «Не симметрично», хотя это нужно? –

+0

@DavisApanasova Я редактировал код. Эта проверка для идеальных квадратов также должна работать, если правильный вход «размер». – gkovacs90

+0

теперь другая матрица говорит, что она не симметрична, когда она есть. :( Существует что-то очень плохое, но не может понять, в чем причина –