《从问题到程序 程序设计与C语言引论》PDF下载

  • 购买积分:12 如何计算积分?
  • 作  者:裘宗燕编著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2011
  • ISBN:9787111337157
  • 页数:338 页
图书介绍:本书以C作为工具语言,讨论了基本程序设计的各方面内容,详细解释了与C语言和程序设计有关的问题。在新版修订中,特别加强了针对近年日益受到业界和学术界广泛重视的问题的讨论,并通过详细地分析和讨论大量符合C99标准的实例,给出了分析和分解问题、找出解决问题的主要步骤、确定函数抽象、找出循环、选择语言结构直至最后做出所需程序的完整过程。本书适合作为高等院校计算机及相关专业第一门程序设计课程的教材,也可供其他学习C程序设计的读者自学使用。

本书中的编程实例和模式 20

例2.1 简单的字符串输出程序 20

例2.2 输出长字符串 20

例2.3 计算圆球体积 23

例2.4 已知三角形两边长和夹角求面积 28

例2.5 简单级数计算 28

例2.6 已知三角形三边长求面积 29

程序模式2.1 简单计算程序 32

程序模式2.2 使用数学函数的简单计算程序 32

例3.1 已知三角形三边长求面积 37

例3.2 求圆盘面积(错误) 39

例3.3 求圆盘面积 40

例3.4 由三边长求三角形面积的函数 41

例3.5 自定义输出函数 44

例3.6 几个用条件表达式的函数 45

例3.7 判断闰年(利用取模运算判断整除关系) 46

例3.8 求圆盘面积(错误参数的处理) 48

例3.9 求二次方程的根 49

例3.10 循环计算和输出 50

例3.11 循环求和 51

例3.12 输出摄氏和华氏温度的对照表 51

例3.13 用for循环重写的输出摄氏和华氏温度的对照表程序 53

例3.14 求立方和 53

例3.15 在程序里定义枚举常量 56

例3.16 使用scanf的简单输入输出程序 57

例3.17 求圆盘面积(带有scanf输入) 58

例3.18 求二次方程的根(通过scanf得到方程的三个系数) 59

例3.19 字符输入和输出 61

程序模式3.1 简单程序 65

程序模式3.2 带函数定义的程序 65

例4.1 打印一系列平方数 69

例4.2 判断素数 71

例4.3 乌龟旅行 71

例4.4 求立方根 73

例4.5 级数通项计算 74

例4.6 验证哥德巴赫猜想 75

例4.7 由每月降雨量求一年的总降雨量 77

例4.8 用特殊值控制循环结束(货单统计) 78

例4.9 读入一系列半径求面积 79

例4.10 求一系列输入数据中的最大、最小和平均值 80

例4.11 由标准输入读入10个字符并输出各字符的编码 81

例4.12 写程序读入一行,输出行里字符的个数 81

例4.13 用getchar读入整个文件的内容并输出 82

例4.14 统计由标准输入得到的文件里的字符个数 83

例4.15 简单计算器 84

例4.16 递归计算阶乘 85

例4.17 递归求幂 86

例4.18 Fibonacci序列的计算 87

例4.19 统计程序或程序片段的计算时间 88

例4.20 用循环求Fibonacci数 89

例4.21 用几种方法求整数的最大公约数 91

例4.22 河内塔的递归求解 93

程序模式4.1 向上循环和向下循环 101

程序模式4.2 程序计时(需要包含time.h) 101

程序模式4.3 输入一系列数的循环 102

程序模式4.4 输入一系列字符的循环 102

程序模式4.5 带检查的整数输入 102

例5.1 文件中字符的分类统计 110

例5.2 使用标准库的字符分类函数 111

例5.3 随机数试验程序 112

例5.4 打印字符图形和函数分解 115

例5.5 弦线法求函数的根 121

例5.6 简单猜数程序 123

例5.7 静态局部变量的定义和使用 128

例5.8 随机数生成器 130

例5.9 单词计数和有穷自动机的使用 136

例5.10 字位运算符和掩码 139

