书籍详情

C语言的科学和艺术

C语言的科学和艺术

作者:(美)Eric S.Roberts著;翁惠玉[等]译

出版社:机械工业出版社

出版时间:2005-04-01

ISBN:9787111159711

定价:¥55.00

购买这本书可以去
内容简介
  本书是计算机科学的经典教材,介绍了计算机科学的基础知识和程序设计的专门知识。本书以介绍ANSIC为主线,不仅涵盖C语言的基本知识,而且介绍了软件工程技术以及如何应用良好的程序设计风格进行开发等内容。本书采用了库函数的方法,强调抽象的原则,详细阐述了库和模块化开发。此外,本书还利用大量实例讲述解决问题的全过程,对开发过程中常见的错误也给出了解决和避免的方法。本书既可作为高等院校计算机科学入门课程及C语言入门课程的教材,也是C语言开发人员的极佳参考书。本书前言致学生欢迎你!拿起这本书,你就迈进了计算机科学的世界—这门学科出现在半世纪以前,现在却成为这个时代最具生机和活力的学科之一。在几十年的发展过程中,计算机几乎使所有领域中看似不可能的事情成为可能。由于计算机可在瞬间将信息传递到任何地方,所以今天的企业家能以空前的规模经营跨国公司。由于计算机可进行必要的、但人工很难完成的计算,科学家才能解决许多问题。电影人利用计算机制作出更具感染力的视觉效果。由于计算机能处理医学中大量的信息处理,因此医生能对患者的病情做出更精确的诊断。计算机技术正在飞速发展。目前我们已经看到的优势与新的世纪将要经历的发展相比肯定将相形见绌。最近50年,计算机已经对世界产生了深远影响,在新的世纪亦将如此。今日的学生将会是执行这项伟大的工程的中流砥柱。要做到这一点,就必须懂得如何使用计算机。和其他值得掌握的技能一样,理解计算机的工作原理以及学会怎样控制它们是需要花费时间的。这一切不可能一蹴而就,必须从某个起点开始循序渐进。2500年前,中国的哲学家老子曾说过:“千里之行,始于足下”。本书就是一个很好的起点。然而对很多人来说,万事开头难。许多学生在计算机面前束手无策,认为计算机科学超出了他们的理解范围。可是基本的程序设计并不需要具备高等数学和电子学的知识。在程序设计中,最重要的是能否从陈述问题过渡到解决问题。要做到这一点,就必须以逻辑方式考虑问题。训练自己用计算机能够理解的方式表达自己的逻辑。最重要的是,不要被困难和挫折压倒,要坚持到底。若能坚持下来,就会发现解决问题是件多么令人兴奋的事情,它所带来的喜悦足以让你忘却学习过程中遇到的任何挫折。本书旨在教授程序设计基础和C语言基础。C语言是当今计算机产业中处于主导地位的程序设计语言。本书不但介绍了程序设计中的“为什么”,还介绍了“如何做”,使读者对程序设计有总体的印象。为使读者避免出现那些阻碍学习的错误,本书在结构上做出了精心安排,可以帮助读者掌握重点。接下来将总结本书在结构上的一些独具匠心之处,并说明如何在学习过程中高效地利用本书。
作者简介
  EricS.Roberts,美国斯坦福大学计算机科学系教授,主管教学的系副主任。他由于教学改革的成就获得CharlesSimonyi荣誉教授。Roberts于1980年获哈佛大学应用数学博士学位,其后他创建了威尔斯利学院的计算机科学系,并担任系主任。后来,他在加州PaloAlto的DEC公司系统研究中心工作了5年。相关图书数据仓库(原书第3版)离散数学导学数据库设计教程(第2版)软件需求3D游戏卷1实时渲染与软件技术3D游戏卷2动画与高级实时渲染技术数字图像处理疑难解析现代信息检索CAXA数控铣CAD/CAM技术计算机视觉信息系统原理:原书第6版数据库与事务处理高级编译器设计与实现计算机网络系统方案(原书第3版)3D计算机图形学(原书第3版)计算机网络与因特网(原书第4版)计算机科学概论(原书第2版)可扩展并行计算技术、结构与编程数据库原理、编程与性能嵌入式微控制器微机接口技术实验教程神经网络原理(原书第2版)编译原理C++语言的设计和演化并行计算导论(原书第2版)信息论、编码与密码学组合数学(原书第4版)JAVA编程思想(第2版)数据库系统导论UNIX系统编程并行程序设计操作系统现代操作系统(第2版)计算机网络:自顶向下方法与Internet特色(原书第3版)C程序设计语言(第2版·新版)习题解答人工智能:英文Java面向对象程序设计教程C++编程思想。第2卷:实用编程技术模式分析的核方法
