关于C语言的一点小问题

一个很简单的问题,从键盘输入三个整数,分别存入x,y,z三个整型变量中,计算并输出三个数的和以及平均值。平均值保留两位小数

我先这样写的(#include<stdio.h>及main省略,只看程序主体)
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",a+b+c);
printf("%.2f\n",(a+b+c)/3);
return 0;

结果出来是和没有问题,走到平均值那里程序显示runtime error

于是我改了下
int a,b,c;
double aver;
scanf("%d %d %d",&a,&b,&c);
aver=(a+b+c)/3;
printf("%d\n",a+b+c);
printf("%.2f\n",aver);
return 0;

结果这样一来,和还是没问题,但是平均值的两位小数始终是00,这个就奇怪了

然后朋友改了下,如果不考虑要求中的必须存入整形变量,改成float或者double,都没问题了,结果OK
完全没明白是怎么回事,所以想请教下,第一种情况的运行时间错误是怎么出来的呢?第二种情况下,同运算式中出现不同类型变量不是会低级自动转化为高级么,aver应该是没有问题的啊,但是现在的感觉变成了右边三个量先按照整形计算完毕再一次性转化成了浮点,因此成了.00,为什么会出现这样的情况呢?
另外,这道题到底该怎么写?
多谢各位指点了~~
原题是这样的
从键盘输入三个整数,分别存入x,y,z三个整型变量中,计算并输出三个数的和以及平均值。【输入形式】从键盘输入三个整数,整数之间以空格隔开。【输出形式】在屏幕上分两行显示结果:第一行为三个数的和,整数形式输出;第二行为三个数的平均值,浮点数形式输出,小数点后保留两位小数。【输入样例】3 2 3【输出样例】82.67【样例说明】3、2、3的和为8,所以第一行输出8;第二行输出3、2、3的平均值2.67(保留两位小数)。

第一个,倒数第二句误将int类型的(a+b+c)/3以%.2f的形式输出,系统认为不合法,无法运行下去,导致runtime error,并且可能使系统软件卡上一段时间。将该句改为printf("%.2f\n",(float)(a+b+c)/3);或者printf("%.2f\n",(double)(a+b+c)/3);即可。
第二个,楼主言下之意是说在aver=(a+b+c)/3;这一句中并未实现自动转换,其实不然。(a+b+c)为int型,除以3后还是int型,将int型数值赋值给double型aver无非就是在小数点后面添加零,该句并没有要求系统自动转换,当然不会得到正确结果了。
那么在c语言中何时会进行自动转换呢,比如3/2两个整型相除,类型相同,没有自动转换,结果为整型1,而3.0/2浮点型除以整型,类型不同,系统则先将整型2自动转换成浮点型再进行计算,即两浮点型相除,结果为浮点型1.5。
其实,楼主只需要将第一次的改为
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",a+b+c);
printf("%.2f\n",(float)(a+b+c)/3);
return 0;
就已经是相当正确的解答了。
(a+b+c)为int型,强制转换成float后,除以3,类型不同无法相除,则3自动转换成float型再运算相除,其结果就符合%.2f了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-21
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",a+b+c);
printf("%.2f\n",(a+b+c)/3);关键问题在这里!!!!!
return 0;

printf("%.2f\n",(a+b+c)/3)里面有个%.2f代表的是浮点型后面显示两位小数
另外你要计算浮点必须是int / float(或者是double)型的你才能得到浮点型
int / int结果会将小数部分省去
所以a,b,c三个变量你都应该改个类型
光结果用float是没有用的
第2个回答  2009-07-21
第一个为啥会有runtime error,我不知道。。。

第二个,你把
aver=(a+b+c)/3;
改成
aver=(float)((a+b+c)/3);
试试看?

你原来的aver=(a+b+c)/3仅仅是把整型的值赋给aver。
第3个回答  2009-07-21
把第一次的程序改成如下就可以
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",a+b+c);
printf("%.2f\n",(float)(a+b+c)/3); //这里加个强制类型转换

第一个错误:
如果不加强制类型转换那么(a+b+c) /3是int型的 不能以float型输出

第二个错误:
aver=(a+b+c)/3;
先计算(a+b+c)/3的结果是int型的 (只保留了整数部分)
再把结果转化成double型 所以平均值的两位小数始终是00

希望对你有所帮助
第4个回答  2009-07-21
第一个,abc都是int变量,所以(a+b+c)/3依旧是int变量,而你要求输出float变量就不行了。。。
第二个么。。。不是解决了么?就是float和double的精度不同么。。。
第5个回答  2009-07-21
为什么会出错呢,你定义的变量时int(整型)你求的平均值却是浮点型,所以会出错,你要把你求的平均值转化成浮点型就可以。请看下面的程序。
#include<stdio.h>
main()
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
printf("%d\n",a+b+c);
printf("%.2f\n",(float)(a+b+c)/3);
getch();
return 0;
}