C++程序求最值与平均值异常:仅取首个输入值且无平均值结果
问题分析与代码修正
核心问题梳理
- 数组越界访问:你定义的
average是大小为8的数组,合法索引范围是0~7,但代码中多次访问average[8],这属于非法内存访问(未定义行为)。输入的数值被写入非法区域,导致max、min的初始化值异常。 - 最大值循环失效:找最大值的
for循环末尾多了分号;,使得循环体为空,后续的判断代码仅执行一次,且始终比较越界的average[8],从未遍历数组有效元素。 - 最小值循环未执行:找最小值的循环条件是
i > 8,初始i=0时条件不成立,循环直接跳过,min保持初始的越界值。 - 平均值逻辑完全错误:计算平均值的循环未做累加操作,
battingAverage = average[8]+number只是用越界值加循环变量,且每次覆盖结果;输出时直接打印数组名average,实际输出的是数组内存地址而非计算出的平均值。 - 冗余/非法代码:
double number[0];是非法定义(C++不允许大小为0的数组);loopIndex、total、double i;等变量未使用;enter code here属于无效代码。
修正后的代码
#include <iostream> using namespace std; int main() { const int ARRAY_SIZE = 8; double average[ARRAY_SIZE] = {.299, .157, .242, .203, .198, .333, .270, .190}; // 输入值替换数组最后一个元素(合法索引范围) cout << "Please enter a batting average: " << endl; cin >> average[ARRAY_SIZE - 1]; // 查找最大值 double max = average[0]; for (int i = 1; i < ARRAY_SIZE; i++) { if (max < average[i]) max = average[i]; } // 查找最小值 double min = average[0]; for (int i = 1; i < ARRAY_SIZE; i++) { if (min > average[i]) min = average[i]; } // 计算平均值 double total = 0.0; for (int i = 0; i < ARRAY_SIZE; i++) { total += average[i]; } double battingAverage = total / ARRAY_SIZE; // 输出结果 cout << "Maximum batting average is " << max << endl; cout << "Minimum batting average is " << min << endl; cout << "The average is " << battingAverage << endl; return 0; }
修正说明
- 用常量
ARRAY_SIZE统一数组大小,避免硬编码数字,提升可维护性; - 修正数组索引,使用
ARRAY_SIZE - 1访问最后一个元素,彻底解决越界问题; - 重构max/min的循环逻辑:从第二个元素开始遍历,逐个比较数组内的有效元素;
- 重新实现平均值计算:先累加所有元素到
total,再除以元素个数得到正确平均值; - 删除所有冗余、非法代码,优化输出格式。
内容的提问来源于stack exchange,提问作者hedi
相关产品推荐
相关产品推荐

