面试题答案
一键面试- 思路:
- 函数模板的非类型参数必须在编译期确定,而要实现运行时动态输入矩阵的行数和列数,不能再使用非类型参数来表示矩阵的维度。
- 可以使用动态内存分配来创建矩阵,比如使用
std::vector
或者new
和delete
来手动管理内存。这里以std::vector
为例,它能动态调整大小,适应运行时输入的行数和列数。 - 函数参数也需要相应调整,不再使用固定维度的数组作为参数,而是使用
std::vector
。
- 修改后的代码框架:
#include <iostream>
#include <vector>
// 函数声明
void matrixMultiply(const std::vector<std::vector<int>>& matrixA, const std::vector<std::vector<int>>& matrixB, std::vector<std::vector<int>>& result) {
int rowsA = matrixA.size();
int colsA = matrixA[0].size();
int colsB = matrixB[0].size();
for (int i = 0; i < rowsA; ++i) {
for (int j = 0; j < colsB; ++j) {
result[i][j] = 0;
for (int k = 0; k < colsA; ++k) {
result[i][j] += matrixA[i][k] * matrixB[k][j];
}
}
}
}
int main() {
int rowsA, colsA, rowsB, colsB;
std::cout << "请输入矩阵A的行数和列数: ";
std::cin >> rowsA >> colsA;
std::cout << "请输入矩阵B的行数和列数: ";
std::cin >> rowsB >> colsB;
if (colsA != rowsB) {
std::cout << "矩阵维度不匹配,无法相乘。" << std::endl;
return 1;
}
std::vector<std::vector<int>> matrix1(rowsA, std::vector<int>(colsA));
std::vector<std::vector<int>> matrix2(rowsB, std::vector<int>(colsB));
std::vector<std::vector<int>> result(rowsA, std::vector<int>(colsB));
std::cout << "请输入矩阵A的元素: " << std::endl;
for (int i = 0; i < rowsA; ++i) {
for (int j = 0; j < colsA; ++j) {
std::cin >> matrix1[i][j];
}
}
std::cout << "请输入矩阵B的元素: " << std::endl;
for (int i = 0; i < rowsB; ++i) {
for (int j = 0; j < colsB; ++j) {
std::cin >> matrix2[i][j];
}
}
matrixMultiply(matrix1, matrix2, result);
std::cout << "结果矩阵: " << std::endl;
for (int i = 0; i < rowsA; ++i) {
for (int j = 0; j < colsB; ++j) {
std::cout << result[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
上述代码实现了运行时动态输入矩阵的行数和列数,并进行矩阵乘法运算。通过std::vector
来管理动态大小的矩阵,函数matrixMultiply
的参数也相应修改为std::vector
类型。在main
函数中,先获取用户输入的矩阵维度,创建相应大小的矩阵,再获取矩阵元素,执行乘法运算并输出结果。