Если значение 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;
}
Проблема в том, что вы передаете одно и то же значение, 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;
}
Причина этого заключается в том, что вы передаете значения по ссылке в функции 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;
}