矩阵运算:加减乘法实现与代码填空
矩阵运算:加减乘法实现与代码填空
本题是代码填空题,按要求补充给出代码的空白即可通过题目。
#include<bits/stdc++.h>
using namespace std;
const int N = 25;
int tt, p;
struct Matrix{
int n, m;
int a[N][N];
Matrix operator+(Matrix &b){
Matrix t;
memset(t.a, 0, sizeof t.a);
if(n != b.n || m != b.m){
t.n = t.m = -1;
return t;
}
t.n = n;
t.m = m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
t.a[i][j] = a[i][j] + b.a[i][j];
return t;
}
Matrix operator-(/*补全函数*/){
/*补全函数*/
}
/*
补全其余未定义的函数
*/
} m[N], ans;
Matrix operator*(/*补全函数*/){
/*补全函数*/
}
int main() {
scanf("%d%d", &tt, &p);
for(int i = 1; i <= tt; ++i){
scanf("%d%d", &m[i].n, &m[i].m);
for(int r = 1; r <= m[i].n; ++r)
for(int s = 1; s <= m[i].m; ++s)
scanf("%d", &m[i].a[r][s]);
}
for(int i = 1; i <= p; ++i){
int op, r, s;
scanf("%d%d%d", &op, &r, &s);
if(op == 1)
ans = m[r] + m[s];
else if(op == 2)
ans = m[r] - m[s];
else if(op == 3)
ans = m[r] * m[s];
ans.print();
}
return 0;
}
有 t 个矩阵(编号从 1 开始),需要完成 p 次矩阵运算。
1 r s表示第 r 个矩阵和第 s 个矩阵相加。2 r s表示第 r 个矩阵和第 s 个矩阵相减。3 r s表示第 r 个矩阵和第 s 个矩阵相乘。 用 Aij 来表示矩阵 A 第 i 行第 j 列的元素。
矩阵加减法的运算法则为:首先必须保证参与运算的两个矩阵的行数都相同、列数也都相同,否则不能运算,加减法的结果矩阵 C 的行列数和参与运算的 A,B 是一样的,运算法则为对应位置相加减。
例如,2×3 的矩阵 A 可以和 2×3 的矩阵 B 相加减。运算法则公式可以写作 Cij=Aij+Bij。
矩阵乘法的运算法则为:设 A 为 n×m 的矩阵,B 为 p×q 的矩阵,只有当 m=p 时才能进行矩阵乘法,否则不能运算,乘法的结果矩阵 C 是 n×q 的。
乘法运算公式可以写作 Cij=∑k=1m AikBkj。
输入格式
从标准输入读入数据。 第一行输入两个正整数 t,p(t,p≤20)。 接下来 t 个部分,每部分输入一个矩阵的信息。 每个矩阵的第一行先输入 n,m(n,m≤20),表示该矩阵的行列数;接下来 n 行,每行 m 个整数(绝对值均 ≤ 20),构成这个矩阵。 矩阵输入完毕后,输入 p 行运算命令,每行都是 o, r, s(r,s≤n)的格式,含义见题面。
输出格式
输出到标准输出。
对于每个运算命令,像输入那样输出运算结果矩阵:先输出行数、列数,然后再输出这个矩阵的元素。
如果运算无效,则不输出矩阵,而是输出 error。
样例 #1
样例输入 #1
3 4
2 3
1 2 3
4 5 6
2 3
-1 -2 -3
-4 -5 -6
3 1
7
8
9
1 1 2
2 1 2
3 1 2
3 1 3
样例输出 #1
0 0 0
0 0 0
2 4 6
8 10 12
error
50
122
写出一个正确的C++代码内容:```c++ #include<bits/stdc++.h> using namespace std; const int N = 25; int tt, p; struct Matrix{ int n, m; int a[N][N]; Matrix operator+(Matrix &b){ Matrix t; memset(t.a, 0, sizeof t.a); if(n != b.n || m != b.m){ t.n = t.m = -1; return t; } t.n = n; t.m = m; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) t.a[i][j] = a[i][j] + b.a[i][j]; return t; } Matrix operator-(Matrix &b){ Matrix t; memset(t.a, 0, sizeof t.a); if(n != b.n || m != b.m){ t.n = t.m = -1; return t; } t.n = n; t.m = m; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) t.a[i][j] = a[i][j] - b.a[i][j]; return t; } Matrix operator*(Matrix &b){ Matrix t; memset(t.a, 0, sizeof t.a); if(m != b.n){ t.n = t.m = -1; return t; } t.n = n; t.m = b.m; for(int i = 1; i <= n; ++i) for(int j = 1; j <= b.m; ++j) for(int k = 1; k <= m; ++k) t.a[i][j] += a[i][k] * b.a[k][j]; return t; } void print(){ if(n == -1 && m == -1){ printf("error\n"); return; } printf("%d %d\n", n, m); for(int i = 1; i <= n; ++i){ for(int j = 1; j <= m; ++j) printf("%d ", a[i][j]); printf("\n"); } } } m[N], ans; int main() { scanf("%d%d", &tt, &p); for(int i = 1; i <= tt; ++i){ scanf("%d%d", &m[i].n, &m[i].m); for(int r = 1; r <= m[i].n; ++r) for(int s = 1; s <= m[i].m; ++s) scanf("%d", &m[i].a[r][s]); } for(int i = 1; i <= p; ++i){ int op, r, s; scanf("%d%d%d", &op, &r, &s); if(op == 1) ans = m[r] + m[s]; else if(op == 2) ans = m[r] - m[s]; else if(op == 3) ans = m[r] * m[s]; ans.print(); }
return 0;
}
原文地址: http://www.cveoy.top/t/topic/fPpf 著作权归作者所有。请勿转载和采集!