强悍的矩阵运算来了

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;  
        }  
    }  
}  
  

记住公共部分在最下面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值