《C语言的科学和艺术》PDF下载

  • 购买积分:16 如何计算积分?
  • 作  者:(美)罗伯茨著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2011
  • ISBN:9787111347750
  • 页数:538 页
图书介绍:本书是计算机科学的经典教材,介绍了计算机科学的基础知识和程序设计的专门知识。本书以介绍ANSI C为主线,不仅涵盖C语言的基本知识,而且介绍了软件工程技术以及如何应用良好的程序设计风格进行开发等内容。本书采用了库函数的方法,强调抽象的原则,详细阐述了库和模块化开发。此外,本书还利用大量实例讲述解决问题的全过程,对开发过程中常见的错误也给出了解决和避免的方法。本书既可作为高等院校计算机科学入门课程及C语言入门课程的教材,也是C语言开发人员的极佳参考书。

第1章 概述 1

1.1计算简史 1

1.2什么是计算机科学 4

1.3计算机硬件简介 5

1.3.1 CPU 5

1.3.2内存 6

1.3.3辅助存储器 6

1.3.4 I/O设备 6

1.4算法 7

1.5程序设计语言和编译 7

1.6编程错误和调试 9

1.7软件维护 10

1.8软件工程的重要性 11

1.9关于C程序设计语言的一些思考 11

小结 12

复习题 12

第一部分 C语言程序设计基础 16

第2章 通过例子学习 16

2.1 “Hello world”程序 17

2.1.1注释 17

2.1.2库包含 18

2.1.3主程序 18

2.2两个数的加法程序 20

2.2.1输入阶段 21

2.2.2计算阶段 23

2.2.3输出阶段 23

2.3有关程序设计过程的观点 24

2.4数据类型 25

2.4.1浮点型数据 25

2.4.2字符串类型的数据 26

2.5表达式 28

2.5.1常量 28

2.5.2变量 29

2.5.3赋值语句 31

2.5.4运算符和操作数 32

2.5.5整型数和浮点型数的结合 33

2.5.6整数除法和求余运算符 34

2.5.7优先级 34

2.5.8优先级法则的应用 36

2.5.9类型转换 37

小结 39

复习题 40

程序设计练习 41

第3章 问题求解 44

3.1程序设计习语和范例 44

3.1.1复合赋值习语 45

3.1.2自增和自减运算符 47

3.2解决规模稍大的问题 47

3.3控制语句 48

3.3.1重复N次习语 49

3.3.2迭代和循环 50

3.3.3下标变量 50

3.3.4初始化的重要性 51

3.3.5读入-直到-标志习语 53

3.3.6创造一个更实用的应用程序 54

3.3.7条件执行和if语句 56

3.4一个调试练习 58

3.5格式化输出 61

3.5.1 printf的格式码 62

3.5.2控制空格、对齐方式和精度 63

3.6构思一个程序 65

3.6.1程序设计风格 66

3.6.2设计时考虑将来的修改 67

3.6.3 #define机制 67

小结 69

复习题 69

程序设计练习 70

第4章 语句形式 74

4.1简单语句 74

4.1.1赋值的嵌套 76

4.1.2多重赋值 76

4.1.3程序块 77

4.2控制语句 78

4.3布尔型数据 78

4.3.1关系运算符 79

4.3.2逻辑运算符 79

4.3.3简化求值 81

4.3.4标志 82

4.3.5避免布尔表达式中的冗余 82

4.3.6布尔计算示例 83

4.4 if语句 84

4.4.1单行if语句 85

4.4.2多行if语句 86

4.4.3 if/else语句 86

4.4.4级联if语句 86

4.4.5?:运算符(可选的) 87

4.5 switch语句 89

4.6 while语句 91

4.6.1 while循环的应用 91

4.6.2无限循环 93

4.6.3解决半途退出问题 93

4.7 for语句 95

4.7.1嵌套的for循环 97

4.7.2 for和while的关系 98

