C++函数中第二个for循环计算Perodua平均销售额错误求助
问题分析与解决方案
你的问题根源很明确:计算第二个品牌平均值时,重复使用的累加/计数变量没有重置,导致第二个循环的计算基于第一个循环的结果,最终得到错误的平均值。
常见错误代码示例
假设你的原代码类似这样:
#include <iostream> #include <vector> #include <string> using namespace std; struct Car { string brand; int sales; }; void calcAvrg(vector<Car> cars) { double totalSales = 0; int brandCount = 0; // 第一个循环:计算Proton平均销售额 for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Proton") { totalSales += cars[i].sales; brandCount++; } } double protonAvg = totalSales / brandCount; cout << "Proton Average Sales: " << protonAvg << endl; // 第二个循环:计算Perodua平均销售额(未重置变量,导致错误) for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Perodua") { totalSales += cars[i].sales; brandCount++; } } double peroduaAvg = totalSales / brandCount; cout << "Perodua Average Sales: " << peroduaAvg << endl; } int main() { vector<Car> cars = { {"Proton", 150000}, {"Proton", 180000}, {"Perodua", 160000}, {"Perodua", 179364} }; calcAvrg(cars); return 0; }
运行这段代码会得到错误的Perodua平均值,因为totalSales和brandCount保留了Proton的累加值,第二个循环相当于把两个品牌的销售额和计数混在一起计算。
两种修复方案
方案1:为每个品牌使用独立的变量
给每个品牌单独定义累加和计数变量,彻底避免变量污染:
void calcAvrg(vector<Car> cars) { // 计算Proton平均 double protonTotal = 0; int protonCount = 0; for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Proton") { protonTotal += cars[i].sales; protonCount++; } } double protonAvg = protonTotal / protonCount; cout << "Proton Average Sales: " << protonAvg << endl; // 计算Perodua平均(独立变量) double peroduaTotal = 0; int peroduaCount = 0; for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Perodua") { peroduaTotal += cars[i].sales; peroduaCount++; } } double peroduaAvg = peroduaTotal / peroduaCount; cout << "Perodua Average Sales: " << peroduaAvg << endl; }
方案2:在第二个循环前重置共享变量
如果想复用变量,必须在第二个循环开始前将累加和计数变量重置为0:
void calcAvrg(vector<Car> cars) { double totalSales = 0; int brandCount = 0; // 第一个循环:Proton for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Proton") { totalSales += cars[i].sales; brandCount++; } } double protonAvg = totalSales / brandCount; cout << "Proton Average Sales: " << protonAvg << endl; // 重置变量,准备计算Perodua totalSales = 0; brandCount = 0; // 第二个循环:Perodua for (int i = 0; i < cars.size(); i++) { if (cars[i].brand == "Perodua") { totalSales += cars[i].sales; brandCount++; } } double peroduaAvg = totalSales / brandCount; cout << "Perodua Average Sales: " << peroduaAvg << endl; }
两种方案都能解决问题,方案1的代码可读性更高,后续扩展其他品牌也更方便;方案2适合变量较少的场景。
内容的提问来源于stack exchange,提问作者Shalu
相关产品推荐
相关产品推荐

