簡體   English   中英

C 指針數組第二個最大值

[英]C Pointers Array 2nd Max

我正在嘗試從數組中找到第二個最大數。 出於某種原因,我一直將 output 歸零。

int main()
{
    int i,j;
    int arr[5],max=0,max2=0;
    int *(ptr)=arr;
    printf("Enter Array Elements: ");
    for(i=0;i<5;i++)
    {
        scanf("%d",ptr+i);
    }
        for(j=0;j<5;j++){
            if(max<*(ptr+j)&&max>max2)
            {
                max=*(ptr)+j;
            }
            else if(max2<*(ptr+j)&&max2<max)
            {
                max2=*(ptr)+j;
            }
        }
    printf("\n2nd Maximum: %d",max2);
}
    

您的兩個條件都將maxmax2進行比較。 由於它們都被初始化為0 ,因此這些條件都不滿足。 相反,您需要首先將當前值( *(ptr+j) )與最大數進行比較,如果不滿足該條件,則與第二個最大值進行比較:

for (j = 0; j < 5; j++) {
    int curr = *(ptr+j);
    if (curr >= max)
    {
        max2 = max;
        max = curr;
    }
    else if(curr > max2)
    {
        max2 = curr;
    }
}

由於將它們設置為0 ,最初maxmax2彼此相等。

int arr[5],max=0,max2=0;

所以這兩個 if 語句都沒有將它們的條件評估為 true

        if(max<*(ptr+j)&&max>max2)
                         ^^^^^^^^ 
        //...

        else if(max2<*(ptr+j)&&max2<max)
                               ^^^^^^^^

因為max不大於max2

此外,最初設置maxmax2是一種錯誤的方法,因為用戶只能向數組元素輸入負值。 在這種情況下,您將得到錯誤的最大值。

如果您想找到兩個彼此不相等的最大值,除非數組包含所有彼此相等的元素,那么該方法並不像您想象的那樣微不足道。

首先,您需要在數組中找到兩個不相等的元素。 例如

int max  = arr[0];
int max2 = arr[0];

i = 1;

while ( i < 5 && arr[i-1] == arr[i] ) ++i;

if ( i != 5 )
{
    if ( max < arr[i] )
    {
        max = arr[i];
    }
    else
    {
        max2 = arr[i];
    }

    for ( ; i < 5; i++ )
    {
        if ( max < arr[i] )
        {
            max2 = max;
            max = arr[i];
        }
        else if ( max2 < arr[i] )
        {
            max2 = arr[i];
        }
    }
}   

if ( max != max2 )
{
    printf("\n2nd Maximum: %d\n", max2 );  
}
else
{
    printf("\nAll elements are equal to %d\n", max2 );
}

你把它復雜化了。 在不使用指針的情況下先編寫它可能會有所幫助,這樣您就可以可視化正在發生的事情然后重寫它。

int main()
{
    int arr[5],max=0,max2=0;
    int *(ptr) = arr;
    printf("Enter Array Elements: ");
    for (int i=0;i<5;i++){
        scanf("%d",ptr+i);
    }
    /*
    max = arr[0];
    for (int j=1;j<5;j++){
        if(arr[j]>=max){
            max2 = max;
            max = arr[j];
        }
    }*/
    max = *(ptr);
    for(int j = 1;j<5;j++){
        if(*(ptr+j)>=max){
            max2 = max;
            max = *(ptr+j);
        }
    }
    printf("\n2nd Maximum: %d",max2);
    return 0;
}

暫無
暫無

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

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