我不知道在C中打印正确的中位数

时间:2020-09-11 18:19:21

标签: c

我需要帮助修正我的中位数计算。当我尝试打印中间值时,它打印错误。这是我的代码。我需要帮助来确定通过排序数字的中位数。该程序从数组中读取10个整数,并打印出最小值,最大值和平均值。

#include <stdio.h>
#include <stdlib.h>

int cmpfunc (const void * a, const void * b) {
    return ( *(int*)a - *(int*)b );
}

// Maximum
int maximum(int values[]) {
    int Maximum = values[0];
    for (int i = 0; i < 10; ++i) {
        if (values[i] > Maximum)
        {
            Maximum = values[i];
        }
    }
    return Maximum;
}
//  Minimum
int minimum(int values[]){
    int Minimum= values[0];
    for(int i = 0; i  < 10; ++i) {
        if (values[i] < Minimum)
        {
            Minimum = values[i];
        }
    }
    return Minimum;
}

int main() {
    printf("Hello, World!\n");
//
    int a[10],i,sum=0;
    printf("enter array\n");
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }



    int max = maximum(a);
    int mini = minimum(a);

    float avg =(float ) sum/10;
    qsort(a, 10, sizeof(int), cmpfunc);


int medianNumber= i/2;
int median=a[medianNumber];

    printf("Sum: %d\n",sum);
    printf("Maximum: %d\n" , max);
    printf("Minimum: %d\n", mini);
    printf("Average: %g\n" , avg);


    //printf("Median: %2.2f\n", median);
    printf("Median:= %d\n" ,a[i]);


    printf("Sorted: ");
    for( int n = 0; n < 10; n++ ) {
        printf("%i ", a[n]);
    }
    return (0);

}

2 个答案:

答案 0 :(得分:4)

问题:

根据median

的定义

这种方法:

int medianNumber= i/2;
int median=a[medianNumber];

仅适用于一组奇数。

使用以下内容覆盖奇数和偶数集:

//if even number of elements, median is average of two middle values
int medianNumber = 0;
float median = 0;
if(i%2 == 0)//even number of elements
{
    medianNumber= (i/2)-1;//zero based indices
    median=(a[medianNumber]+a[medianNumber+1])/2.0;
}
else // odd number of elements
{
    medianNumber= (i/2);//zero based indices
    median=a[medianNumber];       
}

此外,当此for循环退出时,

for(i=0;i<10;i++)
{
    ...
}

i的值将是10,从而导致数组索引越界错误:

//printf("Median: %2.2f\n", median);
printf("Median:= %d\n" ,a[i]);
                          ^

我认为您打算使用索引值a[medianNumber],或更合适的话,使用您为median确定的值

printf("Median:= %d\n" ,median);

以下完整代码包括一些附加的修正和一条#define ELEMENTS语句,以使测试evenodd数量的元素更易于编辑。

#define ELEMENTS 9  //test for odd and even values

int main(void) {
    printf("Hello, World!\n");
//
    int a[10],i,sum=0;
    printf("enter array\n");
    for(i=0;i<ELEMENTS;i++)
    {
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }

    int max = maximum(a);
    int mini = minimum(a);

    float avg =(float ) sum/ELEMENTS;
    qsort(a, ELEMENTS, sizeof(int), cmpfunc);

    //if even number of elements, median is average of two middle values
    int medianNumber = 0;
    float median = 0;
    if(i%2 == 0)//even number of elements
    {
        medianNumber= (i/2)-1;//zero based indices
        median=(a[medianNumber]+a[medianNumber+1])/2.0;
    }
    else // odd number of elements
    {
        medianNumber= (i/2);//zero based indices
        median=a[medianNumber];       
    }

    printf("Sum: %d\n",sum);
    printf("Maximum: %d\n" , max);
    printf("Minimum: %d\n", mini);
    printf("Average: %g\n" , avg);

    printf("Median:= %0.3f\n" ,median);

    printf("Sorted: ");
    for( int n = 0; n < ELEMENTS; n++ ) {
        printf("%i ", a[n]);
    }
    return 0;

}

答案 1 :(得分:1)

问题出在这一行:

printf("Median:= %d\n" ,a[i]);

您要在数组中打印元素i指定的元素,但是i只是一个循环计数器。 运行循环后,i = 10。

但是您正在此处计算中位数的正确数组位置:

int medianNumber= i/2;
int median=a[medianNumber];

因此,您应该打印medianNumber指定的数组元素,如下所示:

printf("Median:= %d\n" ,a[medianNumber]);

如果要取值a [4]和a [5]的平均值来发现中位数,则需要执行以下操作:

float median = ((float)a[4] + (float)a[5]) / 2;

,然后您的打印语句应如下所示:

printf("Median:= %g\n" , median);

打印时,%f将打印您每次告诉它要打印的小数,因此%2.2f将始终打印两位小数。 %g仅会显示不为零的小数,并且会省略尾随的零。

相关问题