目录
第1章  概述        1
1.1  计算简史        1
1.2  什么是计算机科学        4
1.3  计算机硬件简介        4
1.3.1  CPU        4
1.3.2  内存        5
1.3.3  辅助存储器        5
1.3.4  I/O设备        5
1.4  算法        6
1.5  程序设计语言和编译        7
1.6  编程错误和调试        8
1.7  软件维护        9
1.8  软件工程的重要性        10
1.9  关于C程序设计语言的一些思考        10
小结        10
复习题        11
第一部分  C语言程序设计基础
第2章  通过例子学习        14
2.1  “Hello world”程序        14
2.1.1  注释        15
2.1.2  库包含        15
2.1.3  主程序        16
2.2  两个数的加法程序        17
2.2.1  输入阶段        19
2.2.2  计算阶段        20
2.2.3  输出阶段        20
2.3  有关程序设计过程的观点        21
2.4  数据类型        22
2.4.1  浮点型数据        22
2.4.2  字符串类型的数据        23
2.5  表达式        25
2.5.1  常量        25
2.5.2  变量        26
2.5.3  赋值语句        27
2.5.4  运算符和操作数        29
2.5.5  整型数和浮点型数的结合        30
2.5.6  整数除法和求余运算符        30
2.5.7  优先级        31
2.5.8  优先级法则的应用        33
2.5.9  类型转换        33
小结        35
复习题        36
程序设计练习        37
第3章  问题求解        40
3.1  程序设计习语和范例        40
3.1.1  复合赋值习语        41
3.1.2  自增和自减运算符        42
3.2  解决规模稍大的问题        43
3.3  控制语句        44
3.3.1  重复N次习语        44
3.3.2  迭代和循环        45
3.3.3  下标变量        45
3.3.4  初始化的重要性        47
3.3.5  读入-直到-标志习语        47
3.3.6  创造一个更实用的应用程序        49
3.3.7  条件执行和if语句        51
3.4  一个调试练习        53
3.5  格式化输出        56
3.5.1  printf的格式码        57
3.5.2  控制空格、对齐方式和精度        57
3.6  构思一个程序        60
3.6.1  程序设计风格        60
3.6.2  设计时考虑将来的修改        61
3.6.3  #define机制        61
小结        63
复习题        63
程序设计练习        64
第4章  语句形式        68
4.1  简单语句        68
4.1.1  赋值的嵌套        69
4.1.2  多重赋值        70
4.1.3  程序块        70
4.2  控制语句        71
4.3  布尔型数据        72
4.3.1  关系运算符        72
4.3.2  逻辑运算符        73
4.3.3  简化求值        75
4.3.4  标志        75
4.3.5  避免布尔表达式中的冗余        76
4.3.6  布尔计算示例        76
4.4  if语句        77
4.4.1  单行if语句        78
4.4.2  多行if语句        79
4.4.3  if/else语句        79
4.4.4  级联if语句        79
4.4.5  ?: 运算符(可选的)        80
4.5  switch语句        81
4.6  while语句        83
4.6.1  while循环的应用        84
4.6.2  无限循环        85
4.6.3  解决半途退出问题        86
4.7  for语句        87
4.7.1  嵌套的for循环        89
4.7.2  for和while的关系        90
4.7.3  for语句中浮点型数据的使用问题        91
小结        92
复习题        93
程序设计练习        93
第5章  函数        96
5.1  使用库函数        96
5.2  函数声明        98
5.3  自己编写函数        99
5.3.1  return语句        99
5.3.2  将函数与主程序放在一起        100
5.3.3  包含内部控制结构的函数        101
5.3.4  返回非数字值的函数        103
5.3.5  谓词函数        104
5.3.6  测试字符串是否相等的谓词函数        105
5.4  函数调用过程机制        106
5.4.1  参数传递        107
5.4.2  在其他函数中调用函数        109
5.5  过程        115
5.6  逐步精化        116
5.6.1  从顶开始        116
5.6.2  实现PrintCalendar        117
5.6.3  实现PrintCalendarMonth        118
5.6.4  完成最后的片段        121
小结        125
复习题        126
程序设计练习        126
第6章  算法        131
6.1  测试素数        131
6.1.1  一个IsPrime的简单版本        132
6.1.2  验证一个策略是否表示一个算法        132
6.1.3  说明IsPrime算法的正确性        133
6.1.4  改进算法的效率        133
6.1.5  在各个可选方案中选择        136
6.2  计算最大公约数        136
6.2.1  brute-force算法        136
6.2.2  欧几里德算法        137
6.2.3  欧几里德算法的正确性说明(可选)        138
6.2.4  比较GCD算法的效率        138
6.3  数值算法        139
6.3.1  连续逼近        139
6.3.2  报告错误        141
6.4  级数展开        141
6.4.1  Zeno悖论        141
6.4.2  用级数展开法设计平方根函数        143
6.4.3  估计平方根的泰勒级数展开(可选)        143
6.4.4  泰勒级数近似的实现        144
6.4.5  停留在收敛半径之内        146
6.5  指定数值类型的大小        147
6.5.1  整数类型        148
6.5.2  无符号类型        149
6.5.3  浮点类型        149
小结        149
复习题        150
程序设计练习        150
第二部分  库和模块化开发
第7章  库和接口:一个简单的图形库        156
7.1  接口的概念        156
7.2  图形库介绍        158
7.2.1  graphics.h的基本模型        158
7.2.2  graphics.h接口的函数        159
7.2.3  软件包初始化        163
7.2.4  画直线        163
7.2.5  画圆和弧        164
7.2.6  获取有关图形窗口的信息        166
7.3  建立自己的工具        166
7.3.1  定义DrawBox        167
7.3.2  定义DrawCenteredCircle        169
7.3.3  绝对坐标和相对坐标间的切换        169
7.3.4  定义过程的好处        170
7.4  解决一个较大的问题        170
7.4.1  使用逐步精化        171
7.4.2  实现DrawHouse过程        172
7.4.3  寻找共同的模式        172
7.4.4  结束分解        173
小结        177
复习题        178
程序设计练习        179
第8章  设计接口:一个随机数库        183
8.1  接口设计        183
8.1.1  同一主题的重要性        184
8.1.2  简单性和信息隐藏的原则        184
8.1.3  满足客户的需要        185
8.1.4  通用工具的优势        185
8.1.5  稳定性的价值        186
8.2  用计算机生成随机数        186
8.2.1  确定行为与非确定行为        186
8.2.2  随机数和伪随机数        187
8.2.3  ANSI C中生成伪随机数        187
8.2.4  改变随机数的范围        188
8.2.5  将此问题通用化        192
8.3  在库中保存工具        193
8.3.1  接口的内容        193
8.3.2  写random.h接口        195
8.3.3  random.c的实现        196
8.3.4  构造客户程序        197
8.3.5  初始化随机数发生器        198
8.4  评价random.h接口的设计        200
8.4.1  产生随机实数        201
8.4.2  模拟一个概率事件        201
8.4.3  在接口中包含头文件        202
8.4.4  完成随机数软件包的实现        202
8.5  使用随机数软件包        202
小结        205
复习题        206
程序设计练习        207
第9章  字符串和字符        213
9.1  枚举的原理        213
9.1.1  在机器内部表示枚举类型        214
9.1.2  将枚举类型表示为整数        214
9.1.3  定义新的枚举类型        215
9.1.4  枚举类型的操作        217
9.1.5  标量类型        217
9.2  字符        218
9.2.1  数据类型char        218
9.2.2  ASCII代码        218
9.2.3  字符常量        219
9.2.4  ASCII代码方案的重要特性        219
9.2.5  特殊字符        220
9.2.6  字符运算        221
9.2.7  ctype.h接口        222
9.2.8  涉及字符的控制语句        223
9.2.9  字符的输入输出        223
9.3  字符串作为抽象数据类型        224
9.3.1  分层抽象        224
9.3.2  抽象类型的概念        225
9.4  strlib.h接口        226
9.4.1  确定字符串的长度        226
9.4.2  从一个字符串中选择字符        227
9.4.3  连接        227
9.4.4  将字符转换为字符串        228
9.4.5  抽取字符串的一部分        229
9.4.6  比较两个字符串        229
9.4.7  在一个字符串内搜索        230
9.4.8  大小写转换        232
9.4.9  数值转换        232
9.4.10  效率和strlib.h库        235
小结        235
复习题        236
程序设计练习        237
第10章  模块化开发        241
10.1  Pig Latin—一个模块化开发的案例研究        242
10.1.1  应用自顶向下的设计        243
10.1.2  使用伪代码        243
10.1.3  实现TranslateLine        244
10.1.4  考虑空格和标点符号的问题        245
10.1.5  精化单词的定义        246
10.1.6  设计记号扫描器        247
10.1.7  完成TranslateLine的实现        248
10.1.8  定义扫描器模块接口        250
10.2  在模块中维护内部状态        252
10.2.1  全局变量        252
10.2.2  使用全局变量的危险性        253
10.2.3  保持变量的模块私有化        253
10.2.4  初始化全局变量        253
10.2.5  私有函数        255
10.3  实现扫描器抽象        255
小结        261
复习题        261
程序设计练习        261
第三部分  复合数据类型
第11章  数组        268
11.1  数组        268
11.1.1  数组声明        269
11.1.2  数组选择        270
11.1.3  一个简单的数组实例        271
11.1.4  改变下标值的范围        271
11.2  数据的内部表示法        272
11.2.1  比特、字节和字        273
11.2.2  内存地址        273
11.2.3  运算符sizeof        274
11.2.4  变量的内存分配        274
11.2.5  引用超出数组范围的元素        275
11.3  数组作为参数进行传递        276
11.3.1  元素个数的通用化        277
11.3.2  数组参数传递机制        279
11.3.3  实现函数PrintIntegerArray和GetIntegerArray        281
11.3.4  实现函数ReverseIntegerArray        282
11.3.5  实现函数SwapIntegerElements        283
11.4  使用数组制作表格        286
11.5  数组的静态初始化        291
11.5.1  自动确定数组大小        292
11.5.2  确定初始化数组的大小        292
11.5.3  初始化数组和标量类型        293
11.6  多维数组        293
11.6.1  向函数传送多维数组        294
11.6.2  初始化多维数组        295
小结        295
复习题        296
程序设计练习        297
第12章  查找和排序        303
12.1  查找        303
12.1.1  在整数数组中查找        303
12.1.2  关于查找的另一个更复杂的例子        305
12.1.3  线性查找        307
12.1.4  二分查找        308
12.1.5  查找算法的相对效率        310
12.2  排序        311
12.2.1  对一个整数数组排序        312
12.2.2  选择排序算法        313
12.2.3  选择排序效率的评估        315
12.2.4  测试程序的运行时间        316
12.2.5  选择排序的算法分析        317
小结        318
复习题        318
程序设计练习        318
第13章  指针        323
13.1  将地址作为数据值        324
13.2  C语言的指针操作        325
13.2.1  在C语言中声明指针变量        325
13.2.2  基本的指针操作        325
13.2.3  特殊指针NULL        327
13.3  通过引用传递参数        327
13.3.1  设计函数SwapInteger        329
13.3.2  用引用调用返回多个结果        330
13.3.3  过度使用引用调用的危险        332
13.4  指针和数组        332
13.4.1  指针运算        333
13.4.2  运算符++和--的新作用        335
13.4.3  指针的自增和自减        336
13.4.4  指针和数组的关系        337
13.5  动态分配        338
13.5.1  Void *类型        339
13.5.2  动态数组        340
13.5.3  查找malloc中的错误        340
13.5.4  释放内存        341
小结        341
复习题        342
程序设计练习        344
第14章  再论字符串        347
14.1  string类型的概念表示        347
14.1.1  字符串作为数组        347
14.1.2  字符串作为指针        349
14.1.3  字符串作为抽象类型        350
14.1.4  字符串参数        350
14.1.5  字符串变量        351
14.1.6  指针和数组变量间的区别        352
14.1.7  决定字符串的表示方法        354
14.2  ANSI字符串库        354
14.2.1  strcpy函数        355
14.2.2  strncpy函数        357
14.2.3  strcat和strncat函数        358
14.2.4  strlen、strcmp和strncmp函数        359
14.2.5  strchr、strrchr和strstr函数        359
14.2.6  ANSI字符串函数的应用        360
14.3  strlib库的实现        360
14.3.1  实现转换函数        360
14.3.2  strlib分配函数的实现        363
小结        364
复习题        365
程序设计练习        365
第15章  文件        368
15.1  文本文件        368
15.2  C语言中文件的使用        369
15.2.1  声明FILE*类型的变量        370
15.2.2  打开文件        370
15.2.3  执行I/O操作        371
15.2.4  关闭文件        371
15.2.5  标准文件        371
15.3  字符I/O        371
15.3.1  文件更新        374
15.3.2  在输入文件中重新读取字符        376
15.4  面向行的I/O        377
15.5  格式化I/O        379
15.5.1  printf的三种形式        380
15.5.2  scanf函数        380
15.5.3  用scanf读入字符串        381
15.5.4  格式化I/O的一个实例        383
15.5.5  使用scanf的局限        385
小结        385
复习题        386
程序设计练习        387
第16章  记录        393
16.1  数据记录的概念        393
16.2  记录在C语言中的使用        394
16.2.1  定义一个结构类型        394
16.2.2  声明结构变量        395
16.2.3  记录选择        395
16.2.4  记录初始化        395
16.2.5  简单记录        396
16.3  数组与记录的结合        397
16.4  记录的指针        399
16.4.1  定义一个指向记录类型的指针        399
16.4.2  为记录数据分配空间        400
16.4.3  对记录指针进行操作        401
16.5  创建记录的数据库        402
16.5.1  创建员工信息数据库        402
16.5.2  数据库的使用        404
16.6  基于记录的应用程序设计        405
16.6.1  使用数据库的重要性        405
16.6.2  问题的框架        405
16.6.3  设计内部表示        406
16.6.4  设计外部结构        408
16.6.5  程序代码        409
16.6.6  数据驱动设计方法的重要性        415
小结        415
复习题        417
程序设计练习        418
第17章  深入学习        424
17.1  递归        424
17.1.1  递归的简单说明        425
17.1.2  Factorial函数        425
17.1.3  递归信任        429
17.1.4  递归范例        430
17.1.5  排列的生成        431
17.1.6  用递归的思想思考        433
17.2  抽象数据类型        433
17.2.1  队列抽象        434
17.2.2  以队列抽象表示类型        434
17.2.3  queue.h 接口        436
17.2.4  实现队列抽象        437
17.2.5  队列抽象的另一种实现方法        441
17.3  算法分析        444
17.3.1  评估算法效率        444
17.3.2  O标记        444
17.3.3  再看选择排序        445
17.3.4  分而治之策略        446
17.3.5  合并两个数组        447
17.3.6  合并排序算法        447
17.3.7  合并排序的计算复杂性        448
17.3.8  比较平方复杂性与NlogN复杂性的性能        450
小结        450
复习题        451
程序设计练习        451
附      录
附录A  C语言的语法和结构总结        457
附录B  库源代码        471
索引        491
猜您喜欢

读书导航