例5.11 使用移位和其他位运算 140

例5.12 简单加密解密函数 140

例6.1 建立并打印包含Fibonacci数的数组 146

例6.2 统计文件里各数字字符出现的次数 147

例6.3 用筛法求素数 148

例6.4 输入学生成绩并分段输出成绩,再输出统计值 149

例6.5 多项式求值 150

例6.6 求数组元素平均值 152

例6.7 反转数组里的元素 153

例6.8 矩阵乘法 155

例6.9 以多维数组作为数组参数的函数 155

例6.10 字符串复制函数 157

例6.11 二进制串到整数的转换函数 158

例6.12 字符串的前缀删除函数 159

例6.13 找到文件中的最长行并输出 160

例6.14 学生成绩直方图程序 162

例6.15 带检查的通用整数输入函数 165

例6.16 利用sizeof和宏定义“计算”数组的大小 166

例6.17 数组元素划分 167

例6.18 数组元素排序 169

例6.19 统计C语言源程序文件中各ANSIC关键字出现的次数 170

程序模式6.1 处理数组元素的循环 174

程序模式6.2 从标准输入为数组填充值的循环 174

程序模式6.3 处理数组的函数头部|(应该引进一个长度参数) 174

程序模式6.4 静态“求”数组的元素个数的宏 174

例7.1 能交换两个变量的值的参数 178

例7.2 通过指针参数实现输入整数值并检查数值范围的函数 179

例7.3 用指针方式实现计算字符串长度的函数 185

例7.4 用指针方式实现字符串复制 185

例7.5 用指针方式实现的数组处理函数 185

例7.6 用指针方式写出的数组元素划分函数 186

例7.7 输出任意二维整型数组内容的函数 189

例7.8 了解命令行参数的基本用法 193

例7.9 动态存储函数malloc的使用 195

例7.10 用calloc做存储分配 195

例7.11 修改筛法程序 196

例7.12 学生成绩统计和直方图程序(动态调整存储块的大小) 197

例7.13 通过函数参数送回指针值 199

例7.14 利用函数指针重新定义采用弦线法求函数根的函数 203

例7.15 数值积分函数 204

例7.16 利用函数指针参数操作数组元素 205

程序模式7.1 能够修改执行环境的函数 209

程序模式7.2 处理命令行参数的程序的main函数原型 209

程序模式7.3 动态存储分配 209

程序模式7.4 动态存储分配块的大小调整 209

例8.1 文件使用的一般过程 214

例8.2 命名文件复制程序cat 215

例8.3 货单数据统计 216

例8.4 求文件中数据的平均值 223

例8.5 简单的背英语单词程序 225

例8.6 资金来往账目管理系统的输入功能 228

程序模式8.1 文件的使用 230

程序模式8.2 处理由命令行得到的一系列文件名 230

例9.1 展示结构声明、结构变量定义和使用的简单程序 235

例9.2 用结构数组重新构造例6.19的统计C程序中关键字的程序 236

例9.3 返回结构值的函数 238

例9.4 具有结构参数并返回结构值的函数 239

例9.5 采用结构参数和结构指针参数的函数 239

例9.6 通过动态存储分配创建结构 240

例9.7 基于结构设计实现例8.6的账目管理系统 241

例9.8 用结构实现例6.14的学生成绩程序 243

例11.1 找出正文文件里包含某个特定单词的所有正文行,把这些行的内容及其顺序编号送到标准输出 297

例11.2 用strtok把正文文件内容分解为单词序列 298

例11.3 出错报告函数 309

例11.4 采用变参数函数实现任意元素求和 310

例12.1 生成2的某次幂的函数 319

例12.2 求数组元素平均值函数 321

例12.3 打印二维数组的内容 322

例12.4 通用的求矩阵乘积函数 322

例12.5 结构的变长数组成员(灵活数组成员) 323

第1章 程序设计和C语言 1

1.1 程序和程序语言 1

1.2 C语言简介 6

1.3 一个简单的C程序 8

1.4 程序开发过程 10

1.5 问题与程序设计 14

