正如标题所示,我正在努力学习如何打印出矢量的平均值。可以通过以下方式完成:
int avgVec(const vector<int> & x)
{
int sum=0;
for(int i=0; i<x.size(); ++i)
{
sum+=x[i];//sets sum to vector size
}
return sum/x.size(); //Now calculates the average
}
这个设置是否正确?
现在有问题的向量从用户那里获取输入,应该设置为:
vector<int> myVec;
int i;
do
{
cin >> i;
myVec.push_back(i);
}while(i>0);
这是否也已正确设置?
现在为了打印平均值,我会去制作打印功能,或者只是在做完之后:
avgVec(myVec);
我打印出myVec,还是我以错误的方式解决了这个问题? 我已经执行了代码并且实际上确实计算了平均值,但它只输入了第一个数字,这使得平均值为1。 我觉得我就在那里,但有一部分不是点击。
答案 0 :(得分:2)
此代码段错误
vector<int> myVec;
int i;
do
{
cin >> i;
myVec.push_back(i);
}while(i>0);
因为您将输入一个非正数,这是向量的最后一个数字将是非正数。
有效代码看起来像
vector<int> myVec;
int i;
while ( cin >> i && i > 0 ) myVec.push_back(i);
该函数也是错误的,因为没有什么能阻止向量为空。所以我会用以下方式写它
int avgVec( const vector<int> & v )
{
int sum = 0;
for ( int x : v ) sum += x;
return v.empty() ? 0 : sum / v.size();
}
答案 1 :(得分:2)
您的代码的主要问题是您使用整数算术。
E.g。整数运算7/3→2,余数为1。
相反,例如1.0*std::accumulate( v.begin(), v.end(), 0 )/v.length()
,乘以1.0
强制转换为double
(C和C ++中的默认浮点类型),并返回double
。
乘以1.0
的替代方法是使用明确的static_cast
,这更通用,但也更详细。
对于这种情况,另一种替代方案,不那么通用但更优雅,是使用0.0
而不是整数0
作为std::accumulate
的起始值,如KitsuneYMG所述在a comment。这是有效的,因为起始值确定了累积的值类型及其结果。
另外,请注意您当前的输入代码会推送堆栈上的最后一个非正输入值,因此如果用户输入0作为最后一个值,它将对计数有贡献但不会对总和产生影响,从而降低平均值有点......
答案 2 :(得分:1)
使用C ++标准库:
double avgVec(std::vector<int> const&v) // note: the average must not be an integer
{
return v.empty()? 0.0 :
std::accumulate(v.begin(), v.end(), 0.0)) / v.size();
}
答案 3 :(得分:0)
惯用语C ++是:
int avgVec(const std::vector<int> & x)
{
int sum = 0;
for(std::vector<int>::iterator it = x.begin(); it != x.end(); ++it)
sum += *it;
return sum / x.size();
}
答案 4 :(得分:0)
看起来你使用零来停止输入循环,但仍然将它包含在向量中。这可能是您的意图,但确实会影响结果。