Outh_Mane Ответов: 3

Симметричная / антисимметричная матрица


Эй , ребята, я хочу написать функцию (одну функцию), которая говорит , является ли матрица nxn симметричной или антисимметричной, у меня были проблемы с "возвращением". это было бы легко, если бы она была в 2 разных функциях, но в данном случае это всего лишь одна . не могли бы вы мне помочь ? спасибо. ( Си )

Что я уже пробовал:

int vrf_sym_anti(const int  **M,const int  n);
int vrf_sym_anti(const int  **M,const int  n)
{
    int i,j,c=0,sym=0,antisym=0;
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            if(M[i][j]!=(M[j][i] || -M[j][i]))
               c++;
               else
                if(M[i][j]==M[j][i])
                sym++;
                else
                    if((M[i][j]==-M[j][i]) && M[i][i]==0)
                    antisym++;
        }
 if(c!=0)
    return 0; ///Ni sym ni antsym
 if(sym==(pow(n,2)-n)/2)
    return 1; ///sym
 if(antisym==(pow(n,2)+2)/2)
    return -1; ///antiym
}

OriginalGriff

Какая проблема?

И сделай себе одолжение: разберись со своим отступом!

Outh_Mane

Это не работает , это всегда показывает, что это не сим или антисим

OriginalGriff

И что же?
Что вы сделали, чтобы выяснить, почему?

Outh_Mane

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

3 Ответов

Рейтинг:
25

Richard MacCutchan

У вас есть незавершенное if предложение в конце, которое компилятору не нравится:

 if(c!=0)
    return 0; ///Ni sym ni antsym
 if(sym==(pow(n,2)-n)/2)
    return 1; ///sym
 if(antisym==(pow(n,2)+2)/2)
    return -1; ///antiym
// OK, now what to do if antisym is not equal to that expression?
// you need a final return statement here
// or better still use if ... else if ... else if ... else ...


Рейтинг:
20

OriginalGriff

Это всего лишь предположение, но .....
Заменить этот:

if(M[i][j]!=(M[j][i] || -M[j][i]))
С этим:
if(M[i][j] != M[j][i] && M[i][j] != -M[j][i]))
когда вы или два целых числа используете || use, рассматривайте их как логические значения: so
(M[j][i] || -M[j][i])
Вернет true или false - и, вероятно, не соответствует содержимому вашей ячейки.


Рейтинг:
2

Outh_Mane

я сделал это и это работает

инт vrf_sym_anti(константный тип int **м,константный инт Н);
инт vrf_sym_anti(константный тип int **м,константный инт Н)
{
int i,j,sym=0,antisym=0;
для(i=0; i<n; i++)
для(j=0; j<n; j++)
{
если(M[i][j]==M[j][i])
сим++;
еще
если((м[я][Дж]==-м&амп[Дж][я]);&ампер;(м[я][Я]==0))
антисим++;
}
если(sym==n*n)
return 1; ///sym
еще
если(антисим==(n*n)-n)
return -1; ///antiym
еще
return 0; ///Ni sym ni antsym
}