
Art and science of C:a library-based introduction to computer science
副标题:无
作 者:(美)Eric S. Roberts著;翁惠玉[等]译
分类号:
ISBN:9787111347750
微信扫一扫,移动浏览光盘
简介
《C语言的科学和艺术》(作者罗伯茨)是计算机科学的经典教材,介绍
了计算机科学的基础知识和程序设计的专门知识。《C语言的科学和艺术》
以介绍ANSI C为主线,不仅涵盖C语言的基本知识,而且介绍了软件工程技
术以及如何应用良好的程序设计风格进行开发等内容。《C语言的科学和艺
术》采用了库函数的方法,强调抽象的原则,详细阐述了库和模块化开发。
此外,《C语言的科学和艺术》还利用大量实例讲述解决问题的全过程,对
开发过程中常见的错误也给出了解决和避免的方法。《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语言程序设计基础
.第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
第二部分 库和模块化开发
第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
第三部分 复合数据类型
第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 比较平方复杂性与nlogn复杂性的性能 493
小结 493
复习题 494
程序设计练习 495
附 录
附录a c语言的语法和结构总结 501
附录b 库源代码 517
译者序
前言
第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语言程序设计基础
.第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
第二部分 库和模块化开发
第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
第三部分 复合数据类型
第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 比较平方复杂性与nlogn复杂性的性能 493
小结 493
复习题 494
程序设计练习 495
附 录
附录a c语言的语法和结构总结 501
附录b 库源代码 517
Art and science of C:a library-based introduction to computer science
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×
