我正在嘗試從陣列中找到第二個最大數字。出于某種原因,我的輸出一直為零。
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);
}
uj5u.com熱心網友回復:
雙方你的條件比較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;
}
}
uj5u.com熱心網友回復:
你把它復雜化了。先不使用指標撰寫它可能會有所幫助,這樣您就可以想象正在發生的事情然后重寫它。
如果您不想要可以相等的值,請洗掉 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;
}
uj5u.com熱心網友回復:
由于將它們設定為 ,最初max和max2彼此相等0。
int arr[5],max=0,max2=0;
所以這兩個 if 陳述句都沒有將它們的條件評估為真
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 );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392123.html
