对于以下代码,输入为:
第一次输入= 0 1 2 3 4 5 6 7 8 9
第二次输入= 1 2 3 4 5 6 7 8 9 10
它将产生以下输出:
第一个输出= 0
第二次输出= 1
而不是取每个输入四分位数它取第一个元素,问题是(在测试之后),它跟随代码中的问题
for (vector<int>::size_type counter = 0; (quartiles < quadro) && (counter < numstore.size()); ++counter)
{
if (counter == (quartiles/quadro * numstore.size()))
{
quaele.push_back(numstore[counter]);
if ((quartiles == 2) && (numstore.size() / 2 == 0))
quaele[quartiles-1] = (numstore[counter]+numstore[counter-1]) / 2;
++quartiles;
}
// test
cout << quartiles;
}
其中“if function”中的条件不起作用,我的意思是第一个循环,counter == 0
,0 == 1(quartiles)/4(quadro) * 10(numstore.size()
怎么可能?
答案 0 :(得分:4)
因为quartiles
和quadro
都是整数,而第一个总是小于第二个(因为那是for
语句所说的),表达式为:
quartiles / quadro * numstore.size()
总是等于零,因为首先计算quartiles / quadro
。因此,if
语句只有在第一次循环时才会成立。
您可以通过重新安排计算来解决这个问题:
quartiles * numstore.size() / quadro
答案 1 :(得分:2)
这就是整数运算的工作原理。 1/4
被截断为零。
您可以通过先乘以
来获得正确的结果(向下舍入到最接近的整数)(quartiles * numstore.size()) / quadro
我已经使用括号使评估顺序清晰 - 如果您愿意,可以将它们排除在外。
请注意,对于较大的值,您需要注意乘法不会溢出 - 可能是通过转换为更宽的类型或浮点,或者通过小心地乘以除以较小的因子。在这种情况下,这可能不是问题。
答案 2 :(得分:0)
对于四分位数= 1且quadro = 4的情况,表达式quartiles/quadro * numstore.size()
将为0.这是因为1/4向下舍入为0.
也许这就是你的意思:(quartiles * numstore.size()) / quadro
答案 3 :(得分:0)
quartiles / quadro等于0.25,因为四分位数是int quartiles / quadro == 0
答案 4 :(得分:0)
在C++
中,当你除以两个整数时,你得到整数除法。此外,*
和/
具有相同的优先级,因此解析器将其解释为(quartiles / quadro) * numstore.size()
。 (1 / 4)
等于0
。
答案 5 :(得分:0)
在C ++中,除法运算符可以被认为是两个不同的运算符:一个用于整数操作数,另一个用于浮点操作数。如果操作数是浮点类型,则除法运算符将返回浮点值。
http://www.learncpp.com/cpp-programming/eight-c-programming-mistakes-the-compiler-wont-catch/
尝试:
float result = quartiles/quadro * numstore.size();
编辑:感谢评论。
float result = quartiles/(float)quadro * numstore.size();
将其中一个操作数转换为浮点数就足够了。