Когда M нечетное число и если оно находится в середине диагонали, оно показывает ноль после диагонального обмена - PullRequest
0 голосов
/ 25 декабря 2018

Если значение M равно 3, а если значение в mat [1] [1] равно 5, то после замены mat [1] [1] на mat [1] [1] должно быть еще 5, новместо этого он показывает 0. Но когда M четное число, код работает идеально.

#include<iostream>
#define M 3
void swap( int &a, int &b )
{
        a=a+b;
        b=a-b;
        a=a-b;
}

using namespace std;
int main()
{
    int mat[M][M];
    cout<<"Enter "<<M<<"x"<<M<<" matrix"<<endl;
    for( int i=0; i<M; i++ )
        for( int j=0; j<M; j++ )
            cin>>mat[i][j];


    cout<<endl<<"The real matrix"<<endl;
    for( int i=0; i<M; i++ )
        {
            for( int j=0; j<M; j++ )
            {
                cout<<mat[i][j]<<"\t";
            }
            cout<<endl;
        }


    for( int i=0; i<M; i++ )
    {
        swap( mat[i][i], mat[i][M-i-1] );
    }


    cout<<endl<<"The matrix after diagonal interchange "<<endl;
    for( int i=0; i<M; i++ )
        {
            for( int j=0; j<M; j++ )
            {
                cout<<mat[i][j]<<"\t";
            }
            cout<<endl;
        }

    return 0;
}

Ответы [ 2 ]

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

Проблема в том, что вы передаете одно и то же значение, mat[1][1] для обоих параметров вашей функции swap().Ваша функция swap() не обрабатывает этот случай правильно, поскольку любое изменение a также применяется к b и наоборот.

Вместо этого используйте std::swap():

#include <utility>

...
std::swap(mat[i][i], mat[i][M-i-1]);

Или, если вы настаиваете на прокрутке самостоятельно, используйте временную переменную:

void swap(int &a, int &b)
{
    auto c = a;
    a = b;
    b = c;
}
0 голосов
/ 25 декабря 2018

Причина этого в том, что вы передаете значения по ссылке в функции swap ().

Предположим, что M [1] [1] = 5.

Когда вы передаете M [1] [1] в swap (), они не скопированы в a и b.Вместо этого a и b становятся псевдонимом для M [1] [1].

Давайте попробуем понять, что происходит, шаг за шагом:

a=a+b; // equivalent to M[1][1] = M[1][1] + M[1][1];

Когда вы сделаете это, послеоперации, M [1] [1] становится 10. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 10.

b=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];

Когда вы делаете это, M [1] [1] становится 0. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 0.

a=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];

Когда вы это сделаете, M [1] [1] становится 0. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 0.

Редактировать:

Как предложено @SidS, вы можете использовать библиотечную функцию std::swap().Если вы хотите исправить свой код, просто измените swap () следующим образом:

void swap( int &a, int &b )
{
        int tmp = a;
        a = b;
        b = tmp;
}
...