本书是印度各大学使用最广的C语言程序设计教材之一。
本书旨在教授读者如何使用C语言进行程序设计。全书贯彻了“用示例学习”的概念。在深入介绍了C语言的每个特性之后,给出了一个完整的示例程序,用于演示说明其应用。每章末尾的“案例学习”不仅介绍了把C语言的特性集成在一起的常用方法,而且还显示了它在实际生活中的应用。最后一章介绍了开发高效、无错误的C程序的一些指导原则。
本书在前一版的基础上增加介绍了C99的一些新特性,并增加了不少复习题和项目设计题,而且在附录Ⅳ中给出了4个完整的应用程序开发示例,使得本书的实际应用性更强。可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。
C语言是所有本科生课程的一门核心课,也是现今使用最广泛的计算机语言。国内国外的C语言图书已经非常多了,但通过本书的翻译,我们觉得这本书还是很有引进价值,具体表现在它的以下几个特点上:
本书是基于最新的C语言标准。
附录Ⅳ给出了4个完整的应用程序开发示例。
扩展讨论了C的指针。
每章后面的“谨记”一节给出了很有用的编程提示以及容易出错的问题。
每章后面的案例学习给出了20多个真实的开发,展示了C程序的设计过程。
80多个程序设计范例向读者阐述了良好程序设计的基本原则。
还有近200个复习题和130多个项目设计题。
第1章 C语言概述/1
1.1 C语言的历史/1
1.2 C语言的主要特性/2
1.3 示例程序1:显示一条消息/3
1.4 示例程序2:两个数相加/6
1.5 示例程序3:利息计算/7
1.6 示例程序4:子例程的使用/9
1.7 示例程序5:数学函数的使用/10
1.8 C程序的基本结构/12
1.9 编程风格/13
1.10 运行一个程序/13
1.11 UNIX系统环境下/14
1.11.1 创建程序/14
1.11.2 编译与链接/15
1.11.3 运行程序/15
1.11.4 创建自己的可运行文件/16
1.11.5 多个源文件问题/16
1.12 MS-DOS系统环境下/17
复习题/17
编程练习/19
第2章 常量、变量及数据类型/22
2.1 概述/22
2.2 字符集/22
2.3 C标记符/23
2.4 关键字与标识符/24
2.5 常量/24
2.5.1 整型常量/24
2.5.2 实数常量/25
2.5.3 单字符常量/27
2.5.4 字符串常量/27
2.5.5 反斜杠字符常量/27
2.6 变量/28
2.7 数据类型/29
2.7.1 整数型/30
2.7.2 浮点数类型/30
2.7.3 void类型/31
2.7.4 字符类型/31
2.8 变量的声明/31
2.8.1 基本类型的声明/31
2.8.2 自定义类型的声明/33
2.9 存储类的声明/34
2.10 变量的赋值/35
2.10.1 赋值语句/36
2.10.2 从键盘读取数据/38
2.11 符号常量的定义/40
2.11.1 可修改性/40
2.11.2 可理解性/41
2.12 将变量声明为常量/42
2.13 将变量声明为可变的/42
2.14 数据的溢出/42
2.15 案例学习/43
2.15.1 平均数计算/43
2.15.2 温度转换问题/44
复习题/46
编程练习/47
第3章 运算符与表达式/49
3.1 概述/49
3.2 算术运算符/49
3.2.1 整数算术运算/50
3.2.2 实数算术运算/50
3.2.3 混合算术运算/51
3.3 关系运算符/51
3.4 逻辑运算符/53
3.5 赋值运算符/54
3.6 递增和递减运算符/55
3.7 条件运算符/56
3.8 逐位运算符/57
3.9 特殊运算符/57
3.9.1 逗号运算符/57
3.9.2 sizeof运算符/58
3.10 算术表达式/59
3.11 表达式的计算/60
3.12 算术表达式的优先级/61
3.13 一些可计算性问题/62
3.14 表达式中的类型转换/63
3.14.1 隐式类型转换/63
3.14.2 显式类型转换/65
3.15 运算符的优先级及其关联/67
3.16 数学函数/68
3.17 案例学习/69
3.17.1 销售人员的工资/69
3.17.2 二次方程的求解/70
复习题/71
编程练习/75
第4章 输入输出操作管理/78
4.1 概述/78
4.2 读取一个字符/78
4.3 写字符/81
4.4 格式化输入/82
4.4.1 整数输入/83
4.4.2 实数输入/85
4.4.3 字符串输入/86
4.4.4 混合数据类型的读取/88
4.4.5 错误输入的检测/88
4.4.6 使用scanf函数时应记住的几个要点/90
4.5 格式化输出/91
4.5.1 整数的输出/91
4.5.2 实数的输出/92
4.5.3 单个字符的显示/94
4.5.4 字符串的显示/95
4.5.5 混合数据的输出/96
4.5.6 提高输出的可读性/97
4.6 案例学习/98
4.6.1 库存报告/98
4.6.2 可靠性图形/100
复习题/101
编程练习/104
第5章 判断与分支/106
5.1 概述/106
5.2 if判断语句/106
5.3 简单if语句/107
5.4 if…else语句/110
5.5 嵌套if…else语句/113
5.6 阶梯式else if语句/116
5.7 switch语句/119
5.8 ?:运算符/122
5.9 goto语句/125
5.10 案例学习/128
5.10.1 数值的分布范围/128
5.10.2 账单计算/129
复习题/132
编程练习/137
第6章 判断与循环/140
6.1 概述/140
6.2 while语句/142
6.3 do语句/144
6.4 for语句/146
6.4.1 简单的for循环语句/146
6.4.2 for循环的其他特性/149
6.4.3 for循环的嵌套/150
6.5 循环中的跳转/153
6.5.1 跳出循环/153
6.5.2 跳过循环的一部分/157
6.5.3 避免使用goto语句/159
6.5.4 跳出程序/159
6.6 简洁的测试表达式/160
6.7 案例学习/161
6.7.1 二项式系数表/161
6.7.2 柱状图/162
6.7.3 最小成本/164
6.7.4 描绘两函数的曲线图/165
复习题/168
编程练习/172
第7章 数组/176
7.1 概述/176
7.2 一维数组/177
7.3 一维数组的声明/178
7.4 一维数组的初始化/180
7.4.1 编译时初始化/181
7.4.2 运行时初始化/182
7.5 二维数组/184
7.6 二维数组的初始化/188
7.7 多维数组/192
7.8 动态数组/193
7.9 与数组相关的其他内容/193
7.10 案例学习/194
7.10.1 数列的中值问题/194
7.10.2 标准偏差的计算/197
7.10.3 测试评分/198
7.10.4 产品与销售分析/201
复习题/207
编程练习/210
第8章 字符数组与字符串/213
8.1 概述/213
8.2 字符串变量的声明与初始化/213
8.3 使用scanf函数从终端读取字符串/215
8.3.1 读取文本行/217
8.3.2 使用getchar和gets函数/217
8.4 在屏幕上显示字符串/219
8.4.1 使用printf函数/219
8.4.2 使用putchar和puts函数/223
8.5 字符的算术运算/223
8.6 将字符串组合在一起/225
8.7 两个字符串的比较/226
8.8 字符串处理函数/227
8.8.1 strcat()函数/227
8.8.2 strcmp()函数/228
8.8.3 strcpy()函数/229
8.8.4 strlen()函数/229
8.8.5 其他字符串函数/230
8.9 字符串表/232
8.10 字符串的其他特性/234
8.11 案例学习/235
8.11.1 计算文本中的字数/235
8.11.2 客户列表处理程序/237
复习题/239
编程练习/242
第9章 用户自定义函数/244
9.1 概述/244
9.2 为什么需要自定义函数/244
9.3 多函数程序/245
9.4 自定义函数的元素/247
9.5 函数的定义/247
9.5.1 函数头/248
9.5.2 函数名与类型/248
9.5.3 形参列表/248
9.5.4 函数体/249
9.6 返回值及其类型/250
9.7 函数调用/251
9.8 函数声明/253
9.9 函数的类型/255
9.10 无参数无返回值的函数/255
9.11 有参数无返回值的函数/257
9.12 有参数有返回值的函数/260
9.13 无参数但有一个返回值的函数/263
9.14 返回多个值的函数/264
9.15 函数的嵌套/265
9.16 函数的迭代/266
9.17 将数组传递给函数/267
9.17.1 一维数组/267
9.17.2 二维数组/271
9.18 将字符串传递给函数/271
9.19 变量的作用域、可见性和生存期/272
9.19.1 自动变量/273
9.19.2 外部变量/274
9.19.3 外部声明/277
9.19.4 静态变量/278
9.19.5 寄存器变量/279
9.19.6 嵌套代码块/280
9.20 多文件程序/281
9.21 案例学习/284
复习题/286
编程练习/290
第10章 结构体与共用体/293
10.1 概述/293
10.2 结构体的定义/293
10.3 声明结构体变量/294
10.4 访问结构体成员/296
10.5 结构体的初始化/297
10.6 结构体变量的复制与比较/299
10.7 单个成员的运算/300
10.8 结构数组/301
10.9 结构体中的数组/303
10.10 结构体中的结构体/304
10.11 结构体与函数/306
10.12 共用体/309
10.13 结构体的大小/310
10.14 位域/310
10.15 案例学习/313
复习题/317
编程练习/320
第11章 指针/323
11.1 概述/323
11.2 理解指针/323
11.3 访问变量的地址/325
11.4 指针变量的声明/326
11.5 指针变量的初始化/327
11.6 通过指针访问变量/329
11.7 指针链/331
11.8 指针表达式/331
11.9 指针的递增与比例因子/333
11.10 指针与数组/334
11.11 指针与字符串/337
11.12 指针数组/339
11.13 指针作为函数的参数/340
11.14 函数返回指针/343
11.15 指向函数的指针/343
11.16 指针与结构体/346
11.17 案例学习/349
11.17.1 考试成绩处理程序/349
11.17.2 库存更新程序/352
复习题/354
编程练习/357
第12章 文件管理/358
12.1 概述/358
12.2 定义并打开文件/359
12.3 关闭文件/360
12.4 文件的输入输出操作/361
12.4.1 getc与putc函数/361
12.4.2 getw和putw函数/362
12.4.3 fprintf与fscanf函数/364
12.5 I/O操作的错误处理/366
12.6 随机访问文件/368
12.7 命令行参数/373
复习题/375
编程练习/376
第13章 动态内存分配与链表/378
13.1 概述/378
13.2 动态内存分配/378
13.3 用malloc函数分配一块内存/379
13.4 用calloc函数分配多个内存块/381
13.5 用free函数释放已用的空间/381
13.6 用realloc函数改变内存块的大小/382
13.7 链表的概念/383
13.8 链表的优点/386
13.9 链表的种类/387
13.10 再论指针/387
13.11 创建链表/389
13.12 插入一个数据项/392
13.13 删除一个数据项/395
13.14 链表的应用/397
13.15 案例学习/398
13.15.1 在已排序链表中插入数据/398
13.15.2 构建一个已排序的链表/402
复习题/404
编程练习/406
第14章 预处理器/408
14.1 概述/408
14.2 宏替换指令/408
14.2.1 简单宏替换/409
14.2.2 含参数的宏/411
14.2.3 宏嵌套/412
14.3 文件包含/412
14.4 编译器控制指令/413
14.4.1 情形1/414
14.4.2 情形2/414
14.4.3 情形3/415
14.4.4 情形4/415
14.5 ANSI C的其他预处理器指令/416
14.5.1 #elif指令/416
14.5.2 #pragma指令/417
14.5.3 #error指令/417
14.5.4 字符串化运算符#/418
14.5.5 标记符粘贴运算符##/418
复习题/419
编程练习/420
第15章 C程序开发指导原则/421
15.1 概述/421
15.2 程序设计/421
15.2.1 问题分析/421
15.2.2 勾勒程序结构/421
15.2.3 算法开发/422
15.2.4 控制结构/422
15.3 程序编码/423
15.3.1 自身文档化/423
15.3.2 语句构造/424
15.3.3 输入/输出格式/424
15.3.4 程序的通用性/424
15.4 常见的程序错误/425
15.4.1 丢失分号/425
15.4.2 误用分号/425
15.4.3 丢失括号/426
15.4.4 丢失引号/427
15.4.5 误用引号/427
15.4.6 使用不正确的注释字符/427
15.4.7 未定义变量/428
15.4.8 忽视了运算符的优先级/428
15.4.9 忽视了递增递减运算符的计算顺序/429
15.4.10 忽视了函数参数的说明/429
15.4.11 在函数调用中实参和形参类型不匹配/429
15.4.12 函数未声明/429
15.4.13 在scanf的参数中丢失了&运算符/430
15.4.14 超出了数组的边界/430
15.4.15 忘记了给字符串的空字符留出空间/431
15.4.16 使用未初始化的指针/431
15.4.17 丢失了间接运算符和地址运算符/431
15.4.18 在指针表达式中丢失括号/432
15.4.19 在宏定义语句中参数遗漏了括号/432
15.5 程序测试与调试/432
15.5.1 错误的类型/433
15.5.2 程序测试/433
15.5.3 程序调试/434
15.6 程序的效率/435
15.6.1 运行时间/435
15.6.2 内存需求/435
复习题/435
附录I 位级程序设计/437
Ⅰ.1 概述/437
Ⅰ.2 逐位逻辑运算符/437
Ⅰ.2.1 逐位与操作/437
Ⅰ.2.2 逐位或操作/439
Ⅰ.2.3 逐位非或操作/439
Ⅰ.3 逐位移位运算符/439
Ⅰ.4 逐位求反运算符/440
Ⅰ.5 屏蔽/441
附录Ⅱ/442
附录Ⅲ/443
附录Ⅳ 项目设计/446
Ⅳ.1 库存管理系统/446
Ⅳ.2 登录记录系统/468
Ⅳ.3 链表/488
Ⅳ.4 矩阵相乘/496
附录V C99的特性/499
Ⅴ.1 概述/499
Ⅴ.2 新关键字/499
Ⅴ.3 新注释/499
Ⅴ.4 新数据类型/500
Ⅴ.4.1 _Bool类型/500
Ⅴ.4.2 _Complex和_Imaginary类型/500
Ⅴ.4.3 long long类型/500
Ⅴ.5 变量声明/501
Ⅴ.6 I/O格式化的变化/501
Ⅴ.7 数组处理/501
Ⅴ.7.1 可变长度数组/502
Ⅴ.7.2 数组声明中的类型说明/502
Ⅴ.7.3 结构的灵活数组成员/502
Ⅴ.8 函数实现/502
Ⅴ.8.1 默认为inline类型的规则/503
Ⅴ.8.2 显式函数定义/503
Ⅴ.8.3 return语句的限制/503
Ⅴ.8.4 声明函数为inline/504
Ⅴ.9 受限指针/504
Ⅴ.10 编译器限制的变化/505
Ⅴ.11 其他改进/505
参考文献