本章讨论的重要概念 15

练习 15

第2章 数据与简单计算程序 16

2.1 基本字符、标识符和关键字 16

2.2 数据、类型和简单程序 17

2.2.1 几个常用类型 18

2.2.2 函数printf和简单文本输出程序 19

2.3 运算符、表达式和计算 22

2.3.1 算术运算符和算术表达式 22

2.3.2 表达式的求值 23

2.3.3 计算和类型 24

2.4 数学函数和简单计算程序 26

2.4.1 函数、函数调用 26

2.4.2 数学函数及其使用 27

2.4.3 函数调用中的类型转换 28

语言细节和问题 29

C语言的字符集 29

基本数据类型的一些问题 29

数据形式的转换和输出 31

运算对象的求值顺序 32

几个常用程序模式 32

本章讨论的重要概念 32

练习 33

第3章 变量、函数和流程控制 34

3.1 复合结构和顺序程序 34

3.2 变量的概念和使用 35

3.2.1 变量的定义 35

3.2.2 变量的使用 36

3.2.3 注释和简单顺序程序 38

3.3 定义函数(初步) 38

3.3.1 函数定义 39

3.3.2 函数与程序 42

3.3.3 函数与类型 43

3.3.4 自定义输出函数 44

3.4 关系表达式、条件表达式、逻辑表达式 44

3.4.1 关系表达式和条件表达式 44

3.4.2 逻辑表达式 46

3.5 语句与控制结构 47

3.5.1 条件语句:if语句 48

3.5.2 循环语句:while语句 50

3.5.3 循环语句:for语句 52

3.6 若干C语言结构 54

3.6.1 增量和减量运算符(++、--) 54

3.6.2 逗号运算符 55

3.6.3 实现二元运算符操作的赋值运算符 55

3.6.4 空语句 55

3.6.5 定义枚举常量 56

3.7 输入和输出 56

3.7.1 格式输入函数scanf 57

3.7.2 字符输入和输出函数 60

语言细节和问题 61

变量的意义和实现 61

赋值操作的一些问题 61

条件表达式和条件语句 62

表达式和求值 63

输入和缓冲 65

几个常用程序模式 65

本章讨论的重要概念 65

练习 66

第4章 基本编程技术 68

4.1 循环程序设计 68

4.1.1 基本循环方式 69

4.1.2 求一系列完全平方数 69

4.1.3 判断素数(谓词函数) 71

4.1.4 艰难旅程(浮点误差) 71

4.1.5 求立方根(迭代和逼近) 73

4.1.6 求sin函数值(通项计算) 74

4.1.7 从循环中退出 75

4.2 输入循环 77

4.2.1 输入循环的基本技术 77

4.2.2 字符输入 80

4.2.3 检查输入 83

4.2.4 一个简单计算器 84

4.3 循环与递归 85

4.3.1 阶乘和乘幂(循环,递归) 85

4.3.2 Fibonacci序列(计算与时间) 87

4.3.3 为计算过程计时 88

4.3.4 Fibonacci序列的迭代计算(程序正确性与循环不变式) 89

4.3.5 最大公约数 91

4.3.6 河内塔(梵塔)问题 93

4.4 程序调试和排错 95

4.4.1 测试 95

4.4.2 白箱测试 95

4.4.3 黑箱测试 96

4.4.4 排除程序里的错误 98

语言细节和问题 98

程序的逐步求精和控制结构嵌套 99

循环中的几种变量 99

与输入输出有关的几个问题 100

输入与安全性 100

几个常用程序模式 101

本章讨论的重要概念 102

练习 102

第5章 C程序结构 105

5.1 数值类型 105

5.1.1 字符类型 105

5.1.2 整数类型 106

5.1.3 基本数据类型的选择 107

5.2 几种控制语句 107

5.2.1 do-while循环结构 107

5.2.2 流程控制语句 108

5.2.3 开关语句 109

5.3 一些标准库函数 110

5.3.1 字符分类函数 111

5.3.2 随机数生成函数 112

5.4 程序的函数分解 113

5.4.1 函数分解 113

