我正试图从数组中找出第二个最大数字。出于某种原因,我一直得到输出为零。
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);
}发布于 2021-12-20 17:37:36
您的两个条件都将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;
}
}发布于 2021-12-20 18:00:55
最初,由于将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 );
}发布于 2021-12-20 18:26:14
你把事情复杂化了。在不使用指针的情况下,首先编写它可能会有所帮助,这样您就可以可视化正在发生的事情,然后重写它。
如果不希望值相等,请删除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;
}https://stackoverflow.com/questions/70425776
复制相似问题