有关问题的详情如下:

#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的倍数:如果不是这样,您将具有访问数组末尾以外的元素的未定义行为.

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

      med = ((float)m[N / 2 - 1] + m[N / 2]) / 2;
    
  • 如果元素的数量为奇数,则应取中心元素的值,该值在偏移量(N + 1) / 2处为not,但在偏移量N / 2处仅为not.你应该用小写判断这样的公式,例如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期望转换%d的值为int.您应该改用%f:

      printf("Median: %f\n", med);
    
  • 为了计算模式,您使用一个数组f[100],如果是N > 100,则它会太小.

  • 您永远不会将count存储到f[i],而是从未初始化的f[i]中读取count.

  • 此外,对于m中的每个不同值,不要将count重置为01.

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

C++相关问答推荐

修改pGM使用指针填充2-D数组但不起作用

为什么PLT表中没有push指令?

通过MQTT/蚊子发送大文件—限制在4MB

数据包未从DPDK端口传输到内核端口

变量>;-1如何在C中准确求值?

如何在c++中包装返回空*的函数

Linux不想运行编译后的文件

文件权限为0666,但即使以超级用户身份也无法打开

在句子中转换单词的问题

在另一个函数中使用realloc和指针指向指针

处理EPOLL_WAIT中的接收数据和连接关闭信号

如何在VS 2022中正确安装额外的C头文件

如何对现有的双向循环链表进行排序?

我正在try 将QSORT算法实现为C++中的泛型函数

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

在C中使用无符号整数模拟有符号整数

在C中打印指针本身

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

将数组返回到链表

比 * 更快的乘法