C 指针数组第二个最大值
Posted
技术标签:
【中文标题】C 指针数组第二个最大值【英文标题】:C Pointers Array 2nd Max 【发布时间】: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", &a[i])
和a[j]
代替不可读的*(ptr)+j
。
【参考方案1】:
您的两个条件都将max
与max2
进行比较。由于它们都被初始化为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】:最初max
和max2
彼此相等,因为它们设置为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
。
此外,将 max
和 max2
初始设置为零是错误的方法,因为用户只能向数组元素输入负值。在这种情况下,您将得到错误的最大值。
如果您想找到两个彼此不相等的最大值,除非数组包含所有彼此相等的元素,那么这种方法并不像您想象的那么简单。
首先你需要在数组中找到两个不相等的元素。例如
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;
【讨论】:
以上是关于C 指针数组第二个最大值的主要内容,如果未能解决你的问题,请参考以下文章