环境准备
我的是Mac环境
cc:
Apple LLVM version 10.0.0 (clang-1000.10.44.2) Target:x86_64-apple-darwin17.7.0 Thread model: posix
编辑器:CotEditor
1.1 入门
需求
打印hello,world
开发
- 新建hello.c文件
- 输入下列代码
#includemain(){ printf("hello,world\n");}
但请注意,以上代码编译后会产生警告,原书发布时间较早的原因,是没有说明的,大家要留意。
hello.c:2:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] main() ^
所以我们要改成:
#includeint main(){ printf("hello,world\n");}
或
#includeint main(){ printf("hello,world\n"); return 0;}
这两种写法编译后都不会产生警告,正确编译,但是推荐用第二种写法,因为从程序运行上更严谨。
- 在终端中输入
cc hello.c
,执行 - 在hello.c所在目录,继续输入
./a.out
,执行,输出hello,world
注意事项
- 不加n情况
#includeint main(){ printf("hello,world"); return 0;}
输出结果,发现hello,world没有换行。
- n换成c情况
#includeint main(){ printf("hello,world\c"); return 0;}
输出结果,发现编译时出现警告,并且运行是hello,world后面多了一个c,但是没有输出。
1.2 变量与算数表达式
需求1
使用公式℃=(5/9)(℉-32),打印下列华氏度与摄氏度的对照表
0 -1720 -640 460 1580 26100 37120 48140 60160 71180 82200 93220 104240 115260 126280 137300 148开发
- 新建文件,键入下列代码
#includeint main(){ /*当fahr=0,20,...,300时,分别打印华氏温度与摄氏温度对照表*/ float fahr,celsius; float lower,upper,step; lower=0;/*温度表的下限*/ upper=300;/*温度表的上限*/ step=20;/*步长*/ fahr=lower; printf("%s\t%s\n","华氏度","摄氏度"); while(fahr<=upper){ celsius=(5.0/9.0)*(fahr-32.0); printf("%3.0f\t%6.1f\n",fahr,celsius); fahr=fahr+step; } return 0;}
- 输出结果
需求2
根据需求1,将摄氏温度转换为华氏温度,其他条件不变
开发
根据需求1的公式,有需求2的公式,℉=(9℃+160)/5
- 新建文件,键入下列代码
#includeint main(){ /*当celsius=0,20,...,300时,分别打印摄氏温度与华氏温度对照表*/ float fahr,celsius; float lower,upper,step; lower=0;/*温度表的下限*/ upper=300;/*温度表的上限*/ step=20;/*步长*/ celsius=lower; printf("%s\t%s\n","摄氏度","华氏度"); while(celsius<=upper){ fahr=(160.0/5.0)+(9*celsius/5.0); printf("%3.0f\t%6.1f\n",celsius,fahr); celsius=celsius+step; } return 0;}
- 输出结果
注意事项
-
/*注释*/
表示多行注释,另一种是单行注释//注释
- 类型
类型 | 范围 | 说明 |
---|---|---|
char | -128~127 | 字符 |
short | -32768~32767 | 短整型 |
int | 16位-32768~32767,32位-2147483648~2147483647($-2^{32}~2^{32}-1$) | 整型 |
long | 长整型 | |
float | $10^{-38}-10^{38}$$ | 单精度浮点型 |
double | 双精度浮点型 |
- 整数除法操作将进行舍位,结果中的任何小数部分都会被舍弃
- 格式化,百分号(%)表示参数替换位置,后面紧跟的符号,表示打印的格式
格式 | 说明 |
---|---|
%d | 打印十进制整数 |
%3d | 打印3位十进制整数,右对齐 |
%3.0d | 打印3位十进制整数,且不带小数点和小数部分,右对齐 |
%3.1d | 打印3位十进制整数,且带小数点和1位小数,右对齐 |
%.1d | 打印十进制整数,且带小数点和1位小数,右对齐 |
%f | 打印十进制浮点数,包括float、double类型 |
%x | 打印十六进制数 |
%o | 打印八进制数 |
%s | 打印字符串 |
%c | 打印字符 |
%% | 打印%本身 |
1.3 for
需求1
将1.2节需求1中的while改成for来实现
开发
- 新建文件,键入下列代码
#includeint main(){ /*当fahr=0,20,...,300时,分别打印华氏温度与摄氏温度对照表*/ int fahr; printf("%s\t%s\n","华氏度","摄氏度"); for(fahr=0;fahr<=300;fahr=fahr+20){ printf("%3d\t%6.1f\n",fahr,((5.0/9.0)*(fahr-32))); } return 0;}
- 输出结果
需求2
将需求1中的结果逆序打印
开发
- 新建文件,键入下列代码
#includeint main(){ /*当fahr=0,20,...,300时,分别打印华氏温度与摄氏温度对照表*/ int fahr=300; printf("%s\t%s\n","华氏度","摄氏度"); for(fahr=300;fahr>=0;fahr=fahr-20){ printf("%3d\t%6.1f\n",fahr,((5.0/9.0)*(fahr-32))); } return 0;}
- 输出结果
注意事项
- for适合循环次数已知的情况
- while适合循环次数未知的情况
1.4 符号常量
需求1
将1.3节需求1中的幻数改成符号常量来实现
开发
- 新建文件,键入下列代码
#include#define LOWER 0#define UPPER 300#define STEP 20int main(){ /*当fahr=0,20,...,300时,分别打印华氏温度与摄氏温度对照表*/ int fahr; printf("%s\t%s\n","华氏度","摄氏度"); for(fahr=LOWER;fahr<=UPPER;fahr=fahr+STEP){ printf("%3d\t%6.1f\n",fahr,((5.0/9.0)*(fahr-32))); } return 0;}
- 输出结果
注意事项
#define 名字 替换文本
- 名字与普通变量名相同,替换文本可以是任何字符序列,不仅限于数字
(未完待续)