【问题标题】:Find median from a sorted array using a function in c使用c中的函数从排序数组中查找中位数
【发布时间】:2020-02-25 04:03:27
【问题描述】:

我有一个程序,它从数组中获取整数并打印出最大、最小、平均值和排序列表。我需要一个函数来找到中位数,然后打印出来。此外,我的平均值只显示整数,没有数字,就像我使用浮点数时所认为的那样。但找到一个中值函数是重要的部分。

#include <stdio.h>

#define NUMBERS_SIZE 5

int sum(int numbers[], int count)
{

    int sum = 0;

    for (int i = 0; i < count; i++)
        sum += numbers[i];

    return sum;
}


int maximum(int numbers[], int count)
{
    int a;


    int max = numbers[0];


    for (a = 1; a < count; a++)
        if (numbers[a] > max)
            max = numbers[a];

    return max;
}

int minimum(int numbers[], int count)
{
    int a;


    int min = numbers[0];


    for (a = 1; a < count; a++)
        if (numbers[a] < min)
            min = numbers[a];

    return min;
}

int average(int numbers[], int count)
{
    float avg;
    int sum = 0;

    for (int i = 0; i < count; i++)
        sum += numbers[i];

    avg = sum/count;

    return avg;
}

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




int main()
{
    int numbers[NUMBERS_SIZE];

    int n;

    float median=0;

    for (int i = 0; i < NUMBERS_SIZE; i++)
    {
        printf("Enter integer: ");
        scanf("%i", &numbers[i]);
    }

    int result3 = sum(numbers, sizeof(numbers) / sizeof(numbers[0]));
    printf("The sum is: %i\n", result3);



    int count3 = sizeof(numbers)/sizeof(numbers[0]);
    printf("Largest number entered is: %d\n", maximum(numbers, count3));

    int count1 = sizeof(numbers)/sizeof(numbers[0]);
    printf("Smallest number entered is: %d\n", minimum(numbers, count1));

    int count4 = sizeof(numbers)/sizeof(numbers[0]);
    printf("Average is %d\n", average(numbers, count4));



    qsort(numbers, NUMBERS_SIZE, sizeof(int), cmpfunc);

    printf("\nSorted: \n");
    for( n = 0 ; n < NUMBERS_SIZE; n++ ) {
        printf("%d ", numbers[n]);
    }


    return 0;

}

【问题讨论】:

  • 计算平均值为avg = (float)sum/count 以将sum 转换为浮点数。否则,C 将首先进行整数除法,然后将该整数结果分配给avg
  • 请解释计算中位数的确切问题以及您尝试的方法。

标签: c arrays function median


【解决方案1】:

您的平均值四舍五入为整数值,因为sumcount 都是整数。然后,在avg = sum/count 行上,它首先计算sum/count,并对其进行四舍五入,然后将其转换为浮点数并分配给avg。您可以通过先将值转换为浮点数,然后执行除法来轻松解决此问题:

avg = (float) sum / (float) count;

至于中位数,由于输入数组是排序的,所以只要找到长度并索引中间值即可。如果长度是偶数,取两个中间值的平均值。

【讨论】:

    【解决方案2】:

    首先将序列从大到小lisin然后count / 2通过获取索引元素应该 int medianNumber=count/2; int median=number[medianNumber];

    【讨论】:

    • 嗨@deniz kaya,你能用一些工作代码来说明你的想法吗?也许尝试在解释的同时指出可能的更正。
    【解决方案3】:

    我发现了为什么平均没有工作,我在制作函数时使用了 int average 而不是 float average。我还发现了如何为中值创建函数。完整代码如下

    #include <stdio.h>
    #include <stdlib.h>
    
    #define NUMBERS_SIZE 10
    
    int sum(int numbers[], int count)
    {
    
    int sum = 0;
    
    for (int i = 0; i < count; i++)
        sum += numbers[i];
    
    return sum;
    }
    
    
    int maximum(int numbers[], int count)
    {
    int a;
    
    
    int max = numbers[0];
    
    
    for (a = 1; a < count; a++)
        if (numbers[a] > max)
            max = numbers[a];
    
    return max;
    }
    
    int minimum(int numbers[], int count)
    {
    int a;
    
    
    int min = numbers[0];
    
    
    for (a = 1; a < count; a++)
        if (numbers[a] < min)
            min = numbers[a];
    
    return min;
    }
    
    float average(int numbers[], int count)
    {
    float avg;
    int sum = 0;
    
    for (int i = 0; i < count; i++)
        sum += numbers[i];
    
    avg = (float)sum/(float)count;
    
    return avg;
    }
    
    int cmpfunc (const void * a, const void * b) {
    return ( *(int*)a - *(int*)b );
    }
    
    
    float median(int numbers[] , int count)
    {
    float medi=0;
    
    // if number of elements are even
    if(count%2 == 0)
        medi = (numbers[(count-1)/2] + numbers[count/2])/2.0;
        // if number of elements are odd
    else
        medi = numbers[count/2];
    
    return medi;
    }
    
    
    int main()
    {
    int numbers[NUMBERS_SIZE];
    
    int n;
    
    float medi=0;
    
    
    int count = sizeof(numbers)/ sizeof(numbers[0]);
    
    for (int i = 0; i < NUMBERS_SIZE; i++)
    {
        printf("Enter integer: ");
        scanf("%i", &numbers[i]);
    }
    
    
    
    
    
    
    
    
    
    
    printf("Minimum: %d\n", minimum(numbers, count));
    
    printf("Maximum: %d\n", maximum(numbers, count));
    
    printf("Sum: %i\n", sum(numbers, count));
    
    
    printf("Average: %g\n", average(numbers, count));
    
    
    
    qsort(numbers, NUMBERS_SIZE, sizeof(int), cmpfunc);
    
    printf("Sorted: ");
    for( n = 0 ; n < NUMBERS_SIZE; n++ ) {
        printf("%d ", numbers[n]);
    }
    
    
    
    medi = median(numbers , count);
    
    printf("\nMedian: %f\n", medi);
    
    return 0;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2013-06-06
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多