C++文件IO程序问题:如何修正‘高于平均温度天数为0’的错误?
问题修复方案
问题描述
我编写了一个C++程序,从文件Temp2012.txt读取温度数据,计算平均、最高、最低温度以及高于平均温度的天数,并将结果写入Temps2012.out文件。但程序输出中“Days Above Average: 0 days”的结果不符合预期,实际应有更多天数。
程序代码
#include <iostream> #include <fstream> using namespace std; int main() { ifstream inputFile("Temps2012.txt"); if (!inputFile) { cout << "Error opening the file." << endl; return 1; } int temperatures[31]; int temp; int sum = 0; int maxTemp = 100; int minTemp = -100; int daysAboveAvg = 0; int i = 0; while (i < 31 && inputFile >> temp) { temperatures[i] = temp; sum += temp; if (temp > maxTemp) { maxTemp = temp; } if (temp < minTemp) { minTemp = temp; } i++; } inputFile.close(); int average = (sum * 10) / 31; for (int i = 0; i < 31; ++i) { if (temperatures[i] > average) { daysAboveAvg++; } } ofstream outputFile("Temps2012.out"); if (!outputFile) { cout << "Error creating the output file." << endl; return 1; } outputFile << "Average Temperature: " << (average / 10) << "." << (average % 10) << "°F" << endl; outputFile << "Maximum Temperature: " << maxTemp << "°F" << endl; outputFile << "Minimum Temperature: " << minTemp << "°F" << endl; outputFile << "Days Above Average: " << daysAboveAvg << " days" << endl; outputFile.close(); cout << "Results written to Temps2012.out" << endl; return 0; }
当前输出结果
Average Temperature: 80.4°F
Maximum Temperature: 90°F
Minimum Temperature: 70°F
Days Above Average: 0 days
输入文件Temp2012.txt数据
87 72 89 75 88 80 84 82 86 71 78 73 82 76 79 83 85 74 90 77 70 89 83 75 84 76 88 72 87 81 77
问题分析
核心问题出在平均温度的比较逻辑:
- 你计算
average时用了(sum * 10) / 31,得到的是放大10倍的整数(比如当前输出的80.4对应average = 804)。 - 但比较时直接用原始温度(比如87)和
average(804)对比,显然所有温度的整数数值都远小于804,导致daysAboveAvg始终为0。
另外还有两个潜在问题:
maxTemp初始值设为100,输入数据的最高温度是90,小于100,程序不会更新maxTemp,但你的输出显示90,大概率是代码书写错误,正确初始化应设为极小值(如INT_MIN)或第一个温度值。minTemp初始值设为-100,输入数据的最低温度是70,大于-100,同样不会更新,正确初始化应设为极大值(如INT_MAX)或第一个温度值。
修复方案
方案一:使用浮点数计算平均温度(推荐)
将平均温度改为浮点数类型,直接和原始温度对比,逻辑更直观:
// 替换原整数平均计算代码 #include <iomanip> // 需要添加该头文件格式化输出 // ... double average = static_cast<double>(sum) / 31; // 替换原比较循环 for (int i = 0; i < 31; ++i) { if (temperatures[i] > average) { daysAboveAvg++; } } // 替换原平均温度输出代码 outputFile << "Average Temperature: " << fixed << setprecision(1) << average << "°F" << endl;
方案二:保持整数运算,统一比较单位
如果坚持用整数运算,将原始温度放大10倍后再和average对比:
// 修改比较循环 for (int i = 0; i < 31; ++i) { if (temperatures[i] * 10 > average) { daysAboveAvg++; } }
修复max和min的初始化问题
修改初始值为合理范围,或用第一个温度初始化:
// 方法1:使用极限值(需#include <climits>) int maxTemp = INT_MIN; int minTemp = INT_MAX; // 方法2:用第一个温度初始化 if (inputFile >> temp) { temperatures[0] = temp; sum = temp; maxTemp = temp; minTemp = temp; i = 1; // 继续读取剩余数据 while (i < 31 && inputFile >> temp) { temperatures[i] = temp; sum += temp; if (temp > maxTemp) maxTemp = temp; if (temp < minTemp) minTemp = temp; i++; } }
修复后的效果
以方案一为例,计算出的平均温度约为80.42°F,高于该值的天数会被正确统计(比如87、89、88等都会被计入)。
内容的提问来源于stack exchange,提问作者user22777780
相关产品推荐
相关产品推荐

