《编程原本 》一1.4 过程

1.4 过程

一个过程(procedure)是一个指令序列,它修改某些对象的状态,也可能构造或
者销毁一些对象.根据程序员的意图,与一个过程交互的对象分为四类.
1.输入输出(input/output),指该过程通过其参数或返回值直接或间接传递的那些对象.

2.局部状态(localstate),该过程在其一次调用期间创建、销毁或修改的那些对象.

3.全局状态(globalstate),该过程和其他过程在多次调用中访问的对象.

4.拥有的状态(ownstate),仅供该过程(及其隶属过程)访问但又能被该过程的多次调用共享的对象.

如果一个对象作为参数或结果传递,称它是直接传递的;如果是通过指针或类似指针的机制传递,则称它是间接传递的.如果一个对象被某个过程读但是并不修改,称它是该过程的输入.如果一个对象被某过程写入、创建或销毁,但该过程并不访问其初始状态,则称它是该过程的输出.如果一个对象被某过程既读又修改,称它是该过程的输入/输出.
一个类型的计算基(computationalbasis)是有穷的一集过程,基于它们可以构造出该类型上的其他过程.一组基是高效的(e.cient),当且仅当基于它实现的任何过程的效率不比基于任何其他基写出的过程低效.例如,对k-位无符号整数的一组只提供0,相等判断和后继操作的基就不是高效的,因为基于后继函数实现加法的复杂性是k的指数函数.
一组基是有表达力的(expressive),当且仅当基于它可以紧凑而方便地定义相关类型上的其他过程.特别是,如果合适的话,一个基应该提供所有常用的数学运算.举例说,虽然减法运算可以通过求负和加法实现,但在一个有表达力

