第1章 程序设计ABC 1
1.1计算机与人 2
1.2计算机与程序设计语言 3
1.3程序设计语言的故事 6
1.4程序设计语言的工作原理 10
1.4.1运行 10
1.4.2内存 12
1.5本章小结 12
习题1 12
第2章 数据类型、运算符与表达式 13
2.1一个简单的C程序例子 14
2.2 C程序常见标识符号分类 15
2.3数据类型 17
2.3.1 为什么引入数据类型 17
2.3.3类型修饰符 18
2.3.2从基本数据类型到抽象数据类型 18
2.3.4标识符命名 20
2.4常量 20
2.4.1整型常量 20
2.4.2实型常量 21
2.4.3字符常量 22
2.4.4字符串常量 22
2.4.5宏常量 23
2.4.6枚举常量 24
2.5变量 25
2.5.1变量的声明与初始化 25
2.5.2 const类型修饰符 26
2.5.3使用变量时的注意事项 27
2.6.2算术运算符 31
2.6.1运算符的优先级与结合性 31
2.6常用运算符及表达式 31
2.6.3关系运算符 33
2.6.4逻辑运算符 35
2.6.5赋值运算符 36
2.6.6增1和减1运算符 37
2.6.7强制转换运算符 39
2.6.8位运算符 40
2.6.9逗号运算符 42
2.7赋值和表达式中的类型转换 43
2.8本章小结 44
习题2 45
第3章 简单的C程序设计 47
3.2表达式语句 48
3.3复合语句和空语句的作用 48
3.1 C语句分类 48
3.4基本输入/输出操作的实现 50
3.4.1字符输入/输出 50
3.4.2格式输入/输出 52
3.4.3使用scanf()时需要注意的问题 59
3.5本章小结 64
习题3 64
第4章 程序的控制结构 68
4.1算法及其描述方法 69
4.1.1算法的概念 69
4.1.2算法的描述方法 70
4.2顺序结构 72
4.2.1顺序结构的流程图表示 72
4.2.2应用程序举例 73
4.3.1应用场合 77
4.3.2选择结构的流程图表示 77
4.3选择结构 77
4.3.3条件语句 78
4.3.4开关语句 88
4.4循环结构 92
4.4.1应用场合 92
4.4.2循环结构的流程图表示 93
4.4.3循环语句 94
4.4.4单重循环应用举例 96
4.4.5嵌套循环及其应用举例 108
4.5流程的转移控制 114
4.5.1 goto语句 114
4.5.2 break与continue语句 114
4.5.3 exit()函数 117
4.5.4应用程序举例 119
4.6程序排错 125
4.6.1程序中常见的出错原因 126
4.6.2程序调试与排错基本方法 127
4.6.3使用getchar()的问题 128
4.7结构化程序设计方法简介 137
4.7.1关于goto论战 137
4.7.2结构化程序设计的核心思想 137
4.7.3 自顶向下、逐步求精的程序设计方法 138
4.8本章小结 142
习题4 143
第5章 函数 153
5.1程序设计的艺术 154
5.2函数的定义与使用 155
5.2.1 函数的分类 155
5.2.2函数的定义 156
5.2.3函数的调用、参数和返回值 156
5.2.4函数原型 158
5.2.5 main()函数的特殊性 160
5.3变量的作用域和存储类型 161
5.3.1变量的作用域 161
5.3.2全局变量 163
5.3.3变量的存储类型 165
5.4函数封装 168
5.5模块和链接 168
5.6程序调试实例 174
5.7模块化程序设计方法简介 178
5.7.1 功能分解 179
5.7.2模块划分的原则 180
5.8本章小结 180
习题5 180
第6章 数组 183
6.2.1数组的定义 184
6.2数组的定义、引用和初始化 184
6.1数组类型的应用场合 184
6.2.2数组的引用 186
6.2.3数组的初始化 187
6.2.4程序实例 188
6.3向函数传递一维数组 195
6.4向函数传递二维数组 207
6.5字符数组 216
6.5.1字符数组与字符串的关系 216
6.5.2字符数组的输入/输出 218
6.5.3字符串处理函数 219
6.5.4应用举例 221
6.6本章小结 222
习题6 223
第7章 指针 230
7.1.1指针的概念 231
7.1指针概述 231
7.1.2为什么引入指针的概念 232
7.1.3变量的指针作为函数参数 235
7.1.4字符指针作为函数参数 244
7.2指针和数组间的关系 249
7.2.1一维数组的地址和指针 250
7.2.2二维数组的地址和指针 258
7.3指针数组 264
7.4指向指针的指针 269
7.5带参数的main()函数 271
7.6动态数组的实现 272
7.6.1 C程序的内存映像 272
7.6.2动态内存分配函数 273
7.6.3一维动态数组的实现 275
7.6.4二维动态数组的实现 276
7.7代码风格问题 278
7.7.1程序版式 279
7.7.2命名规则 281
7.7.3函数设计 281
7.7.4防御性程序设计 282
7.8本章小结 283
习题7 284
第8章 结构体与共用体 291
8.1 问题的提出 292
8.2结构体类型与结构体变量 294
8.2.1结构体类型的声明 294
8.2.2关键字typedef的用法 295
8.2.3结构体变量的定义 296
8.2.4指向结构体变量的指针 300
8.2.5结构体变量的引用和初始化 300
8.3.1 结构体数组的定义 304
8.3结构体数组 304
8.3.2结构体数组的应用实例 305
8.3.3结构体数组与指针 309
8.4结构体与函数 311
*8.5动态数据结构 314
8.5.1 问题的提出 314
8.5.2链表的定义 316
8.5.3链表的特点及操作原理 317
8.5.4动态链表的建立 318
8.5.5链表的删除操作 321
8.5.6链表插入操作 322
8.6共用体 325
8.7位段 328
8.8本章小结 331
习题8 332
第9章 函数的高级应用 340
9.1递归 341
9.1.1递归问题的提出 341
9.1.2递归函数 342
9.2返回指针值的函数 347
9.3函数指针 349
9.4一个综合应用实例——学生成绩管理程序 355
9.5本章小结 374
习题9 374
第10章 文件操作 378
10.1计算机中的流 379
10.2文件 379
10.2.1存储设备的使用 379
10.2.2 目录 380
10.3.1基本文件操作函数 381
10.2.3文件格式 381
10.3基本文件操作 381
10.3.2错误处理 385
10.3.3程序示例 386
10.3.4基本文件操作的意义 393
10.4高级文件操作 393
10.4.1打开与关闭 394
10.4.2读写 394
10.4.3程序示例 396
10.4.4标准输入与标准输出 398
10.5本章小结 399
习题10 400
第11章 C程序设计常见错误及解决方案 401
条款1:使用未初始化和未赋值的变量 402
条款2:不考虑数值溢出的可能 402
条款4:假定类型取值范围 403
条款3:不用sizeof()获得类型或变量的字长 403
条款5:期望两个整数的运算自动得出浮点数的结果 404
条款6:不预先判断除数是否为0 405
条款7:混淆“&,|”与“ ,||” 405
条款8:使用依赖编译器求值顺序的语句 406
条款9:使用依靠算符优先级的表达式 406
条款10:表达式过于复杂 407
条款11:用“==”时误用“=” 407
条款12:用“==”比较两个浮点数 408
条款13:使用幻数 409
条款14:printf()和scanf()中格式控制字符串与参数类型不匹配 409
条款15:循环或判断语句以“;”结尾 410
条款16:在循环体内改变循环结束条件 410
条款19:不声明函数原型 411
条款18:switch-case语句没有default分支 411
条款17:case分支不用break结束 411
条款20:不定义函数参数或返回值的类型 412
条款21:有返回值的函数不用return指明返回值 412
条款22:调用函数后,不检查函数是否正确执行 413
条款23:变量、函数和模块功能不单一 413
条款24:函数过长 413
条款25:函数的参数过于复杂 413
条款26:返回指向局部变量的指针 413
条款27:随意修改全局变量的值 414
条款28:数组下标越界 414
条款29:字符串没有?\0?终结符 414
条款32:使用已经被free()的指针 415
条款33:文件打开后不主动关闭 415
条款31:用malloc()申请的内存不用free() 415
条款30:使用不限制最大处理长度的字符串处理函数 415
条款34:成对函数不在同一个模块或函数内调用 416
条款35:头文件不加宏定义锁 416
条款36:忽略编译器警告 416
条款37:用“复制+粘贴”的方式复用代码 417
条款38:在字符串和注释以外的地方使用全角字符 417
条款39:代码风格不佳 417
条款40:代码与注释不一致 417
后记 419
附录A 书中常用概念、名词、语句、运算符、数据类型和算法索引表 421
附录B C关键字 425
附录C C运算符的优先级与结合性 426
附录D 常用字符与ASCII码对照表 427
附录E 常用的ANSI C标准库函数 428
参考文献 436