我需要帮助修正我的中位数计算。当我尝试打印中间值时,它打印错误。这是我的代码。我需要帮助来确定通过排序数字的中位数。该程序从数组中读取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);
}
答案 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
语句,以使测试even
和odd
数量的元素更易于编辑。
#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仅会显示不为零的小数,并且会省略尾随的零。