2015-05-31 144 views
0

我一直在试图创建一个函数,它将数字带入矢量(准确的说是7),并计算平均值。不过,我尝试将每个向量元素初始化为用户输入的数字。例如:初始化矢量(C++)

double average(int a, int b, int c, int d, int e, int f, int g) 
vector<double>aa; 
aa[0]=int a; 
aa[1]=int b; 
aa[2]=int c; etc. 

但是,当我这样做,我得到

error: expected primary-expression before ‘int’

当我将其更改为

for(size_t j=0; j<=7; j++) 
{ 
    cout<<"Enter item # " <<(j+1); 
    cin>>a[j]; 
} 

我得到

invalid types ‘int[size_t {aka unsigned int}]’ for array subscript cin>>a[j];

我的新节目,并且可能无法理解复杂的答案。 如果之前有人问过这个问题,我很抱歉。我使用Linux Ubuntu编译我的代码(Terminal,g ++)。

N.B.我们的讲师对这个答案是:

double average (const vector<int>& v) 
{ 
    int N = v.size(); 
    int sum = 0; 
    for (int i = 0; i < N; i = i + 1) 
    { 
     sum = sum + v[i]; 
    } 
    return static_cast<double>(sum)/(N); 
} 

(我认为我是错的,因为他提出要“通过引用函数调用”,我想我“按值调用”创建我有一个不知道他写的东西(尤其是return static_cast<double>(sum)/(N);

+1

所以你有一个问题陈述,你的讲师提供了一个正确的解决方案。你的问题到底是什么? – nvoigt

+0

他的回答困惑了我。 –

回答

5

你真的应该拿起你的课本,并开始阅读,最好是昨天。不过,我会分别讨论每个部分。

你的代码(轻微改变)

double average(int a, int b, int c, int d, int e, int f, int g) 
{ 
    vector<double>aa; 
    aa[0]=int a; 
    aa[1]=int b; 
    aa[2]=int c; 
    // etc. 
} 

有几个问题。您收到的错误归因于所有看起来像aa[0]=int a;的行。int这个词不应该在那里。如果删除它们,它应该编译并在运行时崩溃,因为aa的大小仍为0。您可以预先分配矢量(vector<double> aa(7);)或使用aa.push_back(aa);

在你的第二次尝试

for(size_t j=0; j<=7; j++) 
{ 
    cout<<"Enter item # " <<(j+1); 
    cin>>a[j]; 
} 

对于初学者来说,第一行应该是for(size_t j=0; j<7; j++)(缺少=)。 a应该是第一次尝试时的vector<double>,而不是函数参数。

你的讲师代码具有行

double average (const vector<int>& v) 

v&告诉它不是变量v的接收复印件(按价值计算)的函数,而是原件(供参考)。通常,这意味着如果函数改变了它的值,那么调用函数副本就会改变。但是,在这里有一个神奇的字const,它禁止函数更改值。

最后,static_cast<double>是将变量类型从int转换(变更)为double的一种形式。原因是3/2 == 13.0/2 == 1.5

0

const vector<int>& v - >这表示通过其元素由const参考是int类型的载体,即不能更改v(添加/删除/插入/调整)

for部分是for循环,从循环到v.size()-1即C++中的数组索引从0开始,因此为矢量编制索引。因此,第一元件为v [0],等等...

sum = sum + v[i] - >这执行的v的所有元素的总和

最后,需要通过在V族元素的数量来划分以计算平均值。但intstd::size_t将不会给你一个小数位的结果。因此,您需要将值转换为double。因此static_cast<double>(sum)/(N)

至于初始化std::vector,使用这样的:

std::vector<int> v ; 
int temp = 0 ; 
while(true) { 
    std::cin >> temp ; 
    if(temp == -1) 
     break ; 
    v.push_back(temp); 
} 

将上面的代码读取输入并且遇到直到-1插入载体。

0

在代码

vector<double>aa; 
aa[0]=int a; 
aa[1]=int b; 
aa[2]=int c; 

其原因来自编译器的误差是在各指配的int关键字的存在。删除它们。

编译器不会抱怨的另一个问题是默认情况下创建的矢量的大小为0。接下来的问题是,vectoroperator[](由表达式aa[0]等调用)不会根据需要神奇地调整矢量大小。如果索引无效,则行为未定义。

因此,在尝试分配其元素之前,需要调整矢量大小。

vector<double>aa (some_integer_greater_than_2); 
aa[0]=a; 
aa[1]=b; 
aa[2]=c; 

vector<double>aa; 
aa.resize(some_integer_greater_than_2) 
aa[0]=a; 
aa[1]=b; 
aa[2]=c; 

如果你不知道向量提前大小,使用push_back()(其中添加一个元素到最后,根据需要调整)。

vector<double>aa; 
aa.push_back(a); //since initial size is zero, this (in effect) resizes and copies a to aa[0] 
aa.push_back(b); //since size is now 1, this (in effect) resizes and copies b to aa[1] 
aa.push_back(c); //since size is now 2, this (in effect) resizes and copies c to aa[1] 
0

我是个新手,但刚从长期其中的一个出现了“为什么在所有的名字好,油性没有这个工作”的时刻试图输入整数到所定义的矢量最大尺寸,我提供这个笔记。我的错误是,在定义我的矢量的最大尺寸 - 矢量麻木(25) - 我无意中使用了括号而不是parens - 即矢量麻木[25] - 带来了最令人困惑的失败输入阶段 - 即,cin >>麻木[i]。这里是主题代码:

#include <iostream> 
#include <vector> 
using namespace std; 
int main() 
{ 
    int size, i; 
    vector<int> numbs(25); //error was using brackets instead of parens 
    cout << "Please enter the size of the vector you wish to create (<25)";  
    cin >> size; 
    cout << "Please enter " << size << " integers: "; 
    for (i=0; i<size; i++) 
     cin >> numbs[i]; // where the effect of the prior error showed up 
    return 0; 
}