簡體   English   中英

本書中查找數組中第二大 integer 的代碼是否錯誤?

[英]Is book's code to find the second largest integer in an array wrong?

這個程序應該找到第二大的 integer。 我是從一本書里拿出來的。

當我輸入在4 5 1 2 3中查找第二大數字時,它不會選擇4作為第二大數字。 我認為第 16 行的代碼應該是arr[0]而不是arr[1] 我是正確的還是我錯過了什么?

#include <stdio.h>
int main()
{
    int i, n, arr[20], large, second_large;
    printf("\n Enter the number of elements in the array : ");
    scanf("%d", &n);
    printf("\n Enter the elements");
    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);
    large = arr[0];
    for(i=1;i<n;i++)
    {
        if(arr[i]>large)
            large = arr[i];
    }
    second_large = arr[1]; // line 16
    for(i=0;i<n;i++)
    {
        if(arr[i] != large)
        {
            if(arr[i]>second_large)
                second_large = arr[i];
        }
    }
    printf("\n The numbers you entered are : ");
    for(i=0;i<n;i++)
        printf("\t %d", arr[i]);
    printf("\n The largest of these numbers is : %d",large);
    printf("\n The second largest of these numbers is : %d",second_large);
    return 0;
}

您的代碼讀起來像“C”,這是針對同一問題的 C++20 代碼:(對於手動輸入,使用 std::cin 和 values.push_back)

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

int main()
{
    constexpr std::size_t second_largest_index = 1ul;

    std::vector<int> values{ 0,2,8,7,5,4,1,3,9,6 };
    std::ranges::nth_element(values, values.begin() + 1, std::ranges::greater());
    std::cout << "the second largest value = " << values[second_largest_index];
    return 0;
}

代碼本身存在一些可能導致問題的小錯誤。 一次,如您所知,數組從索引 0 開始,但在 for 循環中,您確實從 1 開始計算它。所以而不是:

for(i=1;i<n;i++)
{
    if(arr[i]>large)
        large = arr[i];
}

你也應該從零開始你的 for 循環,否則,你不算一個。

此外,為了更簡單,您可以這樣編寫代碼:

#include <iostream>
using namespace std;
int main(){
   int n, num[50], biggest, secondBiggest;
   cout<<"Enter number of elements in your array: ";
   cin>>n;
   for(int i=0; i<n; i++){
      cout<<"Enter your "<<(i+1)<<" Number: ";
      cin>>num[i];
   }
   
   if(num[0]<num[1]){ 
      biggest= num[1];
      secondBiggest= num[0];
   }
   else{ 
      biggest= num[0];
      secondBiggest= num[1];
   }
   for (int i = 2; i< n ; i ++) {
      
      if (num[i] > biggest) {
         secondBiggest= biggest;
         biggest= num[i];
      }
      
      else if (num[i] > secondBiggest && num[i] != biggest) {
         secondBiggest= num[i];
      }
   }
   cout<<"Second Largest Element in array is: "<<secondBiggest;
   return 0;
}

這個說法

second_large = arr[1]; 

立即選擇數組 { 4, 5, 1, 2, 3 } 中的最大數。

所以這個 for 循環中嵌套 if 語句的表達式

for(i=0;i<n;i++)
{
    if(arr[i] != large)
    {
        if(arr[i]>second_large)
            second_large = arr[i];
    }
}

永遠不會評估為真。 即第二大數將始終等於第一大數。

請注意,通常數組可以包含所有彼此相等的元素。

我可以建議以下方法。

large = 0;
second_large = n;

i = 1;
while ( i < n && arr[i] == arr[large] ) ++i; 

if ( i < n )
{
    if ( arr[large] < arr[i] )
    {
        large = i;
        second_large = 0;
    }
    else
    {
        second_large = i;
    }

    while ( ++i < n )
    {
        if ( arr[large] < arr[i] )
        {
            second_large = large;
            large = i;
        }
        else if ( arr[second_large] < arr[i] )
        {
            second_large = i;
        }
    }
}

