C代码首次迭代里程计算正确,二次迭代失效问题求助
C程序多组行驶里程计算迭代失效问题修复
需求与问题
需求:编写C程序接收多组数据集计算行驶里程,输入规则为:先输入数据集数量n,每组输入speed(mph)和time,输入-1终止。示例输入对应输出为170 miles、180 miles、90 miles。
问题:首次迭代可得到正确里程,但第二次迭代计算失效。
用户提供的代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int n, s, t, timeDiff, newTime, sum, arrSum; //variables int arr[100]; //array int count = 0; //counter, which i haven't used yet but have been in the habit of doing while (n != -1){ scanf("%d", &n); //Number of data sets to be entered for(int i=0; i<n ;i++){ timeDiff = t; //saves last time value scanf("%d %d", &s, &t); newTime = t - timeDiff; //subtracts last time value from the new if (timeDiff == 0){ sum = s * t; arr[i] = sum; } else{ sum = s * newTime; arr[i] = sum;} } for (int i = 0; i < n; i++){ arrSum = arrSum + arr[i]; } printf("You went %d miles \n", arrSum); sum = 0; timeDiff = 0; arrSum = 0; newTime = 0; for (int i = 0; i < n; i++){ arr[i] = 0; } count++; } return 0; }
问题分析
- 未初始化变量的垃圾值问题:
- 变量
n进入while循环前未赋值,初始是内存随机值,可能导致循环逻辑异常。 - 变量
t首次用于timeDiff = t时未初始化,拿垃圾值计算时间差;且上一组的t值会残留到下一组,彻底打乱后续计算。 arrSum累加前未初始化,第一次计算会基于垃圾值叠加,影响结果准确性。
- 变量
- 循环逻辑缺陷:先判断
n != -1再读取n,不符合输入流程,容易触发未初始化变量的判断错误。 - 冗余数组使用:计算总里程无需存储每组结果到数组,反而增加了出错概率和代码复杂度。
修正后的代码
#include <stdio.h> int main() { int n, speed, curr_time, prev_time, total_miles; // 先读取第一组数据集数量 scanf("%d", &n); while (n != -1) { total_miles = 0; prev_time = 0; // 每组数据的初始时间重置为0 for (int i = 0; i < n; i++) { scanf("%d %d", &speed, &curr_time); // 直接累加当前时间段的里程 total_miles += speed * (curr_time - prev_time); // 更新上一个时间,供下一次计算使用 prev_time = curr_time; } printf("You went %d miles \n", total_miles); // 读取下一组数据集数量 scanf("%d", &n); } return 0; }
修正说明
- 初始化所有关键变量,每组数据处理前重置状态(如
prev_time设为0),避免残留值干扰。 - 调整循环逻辑:先读取
n再判断是否终止,符合输入流程,规避未初始化变量的判断问题。 - 移除冗余数组和中间变量,直接累加总里程,简化代码逻辑,减少出错点。
- 优化变量命名(如
s改为speed、t改为curr_time),提升代码可读性。
内容的提问来源于stack exchange,提问作者Maxwell Scharkopf
相关产品推荐
相关产品推荐

