2013-10-31 49 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之內)偶數的數量就是矢量的總大小減去奇數的數量。