它可能是一个简单的解决方案,但我仍然是编程的新手,它说我的ivec是未声明的。以下是说明和我的代码:
这是我的代码
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
//prototype
double mean(vector<int> & data);
int main()
{
const int SIZE = 10;
vector<int> ivec(SIZE);
int srand(time(0));
double m;
for(int i = 0; i < ivec.size(); i++)
{
ivec[i] = rand() % 99 + 1;
}
m = mean(ivec);
for(int i = 0; i < ivec.size(); i ++)
{
ivec[i] = ivec[i] - mean;
}
return 0;
}
double mean(vector<int> & data)
{
double dSum = 0;
for(int i = 0; i < ivec.size; i++)
{
dSum += data[i];
}
return dSum/ivec.size;
}
它说我的ivec是未宣布的,所以我将如何申报。我很感激帮助
答案 0 :(得分:6)
mean
函数的参数名为data
,因此您需要使用该参数:
double mean(const vector<int>& data)
{
double dSum = 0;
for(int i = 0; i < data.size(); i++)
{
dSum += data[i];
}
return dSum/data().size;
}
另请注意,size
是成员函数,因此您需要调用size()
。此外,矢量应该通过const
引用传递,因为它没有被修改。
注意:计算平均值的惯用方法是使用std::accumulate
:
if (!ivec.empty())
{
double mean = std::accumulate(ivec.begin(), ivec.end(), 0.0)/ivec.size();
}
答案 1 :(得分:0)
你在函数意义上有几个错误。首先,std :: vector没有名称大小的数据成员。它有一个名称大小的成员函数。所以不是例如表达式
ivec.size
必须有
ivec.size()
第二个错误是你不得不使用名称数据,因为在这个函数中没有声明名称ivec。
因此该函数应该看起来像
double mean( const vector<int> &data )
{
double dSum = 0.0;
for ( std::vector<int>::size_type i = 0; i < data.size(); i++ )
{
dSum += data[i];
}
return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}
我将参数的类型更改为const vector<int> &
,因为函数中的矢量本身没有更改。
将普通for语句替换为基于范围的for语句会更好。在这种情况下,该函数将显示为
double mean( const vector<int> &data )
{
double dSum = 0.0;
for ( int x : data ) dSum += x;
return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}
这两个陈述
double dSum = 0.0;
for ( int x : data ) dSum += x;
实际上对应于标准算法std::accumulate
所以你可以写(如果你包括标题<numeric>
)
#include <numeric>
//...
double mean( const vector<int> &data )
{
double dSum = std::accumulate( data.begin(), data.end(), 0.0 );
return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}
还要考虑到您的计划不能完全满足作业。在作业中写了
Query the user for a size.
Create a vector of the size specified by the user.
此循环之后
for(int i = 0; i < ivec.size(); i ++)
{
ivec[i] = ivec[i] - mean;
}
我认为你应该输出用于显示其元素的新值的向量。