C++ 计算给定数字列表的四分位数
我正在尝试完成“加速C++”练习3-2。我已经测试过,下四分位和中间值的计算是正确的,但上四分位不是 例如,假设输入“50、60、70、80、90、100”,它将输出四分位数为60、75和80 我想谈两个问题: 1) 在这种情况下,上四分位数应该是90。 2) 如何让我的程序显示我的数字的浮点或双精度版本?较低的四分位数更精确的是62.5,而不是60C++ 计算给定数字列表的四分位数,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
/* 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