Skip to main content
added 1346 characters in body
Source Link
Vlad from Moscow
  • 313.1k
  • 27
  • 204
  • 358

For starters even this if-else statement

for(i = 0;i < n;i++){
    if(a[i]>max1){
        max1=a[i];
        //i_m1++;
    } else if(a[i]>max2 && a[i]<max1){
        max2=a[i];
        //i_m2++;
    }
}

is wrong.

If the condition of the if statement

    if(a[i]>max1){

is true then you need also assign max1 to max2 if max1 is not equal to max2 before changing max1.

The approach can look the following way

if ( n < 2 )
{
    i_m1 = 0;
    i_m2 = 0;
}
else
{
    if ( a[0] < a[1] )
    {
        i_m1 = 1;
        i_m2 = 0;
    }
    else
    {
        i_m1 = 0;
        i_m2 = 1;
    }

    for ( i = 2; i < n; i++ )
    {
        if ( a[i_m1] < a[i] )
        {
            if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
            i_m1= i;
        }
        else if ( a[i_m2] < a[i] )
        {
            i_m2 = i;
        }
    }
}

printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );        

Here is a demonstration program.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
{
    enum { N = 10 };
    int a[N];
    int n = N;
    
    srand( ( unsigned int )time( NULL ) );
    
    for ( int i = 0; i < n; i++ )
    {
        a[i] = rand() % N;
    }

    for ( int i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }
    
    putchar( '\n' );
    
    //  Below the algorithm for a variable length array
    
    int i_m1 = 0, i_m2 = 0;

    if ( !( n < 2 ) )
    {
        if ( a[0] < a[1] )
        {
            i_m1 = 1;
            i_m2 = 0;
        }
        else
        {
            i_m1 = 0;
            i_m2 = 1;
        }

        for ( int i = 2; i < n; i++ )
        {
            if ( a[i_m1] < a[i] )
            {
                if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
                i_m1= i;
            }
            else if ( a[i_m2] < a[i] )
            {
                i_m2 = i;
            }
        }
    }

    printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
    printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );      
}

Its output might .look like

0 3 5 0 3 8 8 2 5 6 
max1 = 8 max2 = 8
i_m1 = 5 i_m2 = 6

The approach can look the following way

if ( n < 2 )
{
    i_m1 = 0;
    i_m2 = 0;
}
else
{
    if ( a[0] < a[1] )
    {
        i_m1 = 1;
        i_m2 = 0;
    }
    else
    {
        i_m1 = 0;
        i_m2 = 1;
    }

    for ( i = 2; i < n; i++ )
    {
        if ( a[i_m1] < a[i] )
        {
            if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
            i_m1= i;
        }
        else if ( a[i_m2] < a[i] )
        {
            i_m2 = i;
        }
    }
}

printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );        

For starters even this if-else statement

for(i = 0;i < n;i++){
    if(a[i]>max1){
        max1=a[i];
        //i_m1++;
    } else if(a[i]>max2 && a[i]<max1){
        max2=a[i];
        //i_m2++;
    }
}

is wrong.

If the condition of the if statement

    if(a[i]>max1){

is true then you need also assign max1 to max2 if max1 is not equal to max2 before changing max1.

The approach can look the following way

if ( n < 2 )
{
    i_m1 = 0;
    i_m2 = 0;
}
else
{
    if ( a[0] < a[1] )
    {
        i_m1 = 1;
        i_m2 = 0;
    }
    else
    {
        i_m1 = 0;
        i_m2 = 1;
    }

    for ( i = 2; i < n; i++ )
    {
        if ( a[i_m1] < a[i] )
        {
            if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
            i_m1= i;
        }
        else if ( a[i_m2] < a[i] )
        {
            i_m2 = i;
        }
    }
}

printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );        

Here is a demonstration program.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
{
    enum { N = 10 };
    int a[N];
    int n = N;
    
    srand( ( unsigned int )time( NULL ) );
    
    for ( int i = 0; i < n; i++ )
    {
        a[i] = rand() % N;
    }

    for ( int i = 0; i < n; i++ )
    {
        printf( "%d ", a[i] );
    }
    
    putchar( '\n' );
    
    //  Below the algorithm for a variable length array
    
    int i_m1 = 0, i_m2 = 0;

    if ( !( n < 2 ) )
    {
        if ( a[0] < a[1] )
        {
            i_m1 = 1;
            i_m2 = 0;
        }
        else
        {
            i_m1 = 0;
            i_m2 = 1;
        }

        for ( int i = 2; i < n; i++ )
        {
            if ( a[i_m1] < a[i] )
            {
                if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
                i_m1= i;
            }
            else if ( a[i_m2] < a[i] )
            {
                i_m2 = i;
            }
        }
    }

    printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
    printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );      
}

Its output might .look like

0 3 5 0 3 8 8 2 5 6 
max1 = 8 max2 = 8
i_m1 = 5 i_m2 = 6
Source Link
Vlad from Moscow
  • 313.1k
  • 27
  • 204
  • 358

The approach can look the following way

if ( n < 2 )
{
    i_m1 = 0;
    i_m2 = 0;
}
else
{
    if ( a[0] < a[1] )
    {
        i_m1 = 1;
        i_m2 = 0;
    }
    else
    {
        i_m1 = 0;
        i_m2 = 1;
    }

    for ( i = 2; i < n; i++ )
    {
        if ( a[i_m1] < a[i] )
        {
            if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
            i_m1= i;
        }
        else if ( a[i_m2] < a[i] )
        {
            i_m2 = i;
        }
    }
}

printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );