组合数学是既古老而又年轻的一门数学分支,它的基本原理非常直观易懂。本书收集了1200多道组合数学题,涉及4部分内容: 一是加法法则、乘法法则与排列组合;二是序列、递推关系与母函数、Fibonacci数等;三是容斥原理、鸽巢原理、Ramsey数等;四是Polya定理。 本书适合作为高等院校计算机及相关专业本科生的辅助教材,也可作为研究生的辅助教材,也可供广大科学工作者、工程技术人员参考。 最后说明一下本书只涉及组合数学的部分核心内容,比如图论部分暂时放弃了。图论无疑属于组合数学,但因为它成长壮大,本身内容丰富,所以独立出去了,以后争取继续完成。
目录
- 第1章 C语言的基本概念1
- 1.1 程序设计语言的历史和发展1
- 1.2 程序设计过程中的几个基本概念2
- 1.2.1 程序2
- 1.2.2 程序设计2
- 1.2.3 算法3
- 1.2.4 数据结构3
- 1.3 软件工程的概念4
- 1.4 C语言的发展与特点4
- 1.4.1 C语言的发展和ANSI C标准4
- 1.4.2 C语言的特点5
- 1.5 C语言程序的基本标识符6
- 1.6 C程序的几个简单实例7
- 1.7 C程序的结构特点10
- 1.8 C语言程序的编译和执行11
- 1.9 习题12
- 第2章 C语言程序的基本数据类型及其运算13
- 2.1 C语言的数据类型13
- 2.1.1 数据类型的一般概念13
- 2.1.2 常量14
- 2.2 数据类型及变量17
- 2.2.1 基本数据类型17
- 2.2.2 变量及变量的定义17
- 2.2.3 变量的初始化18
- 2.2.4 数据类型转换19
- 2.3 运算符和表达式21
- 2.3.1 运算符和表达式概述21
- 2.3.2 赋值运算符和赋值表达式22
- 2.3.3 算术运算符和算术表达式23
- 2.3.4 关系运算符和关系表达式24
- 2.3.5 逻辑运算符和逻辑表达式25
- 2.3.6 条件运算符26
- 2.3.7 其他运算符27
- 2.4 位运算符28
- 2.4.1 按位取反运算符28
- 2.4.2 移位运算符28
- 2.4.3 按位“与”、按位“或”、按位“异或”29
- 2.5 C语言基本输入输出函数30
- 2.5.1 字符输入输出函数31
- 2.5.2 格式化输入输出函数32
- 2.6 习题37
- 第3章 基本控制结构及其应用39
- 3.1 算法及结构化程序设计39
- 3.1.1 算法及其特征39
- 3.1.2 算法的类型与结构41
- 3.2 顺序结构程序设计42
- 3.3 分支结构程序设计43
- 3.3.1 if 分支43
- 3.3.2 if-else分支43
- 3.3.3 多分支if-else if-else形式44
- 3.3.4 条件分支的嵌套45
- 3.3.5 开关分支46
- 3.4 循环结构程序设计50
- 3.4.1 while语句50
- 3.4.2 do-while语句50
- 3.4.3 for语句51
- 3.4.4 三种循环的比较52
- 3.4.5 多重循环52
- 3.4.6 循环和开关分支的中途退出53
- 3.4.7 goto语句54
- 3.4.8 结构化程序设计的注意事项55
- 3.5 结构化程序设计及应用举例57
- 3.6 习题58
- 第4章 数组及其应用62
- 4.1 一维数组62
- 4.1.1 一维数组的定义62
- 4.1.2 一维数组的初始化63
- 4.1.3 一维数组的引用64
- 4.1.4 一维数组的应用举例65
- 4.2 多维数组67
- 4.2.1 多维数组的定义67
- 4.2.2 多维数组的存储形式67
- 4.2.3 多维数组的引用68
- 4.2.4 多维数组的初始化68
- 4.2.5 数组应用举例70
- 4.3 字符型数组与字符串71
- 4.3.1 字符型数组的概念71
- 4.3.2 字符型数组的初始化72
- 4.3.3 字符型数组的输入输出73
- 4.3.4 字符型数组的应用举例74
- 4.4 综合应用举例75
- 4.5 习题77
- 第5章 函数及其应用79
- 5.1 函数的定义与调用79
- 5.1.1 C源程序的结构79
- 5.1.2 函数的定义80
- 5.1.3 函数的调用82
- 5.2 函数间的信息传递方式85
- 5.2.1 实参-形参之间的信息传递86
- 5.2.2 函数调用结果的返回89
- 5.3 函数与数组92
- 5.3.1 数组元素做实参92
- 5.3.2 一维数组名做实参92
- 5.3.3 多维数组名做参数94
- 5.3.4 字符数组做函数的参数95
- 5.4 递归函数与递归调用96
- 5.4.1 递归的概念96
- 5.4.2 递归程序的设计97
- 5.5 变量的存储类型及作用域98
- 5.5.1 auto型变量99
- 5.5.2 extern型变量99
- 5.5.3 静态变量102
- 5.6 习题104
- 第6章 指针107
- 6.1 指针的基本概念及定义方式107
- 6.1.1 指针的基本概念107
- 6.1.2 指针的定义107
- 6.1.3 指针的初始化108
- 6.1.4 指针运算符110
- 6.2 指针的运算110
- 6.2.1 指针的算术运算110
- 6.2.2 关系运算112
- 6.2.3 指针的赋值运算112
- 6.3 指针与数组112
- 6.3.1 指向一维数组的指针113
- 6.3.2 指向多维数组的指针115
- 6.4 字符指针和字符串116
- 6.5 指针数组118
- 6.5.1 指针数组的概念118
- 6.5.2 指针数组的应用119
- 6.5.3 指针数组在带形参的main函数中的应用120
- 6.6 指针在函数参数传递中的应用122
- 6.7 指针型函数122
- 6.7.1 指针型函数的定义和引用123
- 6.7.2 指针型函数的应用举例123
- 6.8 多级指针124
- 6.8.1 多级指针的概念及定义124
- 6.8.2 多级指针应用举例125
- 6.9 指向函数的指针126
- 6.9.1 指向函数的指针的概念126
- 6.9.2 指向函数的指针的应用127
- 6.10 动态指针129
- 6.10.1 动态内存分配的概念129
- 6.10.2 动态内存分配的应用130
- 6.11 习题132
- 第7章 排序及查找算法及其实现134
- 7.1 排序概述134
- 7.1.1 排序的概念134
- 7.1.2 排序的定义134
- 7.1.3 排序的方法135
- 7.1.4 排序效率135
- 7.2 冒泡排序法的设计及其实现137
- 7.2.1 冒泡算法设计思想137
- 7.2.2 冒泡算法的实现138
- 7.3 选择排序法的设计及其实现139
- 7.3.1 选择排序法设计思想139
- 7.3.2 选择排序法的实现140
- 7.4 插入排序法的设计及其实现141
- 7.4.1 插入排序法设计思想141
- 7.4.2 插入排序法的实现142
- 7.5 SHELL排序法的设计及其实现143
- 7.5.1 SHELL排序法设计思想143
- 7.5.2 SHELL排序法的实现144
- 7.6 字符串数组的排序设计及其实现146
- 7.6.1 字符串数组的排序算法设计思想146
- 7.6.2 字符串数组排序算法的实现147
- 7.7 查找概述148
- 7.8 顺序查找及其应用148
- 7.8.1 顺序查找算法的设计思想148
- 7.8.2 顺序查找算法的实现149
- 7.9 折半查找及其应用150
- 7.9.1 折半查找算法的设计思想150
- 7.9.2 折半查找算法的实现151
- 7.10 习题152
- 第8章 结构体、联合体和枚举153
- 8.1 结构体的说明和定义153
- 8.1.1 结构体的概念153
- 8.1.2 结构体的说明及结构体变量的定义154
- 8.2 结构体成员的引用与结构体变量的初始化157
- 8.2.1 结构体成员的引用157
- 8.2.2 结构体变量的初始化158
- 8.3 结构体数组159
- 8.3.1 结构体数组的定义及初始化159
- 8.3.2 结构体数组的应用举例159
- 8.4 结构体指针161
- 8.4.1 结构体指针及其定义161
- 8.4.2 通过指针引用结构体成员162
- 8.4.3 结构体指针的应用举例163
- 8.5 结构体在函数间的传递166
- 8.5.1 结构体变量的传递166
- 8.5.2 结构体数组在函数间的传递169
- 8.6 结构体指针型和结构体型函数170
- 8.6.1 结构体指针型函数170
- 8.6.2 结构体型函数172
- 8.7 结构体嵌套174
- 8.7.1 结构体嵌套的概念174
- 8.7.2 嵌套结构体类型变量的引用175
- 8.7.3 结构体嵌套应用举例176
- 8.8 联合体177
- 8.8.1 联合体的说明及联合体变量的定义177
- 8.8.2 使用联合体变量应注意的问题182
- 8.9 枚举类型184
- 8.9.1 枚举类型数据的概念及其定义184
- 8.9.2 枚举型变量的使用184
- 8.10 自定义类型186
- 8.10.1 自定义类型及其表示形式186
- 8.10.2 自定义类型的优点187
- 8.11 位字段结构体188
- 8.12 习题189
- 第9章 文件操作193
- 9.1 文件概述193
- 9.2 文件的基本操作197
- 9.2.1 文件的打开197
- 9.2.2 文件的关闭198
- 9.2.3 文件的删除198
- 9.2.4 文件的重命名199
- 9.2.5 临时文件的创建199
- 9.3 文件的读写操作200
- 9.3.1 文件的非格式化读写200
- 9.3.2 文件的格式化写操作206
- 9.3.3 文件的格式化读操作208
- 9.4 文件的定位209
- 9.4.1 fgetpos函数209
- 9.4.2 fsetpos函数209
- 9.4.3 ftell函数209
- 9.4.4 fseek函数210
- 9.4.5 feof函数211
- 9.5 错误处理211
- 9.5.1 ferror函数211
- 9.5.2 perror函数211
- 9.6 习题212
- 第10章 线性表及其应用218
- 10.1 线性表的基本概念218
- 10.2 结构简介219
- 10.2.1 单链表220
- 10.2.2 循环链表228
- 10.2.3 双向链表229
- 10.3 线性表的应用229
- 10.3.1 单链表的应用: 单链表归并问题229
- 10.3.2 循环链表的应用: 求解约瑟夫问题231
- 10.4 习题232
- 第11章 栈及其应用233
- 11.1 栈的定义及其基本操作233
- 11.2 栈的实现234
- 11.2.1 栈的数组实现234
- 11.2.2 栈的链式存储实现236
- 11.3 栈的应用238
- 11.3.1 栈在进制转换中的应用238
- 11.3.2 栈在递归中的应用241
- 11.4 习题243
- 第12章 队列及其应用244
- 12.1 队列的定义及基本操作244
- 12.2 队列的实现245
- 12.2.1 用循环数组实现队列245
- 12.2.2 用链表实现队列248
- 12.3 队列的应用251
- 12.3.1 打印杨辉三角形251
- 12.3.2 舞伴问题254
- 12.4 习题258
- 第13章 二叉树及其应用259
- 13.1 树的定义和基本术语259
- 13.1.1 树的定义259
- 13.1.2 树的基本术语260
- 13.2 二叉树的特点及其数学性质261
- 13.2.1 二叉树的特点261
- 13.2.2 二叉树的数学性质261
- 13.3 二叉树的基本操作及其实现263
- 13.3.1 二叉树的基本操作263
- 13.3.2 二叉树基本操作的实现263
- 13.4 二叉树的应用268
- 13.4.1 二叉树的遍历268
- 13.4.2 利用二叉树的遍历建立、打印二叉树270
- 13.4.3 利用二叉树的遍历按树状打印二叉树273
- 13.5 习题275
- 附录A 预处理命令的应用276
- A.1 预处理概述276
- A.2 宏定义276
- A.2.1 无参宏定义276
- A.2.2 带参宏定义280
- A.3 文件包含284
- A.4 条件编译284
- A.4.1 第一种条件编译形式284
- A.4.2 第二种条件编译形式285
- A.4.3 第三种条件编译形式286
- 附录B Turbo C 3.0的上机过程288
- B.1 文件的建立与保存288
- B.2 文件的编辑289
- B.3 编译连接290
- B.4 程序的运行291
- 附录C Turbo C 3.0程序的调试292
- C.1 程序的调试292
- C.1.1 有关调试的设置292
- C.1.2 设置断点及动态调试的基本操作293
- C.2 程序调试实例295
- C.2.1 添加断点295
- C.2.2 观察变量296
- C.2.3 单步执行296
- C.2.4 观察调用关系297
- C.2.5 终止调试297
- C.2.6 条件断点297
- C.2.7 动态修改变量值298
- 附录D Turbo C 3.0部分库函数表299
- 附录E ASCII码表311
- 参考文献312