最大值始终设置为8

时间:2015-06-16 16:15:40

标签: c

我正在编写一个接受输入的程序,然后打印出每个字母的最大频率值。对于这个程序,我决定只输入这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.有人能告诉我我做了什么错误吗?

5 个答案:

答案 0 :(得分:2)

你的逻辑落后了。

而不是

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];
}

答案 1 :(得分:2)

执行maxval = 0并返回一个满足条件的[0] a [1]等。不要将值赋给maxval。

或者如果您想这样做,以下是setMax() func:

的代码
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;
}

答案 2 :(得分:1)

当您致电maxvalue时,变量setMax()的值不确定。

这会给出未定义的行为。

我也不认为setMax()是有道理的。我认为它应该在第一个return a[0]中执行if,依此类推。

答案 3 :(得分:0)

变量maxvalue未初始化,它的值将是不确定的。在计算中使用它将导致未定义的行为。

此外,总是maxv函数返回它(或更确切地说是setMax)而无需修改,因此您将始终打印相同的内容值。

答案 4 :(得分:0)

正如Unwind先生和JP先生已经指出的那样,当前代码中maxvalue的使用会调用undefined behaviour,因为您正在使用未初始化的自动变量值。

基于代码中setMax()函数的用法,我想,你想做的是(是)

  • 第1点您不需要在maxvalue中定义main()并将其作为参数传递给setMax()

  • 第2点setMax()内部,定义本地maxvalue并将a[0]=maxv;和系列更改为maxv = a[0];等。< / p>