5.4.2 对函数的两种观点 114

5.4.3 函数定义与调用之间的配合 118

5.4.4 函数原型 119

5.4.5 求函数的根 121

5.4.6 一个简单猜数游戏 123

5.5 C程序结构与变量 125

5.5.1 外部定义的变量 125

5.5.2 作用域、存在期和变量类 126

5.5.3 变量的其他问题 130

5.6 预处理 131

5.6.1 文件包含命令 132

5.6.2 宏定义与宏替换 132

5.6.3 条件编译命令 135

5.6.4 定义常量 135

5.6.5 单词计数问题 136

5.7 字位运算符 138

本章讨论的重要概念 141

练习 141

第6章 顺序数据组织:数组 144

6.1 数组的定义和使用 144

6.1.1 数组变量的定义和声明 145

6.1.2 数组的使用 145

6.1.3 数组的初始化 147

6.1.4 数组程序实例 147

6.1.5 定义数组的问题 151

6.2 以数组为参数的函数 151

6.2.1 一个例子 152

6.2.2 修改实参数组的元素 153

6.3 二维和多维数组 153

6.3.1 多维数组的初始化 154

6.3.2 多维数组的使用 154

6.3.3 多维数组作为函数的参数 155

6.4 字符数组与字符串 156

6.4.1 字符数组 156

6.4.2 字符串 156

6.4.3 程序实例 157

6.4.4 标准库字符串处理函数 159

6.4.5 输出文本里的最长行 160

6.5 编程实例 162

6.5.1 成绩直方图 162

6.5.2 一个通用的带检查的整数输入函数 165

6.5.3 “计算”数组变量的大小 166

6.5.4 数组的划分 167

6.5.5 数组的排序 169

6.5.6 统计C程序里的关键字 170

语言细节和问题 172

数组的存储实现 172

越界访问的可能后果 173

多维数组的实现 173

函数参数与sizeof运算符 173

字符串的字典序 174

几个常用程序模式 174

本章讨论的重要概念 174

练习 174

第7章 指针的应用 176

7.1 指针的定义和使用 176

7.1.1 指针的定义 177

7.1.2 指针操作 177

7.1.3 指针作为函数参数 178

7.1.4 有关指针的几个问题 180

7.2 指针与数组 181

7.2.1 指向数组元素的指针 181

7.2.2 基于指针运算的数组程序设计 183

7.2.3 数组参数与指针 184

7.2.4 指针与数组操作的程序实例 184

7.2.5 字符指针与字符数组 187

7.2.6 多维数组作为参数的通用函数 188

7.3 指针数组 189

7.3.1 字符指针数组 190

7.3.2 指针数组与二维数组 190

7.3.3 命令行参数及其处理 191

7.4 动态存储管理 193

7.4.1 C语言的动态存储管理机制 194

7.4.2 两个程序实例 196

7.4.3 函数、指针和动态存储 199

7.4.4 定义类型 200

7.5 指向函数的指针 202

7.5.1 函数指针的定义和使用 202

7.5.2 函数指针作为函数的参数 203

语言细节和问题 206

指针运算原理 206

指针转换 206

使用动态存储管理的要点和细节 206

动态调整策略 207

过时的函数指针形式 207

复杂类型描述与解读 208

几个常用程序模式 209

本章讨论的重要概念 209

练习 209

第8章 文件和输入输出程序设计 211

8.1 文件的概念 211

8.1.1 流和文件指针 211

8.1.2 缓冲式输入输出 212

8.2 文件的使用 213

8.2.1 文件的打开和关闭 213

8.2.2 输入输出函数 214

8.2.3 程序实例 215

8.2.4 标准错误流 216

8.2.5 直接输入输出函数 217

8.3 标准流输入输出与格式控制 218

8.3.1 行式输入和输出 218

8.3.2 输入格式控制 218

8.3.3 输出格式控制 221

8.3.4 以字符串作为格式化输入输出对象 223

8.4 程序实例 223

8.4.1 求文件中数据的平均值 223

8.4.2 一个背单词程序 225

