2013-10-03 99 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

确实信息丰富。 –