2017-05-04 42 views
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; 
} 
+0

上四分位数,最精确的四分之一?我只知道第一,第二和第三四分位数,任何单个项目都可能“处于上四分位数”。 – Swift

+0

我指的是第一个四分位数为“下”,第三个为“上”。 –

回答

1

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

auto size = set.size(); 

使用size % 2 == 0为布尔拗口,它通常写为(size % 2)不过还是谨慎为清楚起见使用表达式只有一次

有三种方法来确定位数和他们给出了不同的答案,你的代码不匹配其中的两个(因为每个方法都会检查数据集中的实际项目数).Code it它与“1-Var Stats”方法相匹配,不会返回所需的值由于错误。

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

    • 如果在原来的奇数个数据点的有序数据集,不包括在上下半场的中位数(排序列表中的中间值)。

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

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

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

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

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

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

研究你的代码行为:如果你采用上或下“中”值,你只需通过分割数组大小来计算“mid”。为什么?理论上,如果计数不均匀,则总是会取上限值,如果四舍五入,但实际上只取较低值,因为您使用整数值进行操作,其中除法结果将被截断。对于大小= 11,你的中间会是5.而“上”索引会发生什么?

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

应该

auto upper = (size + mid)/2; 

这将给予适当的答案第一种方法:60 75 90