0

我正在尝试完成“加速 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;
}
4

1 回答 1

2

对于初学者来说,您的代码有点混乱且难以阅读。如果您使用现代 C++ 编译器,则不需要那种愚蠢的 typedef。您可以使用类型推导:

auto size = set.size();

size % 2 == 0用作布尔值是满嘴的,通常(size % 2)写为

有三种方法可以确定四分位数,它们给出不同的答案,您的代码与其中两个不匹配(因为每种方法都会检查数据集中项目的实际计数)。对其进行编码它与“1-Var Stats”方法匹配由于错误,它不会返回您需要的值。

  1. 使用中位数将有序数据集分成两半。

    • 如果原始有序数据集中有奇数个数据点,则不要在任何一半中包含中位数(有序列表中的中心值)。

    • 如果原始有序数据集中有偶数个数据点,则将该数据集精确地分成两半。

  2. 下四分位数是数据下半部分的中位数。上四分位数是数据上半部分的中位数。

我想,你期待 Tukey 的铰链(midhinge)一个吗?

  1. 使用中位数将有序数据集分成两半。

    • 如果原始有序数据集中有奇数个数据点,则在两半中包括中位数(有序列表中的中心值)。
    • 如果原始有序数据集中有偶数个数据点,则将该数据集精确地分成两半。
  2. 下四分位数是数据下半部分的中位数。上四分位数是数据上半部分的中位数。

如果关于统计的书离得太远,在 wiki 和应用数学 stackexchange 中有描述的算法。

研究您的代码行为:您仅通过除以数组的大小来计算“中间”,如果您采用较高或较低的“中间”值,则无法控制。为什么?理论上,在计数不均匀的情况下,如果四舍五入,您总是会取较高的值,但实际上您只取较低的值,因为您使用整数值进行运算,除法的结果将被截断。对于 size = 11,您的中间值为 5。“上”索引会发生什么情况?

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

应该

auto upper = (size + mid)/2;

这将为第一种方法提供正确的答案:60 75 90

于 2017-05-04T20:49:44.050 回答