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