第1章 C/C++语言概述 1
1.1 程序的基本框架 1
1.2 变量 2
1.2.1 变量的定义 2
1.2.2 变量的赋值 3
1.2.3 变量的引用 3
1.3 C/C++语言的数据类型 3
1.4 常量 5
1.5 运算符和表达式 6
1.5.1 算术运算符 6
1.5.2 赋值运算符 8
1.5.3 关系运算符 8
1.5.4 逻辑运算符 9
1.5.5 位运算符 9
1.5.6 sizeof运算符 12
1.5.7 类型强制转换运算符 13
1.5.8 运算符的优先级 13
1.6 注释 14
1.7 分支语句 15
1.7.1 if语句 15
1.7.2 switch语句 17
1.8 循环语句 19
1.8.1 for语句 19
1.8.2 while语句 20
1.8.3 do-while语句 20
1.8.4 break语句 21
1.8.5 continue语句 21
1.9 函数 22
1.9.1 函数的定义 22
1.9.2 函数的调用 23
1.9.3 参数传递和返回值 24
1.9.4 库函数和头文件 25
1.10 标准输入输出 25
1.10.1 printf函数(标准输出函数) 25
1.10.2 scanf函数(标准输入函数) 26
1.11 全局变量和局部变量 27
1.12 数组 28
1.12.1 一维数组 28
1.12.2 二维数组 30
1.12.3 数组的初始化 31
1.12.4 数组越界 32
1.13 字符串 33
1.13.1 字符串常量 33
1.13.2 用字符数组存放的字符串 34
1.14 指针 36
1.14.1 指针的基本概念 36
1.14.2 指针运算 39
1.14.3 空指针 40
1.14.4 指向指针的指针 41
1.14.5 指针和数组 41
1.14.6 字符串和指针 43
1.14.7 void指针 44
1.14.8 函数指针 45
1.14.9 指针和动态内存分配 47
1.14.10 误用无效指针 50
1.15 结构 50
1.15.1 “结构”的概念 50
1.15.2 结构变量的定义 51
1.15.3 访问结构变量的成员变量 52
1.15.4 结构变量的初始化 52
1.15.5 结构数组 52
1.15.6 指向结构变量的指针 53
1.15.7 动态分配结构变量和结构数组 55
1.16 文件读写 55
1.16.1 用fopen打开文件 56
1.16.2 用fclose关闭文件 56
1.16.3 用fscanf读文件,用fprintf写文件 57
1.16.4 用fgetc读文件,用fputc写文件 58
1.16.5 用fgets函数读文件,fputs函数写文件 59
1.16.6 用fread读文件,用fwrite写文件 60
1.16.7 用fseek改变文件读写的当前位置 63
1.17 C语言标准库函数 64
1.17.1 数学函数 64
1.17.2 字符处理函数 65
1.17.3 字符串处理和内存操作函数 65
1.17.4 字符串转换函数 66
1.18 命令行参数 66
1.19 C/C++编码规范 67
1.19.1 标识符命名注意事项 68
1.19.2 程序的书写格式 68
1.19.3 注释的写法 70
1.19.4 一些好的编程习惯 71
第2章 简单计算题 73
2.1 例题:鸡兔同笼 73
2.2 例题:棋盘上的距离 74
2.3 例题:校门外的树 77
2.4 例题:填词 78
2.5 例题:装箱问题 80
练习题 82
第3章 数制转换问题 85
3.1 相邻数字的基数等比:确定进制 85
3.2 相邻数字的基数不等比:skew数 87
练习题 89
第4章 字符串处理 90
4.1 简单的字符串操作示例 90
4.2 例题:统计字符数 91
4.3 例题:487-3279 93
4.4 例题:子串 96
4.5 例题:Caesar密码 99
练习题 101
第5章 日期和时间处理 104
5.1 例题:判断闰年 104
5.2 例题:细菌繁殖 107
5.3 例题:日历问题 112
5.4 例题:玛雅历 113
5.5 例题:时区间时间的转换 116
练习题 120
第6章 模拟 121
6.1 例题:约瑟夫问题 121
6.2 例题:花生问题 123
6.3 例题:显示器 126
6.4 例题:排列 130
练习题 133
第7章 高精度计算 136
7.1 例题:大整数加法 136
7.2 例题:大整数乘法 138
7.3 例题:大整数除法 141
7.4 例题:麦森数 145
练习题 148
第8章 枚举 149
8.1 枚举的基本思想 149
8.2 简单枚举的例子:生理周期 150
8.3 数学模型中包括多个变量的例子:称硬币 151
8.4 搜索空间中解不唯一的例子:完美立方 154
8.5 遍历搜索空间的例子:熄灯问题 156
8.6 优化判断条件的例子:讨厌的青蛙 160
练习题 165
第9章 递归 167
9.1 递归的基本思想 167
9.2 例题:全排列 168
9.3 例题:八皇后问题 170
9.4 例题:逆波兰表达式 174
9.5 例题:四则运算表达式求值 175
9.6 例题:放苹果 179
9.7 例题:简单的整数划分问题 180
9.8 例题:算24 181
9.9 例题:红与黑 184
9.10 例题:二叉树 186
9.11 例题:拯救少林神棍 187
练习题 193
第10章 动态规划 196
10.1 什么是动态规划 196
10.2 动态规划解题的一般思路 199
10.3 例题:最长上升子序列 200
10.4 例题:帮助Jimmy 202
10.5 例题:最长公共子序列 206
10.6 例题:神奇口袋 208
10.7 例题:灌溉草场 210
10.8 例题:方盒游戏 215
10.9 例题:美妙栅栏 221
练习题 225
第11章 链表 228
11.1 单向链表、链表结点的插入 228
11.2 带表头的单向链表、链表的搜索 232
11.3 双向链表、链表结点的排序 235
11.4 循环链表、链表结点的删除 238
11.5 链表的应用:计算每个作业的运行时间 241
练习题 247
第12章 二叉树 249
12.1 二叉树的建立 250
12.2 基于递归的二叉树遍历 254
12.3 平衡二叉树 257
练习题 263
附录A 北京大学程序在线评测系统介绍 264
A.1 POJ的使用情况 264
A.2 POJ的主要功能 265
A.3 使用本书结合POJ进行教学时的用法 266
附录B 本书题目在POJ上的编号 267
致谢 271