Найти медиану из отсортированного массива с помощью функции в c - PullRequest
0 голосов
/ 30 октября 2019

У меня есть программа, которая берет целые числа из массива и распечатывает самый большой, самый маленький, средний и список сортировки. Мне нужна помощь с функцией, чтобы найти медиану, а затем распечатать ее. Кроме того, мое среднее значение показывает только целые числа и не цифры, как я думал, когда я использую float. Но поиск медианной функции - важная часть.

#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;

}

Ответы [ 3 ]

1 голос
/ 30 октября 2019

ваше среднее значение округляется до целого числа, потому что оба значения sum и count являются целыми числами. Затем в строке avg = sum/count сначала вычисляется sum/count, которая округляется, затем приводится к числу с плавающей точкой и присваивается значению avg. Это можно легко исправить, сначала приведя значения к плавающим значениям, а затем выполнив деление:

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

Что касается медианы, поскольку входной массив отсортирован, вы можете просто найти длину и индексировать среднее значение,Если длина четная, просто возьмите среднее из двух средних значений.

0 голосов
/ 30 октября 2019

Я выяснил, почему работает средняя дидентная система, при создании функции я использовал среднее значение вместо среднего. Я также узнал, как сделать функцию для медианы. Полный код ниже

#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;

}
0 голосов
/ 30 октября 2019

сначала последовательность последовательности от большого к маленькому лизину, затем count / 2, получив индексированный элемент, должен int medianNumber=count/2; int median=number[medianNumber];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...