[英]Max Value always setting to 8
我正在編寫一個接受輸入的程序,然后輸出其中每個字母的頻率的最大值。 對於該程序,我決定僅將輸入作為這5個字母:a,b,c,d和e。 該程序是這樣的。
#include <stdio.h>
int main(){
int i, c , nchar[5];
int maxvalue;
for(i=0;i<5;i++){
nchar[i]=0;
}
/*COLLECTING AND SETTING THE DATA*/
while((c=getchar())!=EOF){
if (c=='a')
nchar[0]++;
else if (c=='b')
nchar[1]++;
else if (c=='c')
nchar[2]++;
else if (c=='d')
nchar[3]++;
else if (c=='e')
nchar[4]++;
}
printf("%d",setMax(nchar,maxvalue));
}
int setMax(int a[5], int maxv){
if ( a[0]> a[1] && a[0]> a[2] && a[0]>a[3] && a[0]> a[4])
a[0]=maxv;
else if ( a[1]> a[0] && a[1]> a[2] && a[1]> a[3] && a[1]> a[4])
a[1]=maxv;
else if ( a[2]> a[0] && a[2]> a[1] && a[2]> a[3] && a[2]> a[4])
a[2]=maxv;
else if ( a[3]> a[0] && a[3]> a[2] && a[3]> a[1] && a[3]> a[4])
a[3]=maxv;
else if ( a[4]> a[0] && a[4]> a[2] && a[4]> a[3] && a[4]> a[1])
a[4]=maxv;
return maxv;
}
現在,例如,我將輸入寫為“ aaabc”,它應該打印值3,因為最大頻率是字母“ a”(即3)。但是,它打印的是值8。輸入作為輸入,它將始終打印8.有人可以告訴我我犯了什么錯誤嗎?
你的邏輯倒退了。
代替
if ( a[0]> a[1] && a[0]> a[2] && a[0]>a[3] && a[0]> a[4])
a[0]=maxv;
你需要
if ( a[0]> a[1] && a[0]> a[2] && a[0]>a[3] && a[0]> a[4])
maxv = a[0];
總體改進
將函數setMax()
的名稱更改為getMax()
並將其簽名更改為:
int getMax(int a[5]);
將用法更改為:
printf("%d", getMax(nchar);
並將實現更改為:
int getMax(int a[5]){
int maxv = 0;
if ( a[0]> a[1] && a[0]> a[2] && a[0]>a[3] && a[0]> a[4])
maxv = a[0];
else if ( a[1]> a[0] && a[1]> a[2] && a[1]> a[3] && a[1]> a[4])
maxv = a[1];
else if ( a[2]> a[0] && a[2]> a[1] && a[2]> a[3] && a[2]> a[4])
maxv = a[2];
else if ( a[3]> a[0] && a[3]> a[2] && a[3]> a[1] && a[3]> a[4])
maxv = a[3];
else if ( a[4]> a[0] && a[4]> a[2] && a[4]> a[3] && a[4]> a[1])
maxv = a[4];
return maxv;
}
更新
當兩個值相等時, getMax()
的更新版本解決了該問題。
int getMax(int a[5])
{
if ( a[0] >= a[1] && a[0] >= a[2] && a[0] >= a[3] && a[0] >= a[4] )
return a[0];
// a[0] is not the max. it has has be a[1], a[2], a[3], or a[4]
if ( a[1] >= a[2] && a[1] >= a[3] && a[1] >= a[4] )
return a[1];
// Similarly, the max has to be a[2], a[3], or a[4]
if ( a[2] >= a[3] && a[2] >= a[4] )
return a[2];
// Similarly, the max has to be a[3] or a[4]
if ( a[3] >= a[4] )
return a[3];
// At this point, a[4] has to be the max value.
return a[4];
}
做maxval = 0
,只要滿足條件就返回a [0] a [1]等。 不要將值分配給maxval。
或者,如果您想這樣做,這是setMax()
函數的代碼:
int setMax(int a[5], int maxv){
int i=0;
maxval = a[0];
for (i=1;i<5;i++)
if (maxval < a[i])
maxval = a[i];
return maxval;
}
調用setMax()
時,變量maxvalue
具有未定義的值。
這給出了未定義的行為。
我也不認為setMax()
有道理。 我認為它應該在第一個if
return a[0]
,依此類推。
變量maxvalue
初始化,其值將是不確定的。 在計算中使用它會導致不確定的行為。
此外,您始終 無需修改就可以從setMax
函數返回它(或者說是maxv
),因此您將始終打印相同的值。
正如我的Unwind先生和JP先生所指出的那樣,在當前代碼中使用maxvalue
引起未定義的行為 ,因為您正在使用未初始化的自動變量值。
根據代碼中setMax()
函數的使用情況,我認為您想要做的是
點1您無需在main()
定義maxvalue
並將其作為參數傳遞給setMax()
。
點2在setMax()
函數中,定義一個局部maxvalue
並更改a[0]=maxv;
並與maxv = a[0];
串聯maxv = a[0];
同樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.