c语言程序 调错 运行出负数

企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成。该公司共十人,从键盘输入当月利润,求每个人应发放奖金总数?
void main()
{
long int x1,x2,x4,x6,x10,x;
int i;
long int a[10];
i=1;
while(i<=10)
{
scanf("%d",&a[i]);
i++;
}
x1=100000*0.1;
x2=x1+100000*0.075;
x4=x2+200000*0.05;
x6=x4+200000*0.03;
x10=x6+400000*0.015;
for(i=1;i<=10;i++)
{
if(a[i]<=100000)
x=a[i]*0.1;
else if(a[i]<=200000)
x=x1+(a[i]-100000)*0.075;
else if(a[i]<=400000)
x=x2+(a[i]-200000)*0.05;
else if(a[i]<=600000)
x=x4+(a[i]-400000)*0.03;
else if(a[i]<=1000000)
x=x6+(a[i]-600000)*0.015;
else
x=x10+(a[i]-1000000)*0.01;
printf("x=%ld\n",x);
}
}
先谢了

楼上的并没有找到错误。x只是应该最好用实型,不过你用整型也没所谓,当表达式中出现浮点数与整数的二元运算时编译器会自动将整型转换为浮点类型在进行运算。所以楼主的程序的问题并不在这儿。而在数组访问越界。楼主,C语言里面数组的下标是从0开始的。所以一个10元素的数组,合法的下标是从0到9。a[0]是第一个元素,a[9]是第十个元素。你的while循环和for循环里面数组的下标都是从1开始的,所以不管是你往数组里面存东西还是从数组里面取东西,你都是从a[1](因为你写的都是a[i])开始的,也就是说数组的第一个元素a[0]你都没有用,然后一直到a[10],而本来a[9]才是你的数组的最后一个元素,结果你非法访问了你的数组的有效范围以外的一个内存单元,即所谓的a[10],这个单元里本来就不在你的数组有小范围之内,所以它里面的值是垃圾值,你打印出来当然就可能是任意值了(这个在不同的运行环境下可能有不同的表现,比如说打印一个很大的值或者一个负数,反正不是你想要的值)。你的程序有两种改法:
1. i=0; while( i < 10 )
for ( i = 0; i < 10; i++ )

2. 把循环体里面的a[i]改成a[i-1],这样你的数组访问就不会越界了,i=1的时候,刚好是a[0],i=9的时候,刚好到最后一个元素a[9]。

