2013-10-31 48 views
-1

我有问题将我的引用的返回值传递给主函数。代码应该返回用户输入的偶数和奇数的数量。我认为我在传球中的语法是错误的。通过引用语法传递的C++向量

using namespace std; 

int numOfOddEven(vector<int>); 
int main() 
{ 
int numValues, odd; 
vector<int> values; 
cout << "Enter number of values: "; 
cin >> numValues; 

for(int count = 0; count < numValues; count++) 
{ 
    int tempValue; 
    cout << "Enter value: "; 
    cin >> tempValue; 
    values.push_back(tempValue); 
} 

cout <<"Odd numbers: " << numOfOddEven(odd); 
}cout <<"Even numbers: " << numOfOddEven(even); 


int numOfOddEven(vector<int> vect) 
{ 
int odd = 0; 
int even = 0; 

for (int i = 0; i < vect.size(); i++) 
    if (i/2 == 1) 
     ++even; 
    else 
     ++odd; 

return odd; 
return even; 
} 
+4

你认为'返回奇数;甚至返回;'会做什么? – P0W

+2

1.这里没有任何参考文献可以传递。 2.多重返回语句是无用的。 –

+1

将if(i/2 == 1)'更改为'if(vect [i]%2 == 0)',除了所有其他错误... – fvdalcin

回答

0

引用在函数声明/签名中定义。例如:

void fct(int &ref1, int &ref2) 
{ 
    ref1 = 1; 
    ref2 = 2; 
} 

int ref1, ref2; 
fct(ref1, ref2); 

无需任何退货。编译器在看到&时,认为它是一个指针,但在代码中,你认为它是一个变量。

+0

在这个答案中没有任何不正确的,但不清楚这是如何连接到原来的问题。 –

+0

'当它看到&时,它认为它是一个指针'< - 这是一个大大的过度简化。 –

+0

@Aaron - 这个人问为什么他不能通过参考(因此身体的2回报)。我试图向他解释他需要特定的语法并且没有任何回报需要通过引用。我理解错了吗? – MasterPlanMan

1

你用错误的参数,调用和使用错误逻辑

odd =numOfOddEven(values); //Use values 
cout <<"Odd numbers: " << odd; 
cout <<"Even numbers: " << values.size()- odd; //Get even count using this 

numOfOddEven只返回odd计数

修复逻辑: -

int numOfOddEven(vector<int> vect) 
{ 
int odd = 0; 
//int even = 0; 

for (int i = 0; i < vect.size(); i++) 
    if (vect[i]%2 != 0) 
     ++odd; 

return odd; 
//return even; 
} 

另一种方法是使用std::count_if

int numodd = std::count_if(values.begin(), values.end(), 
         [](int i) {return i % 2 != 0;}); 
int numeven = values.size() - numodd ; 
4
的事情,我看到不对的代码

  1. 不能返回两个元素,比如你想
  2. 你是不是通过引用传递

    一把随时随地

  3. 什么要传递到numofOddEven是不是有什么该函数需要(一int Vs的vector

了解函数的工作原理,通过引用传递什么实际意义,WH在return呢,以及在C++中取一个数字的模数是什么意思。然后尝试再次接近。

1
int numOfOddEven(vector<int> & vect) 
{ 
int odd = 0; 
int even = 0; 

for (int i = 0; i < vect.size(); i++) 
    if (vect[i]%2 == 1) 
     ++even; 
    else 
     ++odd; 

return odd; 

} 


int main() 
{ 
int numValues, odd; 
vector<int> values; 
cout << "Enter number of values: "; 
cin >> numValues; 

for(int count = 0; count < numValues; count++) 
{ 
    int tempValue; 
    cout << "Enter value: "; 
    cin >> tempValue; 
    values.push_back(tempValue); 
} 

cout <<"Odd numbers: " << numOfOddEven(values); 
cout <<"Even numbers: " << numValues - numOfOddEven(values); 
cin.get(); 
cin.get(); 
return 0; 
} 
+0

欢迎来到堆栈溢出!感谢您的回答!在这里,我们试图解释我们的答案,以便OP(以及任何未来的Google员工)真正了解他们的问题和解决方案,而不是仅仅拥有一堆他们可以复制和粘贴的代码。如果您想在答案中添加一些文字以解释您的解决方案如何工作以及为什么,我们将不胜感激。 :) – JSQuareD

