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

如何修改C++代码避免输出文件打印多余零行(CAPACITY固定为100)

问题根源

你代码的核心问题是参数变量被局部变量屏蔽,且所有业务循环错误地遍历了整个100容量的数组,而不是input函数读取到的实际有效记录数count,导致未赋值的空数组元素也被处理输出,产生大量零值行。


需调整的代码点

1. 修正process函数的循环范围

原函数内部重新定义了同名局部变量count,循环上限错误使用CAPACITY,修改后代码:

void process(order_record STR[], const int count)
{
    // 不要重新定义count,用传进来的有效记录数作为循环上限
    for (int i = 0; i < count; i++)
    {
        // 原有计算逻辑不变,把所有STR[count]改为STR[i]
        STR[i].net_cost = STR[i].quantity * STR[i].plant_cost;
        
        if (STR[i].cname == "dade")
            STR[i].tax_rate = .065;
        else if (STR[i].cname == "broward")
            STR[i].tax_rate = .06;
        else if (STR[i].cname == "palm")
            STR[i].tax_rate = .07;
        
        if (STR[i].quantity <= 0)
            STR[i].discount = 0;
        else if (STR[i].quantity >= 1 && STR[i].quantity <= 5)
            STR[i].discount = .01 * STR[i].net_cost;
        else if (STR[i].quantity >= 6 && STR[i].quantity <= 11)
            STR[i].discount = .03 * STR[i].net_cost;
        else if (STR[i].quantity >= 12 && STR[i].quantity <= 20)
            STR[i].discount = .05 * STR[i].net_cost;
        else if (STR[i].quantity >= 21 && STR[i].quantity <= 50)
            STR[i].discount = .08 * STR[i].net_cost;
        else if (STR[i].quantity > 50)
            STR[i].discount = .12 * STR[i].net_cost;
        
        STR[i].purchase_tax = STR[i].net_cost * STR[i].tax_rate;
        STR[i].total_cost = STR[i].net_cost + STR[i].purchase_tax - STR[i].discount;
    }
}

2. 修正output函数的两个循环范围

删除内部重复定义的count变量,循环上限改为实际有效记录数,修改后代码:

void output(const order_record STR[], const int &count)
{
    ofstream out;
    out.open("nursery_run_results.txt");
    
    out.setf(ios::showpoint);
    out.precision(2);
    out.setf(ios::fixed);
    
    // 输出到文件的循环用有效count作为上限
    for (int i = 0; i < count; i++)
    {
        out << left << setw(15) << STR[i].pname
            << left << setw(10) << STR[i].cname
            << right << setw(8) << STR[i].plant_cost
            << right << setw(8) << STR[i].quantity
            << right << setw(8) << STR[i].net_cost
            << right << setw(8) << setprecision(3) << STR[i].tax_rate
            << right << setw(8) << setprecision(2) << STR[i].purchase_tax
            << right << setw(8) << STR[i].discount
            << right << setw(8) << STR[i].total_cost << endl;
    }
    
    cout.setf(ios::showpoint);
    cout.precision(2);
    cout.setf(ios::fixed);
    
    // 输出到屏幕的循环也用有效count作为上限
    for (int i = 0; i < count; i++)
    {
        cout << left << setw(15) << STR[i].pname
            << left << setw(10) << STR[i].cname
            << right << setw(8) << STR[i].plant_cost
            << right << setw(8) << STR[i].quantity
            << right << setw(8) << STR[i].net_cost
            << right << setw(8) << setprecision(3) << STR[i].tax_rate
            << right << setw(8) << setprecision(2) << STR[i].purchase_tax
            << right << setw(8) << STR[i].discount
            << right << setw(8) << STR[i].total_cost << endl;
    }
    
    out.close();
}

3. 修正count_inventory函数的计算逻辑

原来用CAPACITY计算平均值是错误的,应该用实际有效记录数,修改后代码:

double count_inventory (const order_record STR[], const int count)
{
    double total = 0;
    double average;
    
    cout.setf(ios::showpoint);
    cout.precision(2);
    cout.setf(ios::fixed);
    
    // 只累加有效记录
    for (int i = 0; i < count; i++)
    {
        total += STR[i].total_cost;
    }
    
    // 用有效记录数计算平均值,增加count为0的异常判断
    average = count == 0 ? 0 : total / count;
    
    return average;
}

4. 修复main函数的文件打开判断逻辑

原main函数里定义的in变量没有关联文件就判断fail(),逻辑无效,修改后代码:

int main()
{
   order_record STR[CAPACITY];
   int count = 0;
   // 提前打开文件做可用性校验
   ifstream in("nursery_stock-3.txt");
   if (in.fail())
   {
       cout << "输入文件未正常打开" << endl;
       return 1;
   }
   in.close();

   input(STR, count);
   process(STR, count);
   output(STR, count);

   cout.setf(ios::showpoint);
   cout.precision(2);
   cout.setf(ios::fixed);

   cout << "平均订单总成本 = " << count_inventory(STR, count) << endl;

   return 0;
}

可选优化建议

  • 可以删除order_record类里冗余的double STR[CAPACITY];成员,该变量完全未使用还占用大量内存
  • 可将input函数的while (!in.eof())逻辑改为while (in >> STR[count].pname >> STR[count].cname >> STR[count].plant_cost >> STR[count].quantity && count < CAPACITY) { count++; },避免读取到空记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 14:33:03