学习C语言第二天,
1.2 变量与算术表达式
第二个C语言程序,使用公式C=(5/9)(F-32),打印下列华氏温度与摄氏温度对照表:
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
140 60
160 71
180 82
200 93
220 104
240 115
260 126
280 137
300 148
#include
/*当fahr= 0, 20, ..., 300时,分别
打印华氏温度与摄氏温度对照表 */
main() {
int fahr, celsius;
int lower, upper, step;
lower = 0; /* 温度表的下限 */
upper = 300; /* 温度表的上限 */
step = 20; /*步长*/
fahr = lower;
while (fahr <= upper) {
celsius = 5 * (fahr-32) / 9;
printf("%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
}
其中两行
/*当fahr= 0, 20, ..., 300时,分别
打印华氏温度与摄氏温度对照表 */
称为注释,此处简单地解释了该程序时做什么的。包含在/**/中间的字符序列将被编译器忽略。注释可以出现在任何空格、制表符或换行符处。
在C语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行语句之前。声明用于说明变量的属性,它由一个类型名和一个变量表组成,例如:
int fahr, celsius;
int lower, upper, step;
其中,类型int表示其后所列变量为整数,与之相对应的,float表示所列变量为浮点数(即,可以带有小数部分的数)。int和float类型的取值范围取决与具体的机器。对于int类型通常是16位,其取值范围在-32768~+32768之间,也有用32为表示int类型。float类型通常是32位,它至少有6位有效数字,取值范围一般在10^-38~10+38之间。
除int和float类型之外,还有
char 字符——一个字节
short 短整型
long 长整型
double 双精度浮点型
这些数据类型的大小也取决与具体机器。另外,还存在这些基本类型数据的数组、结构、联合,指向这些类型的指针以及返回这些类型值的函数。
最开始执行的计算是4个赋值语句:
lower = 0; /* 温度表的下限 */
upper = 300; /* 温度表的上限 */
step = 20; /*步长*/
fahr = lower;
它们为变量设置初值。各条语句均以分号结束。
每行计算方式相同,此处使用while循环。while循环执行方式:先测试圆括号中的条件:如果为真,则执行循环体,直到条件为假,循环结束,并继续执行跟在循环语句后的下一条语句。本程序中之后没有其他语句,整个称许执行终止。
花括号{}循环体内可以写一条语句或多条语句,并缩进。这种缩进方式突出了程序的逻辑结构。
我们建议每行只书写一条语句,并在运算符两边各加上一个空格字符,这样可以使得运算的结合关系更清楚明了。
循环体内的赋值语句:
celsius = 5 * (fahr-32) / 9;
用于计算与指定华氏温度相对应的摄氏温度的值,并将结果赋值给变量celsius。再该语句中把表达式写成先乘5再除以9,而不是直接写成5/9,是应为C语言及许多其他语言中,整数除法操作将执行舍位,结果中的任何小数部分都会舍弃。由于5和9都是整数,5/9结果是0,所有计算结果都将是0。
printf是一个通用输出格式化函数。该函数第一个参数是待打印的字符串,其中每个%表示其他的参数(第二个、第三个、...)之一进行替换的位置,并指定打印格式。例如,%d指定一个整型参数。因此:
printf("%d\t%d\n", fahr, celsius);
用于打印两个整数fahr和celsius的值,并再两者中间留一个制表符的空间。printf第一个参数中的%对应的参数,数目和类型都必须匹配,否则将出现错误的结果。
printf函数并不是C语言本身的一部分,C语言本身并没有定义输入/输出功能。printf仅仅是标准库函数中一个有用的函数而已,这些标准库函数在C语言程序中通常都可以使用。
上述程序存在两个问题。
第一个是输出的数不是右对齐,所以输出结果不是很美观。如果在printf语句的第一个参数的%d中指明打印宽度,则可以右对齐。
printf("%3d %6d\n", fahr, celsius);
如上,fahr的值占3个数字宽,celsius的值占6个数字宽度
另一个比较严重的问题是,整型计算得到的温度值不太精确,例如0 F度对应精确的摄氏温度应该是-17.8 C度,而不是-17。为了得到更精确的结果,使用浮点数代替。
#include
/*当fahr= 0, 20, ..., 300时,分别
打印华氏温度与摄氏温度对照表 */
main() {
float fahr, celsius;
int lower, upper, step;
lower = 0; /* 温度表的下限 */
upper = 300; /* 温度表的上限 */
step = 20; /*步长*/
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr-32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}
}
两个程序基本一致,不同之处是把fahr和celsius声明程float类型,转换公式更自然。
如果某个算术运算符的所有操作数均是整数,则执行整数运算。但是,如果有一个浮点数,那么整型会被转换为浮点数后再运算。即使浮点数取的是整数值,也最好加上一个显式的小数点,这样可以强调其浮点性质,便于阅读。
printf中的转换说明%3.0f表明待打印的浮点数至少占3个字符宽,且不带小数点和小数部分;%6.1f表明另一个待打印的数至少占6个字符宽,且小数点后面有1位小数。
%d 按照十进制整型打印
%6d 按照十进制整型打印,至少6个字符宽
%f 按照浮点数打印
%6f 按照浮点数打印,至少6个字符宽
%.2f 按照浮点数打印,小数点后有两位小数
%6.2f 按照浮点数打印,至少6个字符宽,小数点后有两位小数
此外,printf还支持:%o八进制,%x十六进制,%s字符串,%%百分号本身。
练习1-3 修改温度转换程序,是之能再转换表的顶部打印一个标题
练习1-4 编写一个程序打印摄氏温度转换为响应华氏温度的转换表。