C++代码执行异常:Task 2未运行,Herdtotalweek未初始化求助
问题分析与修复方案
咱们直接拆解你遇到的两个核心问题:Task 2 完全没执行,以及 Herdtotalweek 未初始化的警告,这些都源于代码里的几个逻辑错误,我来逐个说明并修复:
1. 为什么 Task 2 根本没机会执行?
你在 Task 1 里犯了数组越界+逻辑遗漏的错误,直接导致程序在 Task 1 执行完就崩溃了:
- 原代码里,你把每日产奶量的赋值放在了内层循环(Day循环)的外面,这意味着你只保存了最后一天(第7天)的产奶量,前面6天的数据全丢了;
- 更严重的是,内层循环结束后
Day的值是8,你用((count - 1) * 7) + Day作为DailyYield的索引——比如当count=1时,索引是0*7+8=8,但DailyYield的大小是Herdsize *7,比如Herdsize=1时数组只有7个元素(索引0-6),这直接触发数组越界,程序崩溃,自然到不了Task 2。
2. 未初始化变量的问题
WeeklyYieldpercow数组未初始化:你直接用WeeklyYieldpercow[count] = WeeklyYieldpercow[count] + ...累加,但数组创建时没有初始化,里面都是随机垃圾值,结果完全错误;Herdtotalweek未初始化:Task 2 里直接拿它做累加,初始值是随机的,这就是编译器警告的原因。
修复后的完整代码
我把所有错误都修正了,还优化了逻辑(比如数组索引从0开始,更符合C++规范):
#include <iostream> #include <string> using namespace std; int main() { // Task 1 int Herdsize; int Day; float MilkYield1; float MilkYield2; int count; cout << "Please input herd size" << endl; cin >> Herdsize; while (Herdsize < 1 || Herdsize > 900) { cout << "Please re-input herdsize between 1 and 900" << endl; cin >> Herdsize; } // 数组索引从0开始,避免逻辑混淆 int CowID[Herdsize]; float DailyYield[Herdsize * 7]; // 初始化每周产奶量数组为0,解决垃圾值问题 float WeeklyYieldpercow[Herdsize] = {0}; for (count = 0; count < Herdsize; count++) { cout << "Input 3 digit cow id: "; cin >> CowID[count]; // 修正验证条件:确保是真正的3位数(100-999) while (CowID[count] < 100 || CowID[count] > 999) { cout << "Please re-input a 3 digit cow id: " << endl; cin >> CowID[count]; } // 把每日产奶量的逻辑放到内层循环里,保存每天的数据 for (Day = 0; Day < 7; Day++) { cout << "Please input first milk yield of cow " << count+1 << ", day " << Day+1 << ":" << endl; cin >> MilkYield1; cout << "Please input second milk yield day " << Day+1 << ", if no second yield enter 0:" << endl; cin >> MilkYield2; // 计算当日总产奶量并存入数组 int dailyIndex = count * 7 + Day; DailyYield[dailyIndex] = MilkYield1 + MilkYield2; // 累加进该奶牛的每周总产奶量 WeeklyYieldpercow[count] += DailyYield[dailyIndex]; } } // TASK 2 float Herdtotalweek = 0; // 初始化总产奶量为0,解决未初始化警告 float Averagevolume; // 修正循环条件:遍历所有奶牛 for (count = 0; count < Herdsize; count++) { Herdtotalweek += WeeklyYieldpercow[count]; } Averagevolume = Herdtotalweek / Herdsize; // 用static_cast更规范地做类型转换 int Herdtotalweekwhole = static_cast<int>(Herdtotalweek + 0.5); int Averagevolumewhole = static_cast<int>(Averagevolume + 0.5); cout << "Total weekly volume = " << Herdtotalweekwhole << endl; cout << "Average volume = " << Averagevolumewhole << endl; return 0; }
关键修复点总结
- 把每日产奶量的赋值逻辑移到内层循环中,确保每天的数据都被保存,同时避免数组越界;
- 初始化了
WeeklyYieldpercow和Herdtotalweek为0,彻底解决未初始化的问题; - 修正奶牛ID的验证条件,确保输入的是真正的3位数;
- 数组索引改为从0开始,符合C++常规写法,减少逻辑混淆;
- 优化了输出提示信息,更清晰易懂。
内容的提问来源于stack exchange,提问作者Aloysius Rebeiro
相关产品推荐
相关产品推荐