+0

您的逻辑计算赔率和平均数是错误的:对于**奇数**,'vect [i]%2 == 1'将为“真”,**为**偶数则为“假”。而且,如果你不打算对它们做任何事情,那就没有意义了。 –

+0

哈哈我不知道作者试图做什么,只是想帮忙。在我看来,在这种情况下没有必要使用参考。对不起,没有评论,今天早上有点忙于其他事情。 –

0

为了解决这个问题在你的主题:

int numOfOddEven(vector<int> vect) { } 

一个& VECT之前添加:

int numOfOddEven(vector<int> & vect) { } 

然后VECT将通过引用传递,而不是复制。在问候你的返回值,在将它们作为参考也然后声明void类型的函数:

void numOfOddEven(vector<int> & vect, int & countodd, int & counteven) { } 

然后,只需修改这些变量的函数,不返回任何东西。

0

首先,您不会在现有代码中通过引用传递任何内容。如果你想通过引用传递的载体,你需要声明你的函数是这样的:

int OddCount(const std::vector<int>& v) 
// ................................^ That denotes a reference 
{ 
    return std::count_if(v.begin(), v.end(), [](int i) 
    { 
     return i % 2; 
    }); 
} 

int EvenCount(const std::vector<int>& v) 
{ 
    return std::count_if(v.begin(), v.end(), [](int i) 
    { 
     return !(i % 2); 
    }); 
} 

注意:你确定一个奇怪的逻辑/偶固定在上述两种功能。你的方法不正确(除非你认为2是唯一的偶数)。其次,您从未声明过even向量(并且没有必要也没有必要声明odd向量)。所以,你应该修改你的输出语句:

cout << "Odd Numbers: " << OddCount(values) << std::endl; 
cout << "Even Numbers: " << EvenCount(values) << std::endl; 

如果你想从一个函数调用返回两个值,有几个方法可以做到这一点。在“简单”的方法是将返回std::pair<int, int>

std::pair<int, int> CountOddsAndEvens(const std::vector<int>& v) 
{ 
    int evens = std::count_if(v.begin(), v.end(), [](int i) 
     { 
      return !(i % 2); 
     }); 

    int odds = v.size() - evens; 

    return std::make_pair(evens, odds); 
} 

或者,你可以在将它们作为输出参数:

void CountOddsAndEvens(const std::vector<int>& v, int& evens, int& odds) 
{ 
    evens = std::count_if(v.begin(), v.end(), [](int i) 
     { 
      return !(i % 2); 
     }); 

    odds = v.size() - evens; 
} 

两者都将要求您更改您的电流输出电话:

std::pair<int, int> results = CountOddsAndEvens(values); 
std::cout << "Odds = " << results.second << ", Evens = " << results.first << std::endl; 

或者

int evens, odds; 
CountOddsAndEvens(values, evens, odds); 
std::cout << "Odds = " << odds << ", Evens = " << evens << std::endl; 
0

看的第一个地方就是声明:

int numOfOddEven(vector<int>); 

这将返回一个int,而不是两个。如果你想返回两个(独立的)信息,你必须改变一些东西。如果你想返回两个整数,你可以的功能与这种类型:

pair<int,int> numOfOddEven(vector<int>); 

然后,在函数结束时,你可以用return make_pair(num_odds, num_evens)返回。然后,您也需要做这样的事情实际上接受返回值:

tie(odd, even) = numOfOddEven(values); 

,这可能对于初学者过于复杂。你想找到另一个环形的方式来从一个函数调用中“返回”两个数字。

void numOfOddEven(vector<int>, int&, int&); 

请注意返回类型不是void。这个功能并不是真的return什么。但是你可以通过引用你的两个变量oddeven。当你说“通过引用传递”时,这可能就是你的意思。

...需要更多的代码...... [社区维基:-)]


但是,又来了!很明显,每个数字都是奇数或偶数。因此,仅返回一个号码即odd就足够了。然后,您可以计算(在main之内)偶数的数量就是矢量的总大小减去奇数的数量。