星痕࿐ 2024-06-19 11:46 采纳率: 46.2%
浏览 1

问大家一个C语言问题,为什么我的代码出错?

img


为什么我输出的结果是2000?


#include <stdio.h>

int main(void) {
    int i, j, N, x[100];
    double sum = 0, ave;
    scanf("%d", &N);
    for (i = 0; i < N; i++) {
        scanf("%d", &x[i]);
    }
    int a, t, min = x[0];
    for (i = 0; i < N; i++) {
        if (min > x[i]) {
            min = x[i];
            t = i;
        }
    }
    for (i = t; i < N - 1; i++) {
        x[i] = x[i + 1];
    }
    int max = x[0];
    for (i = 0; i < N - 1; i++) {
        if (max < x[i]) {
            max = x[i];
            a = i;
        }
    }
    for (i = a; i < N - 2; i++) {
        x[i] = x[i + 1];
    }
    for (j = 0; j < N - 2; j++) {
        sum += x[i];
    }

    ave = sum / (N - 2);
    printf("%.5f", ave);
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-19 11:46
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,主要的问题在于计算平均值时的逻辑有误。代码试图移除数组中的最大值和最小值,然后计算剩余元素的平均值。然而,在移除最大值和最小值的过程中,代码并没有正确地调整数组的索引,导致在后续的循环中产生了错误。

    以下是修正后的代码,其中主要修改了移除最大值和最小值的部分,并且修正了求和的循环:

    #include <stdio.h>
    
    int main(void) {
        int i, j, N, x[100], max_idx, min_idx;
        double sum = 0, ave;
    
        // Read number of elements
        scanf("%d", &N);
    
        // Read elements into array
        for (i = 0; i < N; i++) {
            scanf("%d", &x[i]);
        }
    
        // Find the maximum and minimum values along with their indices
        int max = x[0], min = x[0];
        for (i = 0; i < N; i++) {
            if (x[i] > max) {
                max = x[i];
                max_idx = i;
            }
            if (x[i] < min) {
                min = x[i];
                min_idx = i;
            }
        }
    
        // Ensure min_idx is not greater than max_idx to avoid index out of range
        if (min_idx > max_idx) {
            int temp = min_idx;
            min_idx = max_idx;
            max_idx = temp;
        }
    
        // Calculate sum excluding max and min values
        for (i = 0, j = 0; i < N; i++) {
            if (i != min_idx && i != max_idx) {
                sum += x[i];
                j++;
            }
        }
    
        // Calculate average
        ave = sum / (N - 2);
    
        // Print result
        printf("%.5f\n", ave);
    
        return 0;
    }
    

    这个修正版的代码首先找到数组中的最大值和最小值及其对应的索引。接着,在计算总和时,它跳过了最大值和最小值,确保了正确的平均值计算。最后,输出结果时也符合题目要求的小数点后五位的精度。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月19日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求