首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C指针阵列2最大

C指针阵列2最大
EN

Stack Overflow用户
提问于 2021-12-20 17:33:30
回答 3查看 57关注 0票数 1

我正试图从数组中找出第二个最大数字。出于某种原因,我一直得到输出为零。

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

发布于 2021-12-20 17:37:36

您的两个条件都将maxmax2进行比较。由于它们都被初始化为0,所以这两种条件都没有得到满足。相反,您需要首先将当前值(*(ptr+j))与最大值进行比较,如果不满足该条件,则将其与第二个最大值进行比较:

代码语言:javascript
复制
for (j = 0; j < 5; j++) {
    int curr = *(ptr+j);
    if (curr >= max)
    {
        max2 = max;
        max = curr;
    }
    else if(curr > max2)
    {
        max2 = curr;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-20 18:00:55

最初,由于将maxmax2设置为0,它们是相等的。

代码语言:javascript
复制
int arr[5],max=0,max2=0;

因此,这两个if语句都没有将它们的条件评估为true。

代码语言:javascript
复制
        if(max<*(ptr+j)&&max>max2)
                         ^^^^^^^^ 
        //...

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

因为max不大于max2

此外,最初将maxmax2设置为零是一种错误的方法,因为用户只能向数组元素输入负值。在这种情况下,您将得到错误的最大值。

如果您想找到两个彼此不相等的最大值,除非数组包含所有元素是相等的,那么这种方法并不像您想的那样简单。

首先,需要在数组中找到两个不相等的元素。例如

代码语言:javascript
复制
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 );
}
票数 0
EN

Stack Overflow用户

发布于 2021-12-20 18:26:14

你把事情复杂化了。在不使用指针的情况下,首先编写它可能会有所帮助,这样您就可以可视化正在发生的事情,然后重写它。

如果不希望值相等,请删除If语句中的等号。

第二,这仍然存在潜在的问题。如果你有所有的负数,第一个数字是最高的。max2永远不会被设置。为了避免这个问题,您需要对所有值从低到高进行排序,或者运行两个循环,一个用于max,另一个用于max2。甚至比这还要复杂一些。最好的选择是排序,然后运行循环以避免问题。

如果你做得很好,你的工作大部分都完成了。如果允许相同的值,则顶部的第二个值将为最大值2。如果不是,你只需要向下走,直到你找到下一个不同的值。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70425776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档