You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:04:58