C语言学习笔记(二)

学习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 <stdio.h>

/*当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 <stdio.h>

/*当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 编写一个程序打印摄氏温度转换为相应华氏温度的转换表。

______________________________________________________________________________

练习1-3:
#include <stdio.h>

/*当fahr= 0, 20, ..., 300时,分别
    打印华氏温度与摄氏温度对照表   */

main() {
    float fahr, celsius;
    int lower, upper, step;

    lower  = 0;  /* 温度表的下限 */
    upper = 300;  /* 温度表的上限 */
    step = 20;  /*步长*/

    fahr = lower;
    printf("\n---------------华氏温度与摄氏温度对照表------------\n\n");
    printf("  F      C\n");
    while (fahr <= upper) {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f %6.1f\n", fahr, celsius);
        fahr = fahr + step;
    }
}      

练习1-4:

摄氏温度转换为相应华氏温度,公式是 celsius*(9.0/5.0)+32

#include <stdio.h>

/*当fahr= 0, 20, ..., 300时,分别
    打印摄氏温度与华氏温度对照表   */

main() {
    float fahr, celsius;
    int lower, upper, step;

    lower  = -17;  /* 温度表的下限 */
    upper = 148;  /* 温度表的上限 */
    step = 11;  /*步长*/

    celsius = lower;
    printf("\n---------------摄氏温度与华氏温度对照表------------\n\n");
    printf("  C      F\n");
    while (celsius < upper) {
        fahr = celsius * (9.0/5.0)  + 32.0;
        printf("%3.0f %6.1f\n", celsius, fahr);
        celsius = celsius + step;
    }
}    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值