另外,楼上的说得也没错,你最好把你的运算操作数都改成浮点类型(float或者double),不要依赖编译器帮你做类型转换
温馨提示:内容为网友见解,仅供参考
第1个回答  2006-12-28
long int x1,x2,x4,x6,x10,x;
int i;
long int a[10];
i=1;
while(i<=10)
{
scanf("%d",&a[i]);
改为float int x1,x2,x4,x6,x10,x;
int i;
float a[10];
i=1;
while(i<=10)
{
scanf("%f",&a[i]);
就可以了,调试过,已经通过,运行正常
补充:刚才看了楼下day9981 的回答,首先我同意他说的应该说用long int也没有关系,但是我不同意他所说的问题出现在下标越界一说。不信的话你可以在scanf语句下面紧跟着加一句printf("%d",a[i]);让程序把你刚刚输入存入数组的每一个元素都输出来看看?你会发现输出的每个数都不是你输入的数。这应该不是越界造成的吧。
至于为什么long int从理论上讲是可以的,但是这段程序中不行,要改成float才行,我水平有限解释不来了,请高手作答!

第二次补充:
刚才又进行了调试,发现原来是这么低级的一个错误,就是scanf语句中的格式符应该改为%ld而不是%d,还有下标越界也是要改的
最后给一段修改好的吧:
void main()
{
long int x1,x2,x4,x6,x10,x;
int i;
long int a[10];
i=0; (原来是i=0)
while(i<=9) (原来是i<=10)
{
scanf("%ld",&a[i]);(原来是%d)
i++;
}
x1=100000*0.1;
x2=x1+100000*0.075;
x4=x2+200000*0.05;
x6=x4+200000*0.03;
x10=x6+400000*0.015;
for(i=0;i<=9;i++)
{
if(a[i]<=100000)
x=a[i]*0.1;
else if(a[i]<=200000)
x=x1+(a[i]-100000)*0.075;
else if(a[i]<=400000)
x=x2+(a[i]-200000)*0.05;
else if(a[i]<=600000)
x=x4+(a[i]-400000)*0.03;
else if(a[i]<=1000000)
x=x6+(a[i]-600000)*0.015;
else
x=x10+(a[i]-1000000)*0.01;
printf("x=%ld\n",x);
}
}
第2个回答  2006-12-28
void main()
{
long int x1,x2,x4,x6,x10,x;
long int m;
printf("please input this month's profit:\n");
scanf("%ld",&m);
x1=100000*0.1;
x2=x1+100000*0.075;
x4=x2+200000*0.05;
x6=x4+200000*0.03;
x10=x6+400000*0.015;
if(m<=100000)
x=m*0.1;
else if(m<=200000)
x=x1+(m-100000)*0.075;
else if(m<=400000)
x=x2+(m-200000)*0.05;
else if(m<=600000)
x=x4+(m-400000)*0.03;
else if(m<=1000000)
x=x6+(m-600000)*0.015;
else
x=x10+(m-1000000)*0.01;
printf("x=%ld\n",x);
getchar();
getchar();
}本回答被提问者采纳
第3个回答  2020-02-06
void
main()
{
long
int
x1,x2,x4,x6,x10,x;
long
int
m;
printf("please
input
this
month's
profit:\n");
scanf("%ld",&m);
x1=100000*0.1;
x2=x1+100000*0.075;
x4=x2+200000*0.05;
x6=x4+200000*0.03;
x10=x6+400000*0.015;
if(m<=100000)
x=m*0.1;
else
if(m<=200000)
x=x1+(m-100000)*0.075;
else
if(m<=400000)
x=x2+(m-200000)*0.05;
else
if(m<=600000)
x=x4+(m-400000)*0.03;
else
if(m<=1000000)
x=x6+(m-600000)*0.015;
else
x=x10+(m-1000000)*0.01;
printf("x=%ld\n",x);
getchar();
getchar();
}
第4个回答  2006-12-28
哦,提个建议啊??
首先我觉得出现负数,
1.是数组越界,多调试可以发现是否越界
2.是由于非法数字出现了!
你的程序结构不合理!
1.c语言中主要是函数,把处理的部分独立出一个函数来!
2.用switch case 语句替代那么多的if语句
这样的话,结构清晰,也不容易出错误.
就剩下很多事情了,那会出现什么错误啊?

【C语言】有没有大佬知道这个程序为什么会输出一个负数?
程序会输出负数的原因是,在这个程序中你没有对每次运算的结果进行检查,因此当乘积超出了long类型的最大值时,就会产生溢出,导致结果为负数。为了避免这个问题,你可以在每次运算后检查结果是否已经超出了long类型的范围,并在必要时退出循环。可以这样改:include<stdio.h> main(){ long i;i=chengji(...

C语言,为啥总是输出负数
可能的原因太多,可以肯定程序输出不在你的预想,代码有错。错误代码输出的结果没有参考性。先检查代码。一、运算式子有没错。二、调用了未赋值且未初始化的变量。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 1条折叠回答 其他类似问题2014-11-19 为什么总输出一个很大的负数 C语言 18 2012-11-03...

c语言问题,为什么会输出负数
算法有错误,最终计算结果是负数。输出自然会是负数。例如:int a=1;int b=a-2;printf("b=%d",b);\/\/输出结果:b=-1超过变量类型的最大取值范围,发生溢出。例如Turbo C里int是16位,取值范围-32768~32767。如果计算过程当中,数值超过32767,由于补码的关系。结果就有可能是负数。这种情况,就需...

C语言运行结果的时候为什么会出现负数
看这里,你的函数返回值为整形int fib(long n)整形的范围是 -32768~32767;必然是溢出了。

C语言 为什么我这个程序输入正确数后 结果总为负数
那么长的结果 你不把数据类型改长一点 那么就会数据溢出 变成负数的

C语言下面的代码为什么我每次运行都会出现负数哪里出错了。
main(){ double zhijing,zhouchang; printf("请输入直径:"); scanf("%lf",&zhijing);\/\/这里改了 zhouchang = zhijing * PI; printf("周长=%lf\\n",zhouchang);\/\/这里改了 return 0;}小错误 不过 格式 很重要 啊 亲 有问题 请联系我 ...

哪位大神帮我看看这个C语言的编程错在哪,老是出现负数。
三个数,比较大小,逻辑错了\/\/这一个函数,void print(int a,int b,int c){ int max; if(a<b) { max=a; a=b; b=max; } if(a<c) { max=a; a=c; c=max; } if(b<c) { max=b; b=c; c=max; } printf("从...

c语言程序 调错 运行出负数
楼上的并没有找到错误。x只是应该最好用实型,不过你用整型也没所谓,当表达式中出现浮点数与整数的二元运算时编译器会自动将整型转换为浮点类型在进行运算。所以楼主的程序的问题并不在这儿。而在数组访问越界。楼主,C语言里面数组的下标是从0开始的。所以一个10元素的数组,合法的下标是从0到9。a[...

为什么总输出一个很大的负数 C语言
1,代码中有一点错误 scanf ("i=%1f",&i);原型是int scanf(constchar*format,...);format为格式说明字符串,这个跟printf里面的不同,不能有多余杂质 故正确用法是scanf ("%1f",&i);特别注意的地方是,浮点型不能指点位数 进一步修改为scanf ("%f",&i);到这部还不一定正确,需要注意第2点...

C语言程序,结果会出现负0,请问怎么办?
这是圆周率数值的截断误差引起的,算出的向量就是接近0的负数。要想得正0,圆周率给个 (四舍)五入值:pai=3.14159265359;就可以了。但不能保证别的特殊的输入数会不会 该正0 出现负0。

相似回答