C++ 当M是奇数时,若它在对角线中间,则在对角线交换后显示为零
如果M的值为3,并且如果mat[1][1]处的值为5, 然后将mat[1][1]与mat[1][1]互换后,应仍然为5, 但它却显示为0。 但是当M是偶数时,代码工作得很完美C++ 当M是奇数时,若它在对角线中间,则在对角线交换后显示为零,c++,arrays,matrix,diagonal,C++,Arrays,Matrix,Diagonal,如果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() { i
#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;
}
#包括
#定义m3
无效掉期(内部和a、内部和b)
{
a=a+b;
b=a-b;
a=a-b;
}
使用名称空间std;
int main()
{
int mat[M][M];
cout这背后的原因是在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
a=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
编辑:
正如@SidS所建议的,您可以使用库函数std::swap()
。如果要更正代码,只需使用以下命令更改swap():
void swap( int &a, int &b )
{
int tmp = a;
a = b;
b = tmp;
}
问题是,您正在为swap()
函数的两个参数传递相同的值,mat[1][1]
。您的swap()
函数不能正确处理这种情况,因为对a
的任何更改也会应用于b
,反之亦然
相反,请使用std::swap()
:
如何交换值?@SidS在这种情况下使用临时变量是一个更好的选择。我同意,但按引用传递不是问题。有必要按引用传递。@SidS是的。您必须按引用传递,但在没有临时变量的情况下不应这样做。@SidS,问题是因为值但根据要求,我们别无选择,只能通过引用。
void swap(int &a, int &b)
{
auto c = a;
a = b;
b = c;
}