如何修改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
相关产品推荐
相关产品推荐

