簡體   English   中英

最大值始終設置為8

[英]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()

  • 點2setMax()函數中,定義一個局部maxvalue並更改a[0]=maxv; 並與maxv = a[0];串聯maxv = a[0]; 同樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM