求排查C++稀疏矩阵判断程序中的语法错误
修复稀疏矩阵判断程序的语法与逻辑错误
我来帮你逐个排查并修复代码里的问题:
1. 模板类成员函数的类型匹配问题
编译报错的核心原因是模板类的成员函数在实现时,返回类型和参数都必须明确指定模板参数<T>,不能只写matrix。同时类声明里的add函数参数是matrix&,但实现里写成了传值matrix r,导致原型不匹配。
修改add函数的实现签名:
template < class T > matrix<T> matrix<T>::add(matrix<T>& r) // 明确指定模板参数,参数类型和类声明保持一致用引用
2. mismatchDimension::error_Msg函数的重复const修饰
你在定义这个函数时写了两个const,这是语法错误,删掉多余的那个:
void mismatchDimension::error_Msg () const
3. check_Sparse函数中变量t未初始化
变量t用来统计0元素的数量,但未初始化会导致未定义行为,初始化t为0:
int i, j, t = 0;
4. add函数中的维度判断逻辑错误
原代码用&&判断行列不匹配,这意味着只有行列都不匹配时才抛出异常,但实际上只要行或列不匹配就应该抛出,改成||:
if (row != r.row || col != r.col)
5. 矩阵元素访问的行列顺序问题
在get、check_Sparse、add、print函数里,你误用了ele[j][i],按照输入逻辑i是行索引、j是列索引,正确访问应该是ele[i][j],否则会导致矩阵元素存储和输出错乱。比如get函数里的循环:
for (i = 0; i < row; i++) { for (j = 0; j < col; j++) cin >> ele[i][j]; // 修复行列访问顺序 }
其他函数里的ele[j][i]都要改成ele[i][j]。
6. print函数的输出格式问题
原代码每个元素单独换行,会导致矩阵变成一列输出,改成用空格分隔元素,每行结束再换行:
for (i = 0; i < row; i++) { for (j = 0; j < col; j++) cout << ele[i][j] << " "; cout << endl; // 每行结束换行 }
7. 补充:结果矩阵的行列初始化
add函数中创建的w对象需要手动设置行列数,否则调用print时会使用未初始化的行列值,导致输出异常,在函数里添加:
w.row = row; w.col = col;
修正后的完整代码
#include<iostream> #include <exception> using namespace std; class mismatchDimension:public exception { public: void error_Msg () const; }; template < class T > class matrix { int row; int col; T ele[10][10]; public: void get (); bool check_Sparse (); matrix add (matrix&); void print (); }; // 修复重复const的问题 void mismatchDimension::error_Msg () const { cout << "Dimension of matrices do not match" << endl; } template < class T > void matrix < T >::get () { cin >> row; cin >> col; int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) cin >> ele[i][j]; // 修复行列访问顺序 } } template < class T > bool matrix < T >::check_Sparse () { int i, j, t = 0; // 初始化t为0 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (ele[i][j] == 0) // 修复行列访问顺序 ++t; } } if (t > (row * col) / 2) return true; else return false; } template < class T > matrix<T> matrix < T >::add (matrix<T>& r) // 修复模板类型匹配和参数类型 { mismatchDimension z; int i, j; matrix < T > w; w.row = row; // 设置结果矩阵的行列数 w.col = col; if (row != r.row || col != r.col) // 修复逻辑判断用|| throw z; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { w.ele[i][j] = ele[i][j] + r.ele[i][j]; // 修复行列访问顺序 } } return w; } template < class T > void matrix < T >::print () { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) cout << ele[i][j] << " "; // 用空格分隔元素 cout << endl; // 每行结束换行 } } int main () { matrix < int >m1, m2, m3; m1.get (); m2.get (); try { m3 = m1.add (m2); m3.print (); } catch (mismatchDimension & m) { m.error_Msg (); } if (m1.check_Sparse ()) cout << "Matrix is sparse" << endl; else cout << "Matrix is not sparse" << endl; }
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

