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

Если значение M равно 3, а если значение в mat [1] [1] равно 5,
затем после замены мата [1] [1] на мата [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;
}

-1

Решение

Проблема в том, что вы передаете одно и то же значение, 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;
}
1

Другие решения

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

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

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

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

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

Когда вы делаете это, после операции M [1] [1] становится 10. Потому что & 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. Потому что & 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. Потому что & b являются псевдонимами M [1] [1], a и b также становятся 0.

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

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector