C语言分数统计程序min值异常问题排查请求
分数统计代码中min计算错误的原因及修复方案
错误根源
你的代码里int max = score[0];和int min = score[0];这两行存在核心问题:score是局部数组,声明后未初始化,其元素值是随机垃圾值。用这种随机值作为max和min的初始值,会导致后续的比较逻辑完全失效,最终min(甚至max)的计算结果必然不正确。
修复方案
这里提供两种可靠的修复方式:
方案一:先读取第一个分数再初始化极值
先读入第一个分数,用它来初始化max、min和sum,之后再处理剩下的分数:
#include <stdio.h> int main(){ int score[5]; int sum = 0; int i; int max, min; // 读取第一个分数,初始化sum、max、min scanf(" %d", &score[0]); sum = score[0]; max = score[0]; min = score[0]; // 从第二个分数开始循环处理 for(i=1; i<5; i++){ scanf(" %d", &score[i]); sum += score[i]; if (max < score[i]){ max = score[i]; } if (min > score[i]){ min = score[i]; } } printf("total = %d\nmean = %.2f\nmax = %d\nmin = %d\n%s\n", sum, (float)sum/5.0, max, min, sum<100 ? "Fail." : "Pass." ); return 0; }
方案二:用类型极限值初始化极值
引入<limits.h>头文件,用INT_MIN(int类型最小值)初始化max,INT_MAX(int类型最大值)初始化min,这样第一个输入的分数必然能更新这两个值:
#include <stdio.h> #include <limits.h> int main(){ int score[5]; int sum = 0; int i; int max = INT_MIN; int min = INT_MAX; for(i=0; i<5; i++){ scanf(" %d", &score[i]); sum += score[i]; if (max < score[i]){ max = score[i]; } if (min > score[i]){ min = score[i]; } } printf("total = %d\nmean = %.2f\nmax = %d\nmin = %d\n%s\n", sum, (float)sum/5.0, max, min, sum<100 ? "Fail." : "Pass." ); return 0; }
补充说明
C语言中,局部变量(包括数组)存储在栈内存中,默认不会被自动初始化为0或其他确定值,使用未初始化的局部变量属于未定义行为,结果不可预测。所以使用局部变量前必须确保完成初始化。
内容的提问来源于stack exchange,提问作者Kim Do Kyeong
相关产品推荐
相关产品推荐

