c - 中位数和众数不正确

标签 c statistics median

问题的详细信息如下:

#include <stdio.h>

int main() {

    int N, i, j, sum, mode, count, f[100], maxf;
    float mean, med;

    printf("Enter the number of students\n");
    scanf("%d", &N);
    printf("Number of students:%d\n", N);

    int m[N];  // Array to store the marks //

    for (i = 0; i < N; i++) {
        printf("Enter the marks of student %d\n", i + 1);
        scanf("%d", &m[i]);
    }

    printf("Scores\n");

    for (j = 0; j < N; j += 5) {
        printf("%d, %d, %d, %d, %d\n", m[j], m[j + 1], m[j + 2], m[j + 3], m[j + 4]);
    }

    // Sorting the array //

    for (i = 0; i < (N - 1); i++) {
        for (j = i + 1; j < N; j++) {
            if (m[j] < m[i]) {
                int temp = m[j];
                m[j] = m[i];
                m[i] = temp;
            }
        }
    }

    if (N % 2 == 0) {
        med = (((m[((N / 2) - 1)] + m[(N / 2)])) / 2);
    } else
    if (N % 2 != 0) {
        med = m[((N + 1) / 2)];
    }

    sum = 0;

    for (i = 0; i < N; i++) {
        sum += m[i];
    }

    mean = (((float)(sum)) / (N));

    printf("Mean:%f\n", mean);
    printf("Median:%d", med);

    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++) {
            if (m[j] != -1) {
                if (m[j] == m[i]) {
                    count += 1;
                    m[j] = -1;
                }

                count = f[i];                      // Array to store frequency //
            }
        }
    }

    maxf = 0;

    for (i = 0; i < N; i++) {
       if (maxf < f[i]) {
           maxf = f[i];
       }   
    }

    for (i = 0; i < N; i++) {
        if (maxf == f[i]) {
            printf("Mode: %d\n", m[i]);
        }
    }
    return 0;
}

我期望中位数会出现一些值,但每次都是0,而且我总是得到不正确的模式。

最佳答案

代码中存在多个问题:

  • 您没有测试 scanf() 的返回值:如果任何输入丢失或导致转换错误,您将出现未定义的行为。

  • 打印值时,您假设 N5 的倍数:如果不是这种情况,您将有未定义的行为访问超出数组末尾的元素。

  • 在元素数量为偶数的情况下,计算中值作为数组中心元素值的平均值:您应该使用浮点算术进行此计算:将至少一个操作数转换为 floatdouble 。例如:

      med = ((float)m[N / 2 - 1] + m[N / 2]) / 2;
    
  • 如果元素数量为奇数,则应采用中心元素的值,该元素位于偏移量 (N + 1) / 2 处但只是在偏移量N / 2处。您应该用简单的情况检查这些公式,例如 N=1 -> med=m[(1+1)/2] 超出范围!

      med = m[N / 2];
    

    请注意,您可以使用公式 med = ((float)m[(N - 1) / 2] + m[N / 2]) / 2;在所有情况下,假设 N > 0 .

  • printf("Median:%d", med)有未定义的行为,因为您传递了 float值(自动转换为 double ),其中 printf预计 int用于转换%d 。您应该使用%f相反:

      printf("Median: %f\n", med);
    
  • 要计算众数,您可以使用数组 f[100]如果 N > 100 则太小.

  • 你从不存储 countf[i] ,而是您阅读 count来自f[i]这是未初始化的。

  • 此外,您不会重置 count01对于 m 中的每个不同值.

  • 数组的众数是在数组中出现次数多于任何其他数字的数字。您可以通过计算线性扫描中的最大重复次数来确定这一点,而无需额外的数组,并在后续扫描中打印具有此重复次数的值。

关于c - 中位数和众数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77076311/

相关文章:

C代码中的CRLS归并排序边界代码理解

c - 用链表实现堆栈

r - ggplot2 boxplot中位数未按预期绘制

c - 在 C 中寻找中位数

c++ - C11/C++11 弱内存基准测试

将具有动态数组的结构转换为双指针

sql - 用 MySQL 计算中位数的简单方法

math - 如何获得趋势的标准化斜率

statistics - 基于PAC-learning框架的计算学习理论

r - 获取列的中位数,其中另一列的值为 R 中的 1