2013-10-03 95 views
-2

我使用這種方法:首先查找5個數字中最大的數字,然後在顯示最大數字後保存最大數字的最大數組的下標,像這樣做
array[ivariable] = 0 ; ,以便第一個最大值設置爲零,並且不再位於數組中。 並再次做同樣的事情,找到最大的,但我沒有得到我想要的。 它是一個邏輯錯誤。 感謝查找兩個最大數字,C++

#include <iostream> 
using namespace std; 
int main(void) 
{ 
    int counter, large,number,det_2, i , large3, det_3= 0; 
    int det[5] = {0,0,0,0,0}; 

    for(int k(0); k < 5 ; k++) 
    { 
     cout << "Enter the number " << endl ; 
     cin >> det[k] ; 
    } 

    for(i; i<5; i++) 
    { 
     large = det[i] ; 
     if (large > det_2) 
     { 
      det_2= large ; 
      counter = i ; 
     } 
     else 
     { 

     } 
    } 
    cout << "Largest among all is " << det_2 << endl; 
    det[i] = 0 ; 

    for(int j(0); j<5; j++) 
    { 
     large3 = det[j] ; 
     if(large3 > det_3) 
     { 
      det_3= large3 ;     
     } 
     else 
     { 

     } 
    } 
    cout << "Second largest " << large3 << endl ; 

    system("PAUSE"); 
} 
+4

一個問題是,在與之比較之前,您不會初始化'det_2'。 –

+0

查找[std :: max_element](http://en.cppreference.com/w/cpp/algorithm/max_element)。 –

+0

你對'large> det_2'的比較結果是什麼,其中'det_2'包含垃圾值 – exexzian

回答

1

你有可能的語法和初始化錯誤。修復那些第一:

for(int k(0); k < 5 ; k++):我從來沒有見過一個整數初始化這種方式。它不應該是:

for (int k = 0; k < 5; k++)? (同樣的,最後的循環。)

此外,

for(i; i<5; i++)

可變i是未初始化。變量在C++中未初始化爲任何默認值。因爲你沒有初始化它,它可能執行5次,沒有次數或25,899次。你不知道。

這應該是:

for (i = 0; i < 5; i++)

但是,整個事情或許可以更清楚一點反正:

#include <iostream> 
using namespace std; 
int main(void) 
{ 
    int largest = -1; 
    int second_largest = -1; 

    int index_of_largest = -1; 
    int index_of_second_largest = -1; 

    int det[5] = {0, 0, 0, 0, 0}; 

    for (int i = 0; i < 5; i++) 
    { 
     cout << "Enter the number " << endl; 
     cin >> det[i]; // assuming non-negative integers! 
    } 

    for (int j = 0; j < 5; j++) // find the largest 
    { 
     if (det[j] >= largest) 
     { 
      largest = det[j]; 
      index_of_largest = j; 
     } 
    } 

    for (int k = 0; k < 5; k++) // find the second largest 
    { 
     if (k != index_of_largest) // skip over the largest one 
     { 
      if (det[k] >= second_largest) 
      { 
       second_largest = det[k]; 
       index_of_second_largest = k; 
      } 
     } 
    } 

    cout << "Largest is " << largest << " at index " << index_of_largest << endl; 
    cout << "Second largest is " << second_largest << 
      " at index " << index_of_second_largest << endl; 

return 0; 
} 
+0

是的問題是我沒有單獨初始化每個變量 –

1

你使用它們

det_2 = det[0]; 
counter = 0; 
for (i = 1; i < 5; i++) 
+0

是的,我將在未來謹慎。謝謝 –

0
  • 我看到的是你正在使用i作爲指標迭代第一個問題之前,請務必給您的變量的值,但你不初始化我。

代碼應該是:

for(i = 0; i<5; i++) 
     ^^^^ 
  • 同樣適用於det_2。您比較元素,但不要初始化它。您應該在使用它的循環之前將其設置爲det[0]

  • 第三個問題:您的「在打印後將最大值設置爲零」聽起來像是在那裏,因此您可以在第二次應用相同的算法。

您應該創建一個額外的功能,讓你最大的元素的索引,並將其命名爲這樣的:

int index = find_largest_index(a); 
cout << "largest element: " << a[index] << endl; 
a[index] = 0; 
cout << "second largest element: " << a[ find_largest_index(a) ] << endl; 
+0

是的,有時候不幸的偏好會導致意想不到的結果,我所做的就是不單獨初始化每個變量。 –

0

GCC 4.7.3:G ++ -Wall -std -Wextra = C++ 0x largest.cpp

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 

int main() { 
    std::cout << "Enter 5 numbers: "; 

    // Read 5 numbers. 
    std::vector<int> v; 
    for (auto i = 0; i < 5; ++i) { 
    int x = 0; 
    while (!(std::cin >> x)) { 
     // Error. Reset and try again. 
     std::cin.clear(); 
     std::cin.ignore(); 
    } 
    v.push_back(x); 
    } 

    // partition on element 3 (4th number) 
    std::nth_element(std::begin(v), std::next(std::begin(v), 3), std::end(v)); 

    std::cout << "Two largest are: "; 
    std::copy(std::next(std::begin(v), 3), std::end(v), std::ostream_iterator<int>(std::cout, " ")); 
} 
+0

我想你使用鏈表數據結構的方法?對? –

+0

@ArsalaKamal,你覺得呢?我正在使用一個容器,但它不是一個鏈表,它是一個向量(數組)。 –

0

在5個元素的特定情況下,您使用i的算法不太可能產生真正的區別。

也就是說,專門爲這類工作設計的標準算法是std::nth_element

它允許您查找如果要對整個集合進行排序,則會在N位置結束的元素(或「an」,如果有重複的元素)。

這個名字很明顯。有什麼不那麼明顯(但仍然需要)是nth_element也將這些元素排列成兩個(或三個,取決於你如何看待它)組:在該元素之前短的元素,元素本身以及元素會在那個元素之後排序。儘管這些元素沒有在每個組中排序,但它們被排列到這些組中 - 即排序之前排序的所有元素,然後是元素本身,然後是排序後的元素。

這給你你想要的東西 - 你提供的4個th和5 th元素。

正如我剛纔所說的,只有5個元素的情況下,它並不重要 - 但是如果您想要(例如)1000萬中的前50000個,選擇正確的算法會產生更大的差異。

+0

確實信息豐富。 –