无指针C++成绩统计程序异常:A/B等级计数出现乱码数值
问题原因分析与解决方案
嗨,这问题我太熟了——十有八九是局部变量未初始化搞的鬼!
问题根源
C++里的局部变量(比如你用来统计等级人数的变量)如果不手动初始化,会直接占用栈内存里的随机垃圾值。你说C、D、F统计正常,A、B出异常,大概率是你只给C、D、F的计数器赋了初始值0,却忘了给A、B的计数器初始化。
当输入A/B对应的分数时,程序会在这些随机垃圾值的基础上累加,自然就出现了像907517809这种离谱的数值。而平均分计算正常,是因为你用来算平均分的总分、人数变量应该是初始化过的,没踩这个坑。
修复方案
把所有等级计数器都显式初始化为0就行,比如:
// 原来可能只初始化了C/D/F,现在全部初始化 int countA = 0, countB = 0, countC = 0, countD = 0, countF = 0;
修正后的完整代码示例
#include <iostream> using namespace std; int main(){ // 所有计数器都初始化为0 int countA = 0, countB = 0, countC = 0, countD = 0, countF = 0; int score, totalScore = 0, studentCount = 0; char continueInput; do { cout << "请输入学生成绩:"; cin >> score; // 累加总分和人数 totalScore += score; studentCount++; // 判定成绩等级并计数 if (score >= 90 && score <= 100) { countA++; } else if (score >= 80 && score < 90) { countB++; } else if (score >= 70 && score < 80) { countC++; } else if (score >= 60 && score < 70) { countD++; } else if (score >= 0 && score < 60) { countF++; } else { cout << "输入的成绩无效,请重新输入!" << endl; studentCount--; // 无效成绩不计入人数 totalScore -= score; // 无效成绩不计入总分 } cout << "是否继续输入?(Y/N):"; cin >> continueInput; } while (continueInput == 'Y' || continueInput == 'y'); // 计算并输出结果 if (studentCount > 0) { double average = static_cast<double>(totalScore) / studentCount; cout << "\n成绩统计结果:" << endl; cout << "A等级(90-100分)人数:" << countA << endl; cout << "B等级(80-89分)人数:" << countB << endl; cout << "C等级(70-79分)人数:" << countC << endl; cout << "D等级(60-69分)人数:" << countD << endl; cout << "F等级(0-59分)人数:" << countF << endl; cout << "平均分:" << average << endl; } else { cout << "没有有效成绩输入!" << endl; } return 0; }
额外提醒
以后写C++代码时,所有局部变量都要记得初始化,尤其是用来计数、累加的变量,不然很容易踩这种看起来莫名其妙的坑。
内容的提问来源于stack exchange,提问作者Unknown Shin
相关产品推荐
相关产品推荐

