这是《C程序设计语言》第二版中1.2的练习题,要求根据Celsius = (5 / 9) * (Fahr - 32)的公式实现一个比照表的打印输出。 (运算符号两侧最好用空格与其他内容分隔开,这样可以提高代码的可读性)
这道练习题看似简单,但其实藏着一个很容易被忽视的坑,那就是C语言中,整数除法操作会自动执行舍位,结果中的任何小数部分都会被舍弃。由于5和9都是整数,相除结果为0,因此这样计算求得的所有摄氏度都将为0。对此我们采用5 * (Fahr - 32) / 9的运算方式来进行运算下面是成功的例子
#include <stdio.h> main(){ //整数型华氏度摄氏度比照表成功案例 int Fahr,Celsius; int max,min,step; max = 300;//最大值 min = 0;//最小值 step = 20;//步长(间距) Fahr = min; printf("Fahr\tCelsius\n");//打印标题 while(Fahr <= max){ //while循环语句,循环将Fahr换算为Celsius Celsius = 5*(Fahr - 32) / 9; printf("%d\t%d\n",Fahr,Celsius); //%d\t和%d\n整体上作为printf语句的第一个参数,分别对第二和第三个参数的格式进行设置 //%d表示按照整数打印, //%.1f表示按照整数打印,小数点后有一位小数 //%9f表示按照整数打印,至少9个字符宽 //%9.1f表示则是在上述基础上,小数点后有一位小数 //\t和\n是换码序列,\t表示制表符(9个空格)\n表示换行输出 Fahr = Fahr + step; } }
使用整数型的变量有较大的不足,计算得到的摄氏度不太精确,例如华氏度0应对应摄氏度-17.8,计算得到的结果却为-17,这点在下面的程序中能得到解决。
由于已经用float声明了变量为浮点型,因此在=的赋值运算中,等号右侧的字面量(数据)会自动转换为小数 ,但最好还是将字面量(数据)写为小数的形式,这样可以强调其浮点性,增强代码可读性。
#include <stdio.h> main(){ float Fahr,Celsius; float Upper,Lower,Step; Upper = 300; Lower = 0.0; Step = 20.0; //由于已经用float声明了变量为浮点型, //因此在=的赋值运算中,等号右侧的字面量(数据)会自动转换为小数 //但最好还是将字面量(数据)写为小数的形式,这样可以强调其浮点性,增强代码可读性。 Fahr = Lower; printf("Fahr\tCelsius\n"); while(Fahr <= Upper){ Celsius = 5 * (Fahr - 32) / 9; printf("%3.0f %9.1f\n",Fahr,Celsius); //%f表示按照浮点数打印, //%.1f表示按照浮点数打印,小数点后有一位小数 //%9f表示按照浮点数打印,至少9个字符宽 //%9.1f表示按照则是在上述基础上,小数点后有一位小数 Fahr = Fahr + Step; } }
%f表示按照浮点数打印,
%.1f表示按照浮点数打印,小数点后有一位小数
%9f表示按照浮点数打印,至少9个字符宽
%9.1f表示按照则是在上述基础上,小数点后有一位小数