[英]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.