《编程珠玑》学习笔记-第3、4章

第三章 数据决定程序结构

几个案例:

1、一个调查程序

输入:某学院的学生所填写的近2万份调查表,共25页分别代表8大类,每条记录表示每份调查表;

输出:3页相似输出以及其他密切相关的表,例如拒绝回答每个问题的学生数目。

程序设计:(三视图方法)关键在于用数组来存储数据;数组按照其输出结构或者按照其输入结构来组织。

2、格式信函编程

编写基于格式信函模板的格式信函发生器;$i代表记录中的第i个字段,长字符串数组表示该模板。

发生器+模板程序实现。将数据从控制中分离出来:如果重新设计信函,那么模板可以使用文本编辑器来修改,从而第二个特定页的准备也会简单。

3、其他示例:菜单、出错信息、日期函数、单词分析。

 

小结:1、用于特殊数据的强大工具:超文本、键值对、电子表格、数据库、特定领域的编程语言。

2、数据结构对软件的贡献:将大程序缩减为小程序。

3、退回七点思考的原则:使用数组重新编写重复代码;封装复杂的结构;尽可能使用高级工具;从数据得出程序的结构。

 


第四章 编写正确的程序

1、对程序验证进行研究可以加深对计算机编程的基本理解,对于程序维护也至关重要。

2、关于二分搜索的论文在1946年发表,但一个没有错误的二分搜索程序在1962年才出现,可见正确编写二分搜索还是很有挑战的。

3、编写二分搜索程序:首先编写程序框架(引入断言),如下:

initialize range to 0..n-1

loop

{incariant:mustbe(range)}

if range is empty,

 break and report that t is not in the array

compute m,the middle of the range

use m as a probe to shrink the range

if t is found during the shrinking process,

 break and report its position

然后进行初始化l=0,u=n-1;接下来检查空范围([0,n-1])并计算新的中间点m;最后编写伪代码如下:

l=0;u=n-1

loop

{mustbe(l,u)}

if l>u

p=-1;break

m=(l+u)/2

case

x[m]<t:l=m+1

x[m]==t:p=m;break

x[m]>t:u=m-1

程序验证的基本技术:精确定义不变式并在编写每一行代码时随时保持不变式对的成立。

程序验证的基本技术在将算法框架转化为伪代码时起了很大作用。

4、理解程序:

【开发:自上而下;正确性分析:自下而上】

对二分程序进行验证分析,分为三段式:

a. 初始化:循环初次执行的时候不变式为真;

b. 保持:如果在某次迭***始的时候以及循环体执行的时候,不变式都为真,那么,循环体执行完毕的时候不变式依然为真。

c. 终止:循环能够终止,并且可得到期望的结果。

5、原理:

问题很重要,需要认真编写代码,程序开发新需要遵循验证思想,可使用一般性的工具进行程序正确性的分析。

a. 断言:输入、程序变量和输出之间的关系勾勒出程序的状态,断言可以准备阐述这些关系;

b. 顺序控制结构:分析每个分支说明结构的重要性,选择某个分支的事实使用断言来证明;

c. 迭代控制结构:上面提到的三段式;

d. 函数:使用两个断言陈述其目的,前置条件和后置条件。前置条件是在调用该函数之前就应该成立的状态,后置条件的正确性由函数在终止执行时保证。也就是通常说的“契约编程”:如果前置条件满足的情况下调用函数,那么函数的执行将确立后置条件。

#编辑器##设计##论文##笔记#
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务