时间限制: 1 Sec 内存限制: 128 MB
题目描述
设计一个矩阵类模板Matrix,支持任意数据类型的数据。
要求至少包含2个成员函数:矩阵转置函数transport、以及打印输出函数print
编写main函数进行测试,调用类的成员函数完成转置和输出。
输入
第一行先输入t,表示有t个测试用例
从第二行开始输入每个测试用例的数据。
首先输入数据类型,I表示int,D表示double,C表示char,接着输入两个参数m和n,分别表示矩阵的行和列
接下来输入矩阵的元素,一共m行,每行n个数据
输出
输出转置后的矩阵
样例输入
2
I 2 3
1 2 3
4 5 6
C 3 3
a b c
d e f
g h i
样例输出
1 4
2 5
3 6
a d g
b e h
c f i
提示
解决方案
#include <iostream>
template<typename T>
class Matrix {
public:
Matrix(size_t row, size_t col) : row(row), col(col) {
data = new T *[row];
for (size_t i = 0; i < row; ++i) {
data[i] = new T[col];
}
}
void setFromCin() {
for (size_t ir = 0; ir < row; ++ir) {
for (size_t ic = 0; ic < col; ++ic) {
std::cin >> data[ir][ic];
}
}
}
void transport() {
T **tmp = new T *[col];
for (size_t ir = 0; ir < col; ++ir) {
tmp[ir] = new T[row];
}
for (size_t ir = 0; ir < col; ++ir) {
for (size_t ic = 0; ic < row; ++ic) {
tmp[ir][ic] = data[ic][ir];
}
}
for (size_t ir = 0; ir < row; ++ir) {
delete[](data[ir]);
}
delete[](data);
std::swap(row, col);
data = tmp;
}
void println() {
for (size_t ir = 0; ir < row; ++ir) {
std::cout << data[ir][0];
for (size_t ic = 1; ic < col; ++ic) {
std::cout << ' ' << data[ir][ic];
}
std::cout << std::endl;
}
}
struct Row &operator[](int index) {
return Row(data[index]);
}
~Matrix() {
for (size_t ir = 0; ir < row; ++ir) {
delete[](data[ir]);
}
delete[](data);
}
private:
int row, col;
T **data;
struct Row {
explicit Row(T *row) : data(row) {}
T operator[](int index) {
return data[index];
}
T *data;
};
};
int main() {
int T;
std::cin >> T;
while (T--) {
char type;
std::cin >> type;
int row, col;
std::cin >> row >> col;
switch (type) {
case 'I': {
Matrix<int> matrix(row, col);
matrix.setFromCin();
matrix.transport();
matrix.println();
break;
}
case 'D': {
Matrix<double> matrix(row, col);
matrix.setFromCin();
matrix.transport();
matrix.println();
break;
}
case 'C': {
Matrix<char> matrix(row, col);
matrix.setFromCin();
matrix.transport();
matrix.println();
break;
}
default: ;
}
}
return 0;
}
发表回复