Вычислить квартили заданного списка чисел

Я пытаюсь выполнить упражнение «Ускоренный C ++» 3-2. Я проверил, и нижний квартиль и медианы рассчитываются правильно, а верхний квартиль — нет.

Например, если ввести «50, 60, 70, 80, 90, 100», он будет выводить квартили как 60, 75 и 80.

У меня есть два вопроса, которые я хочу решить:

1) Верхний квартиль в этом случае должен быть 90.
2) Как мне заставить мою программу отображать число с плавающей запятой или двойную версию моих чисел? Более точный квартиль для нижнего равен 62,5, а не 60.

/* Write a program to compute and print the quartiles(quarter of the
* numbers with the largest values) of a set of integers
* The first quartile (Q1) is defined as the middle number between the smallest number and the median of the data set.
* The second quartile (Q2) is the median of the data.
* The third quartile (Q3) is the middle value between the median and the highest value of the data set.*/

#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>

using std::vector;
using std::endl;
using std::cout;
using std::cin;

int main() {
double x = 0;
double median, lowerQt, upperQt;
median = lowerQt = upperQt = 0;
vector<double> set;
typedef vector<double>::size_type vec_sz;

cout << "Enter integers followed by EOF: ";

while(cin >> x)
set.push_back(x);

vec_sz size = set.size();
if(size == 0) {
cout << "invalid" << endl;
return 1;
}

vec_sz mid = size / 2;
vec_sz lower = mid / 2;
vec_sz upper = size - mid;

sort(set.begin(), set.end());

median = size % 2 == 0 ? (set[mid] + set[mid - 1]) / 2 : set[mid];
lowerQt = mid % 2 == 0 ? (set[lower] + set[lower - 1]) / 2 : set[lower];
upperQt = mid % 2 == 0 ? (set[upper] + set[upper - 1]) / 2 : set[upper];

cout << lowerQt << endl << median << endl << upperQt;
}

0

Решение

для начала, ваш код немного грязный и трудно читаемый. Если вы используете современный компилятор C ++, вам не нужен этот глупый typedef. Вы можете использовать тип удержания:

auto size = set.size();

С помощью size % 2 == 0 поскольку логическое значение является полным, оно обычно записывается как (size % 2) Было бы разумно для ясности использовать это выражение только один раз

Существует три метода для определения квартилей, и они дают разные ответы, ваш код не соответствует двум из них (потому что каждый метод проверяет фактическое количество элементов в наборе данных). Код это соответствует методу «1-Var Stats» это не вернет нужное вам значение из-за ошибки.

  1. Используйте медиану, чтобы разделить упорядоченный набор данных на две половины.

    • Если в исходном упорядоченном наборе данных есть нечетное количество точек данных, не включать медиана (центральное значение в упорядоченном списке) в любой половине.

    • Если в исходном упорядоченном наборе данных имеется четное количество точек данных, разделите этот набор данных ровно пополам.

  2. Нижняя квартиль — это медиана нижней половины данных. Значение верхнего квартиля — это медиана верхней половины данных.

Я думаю, вы ожидаете, что петли Тьюки (середина) один?

  1. Используйте медиану, чтобы разделить упорядоченный набор данных на две половины.

    • Если в исходном упорядоченном наборе данных есть нечетное количество точек данных, включают медиана (центральное значение в упорядоченном списке) в обеих половинах.
    • Если в исходном упорядоченном наборе данных имеется четное количество точек данных, разделите этот набор данных ровно пополам.
  2. Нижняя квартиль — это медиана нижней половины данных. Значение верхнего квартиля — это медиана верхней половины данных.

Если книга по статистике слишком далека, есть алгоритмы, описанные в вики и о применении математического стека обмена.

Изучение поведения вашего кода: вы вычисляете «середину» просто путем деления размера массива, не контролируя, если вы берете верхнее или нижнее «среднее» значение. Зачем? Теоретически в случае неравномерного подсчета вы всегда будете принимать верхнее значение, если округлять, но на самом деле вы берете только нижнее значение, потому что вы оперируете целочисленными значениями, где результат деления будет усечен. Для размера = 11 ваш средний будет 5. И что происходит с «верхним» индексом?

auto upper = size - mid;   //? upper = 6 That's not right

должно быть

auto upper = (size + mid)/2;

Это дало бы правильный ответ для первого метода: 60 ​​75 90

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]