【问题标题】:C Pointers Array 2nd MaxC 指针数组第二个最大值
【发布时间】:2022-01-22 07:17:45
【问题描述】:

我正在尝试从数组中查找第二个最大数。出于某种原因,我的输出一直为零。

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);
}
    

【问题讨论】:

  • OT:放下指针,这里没用。使用scanf("%d", &amp;a[i])a[j] 代替不可读的*(ptr)+j

标签: arrays c loops max


【解决方案1】:

您的两个条件都将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;
    }
}

【讨论】:

    【解决方案2】:

    最初maxmax2 彼此相等,因为它们设置为0

    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 );
    }
    

    【讨论】:

      【解决方案3】:

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

      如果您不想要可以相等的值,请删除 if 语句中的等号。

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

      如果你做的很好,你的工作大部分就完成了。如果您允许相等的值,则从顶部开始的第二个值将是最大值 2。 如果不是,您只需要继续下去,直到找到下一个不同的值。

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 1970-01-01
        • 2015-05-25
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多