4.7.3 for语句中浮点型数据的使用问题 99

小结 100

复习题 101

程序设计练习 102

第5章 函数 105

5.1使用库函数 105

5.2函数声明 107

5.3自己编写函数 108

5.3.1 return语句 109

5.3.2将函数与主程序放在一起 110

5.3.3包含内部控制结构的函数 111

5.3.4返回非数字值的函数 113

5.3.5谓词函数 113

5.3.6测试字符串是否相等的谓词函数 115

5.4函数调用过程机制 116

5.4.1参数传递 117

5.4.2在其他函数中调用函数 119

5.5过程 125

5.6逐步精化 127

5.6.1从顶开始 127

5.6.2实现PrintCalendar 128

5.6.3实现PrintCalendarMonth 128

5.6.4完成最后的片段 132

小结 137

复习题 138

程序设计练习 138

第6章 算法 143

6.1测试素数 144

6.1.1一个IsPrime的简单版本 144

6.1.2验证一个策略是否表示一个算法 144

6.1.3说明IsPrime算法的正确性 145

6.1.4改进算法的效率 146

6.1.5在各个可选方案中选择 148

6.2计算最大公约数 149

6.2.1 brute-force算法 149

6.2.2欧几里得算法 150

6.2.3欧几里得算法的正确性说明(可选) 150

6.2.4比较GCD算法的效率 151

6.3数值算法 151

6.3.1连续逼近 152

6.3.2报告错误 153

6.4级数展开 154

6.4.1 Zeno悖论 154

6.4.2用级数展开法设计平方根函数 156

6.4.3估计平方根的泰勒级数展开(可选) 156

6.4.4泰勒级数近似的实现 157

6.4.5停留在收敛半径之内 159

6.5指定数值类型的大小 161

6.5.1整数类型 161

6.5.2无符号类型 162

6.5.3浮点类型 162

小结 163

复习题 163

程序设计练习 164

第二部分 库和模块化开发 170

第7章 库和接口:一个简单的图形库 170

7.1接口的概念 171

7.2图形库介绍 172

7.2.1 graphics.h的基本模型 173

7.2.2 graphics.h接口的函数 174

7.2.3软件包初始化 178

7.2.4画直线 178

7.2.5画圆和弧 179

7.2.6获取有关图形窗口的信息 181

7.3建立自己的工具 182

7.3.1定义DrawBox 182

7.3.2定义DrawCenteredCircle 184

7.3.3绝对坐标和相对坐标间的切换 184

7.3.4定义过程的好处 185

7.4解决一个较大的问题 185

7.4.1使用逐步精化 186

7.4.2实现DrawHouse过程 187

7.4.3寻找共同的模式 188

7.4.4结束分解 189

小结 193

复习题 194

程序设计练习 195

第8章 设计接口:一个随机数库 200

8.1接口设计 201

8.1.1同一主题的重要性 201

8.1.2简单性和信息隐藏的原则 202

8.1.3满足客户的需要 202

8.1.4通用工具的优势 203

8.1.5稳定性的价值 203

8.2用计算机生成随机数 204

8.2.1确定行为与非确定行为 204

8.2.2随机数和伪随机数 204

8.2.3 ANSI C中生成伪随机数 205

8.2.4改变随机数的范围 206

8.2.5将此问题通用化 210

8.3在库中保存工具 212

8.3.1接口的内容 212

8.3.2写random.h接口 213

8.3.3 random.c的实现 214

8.3.4构造客户程序 215

8.3.5初始化随机数发生器 217

8.4评价random.h接口的设计 219

8.4.1产生随机实数 220

8.4.2模拟一个概率事件 220

8.4.3在接口中包含头文件 221

8.4.4完成随机数软件包的实现 231

8.5使用随机数软件包 222

小结 225

复习题 226

程序设计练习 226

第9章 字符串和字符 233

9.1枚举的原理 234

9.1.1在机器内部表示枚举类型 234

9.1.2将枚举类型表示为整数 235

9.1.3定义新的枚举类型 235

9.1.4枚举类型的操作 237

9.1.5标量类型 238

9.2字符 238

9.2.1数据类型char 238

9.2.2 ASCII代码 239

9.2.3字符常量 240

9.2.4 ASCII代码方案的重要特性 240

9.2.5特殊字符 241

9.2.6字符运算 242

9.2.7 ctype.h接口 243

9.2.8涉及字符的控制语句 244

9.2.9字符的输入输出 245

9.3字符串作为抽象数据类型 245

9.3.1分层抽象 246

9.3.2抽象类型的概念 247

9.4 strlib.h接口 247

9.4.1确定字符串的长度 248

9.4.2从一个字符串中选择字符 248

9.4.3连接 249

9.4.4将字符转换为字符串 250

9.4.5抽取字符串的一部分 250

9.4.6比较两个字符串 251

9.4.7在一个字符串内搜索 252

9.4.8大小写转换 255

9.4.9数值转换 255

9.4.10效率和strlib.h库 257

小结 257

复习题 258

程序设计练习 260

第10章 模块化开发 264

10.1 Pig Latin——一个模块化开发的案例研究 266

10.1.1应用自顶向下的设计 266

10.1.2使用伪代码 267

10.1.3实现TranslateLine 268

10.1.4考虑空格和标点符号的问题 268

10.1.5精化单词的定义 270

10.1.6设计记号扫描器 271

10.1.7完成TranslateLine的实现 272

10.1.8定义扫描器模块接口 274

10.2在模块中维护内部状态 276

10.2.1全局变量 276

10.2.2使用全局变量的危险性 277

10.2.3保持变量的模块私有化 277

10.2.4初始化全局变量 278

10.2.5私有函数 279

10.3实现扫描器抽象 280

小结 286

复习题 286

程序设计练习 286

第三部分 复合数据类型 294

第11章 数组 294

11.1数组 295

11.1.1数组声明 295

11.1.2数组选择 296

11.1.3一个简单的数组实例 297

11.1.4改变下标值的范围 298

11.2数据的内部表示法 299

11.2.1比特、字节和字 299

11.2.2内存地址 300

11.2.3运算符sizeof 301

11.2.4变量的内存分配 301

11.2.5引用超出数组范围的元素 302

11.3数组作为参数进行传递 303

11.3.1元素个数的通用化 304

11.3.2数组参数传递机制 306

11.3.3实现函数PrintIntegerArray和GetIntegerArray 308

11.3.4实现函数ReverseIntegerArray 309

11.3.5实现函数SwapIntegerElements 310

11.4使用数组制作表格 314

11.5数组的静态初始化 320

11.5.1自动确定数组大小 320

11.5.2确定初始化数组的大小 321

11.5.3初始化数组和标量类型 321

11.6多维数组 321

11.6.1向函数传送多维数组 322

11.6.2初始化多维数组 323

小结 324

复习题 324

程序设计练习 326

第12章 查找和排序 332

12.1查找 332

12.1.1在整数数组中查找 333

12.1.2关于查找的另一个更复杂的例子 335

12.1.3线性查找 337

12.1.4二分查找 338

12.1.5查找算法的相对效率 339

12.2排序 341

12.2.1对一个整数数组排序 342

12.2.2选择排序算法 343

12.2.3选择排序效率的评估 346

12.2.4测试程序的运行时间 347

12.2.5选择排序的算法分析 347

小结 348

复习题 348

程序设计练习 349

第13章 指针 354

13.1将地址作为数据值 355

13.2 C语言的指针操作 356

13.2.1在C语言中声明指针变量 356

13.2.2基本的指针操作 357

13.2.3特殊指针NULL 359

13.3通过引用传递参数 359

13.3.1设计函数SwapInteger 361

13.3.2用引用调用返回多个结果 362

