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

C++数组报错求助:未声明变量问题及表格输出需求

解决C++数组未声明错误及代码优化

错误核心原因

  • 作用域问题:你把NoOfHours、TaxRate、Salary、Tax、NetPay这些数组定义在了第一个for循环内部,循环结束后这些局部变量会被销毁,后面第二个输出循环访问时,编译器自然会报“未声明”的错误。
  • 非标准变长数组:C++标准不支持string Name[n];这种运行时确定大小的数组(这是C语言特性,仅部分编译器兼容),容易引发兼容性问题。
  • 数组越界风险:RatePerDay被定义为固定大小3的数组,但员工数量n可以是任意值,RatePerDay[i]会轻易超出下标上限,导致内存越界。
  • else语法错误:else (Position[i]=="Manager");多了分号,导致不管前面条件是否满足,都会执行后面的代码块,逻辑完全错误。
  • 总计变量误用:TotalSalary等被定义为数组,但你需要的是累加所有员工的总和,应该用单个浮点变量,且必须初始化后再累加。

修改后的完整代码

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>

using namespace std;

int main()
{
    const int Laborer = 500;
    const int Foreman = 750;
    const int Manager = 1500;

    int n;
    cout << "Enter No. of Employees: ";
    cin >> n;
    cout << endl;

    // 用vector替代变长数组,符合C++标准且安全
    vector<string> Name(n);
    vector<string> Position(n);
    vector<float> NoOfHours(n);
    vector<float> TaxRate(n);
    vector<float> Salary(n);
    vector<float> Tax(n);
    vector<float> NetPay(n);
    vector<int> RatePerDay(n);

    // 总计变量用单个值,初始化为0
    float TotalSalary = 0.0f;
    float TotalTax = 0.0f;
    float TotalNetPay = 0.0f;

    for (int i = 0; i < n; i++) {
        cout << "Enter Name: ";
        cin >> Name[i];

        cout << "Enter the position: ";
        cin >> Position[i];

        cout << "Enter No. of Hours Worked: ";
        cin >> NoOfHours[i];
        cout << endl;

        if (Position[i] == "Laborer") {
            RatePerDay[i] = Laborer;
            TaxRate[i] = 0.05f;
        } else if (Position[i] == "Foreman") {
            RatePerDay[i] = Foreman;
            TaxRate[i] = 0.08f;
        } else { // 默认按Manager处理(也可加输入校验)
            RatePerDay[i] = Manager;
            TaxRate[i] = 0.10f;
        }

        Salary[i] = NoOfHours[i] * RatePerDay[i] / 8;
        Tax[i] = Salary[i] * TaxRate[i];
        NetPay[i] = Salary[i] - Tax[i];

        // 累加总计
        TotalSalary += Salary[i];
        TotalTax += Tax[i];
        TotalNetPay += NetPay[i];
    }

    // 输出符合要求的表格格式
    cout << left 
         << setw(15) << "Name"
         << setw(15) << "Position"
         << setw(15) << "No. Of Hours"
         << setw(15) << "Salary"
         << setw(10) << "Tax"
         << setw(10) << "NetPay" << endl;
    cout << "-------------------------------------------------------------------------" << endl;

    for (int i = 0; i < n; i++) {
        cout << left
             << setw(15) << Name[i]
             << setw(15) << Position[i]
             << setw(15) << NoOfHours[i]
             << setw(15) << Salary[i]
             << setw(10) << Tax[i]
             << setw(10) << NetPay[i] << endl;
    }

    // 可选:输出总计行
    cout << "-------------------------------------------------------------------------" << endl;
    cout << left
         << setw(15) << "Total"
         << setw(15) << ""
         << setw(15) << ""
         << setw(15) << TotalSalary
         << setw(10) << TotalTax
         << setw(10) << TotalNetPay << endl;

    return 0;
}

关键修改说明

  • 调整变量作用域:把所有员工数据容器(vector)移到main函数顶部,确保输出循环能正常访问。
  • 替换为std::vector:完全符合C++标准,自动管理内存,避免越界和兼容性问题。
  • 修复分支逻辑:去掉else后面多余的分号,修正分支判断逻辑。
  • 修正总计计算:用单个变量存储总和,初始化为0后累加,逻辑正确。
  • 优化表格输出:调整对齐宽度,接近你给出的示例格式,可读性更强。

内容的提问来源于stack exchange,提问作者GrimAge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:15:37