编程原本》提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目标是提升你对编程的洞察力。要想从中大获裨益,你需要从头到尾认真学习:阅读代码,证明引理,完成练习。到结束之时,你将看到如何把这里讨论的演绎方法应用到你的程序中,保证你做出的软件部件能一起工作,并表现出它们所应该表现的行为。 书中给出的算法和需求针对某些被操作的类型。有关这些描述的代码(也可以通过Web得到)采用C++的一个小子集书写,这样做是为了让所有有经验的程序员都能理解。这个小子集可以看做一种特殊语言,是由Sean Parent和Bjarne Stroustrup一起设计的。 无论你是一位软件开发者,还是其他以编程作为一项重要活动的专业人员,或者是一名在校的学生,你都会逐渐理解本书的经验丰富的作者多年来一直在教授和阐释的道理:数学对于编程是绝好的东西,理论对于实际是绝好的东西。
本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系。书中把理论的规程、基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者。 第1章 基础 1 1.1 理念范畴:实体,类别,类属 1 1.2 值 2 1.3 对象 4 1.4 过程 6 1.5 规范类型 7 1.6 规范过程 8 1.7 概念 10 1.8 总结 14 第2章 变换及其轨道 15 2.1 变换 15 2.2 轨道 18 2.3 碰撞点 21 2.4 轨道规模的度量 27 2.5 动作 28 2.6 总结 29 第3章 可结合运算 31 3.1 可结合性 31 3.2 计算乘幂 32 3.3 程序变换 35 3.4 处理特殊情况的过程 40 3.5 参数化算法 43 3.6 线性递归 44 3.7 累积过程 47 3.8 总结 48 第4章 线性序 49 4.1 关系的分类 49 4.2 全序和弱序 51 4.3 按序选取 52 4.4 自然全序 62 4.5 派生过程组 63 4.6 按序选取过程的扩展 63 4.7 总结 64 第5章 有序代数结构 65 5.1 基本代数结构 65 5.2 有序代数结构 70 5.3 求余 72 5.4 最大公因子 76 5.5 广义gcd 79 5.6 Steingcd 81 5.7 商 82 5.8 负量的商和余数 84 5.9 概念及其模型 87 5.10 计算机整数类型 88 5.11 结论 89 第6章 迭代器 91 6.1 可读性 91 6.2 迭代器 92 6.3 范围 94 6.4 可读范围 97 6.5 递增的范围 106 6.6 前向迭代器 108 6.7 索引迭代器 113 6.8 双向迭代器 114 6.9 随机访问迭代器 115 6.10 总结 117 第7章 坐标结构 119 7.1 二叉坐标 119 7.2 双向二叉坐标 123 7.3 坐标结构 129 7.4 同构,等价和有序 129 7.5 总结 137 第8章 后继可变的坐标 139 8.1 链接迭代器 139 8.2 链接重整 140 8.3 链接重整的应用 147 8.4 链接的二叉坐标 151 8.5 结论 155 第9章 拷贝 157 9.1 可写性 157 9.2 基于位置的拷贝 159 9.3 基于谓词的拷贝 166 9.4 范围的交换 174 9.5 总结 178 第10章 重整 179 10.1 置换 179 10.2 重整 182 10.3 反转算法 184 10.4 轮换算法 188 10.5 算法选择 196 10.6 总结 200 第11章 划分和归并 201 11.1 划分 201 11.2 平衡的归约 207 11.3 归并 212 11.4 总结 218 第12章 复合对象 219 12.1 简单复合对象 219 12.2 动态序列 227 12.3 基础类型 233 12.4 总结 236 跋 237 附录 A 数学表示 241 附录B 程序设计语言 243 参考文献 253 索引 257
目 录 前 言6 第1 章 文件结构 1.1 版权和版本的声明. 1.2 头文件的结构. 1.3 定义文件的结构. 1.4 头文件的作用. 1.5 目录结构. 第2 章 程序的版式 2.1 空行. 2.2 代码行. 2.3 代码行内的空格. 2.4 对齐. 2.5 长行拆分. 2.6 修饰符的位置. 2.7 注释. 2.8 类的版式. 第3 章 命名规则 3.1 共性规则. 3.2 简单的WINDOWS 应用程序命名规则. 3.3 简单的UNIX 应用程序命名规则 第4 章 表达式和基本语句 4.1 运算符的优先级. 4.2 复合表达式. 4.3 IF 语句 4.4 循环语句的效率. 4.5 FOR 语句的循环控制变量. 4.6 SWITCH 语句. 4.7 GOTO 语句. 第5 章 常量 5.1 为什么需要常量. 5.2 CONST 与 #DEFINE 的比较. 5.3 常量定义规则. 5.4 类中的常量. 第6 章 函数设计 高质量C++/C 编程指南,v 1.0 2001 Page 4 of 101 6.1 参数的规则. 6.2 返回值的规则. 6.3 函数内部实现的规则. 6.4 其它建议. 6.5 使用断言. 6.6 引用与指针的比较. 第7 章 内存管理 7.1 内存分配方式 7.2 常见的内存错误及其对策 7.3 指针与数组的对比 7.4 指针参数是如何传递内存的? 7.5 FREE 和DELETE 把指针怎么啦? 7.6 动态内存会被自动释放吗?. 7.7 杜绝“野指针”. 7.8 有了MALLOC/FREE 为什么还要NEW/DELETE ?. 7.9 内存耗尽怎么办?. 7.10 MALLOC/FREE 的使用要点 7.11 NEW/DELETE 的使用要点. 7.12 一些心得体会 第8 章 C++函数的高级特性 8.1 函数重载的概念. 8.2 成员函数的重载、覆盖与隐藏. 8.3 参数的缺省值. 8.4 运算符重载. 8.5 函数内联. 8.6 一些心得体会. 第9 章 类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源. 9.2 构造函数的初始化表. 9.3 构造和析构的次序. 9.4 示例:类STRING 的构造函数与析构函数 9.5 不要轻视拷贝构造函数与赋值函数. 9.6 示例:类STRING 的拷贝构造函数与赋值函数 9.7 偷懒的办法处理拷贝构造函数与赋值函数. 9.8 如何在派生类中实现类的基本函数. 9.9 一些心得体会. 第10 章 类的继承与组合. 高质量C++/C 编程指南,v 1.0 2001 Page 5 of 101 10.1 继承 10.2 组合 第11 章 其它编程经验. 11.1 使用CONST 提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议 参考文献 附录A :C++/C 代码审查表. 附录B :C++/C 试题. 附录C :C++/C 试题的答案与评分标准.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值