我们来看一个程序,使用公式℃=(5/9)(°F-32)
打印下列华氏温度和摄氏温度对照表:
1 -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 <stdio.h>
/* 当 fahr=0,20,… ,300 时,
分别打印华氏温度与摄氏温度对照表 */
int 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;
}
return 0;
}
在例程中/*
与*/
之间的内容称为注释,注释用来解释说明程序,使程序更易于理解。/*
与*/
用于注释多行程序,//
用于注释单行程序,通过上面的例程,想必不难理解。
在C语言中,所有变量必须先声明后使用,声明用于说明变量的属性,由类型名和变量表组成,例如:
int fahr, celsius;
int lower, upper, step;
int
表示其后所列变量为整数型,int类型的取值范围取决于具体的机器,一般来说为4个字节,32位。除int类型外,C语言还提供了其他一些基本数据类型,如char
字符型,short
短整形,long
长整形,double
双精度浮点型,float
单精度浮点型。这些数据类型对象的大小也取决于具体的实现。
lower = 0;
upper = 300;
step = 20;
fahr = lower;
这些语句为变量设置初值,以分号结束。=
为赋值运算符,意为将右侧数值赋值给左侧变量。
温度转换各行计算方式相同,因此可以用循环语句 while
,例程中的while
用法:
while (fahr <= upper) {
celsius = 5 * (fahr32)/ 9;
printf("%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
while语句的执行方式为:先测试小括号()
中的条件,如果为真,执行大括号中的语句,执行完毕后,再次测试()
的条件,如果为真,再次执行大括号内的语句。如果为假,终止循环。条件为真时,执行大括号内的语句,如果没有大括号,则执行while
后的单条语句
我们看计算赋值语句:
celsius = 5 * (fahr - 32)/ 9;
用于将华氏温度转换为设置温度,并将结果赋值给celsius
,之所以写成 5 * (fahr - 32)/ 9
,而不是5/9*(fahr - 32)
,是因为5/9
为0,整数的除法只能整除,结果为商。
printf("%d\t%d\n", fahr, celsius);
%d
为占位符,表示这个位置的值为整数,\t
为制表符,打印时对齐用,\n
为换行符,当fahr为1,celsius为-17时,此时打印:0 -17
我们看:
printf("%3d%6d\n", fahr, celsius);
%3d
,表示fahr占3个字宽,%6d
,表示celsius占6个字宽,此时打印:空格空格0空格空格空格-17
我们的程序目前很不精确,因为所有的变量都声明为int
,在用/
操作符会舍弃掉小数部分,让我们对程序做个改造:
#include <stdio.h>
/* print FahrenheitCelsius
table
for fahr = 0, 20, ..., 300; floatingpoint
version */
int main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0; /* lower limit of temperatuire scale */
upper = 300; /* upper limit */
step = 20; /* step size */
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}
}
我们将int
类型换成了float
类型,计算公式换为celsius = (5.0/9.0) * (fahr - 32.0);
,5.0/9.0
是两个浮点数相除,结果将保留小数。
如果一个运算符的操作数均为整数,则执行整数运算。如果一个浮点数和一个整数运算,则在开始运算之前,整数型操作数将会自动转换为浮点数。在一个小类型和一个大类型做运算时,小类型会先转换成大类型再开始运算。不过即使这样,在书写时最好还是显示加上一个小数点,这样可以强调浮点性质,便于阅读。
printf("%3.0f %6.1f\n", fahr, celsius);
%3.0f
表示浮点数fahr
在打印时占3个字宽,不保留小数部分。%6.1f
表示浮点数celsius
在打印时占6个字宽,小数部分占1个字宽,不足的用空格或0补齐。
格式说明可以省略宽度和精度,例如,%6f
表示待打印的浮点数整数部分至少有6个字宽,不足用0补齐;%.2f
指定待打印的浮点数的小数部分有两位小数,但宽度没有限制
%d
按照十进制整形数打印
%6d
按照十进制整形数数打印,至少6个字宽,不足用空格补齐
%f
打印浮点数
%6f
打印浮点数,至少6个字符宽
%.2f
打印浮点数,小数点后有两位小数
%6.2f
打印浮点数,至少6个字符宽,小数后有两位小数
%o
表示八进制数,%x
表示十六进制数,
%c表示字符
,%s
表示字符串,%%
表示%
自身。
网友评论