2013-07-30 2 views
0

Я использую следующий код (и работает, как ожидалось) для находки Q1, Q2 и Q3, но я не могу писать set_qrt() используя только int «S и % для нахождения положенияFinding квартили без удваивается

для 1.0, 2.0, 3.0 квартилей должно быть Q1 = 1.5; Q2 = 2,0; Q3 = 2,5

для 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 квартиль должен быть Q1 = 2.0; Q2 = 3,5; Q3 = 5,0

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

typedef struct { 
    double qrt[3]; 
    double *value; 
    int count; 
} t_data; 

static void set_qrt(t_data *data, int qrt) 
{ 
    int n, e; 
    double d; /* I want to avoid that */ 

    d = qrt * data->count * 0.25 + 0.5; 
    n = (int)d; 
    e = n != d; 
    data->qrt[qrt - 1] = data->value[n - 1]; 
    if (e) { 
     data->qrt[qrt - 1] += data->value[n]; 
     data->qrt[qrt - 1] *= 0.5; 
    } 
} 

static void set_qrts(t_data *data) 
{ 
    set_qrt(data, 2); 
    if (data->count > 1) { 
     set_qrt(data, 1); 
     set_qrt(data, 3); 
    } else { 
     data->qrt[0] = 0.0; 
     data->qrt[2] = 0.0; 
    } 
} 

static int comp(const void *pa, const void *pb) 
{ 
    const double a = *(const double *)pa; 
    const double b = *(const double *)pb; 

    return (a > b) ? 1 : (a < b) ? -1 : 0; 
} 

int main(void) 
{ 
    double values[] = {1.0, 2.0, 3.0}; 
    t_data data; 

    data.value = values; 
    data.count = (int)(sizeof(values)/sizeof(double)); 
    qsort(data.value, data.count, sizeof(double), comp); 
    set_qrts(&data); 
    printf("Q1 = %.1f\nQ2 = %.1f\nQ3 = %.1f\n", data.qrt[0], data.qrt[1], data.qrt[2]); 
} 
+0

Ваши значения данных здесь являются поплавками. Вы как бы застряли в использовании поплавков для статистики, если это так. Если они фактически являются целыми числами, то для точного представления квартилей вам придется их вычислять * 4. –

ответ

1

Я не уверен, что вы хотите, но если вы хотите изменить тезисы две строки:

d = qrt * data->count * 0.25 + 0.5; 
n = (int)d; 

и не используя д непосредственно получить целое значение, то просто нужно сделать:

n = (qrt * data->count +2)/4; 

и проверить, если это реальное число просто truncature:

e = ((qrt * data->count +2) % 4) != 0; 

Таким образом, вы узнаете, является ли n десятичным, и вы получите его значение

+0

Спасибо, но я даю 'Q1 = 1.0; Q2 = 2,5; Q3 = 2.0' для '1.0, 2.0, 3.0' –

+0

Фактически, я допустил ошибку в своем алгоритме. Теперь это исправлено: == должно было быть a = = –

+0

, если ((qrt * data-> count * 0.25) - 0.5) целое число выбираем (положение - 1) иначе мы выбираем (((позиция - 1) + позиция)/2) –

Смежные вопросы