-1

我在将引用的返回值传递给主函数时遇到问题。代码应该返回用户输入的偶数和奇数的数量。我认为我在通行证中的语法是错误的。

  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

7 回答 7

4

我认为这段代码有很多问题

  1. 你不能像你尝试的那样返回两个元素
  2. 您没有在任何地方通过引用传递
  3. 您传递给numofOddEven的不是函数所期望的(an intvs a vector

了解函数的工作原理、引用传递的实际含义、return作用以及取模数在 c++ 中的含义。然后尝试再次接近这个。

于 2013-10-31T18:49:12.583 回答
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 ;
于 2013-10-31T18:46:38.447 回答
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;
}
于 2013-10-31T18:52:15.497 回答
0

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

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

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

不需要任何回报。编译器在看到 & 时,会将其视为指针,但在代码中,您将其视为变量。

于 2013-10-31T18:45:20.653 回答
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;

如果您希望从单个函数调用中返回两个值,有几种方法可以做到这一点。“最简单”的方法是返回 a 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;
于 2013-10-31T18:56:15.993 回答
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)偶数的数量只是向量的总大小减去奇数的数量。

于 2013-10-31T18:57:44.347 回答
0

要解决您的主题中的问题:

int numOfOddEven(vector<int> vect) { }

在 vect 之前添加 & :

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

然后 vect 将通过引用而不是复制来传递。关于您的返回值,也将它们作为引用传递,然后声明 void 类型的函数:

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

然后只需修改函数中的那些变量并且不返回任何内容。

于 2013-10-31T18:54:22.923 回答