8.4.3 资金账目系统 228

几个常用程序模式 230

本章讨论的重要概念 231

练习 231

第9章 结构和复杂数据组织 232

9.1 结构 232

9.1.1 结构声明与变量定义 232

9.1.2 结构变量的初始化和使用 235

9.1.3 结构、数组与指针 236

9.2 枚举 237

9.3 结构与函数 238

9.3.1 处理结构的函数 238

9.3.2 程序实例 241

9.4 编程实例 243

9.4.1 数据组的排序 243

9.4.2 复数的表示和处理 245

9.5 链接结构(自引用结构) 247

9.5.1 链接结构 247

9.5.2 自引用结构的定义 249

9.5.3 程序实现 249

9.5.4 数据与查找 252

语言细节和问题 253

结构的实现 253

联合 254

字段 256

本章讨论的重要概念 257

练习 257

第10章 程序开发技术 259

10.1 分别编译和C程序的分块开发 259

10.1.1 分块开发的问题和方法 259

10.1.2 程序实例:学生成绩处理 260

10.1.3 分块重整 263

10.1.4 其他安排和考虑 266

10.1.5 模块化思想和技术 267

10.1.6 单一头文件结构和多个头文件结构 271

10.2 功能模块和程序库 273

10.2.1 复数模块 273

10.2.2 目标文件和库 275

10.2.3 防止重复包含 276

10.3 错误报告和处理 276

10.3.1 建立统一的错误报告机制 276

10.3.2 定义变参数的错误报告函数 277

10.3.3 运行中错误的检查和处理 279

10.4 程序的配置 283

10.4.1 程序的行为参数和启动时配置 283

10.4.2 交互式配置 285

10.4.3 通过命令行参数 286

10.4.4 采用配置文件 287

10.5 程序开发过程 287

10.5.1 自上而下的开发 288

10.5.2 自下而上的开发 289

10.5.3 实际开发过程 290

本章讨论的重要概念 291

练习 291

第11章 标准库 293

11.1 标准库结构 293

11.1.1 标准定义(<stddef.h>) 294

11.1.2 错误信息(<errno.h>) 294

11.1.3 C99的几个头文件 295

11.2 几个已经介绍过的头文件 295

11.3 字符串函数(<string.h>) 295

11.3.1 一些字符串函数 296

11.3.2 存储区操作函数 299

11.4 功能函数(<stdlib.h>) 299

11.4.1 几个整数函数 299

11.4.2 数值转换 299

11.4.3 执行控制 300

11.4.4 与执行环境交互 301

11.4.5 常用函数bsearch和qsort 301

11.5 日期和时间(<time.h>) 302

11.6 实现特征(<limit.h>和<float.h>) 303

11.6.1 整数类型特征 303

11.6.2 浮点数类型特征 304

11.7 其他与输入输出有关的函数(<stdio.h>) 304

11.7.1 符号常量和类型 305

11.7.2 文件操作函数 305

11.7.3 流缓冲区操作函数 306

11.7.4 文件定位及定位函数 306

11.7.5 其他有关函数 307

11.7.6 采用va_list参数的输出函数 308

11.8 定义变长参数表(<stdarg.h>) 309

11.9 非局部控制转移(<setjmp.h>) 311

11.10 调试断言和信号处理(<assert.h>和<signal.h>) 313

11.11 标准库的其他功能 314

11.11.1 本地化 314

11.11.2 多字节字符 315

本章讨论的重要概念 316

练习 316

第12章 C99导引 317

12.1 C99扩充 317

12.1.1 语言层扩充 317

12.2 C99数组和结构 319

12.2.1 复合对象的初始化 319

12.2.2 变长数组的定义和声明 320

12.2.3 函数的变长数组参数 321

12.2.4 结构的变长数组成员 322

12.3 几个C99标准库包 324

12.3.1 标准库包<stdint.h>和<inttype.h> 324

12.3.2 标准库包<complex.h> 325

附录A C语言运算符表 327

附录B C语言速查 328

进一步学习的建议 333

参考文献 336