第1章 程序设计引论 1
1.1 计算机程序与计算机语言 1
1.1.1 计算机程序 1
1.1.2 计算机内存 2
1.1.3 计算机语言 3
1.1.4 C语言简介 5
1.2 简单的C程序构成 6
1.2.1 最简单的C语言程序举例 6
1.2.2 C程序的结构 10
1.3 C程序设计的基本步骤 12
1.3.1 需求分析 12
1.3.2 详细设计 13
1.3.3 编辑程序 13
1.3.4 编译与链接 14
1.3.5 运行与调试 15
1.4 C程序文件的创建、编译与运行 16
1.4.1 CodeBlocks下程序文件的创建、编译与运行 17
1.4.2 Visual C++ 6.0下程序文件的创建、编译与运行 20
1.5 本章小结 23
第2章 算法设计基础 25
2.1 什么是算法 25
2.1.1 日常生活中的算法 25
2.1.2 计算机算法的分类 26
2.1.3 简单算法举例 27
2.2 算法的特征 28
2.3 算法的表示方法 28
2.3.1 自然语言表示算法 28
2.3.2 传统流程图表示算法 29
2.3.3 三种基本结构 30
2.3.4 用N-S流程图表示算法 31
2.3.5 其他表示算法的方法 32
2.4 程序设计中常用算法 32
2.4.1 迭代法 33
2.4.2 穷举搜索法 33
2.4.3 递推法 34
2.4.4 递归 34
2.4.5 回溯法 35
2.4.6 贪心法 35
2.4.7 分治法 36
2.4.8 动态规划法 37
2.5 本章小结 39
第3章 数据类型基础 40
3.1 数据在计算机中的存储方式 40
3.1.1 二进制 40
3.1.2 位与字节 40
3.1.3 数据的存储方式 41
3.2 常量与变量 42
3.2.1 基本概念 42
3.2.2 定义常量的名字(预处理命令#define) 43
3.2.3 变量的声明和赋值 44
3.2.4 常量的分类 46
3.3 基本数据类型 49
3.3.1 整型 49
3.3.2 实型 50
3.3.3 字符型 51
3.3.4 sizeof()求类型大小 52
3.4 数据类型转换 53
3.4.1 自动转换 53
3.4.2 强制类型转换 54
3.5 运算符与表达式 54
3.5.1 算术运算符 55
3.5.2 自增运算符和自减运算符 55
3.5.3 算术表达式 56
3.5.4 运算符的优先级和结合性 57
3.6 本章小结 58
第4章 顺序控制结构与数据的输入输出 59
4.1 顺序结构 59
4.1.1 C语句综述 59
4.1.2 赋值运算符和赋值表达式 61
4.1.3 顺序结构实例 63
4.2 数据的输入输出及实现 66
4.3 字符数据的输入输出 66
4.3.1 putchar函数 66
4.3.2 getchar函数 67
4.4 格式化输入输出 68
4.4.1 格式输出printf函数 68
4.4.2 格式输入scanf函数 70
4.5 本章小结 74
第5章 分支控制结构 75
5.1 关系运算符和关系表达式 75
5.2 逻辑运算符和逻辑表达式 76
5.3 if语句 79
5.3.1 if语句的三种形式 79
5.3.2 if语句的嵌套 84
5.3.3 条件运算符与条件表达式 85
5.3.4 if语句中的复合语句 87
5.4 switch语句 88
5.5 本章小结 91
第6章 循环控制结构 92
6.1 循环控制结构 92
6.2 while()语句 93
6.2.1 while语句的一般形式 93
6.2.2 如何终止while循环 93
6.2.3 while语法要点 95
6.2.4 计数循环与不确定循环 97
6.3 do…while语句——退出条件循环 98
6.3.1 do while的一般形式 98
6.3.2 do while语句的使用 98
6.3.3 do while语句的语法要点 99
6.4 逗号运算符和逗号表达式 100
6.5 for语句 101
6.5.1 for语句的一般形式 102
6.5.2 for语句的灵活运用 104
6.5.3 逗号表达式在for语句中的使用 107
6.6 空语句在循环中的使用 107
6.7 循环语句的选择 108
6.8 循环嵌套 109
6.9 break和continue语句 112
6.10 本章小结 114
第7章 函数 116
7.1 函数概述 116
7.1.1 什么是函数 116
7.1.2 为什么使用函数 117
7.1.3 函数的特点 118
7.1.4 函数的分类 118
7.2 函数定义和调用 118
7.2.1 函数定义 118
7.2.2 函数调用 120
7.2.3 函数的声明 122
7.2.4 return语句 123
7.3 嵌套调用与递归调用 124
7.3.1 嵌套调用 124
7.3.2 递归调用 125
7.4 变量与函数 130
7.4.1 变量的作用域和存储类别 130
7.4.2 局部变量的作用域和存储类别 131
7.4.3 全局变量的作用域和存储类别 134
7.5 随机数函数 136
7.6 本章小结 139
第8章 数组 141
8.1 一维数组的定义、引用与初始化 143
8.1.1 一维数组的定义 143
8.1.2 一维数组元素的引用 144
8.1.3 一维数组的初始化 146
8.2 一维数组的应用 149
8.2.1 Fibonacci数列 149
8.2.2 统计问题 151
8.2.3 排序问题 152
8.2.4 查找问题 158
8.2.5 逆置与移位 162
8.2.6 元素删除 165
8.3 二维数组 166
8.3.1 二维数组的定义 166
8.3.2 二维数组元素的引用 167
8.3.3 二维数组的初始化 168
8.3.4 二维数组程序举例 169
8.4 数组与函数 171
8.4.1 数组元素作函数实参 171
8.4.2 数组名作为函数参数 172
8.5 本章小结 174
第9章 指针 175
9.1 地址与指针 175
9.1.1 变量、数组、函数与地址 175
9.1.2 变量的地址和变量的值 176
9.1.3 变量的访问方式 177
9.1.4 指针和指针变量 178
9.2 指针变量 179
9.2.1 指针变量的定义 179
9.2.2 指针变量的引用 180
9.2.3 指针变量作为函数参数 185
9.3 指向数组的指针变量 189
9.3.1 指向数组元素的指针 189
9.3.2 通过指针引用数组元素 190
9.3.3 指向数组的指针变量作为函数参数 193
9.3.4 指向多维数组的指针变量 199
9.4 函数指针变量 207
9.4.1 函数指针与指向函数的指针变量 207
9.4.2 用函数指针变量调用函数 208
9.4.3 用指向函数的指针变量作函数参数 211
9.5 返回指针值的函数 212
9.6 指针数组和指向指针的指针 214
9.6.1 指针数组的概念 214
9.6.2 指向指针的指针 217
9.7 本章小结 219
第10章 字符串 221
10.1 字符串常量 221
10.1.1 字符串与字符串结束标志 221
10.1.2 什么是字符串常量 221
10.1.3 如何存储字符串常量 222
10.2 如何表示字符串变量 223
10.2.1 字符数组的定义与引用 223
10.2.2 字符数组的初始化 224
10.2.3 指针变量与字符串 225
10.2.4 字符串数组 228
10.3 字符串的输入输出 230
10.3.1 用gets函数和puts函数输入输出字符串 230
10.3.2 用scanf函数和printf函数输入输出字符串 231
10.4 字符串处理函数 232
10.5 字符指针与字符数组的区别 234
10.6 程序举例 237
10.7 本章小结 239
第11章 结构体、共用体和枚举 241
11.1 示例问题:学生成绩管理的例子 241
11.2 结构体 242
11.2.1 结构体类型的定义 242
11.2.2 结构体类型变量的定义 243
11.2.3 结构体类型变量的引用与赋值 244
11.2.4 结构体变量的初始化 245
11.2.5 结构体类型数组 246
11.2.6 结构体类型指针变量 249
11.2.7 结构体类型指针变量作函数参数 252
11.3 共用体 253
11.3.1 共用体类型的概念 253
11.3.2 共用体类型变量的引用 254
11.3.3 共用体类型数据的特点 255
11.4 枚举 256
11.4.1 枚举类型的概念和定义 256
11.4.2 枚举类型变量的赋值和使用 256
11.5 利用typedef自定义类型 258
11.6 本章小结 260
第12章 文件 261
12.1 文件概述 261
12.1.1 文件的概念 261
12.1.2 文件的分类 261
12.1.3 标准文件I/O 262
12.2 文件指针 263
12.3 文件的打开与关闭 263
12.3.1 文件打开函数(fopen)与程序结束函数(exit) 263
12.3.2 文件关闭函数(fclose) 265
12.4 文本文件的读写 265
12.4.1 字符读写函数(fgetc和fputc) 265
12.4.2 字符串读写函数(fgets和fputs) 267
12.4.3 格式化读写函数(fscanf和fprintf) 268
12.5 二进制文件的读写 270
12.5.1 二进制模式与文本模式的区别 270
12.5.2 数据块读写函数(fread和fwtrite) 271
12.6 文件操作的其他函数 272
12.6.1 判断文件是否结束函数(feof) 272
12.6.2 文件内部指针定位 273
12.6.3 ftell函数 274
12.6.4 int fflush()函数 275
12.7 综合示例 275
12.8 本章小结 276
第13章 链表 278
13.1 动态内存分配 278
13.1.1 C程序的内存划分 278
13.1.2 内存分配方式 279
13.1.3 动态内存分配函数 279
13.2 单链表概述 282
13.2.1 结点的结构 282
13.2.2 单链表的结构 282
13.3 单链表结点的基本操作 283
13.3.1 单链表结点的查找 283
13.3.2 单链表结点的插入 284
13.3.3 单链表结点的删除 286
13.4 单链表的建立 287
13.4.1 逆序建链表 288
13.4.2 顺序建链表 289
13.5 单链表的应用 290
13.5.1 单链表的逆置 291
13.5.2 单链表的归并 292
13.5.3 单链表的拆分 295
13.6 循环链表与约瑟夫环问题 296
13.6.1 循环链表 296
13.6.2 约瑟夫环问题 296
13.7 本章小结 299
第14章 递推与递归 301
14.1 递推 301
14.1.1 递推思想 301
14.1.2 求解递推关系的方法 302
14.1.3 递推关系的建立 302
14.2 递推设计实例 303
14.2.1 简单Hanoi塔问题 303
14.2.2 捕鱼问题 304
14.2.3 Fibonacci类问题 306
14.2.4 错排公式 310
14.2.5 马踏过河卒 311
14.3 递归 313
14.3.1 递归的定义 313
14.3.2 递归的思想 313
14.4 递归设计实例 314
14.4.1 青蛙过河问题 314
14.4.2 快速排序问题 319
14.4.3 第k小的数 323
14.4.4 全排列问题 327
14.4.5 八皇后问题 332
14.5 递归的效率 335
14.6 本章小结 337
第15章 贪心法与动态规划法 339
15.1 贪心法 339
15.1.1 贪心法的思想 339
15.1.2 贪心法的实现过程 340
15.1.3 贪心法的基本要素 341
15.1.4 贪心法的注意事项 342
15.2 贪心法实例 344
15.2.1 删数问题 344
15.2.2 活动选择问题 345
15.2.3 区间覆盖问题 348
15.2.4 贪心法解题的一般步骤 351
15.3 动态规划 351
15.3.1 什么是动态规划 351
15.3.2 引入动态规划的意义 352
15.3.3 动态规划的特征 354
15.3.4 动态规划算法的基本步骤 355
15.4 动态规划实例 356
15.4.1 简单最短路径问题 356
15.4.2 最长公共子序列问题 360
15.4.3 最长上升子序列问题 362
15.5 本章小结 364