if ( second_large == n )
{
    puts( "\nAll elements are equal each other." );
}
else
{
    printf("\nThe largest of these numbers is : %d", arr[large] );
    printf("\nThe second largest of these numbers is : %d", arr[second_large] );
}

這是一個演示 C 程序(這是一個 C 程序,因為您提供的程序實際上與 C++ 無關)

#include <stdio.h>

int main( void )
{
    int arr[] = { 4, 5, 1, 2, 3 };
    const size_t n = sizeof( arr ) / sizeof( *arr );

    size_t large = 0;
    size_t second_large = n;

    size_t i = 1;
    while (i < n && arr[i] == arr[large]) ++i;

    if (i < n)
    {
        if (arr[large] < arr[i])
        {
            large = i;
            second_large = 0;
        }
        else
        {
            second_large = i;
        }

        while (++i < n)
        {
            if (arr[large] < arr[i])
            {
                second_large = large;
                large = i;
            }
            else if (arr[second_large] < arr[i])
            {
                second_large = i;
            }
        }
    }

    for (i = 0; i < n; i++)
    {
        printf( "%d ", arr[i] );
    }
    putchar( '\n' );

    if (second_large == n)
    {
        puts( "All elements are equal each other." );
    }
    else
    {
        printf( "The largest of these numbers is : %d\n", arr[large] );
        printf( "The second largest of these numbers is : %d\n", arr[second_large] );
    }
}

程序 output 是

4 5 1 2 3
The largest of these numbers is : 5
The second largest of these numbers is : 4

一個C++演示程序可以看如下方式

#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>

int main()
{
    int arr[] = { 4, 5, 1, 2, 3 };
    const size_t n = sizeof( arr ) / sizeof( *arr );

    auto last = std::next( arr, n );

    for (auto first = std::begin( arr ); first != last; ++first)
    {
        std::cout << *first << ' ';
    }
    std::cout << '\n';

    auto it = std::adjacent_find( std::begin( arr ), last,
                                  std::not_equal_to<>() );

    if (it == last)
    {
        std::cout << "All elements are equal each other.\n";
    }
    else
    {
        auto [second_large, large] = std::minmax( { it, std::next( it ) },
            []( const auto &it1, const auto &it2 )
            {
                return *it1 < *it2;
            } );

        for (auto current = std::next( it, 2 ); current != last; ++current)
        {
            if (*large < *current)
            {
                second_large = std::exchange( large, current );
            }
            else if (*second_large < *current)
            {
                second_large = current;
            }
        }

        std::cout << "The largest of these numbers is "
                  << *large << " that is present at position "
                  << std::distance( std::begin( arr ), large )
                  << '\n';
        std::cout << "The second largest of these numbers is "
                  << *second_large << " that is present at position "
                  << std::distance( std::begin( arr ), second_large )
                  << '\n';
    }
}

程序 output 是

4 5 1 2 3
The largest of these numbers is 5 that is present at position 1
The second largest of these numbers is 4 that is present at position 0

這是“運行最大值”算法的實現:

    #include <iostream>
    
    int main()
    {
      int largest_number = 0;
      std::cin >> largest_number;
      int second_largest = 0;
      int number = 0;
      std::cin >> number;
      if (number > largest_number)
      {
          second_largest = largest;
          largest = number;
      }
      else
      {
        second_largest = number;
      }
      while (cin >> number)
      {
        if (number > largest_number)
        {
            second_largest = largest;
            largest = number;
        }
        else
        {
            if (number > second_largest)
            {
              second_largest = number;
            }
        }
      }
    std::cout << "First largest: " << largest_number << "\n";
    std::cout << "Second largest: " << second_largest << "\n";
  }

上面的代碼在不使用數組或向量的情況下找到最大和第二大的數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM