You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:52:35