13.3.3过度使用引用调用的危险 364

13.4指针和数组 364

13.4.1指针运算 365

13.4.2运算符++++和--的新作用 367

13.4.3指针的自增和自减 369

13.4.4指针和数组的关系 369

13.5动态分配 371

13.5.1 Void*类型 371

13.5.2动态数组 372

13.5.3查找malloc中的错误 373

13.5.4释放内存 374

小结 374

复习题 375

程序设计练习 377

第14章 再论字符串 381

14.1 string类型的概念表示 381

14.1.1字符串作为数组 382

14.1.2字符串作为指针 384

14.1.3字符串作为抽象类型 384

14.1.4字符串参数 385

14.1.5字符串变量 385

14.1.6指针和数组变量间的区别 387

14.1.7决定字符串的表示方法 388

14.2 ANSI字符串库 389

14.2.1 strcpy函数 390

14.2.2 strncpy函数 392

14.2.3 strcat和strncat函数 393

14.2.4 strlen、strcmp和strncmp函数 394

14.2.5 strchr、strrchr和strstr函数 394

14.2.6 ANSI字符串函数的应用 395

14.3 strlib库的实现 397

14.3.1实现转换函数 398

14.3.2 strlib分配函数的实现 398

小结 400

复习题 400

程序设计练习 401

第15章 文件 404

15.1文本文件 404

15.2 C语言中文件的使用 406

15.2.1声明FILE*类型的变量 406

15.2.2打开文件 406

15.2.3执行I/O操作 407

15.2.4关闭文件 407

15.2.5标准文件 408

15.3字符I/O 408

15.3.1文件更新 410

15.3.2在输入文件中重新读取字符 413

15.4面向行的I/O 415

15.5格式化I/O 417

15.5.1 printf的三种形式 417

15.5.2 scanf函数 417

15.5.3用scanf读入字符串 419

15.5.4格式化I/O的一个实例 420

15.5.5使用scanf的局限 423

小结 423

复习题 424

程序设计练习 425

第16章 记录 431

16.1数据记录的概念 432

16.2记录在C语言中的使用 432

16.2.1定义一个结构类型 433

16.2.2声明结构变量 433

16.2.3记录选择 434

16.2.4记录初始化 434

16.2.5简单记录 434

16.3数组与记录的结合 435

16.4记录的指针 437

16.4.1定义一个指向记录类型的指针 438

16.4.2为记录数据分配空间 439

16.4.3对记录指针进行操作 440

16.5创建记录的数据库 440

16.5.1创建员工信息数据库 441

16.5.2数据库的使用 443

16.6基于记录的应用程序设计 444

16.6.1使用数据库的重要性 444

16.6.2问题的框架 445

16.6.3设计内部表示 445

16.6.4设计外部结构 447

16.6.5程序代码 448

16.6.6数据驱动设计方法的重要性 455

小结 455

复习题 458

程序设计练习 458

第17章 深入学习 465

17.1递归 465

17.1.1递归的简单说明 466

17.1.2 Factorial函数 467

17.1.3递归信任 471

17.1.4递归范例 472

17.1.5排列的生成 472

17.1.6用递归的思想思考 475

17.2抽象数据类型 475

17.2.1队列抽象 476

17.2.2以队列抽象表示类型 476

17.2.3 queue.h接口 478

17.2.4实现队列抽象 479

17.2.5队列抽象的另一种实现方法 484

17.3算法分析 486

17.3.1评估算法效率 487

17.3.2 O标记 487

17.3.3再看选择排序 488

17.3.4分而治之策略 489

17.3.5合并两个数组 490

17.3.6合并排序算法 491

17.3.7合并排序的计算复杂性 492

17.3.8比较平方复杂性与MogN复杂性的性能 493

小结 493

复习题 494

程序设计练习 495

附录 501

附录A C语言的语法和结构总结 501

附录B 库源代码 517