关于c语言基础的一个问题

来源:百度知道 编辑:UC知道 时间:2024/05/18 00:43:27
程序如下
main()
{
float k,n;
scanf("%f",&n);
if(n>35000&&n<=40000)
k=5250+(n-5000*7)*19/100;
else if(n>40000&&n<=45000)
k=6200+(n-5000*8)*20/100;
else if(n>45000&&n<=50000)
k=7200+(n-5000*9)*20/100;
else if(n>50000&&n<=55000)
k=8200+(n-5000*10)*20/100;
else if(n>55000&&n<=60000)
k=9200+(n-5000*11)*20/100;
printf("%f",k);
getch();
}
当我把上面的数值改到35000以下时计算没问题,可一改到35000以上就算不出答案了 这是为什么
#include"stdio.h"
jisuan(float n)
{
float k=0;
if(n<=5000)
k=n*12/100;
if(n>5000&&n<=10000)
k=600+(n-5000)*13/100;
if(n>10000&&n<=15000)
k=1250+(n-5000*2)*14/100;
if(n>15000&&n<=20000)
k=1950+(n-5000*3)*15/100;
if(n>20000&&n<=25000)
k=2700+(n-5000*4)*16/100;
if(n>25000&&n<=30000)
k=3500+(n-5000*5)*17/100;
if(n>

不打钩好多年~~

ps:楼主,我错了,主要问题是k未初始化
其他没问题我试过了.
还有这句话啥意思?:当我把上面的数值改到35000以下时计算没问题,可一改到35000以上就算不出答案了 这是为什么

b要初始化 b=0

b+=jisuan(a[i]); //这句话又调用了一次jisuan(),就是说你又计算了一遍.
for(i=0;i<1;i++)
{
printf("%d ",i+1);
b+=jisuan(a[i]);
printf("%u",b);
}
改成上面这样的

b是要初始化,但问题不在这里,我想楼主的编译器的int型是两个字节的,即缺省情况下最大正数只能达到32767,而你若输入大于35000的数,则会在这些语句中计算:
if(n>35000&&n<=40000)
k=5250+(n-5000*7)*19/100;
if(n>40000&&n<=45000)
k=6200+(n-5000*8)*20/100;
if(n>45000&&n<=50000)
k=7200+(n-5000*9)*20/100;
if(n>50000&&n<=55000)
k=8200+(n-5000*10)*20/100;
if(n>55000&&n<=60000)
k=9200+(n-5000*11)*20/100;

计算过程中,并不是有n就全部转换为实型,要遇到实型值才会转换。而(n-5000*7)中先计算5000*7,这里5000*7都已经超过35000了,大于32767,导致溢出问题。所以这才是问题的症结所在,建议楼主改为5000*7.0等形式。

如果你输入的数满足你程序里的条件,应该不会出错的。
因为算出来的k值不会超出float的可容的大小,(n-5000*#)不会超过5000,乘以20最多也只有10