C++ 计算给定数字列表的四分位数

C++ 计算给定数字列表的四分位数,c++,quartile,C++,Quartile,我正在尝试完成“加速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 * n

我正在尝试完成“加速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;
}
/*编写一个程序来计算和打印四分位数(四分之一)
*一组整数中具有最大值的数)
*第一个四分位数(Q1)被定义为数据集最小数和中位数之间的中间数。
*第二个四分位数(Q2)是数据的中位数。
*第三个四分位数(Q3)是数据集中值和最高值之间的中间值*/
#包括
#包括
#包括
#包括
#包括
#包括
使用std::vector;
使用std::endl;
使用std::cout;
使用std::cin;
int main(){
双x=0;
双中位数,低QT,高QT;
中位数=下限QT=上限QT=0;
向量集;
typedef vector::size_type vec_sz;
cout>x)
设置。推回(x);
vec_sz size=set.size();
如果(大小==0){

对于初学者来说,你的代码有点乱,很难阅读。如果你使用现代C++编译器,你就不需要那些愚蠢的Type。你可以使用类型推断:

auto size = set.size();
使用
size%2==0
作为一个布尔值是很麻烦的,它通常写为
(size%2)
为了清晰起见,最好只使用一次该表达式

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

  • 使用中间值将有序数据集分成两半

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

    • 如果原始有序数据集中有偶数个数据点,请将此数据集精确拆分为两半

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

  • 我想,你期待Tukey的铰链(中铰链)一个

  • 使用中间值将有序数据集分成两半

    • 如果原始有序数据集中有奇数个数据点,将中位数(有序列表中的中心值)包含在两半中
    • 如果原始有序数据集中有偶数个数据点,请将此数据集精确拆分为两半
  • 下四分位值是数据下半部分的中值。上四分位值是数据上半部分的中值

  • 若关于统计的书太离谱,那个么维基和应用数学stackexchange中描述了一些算法

    研究您的代码行为:您只需除以数组大小即可计算“mid”,若取上或下“middle”,则不受控制值。为什么?理论上,如果计数不均匀,如果四舍五入,你总是取上限值,但事实上,你只取下限值,因为你用整数值运算,除法的结果会被截断。对于size=11,你的mid将是5。那么“上限”索引会怎么样

    应该是

    auto upper = (size + mid)/2;
    

    对于初学者来说,这将给出一个正确的答案:60 75,90, < P>,代码有点凌乱,难以阅读。如果使用现代C++编译器,就不需要那些愚蠢的Type。
    auto size = set.size();
    
    使用
    size%2==0
    作为一个布尔值是很麻烦的,它通常写为
    (size%2)
    为了清晰起见,最好只使用一次该表达式

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

  • 使用中间值将有序数据集分成两半

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

    • 如果原始有序数据集中有偶数个数据点,请将此数据集精确拆分为两半

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

  • 我想,你期待Tukey的铰链(中铰链)一个

  • 使用中间值将有序数据集分成两半

    • 如果原始有序数据集中有奇数个数据点,将中位数(有序列表中的中心值)包含在两半中
    • 如果原始有序数据集中有偶数个数据点,请将此数据集精确拆分为两半
  • 下四分位值是数据下半部分的中值。上四分位值是数据上半部分的中值

  • 若关于统计的书太离谱,那个么维基和应用数学stackexchange中描述了一些算法

    研究您的代码行为:您仅通过除以数组的大小来计算“中间值”,如果取“中间值”的上限或下限,则无法控制。为什么?理论上,在计数不均匀的情况下,您总是取上限值,如果向上取整,则b