...
/Problem Solving: Finding Second Highest Number
Problem Solving: Finding Second Highest Number
Learn to write a program using functions to find the second maximum number.
We'll cover the following...
In this lesson, we will write a program that takes k numbers and finds the second maximum (highest) number using functions.
So let’s start!
Second highest number
Take k numbers as input and find the second highest number.
Sample input
k = 5
10 -20 30 -40 50
Sample output
30
We need to find the second highest number out of k numbers. How do we do that? To find the second highest number, we can modify the function kNumbersMaximum() that we wrote in the previous lesson.
We can modify the kNumbersMaximum() as kNumbersSecondMaximum() with few changes.
We will declare the
secondMaxvariable in the function. Before assigningnumtomax, we will store themaxnumber insecondMax. After completion of thefor loop, we willreturnthesecond_max.
Let’s write the complete code below:
#include <iostream>
using namespace std;
// Printing the maximum number
int kNumbersSecondMaximum(int k)
{   
    int num;
    cout << "numbers: "; 
    cin >> num;
    
    // max variable initialized with the first number
    int max = num;
    int secondMax;
    for(int i = 2; i<=k; i++)
    {
        // taking the k-1 numbers from the user
        cin >> num;
        if (num > max)
        {
            secondMax = max; // store previous maximum before assigning num to max
            max = num;
        }
    } 
    return secondMax;
}
int main()
{
   int k, result;
   cout << "How many numbers would you like to enter (k): " << endl;
   cin >> k; // How many numbers you want as input
   result = kNumbersSecondMaximum(k);
   cout << "The second maximum number is " << result << endl; 
    return 0;
}
- Line 19: We are assigning 
maxnumber tosecondMaxbefore updatingmaxvariable withnumin line 20. In each iterationsecondMaxwill store the previousmaxnumber. - Line 23: We return the 
secondMax. 
Instruction: Execute the above program with the sample input k = 3 and numbers 1 2 3.
Can you see an issue with the second run?
Point out the logical error
There is at least one logical mistake in the above second highest code. Can you guess what it is without running it? After thinking, click “Run” and see step-by-step execution in the debugger.
Instruction: Run the above code and step by step execute it and see what is the logical mistake for the input of k=3 and numbers 3, 2, 1.
Second maximum number
On the below sample input, what second maximum will your kNumbersSecondMaximum() return?
Sample input
k = 3
20 -5 15
-5
20
15
Garbage
Fixing logical error 1
The idea to fix the above code is that instead of not initializing the secondMax, before entering the loop, we input two numbers and store the first in max and second in secondMax. If the value in secondMax is bigger, we swap the two values and ensure that before entering the loop, the max contains the maximum and the secondMax contains the second maximum. Now, the rest of the code should work.
Let’s run the below code to see how we can change it:
#include <iostream>
using namespace std;
// Printing the maximum number
int kNumbersSecondMaximum(int k)
{
    int num;
    cin >> num;
    // max variable initialized with the first number
    int max = num;
    
    int secondMax;
    // take second number for initialization of secondMax variable
    cin >> num;
    //secondMax should not be greater than max
    if (num > max)
    {
        secondMax = max;
        max = num;
    }
    else
    {
        secondMax = num;
    }
    
    for(int i = 3; i<=k; i++)
    {
        // taking the k-2 numbers from the user
        cin >> num;
        if (num > max)
        {
            secondMax = num; // store previous maximum before assigning num to max
            max = num;
        }
    } 
    return secondMax;
}
int main()
{
   int k, result;
   cout << "How many numbers would you like to enter: " << endl;
   cin >> k; // How many numbers you want as input
   result = kNumbersSecondMaximum(k);
   cout << "The 2nd maximum number is " << result << endl; 
    return 0;
}
- In lines 7–9, we take the first number 
numfrom the user and assign it tomax. - In lines 11–13, the second number is taken from the user.
 - In lines 16–24, the second number is checked. If 
num>max, both are swapped. Otherwise, the second number is assigned tosecondMax. - In line 26, our 
forloop will start from3instead of2fork-2numbers because we have already taken two numbers from the user. 
This will resolve the garbage value issue. Run the above code with 3, 2, 1 and see the output.
However, there’s still one issue left. Look at the below example:
Sample Input
3 1 2 
Sample Output
2
Our kNumbersSecondMaximum() will fail on above sample input and will return 1 as secMax. Why?
Fixing logical error 2
The issue is that we were assuming in the above code that whenever the max is updated, surely, the second maximum will also get replaced by the previous maximum. But what if the new number is not greater than the maximum but greater than the second maximum only? In that case, we will only update the second maximum number.
So look at the following fix (Look at the following fix (from line 35–38):):
#include <iostream>
using namespace std;
// Printing the maximum number
int kNumbersSecondMaximum(int k)
{
    int num;
    cout << "number: ";
    cin >> num;
    // max variable initialized with the first number
    int max = num;
    
    int secondMax;
    // take second number for initialization of secondMax variable
    cin >> num;
    //secondMax should not be greater than max
    if (num > max)
    {
        secondMax = max;
        max = num;
    }
    else
    {
        secondMax = num;
    }
    
    for(int i = 3; i<=k; i++)
    {
        // taking the k-2 numbers from the user
        cin >> num;
        if (num > max)
        {
            secondMax = max; // store previous maximum before assigning num to max
            max = num;
        }
        else if (num > secondMax)
        {
            secondMax = num;
        }
    } 
    return secondMax;
}
int main()
{
   int k, result;
   cout << "How many numbers would you like to enter: " << endl;
   cin >> k; // How many numbers you want as input
   result = kNumbersSecondMaximum(k);
   cout << "The second maximum number is " << result << endl; 
    return 0;
}
- In lines 30–38, if 
num>secondMax, bothmaxandsecMaxwill update. And ifnum>secondMax, onlysecondMaxwill be updated. 
Practice exercise
How can we modify the above program to report the third maximum from k numbers (where k>=3)?