Description
定义一个Matrix类,用于存储一个矩阵。重载其+、*运算符,分别用于计算两个矩阵的和、乘积;重载其<<和>>运算符,用于输出和输入一个矩阵。要求当两个矩阵不能进行加法或乘法运算时,应该输出Error。
Input
输入第1行N>0,表示有N组测试用例,共2N个矩阵。
每组测试用例包括2个矩阵。每个矩阵首先输入行数、列数,之后是该矩阵的所有元素。
Output
每个测试用例产生一组输出。具体格式见样例。注意:当不能进行加法或乘法运算时,应输出Error。
Sample Input
3
2 2
1 1
1 1
2 2
2 2
2 2
1 1
1
1 2
2 2
1 1
1
2 2
2 2
2 2
Sample Output
Case 1:
3 3
3 3
4 4
4 4
Case 2:
Error
2 2
Case 3:
Error
Error
HINT
Append Code
append.cc,
int main()
{
int cases, i;
cin>>cases;
for (i = 0; i < cases; i++)
{
Matrix A, B, C, D;
cin>>A>>B;
C = A + B;
D = A * B;
cout<<"Case "<<i + 1<<":"<<endl;
cout<<C<<endl;
cout<<D;
}
return 0;
}
AC代码
#include <iostream>
using namespace std;
class Matrix
{
private:
int a[102][102];
int m,n,error;
public:
Matrix():m(0),n(0),error(0) {}
friend istream& operator>>(istream& is,Matrix& b)
{
is>>b.m>>b.n;
for(int i=0; i<b.m; i++)//这里别忘了是b.m
for(int j=0; j<b.n; j++)//这里别忘了是b.n
{
is>>b.a[i][j];
}
return is;
}
friend ostream& operator<<(ostream& os,const Matrix& b)
{
if(b.error)//这里别忘了是b.error
os<<"Error"<<endl;
else
{
for(int i=0; i<b.m; i++)//这里别忘了是b.m
for(int j=0; j<b.n; j++)//这里别忘了是b.n
{
if(j==b.n-1)
os<<b.a[i][j]<<endl;
else
os<<b.a[i][j]<<" ";
}
}
return os;
}
Matrix operator+(const Matrix& b)
{
Matrix t;
if(m!=b.m||n!=b.n)
t.error=1;
else
{
t.m=m;
t.n=n;
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
t.a[i][j]=a[i][j]+b.a[i][j];//从这里可以看出来哪个是原来的;
}
}
}
return t;
}
Matrix operator*(const Matrix& b)
{
Matrix t;
if(n!=b.m)
t.error=1;//这里必须是t.error,不能是error,因为,返回的是t,所以要改变t里面的error
else
{
t.m=m;
t.n=b.n;
for(int i=0; i<t.m; i++)
{
for(int j=0; j<t.n; j++)
{
int sum=0;
for(int k=0; k<t.m; k++)
{
sum+=a[i][k]*b.a[i][k];
}
t.a[i][j]=sum;
}
}
}
return t;
}
//进行乘法重载的第二种方法,推荐使用第二种方法;
Matrix operator*(const Matrix& b)
{
Matrix t;
t.m=m;
t.n=b.n;
if(n!=b.m)
t.error=1;
else
{
t.m=m;
t.n=b.n;
for(int i=0;i<m;i++)
{
for(int j=0;j<b.n;j++)
{
int sum=0;
for(int k=0;k<b.m;k++)
{
sum+=a[i][k]*b.a[k][j];//注意这里是乘号;
}
t.a[i][j]=sum;
}
}
}
return t;
}
};
int main()
{
int cases, i;
cin>>cases;
for (i = 0; i < cases; i++)
{
Matrix A, B, C, D;
cin>>A>>B;
C = A + B;
D = A * B;
cout<<"Case "<<i + 1<<":"<<endl;
cout<<C<<endl;
cout<<D;
}
return 0;
}
1、看好矩阵乘法是怎么运算的,记住。
2、细节问题看代码。
3、矩阵想乘模板
void matrixMultiply(T **a, T **b, T **c, int n,int p)
{
for (int i = 0; i < m; i++) //a的行数
{
for (int j = 0; j < p; j++) //b的列数
{
int sum=0;//在这里指明sum=0;
for (int k = 0; k < n; k++) //a的列数 //b的行数
{
sum += a[i][k] * b[k][j]; //注意这里是乘号;
}
a[i][j] = sum;
}
}
}
记住公共部分在最下面