程序设计方法学习题汇总
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《程序设计方法学》习题汇总
一、简答题:
1)何谓Proper程序?试举一例。
答:一个框图程序,若满足:i)一个入口,一个出口;ii)每个结点总有一条从入口到出口的路径通过它。则称其为Proper
2)何谓prime程序?试举一例。
答:Prime程序又称初等程序、基本程序。是Proper程序且其中不包括由二个以上结点组成的Proper程序。即最小的Proper程序。例:
3)给出Hoare关于程序部分正确和完全正确的定义。
答:给定Spec(φ, ψ),若对输入x满足φ(x),则程序S计算终止,且ψ(x , z)满足。称S关于(φ, ψ)是完全正确的。记为{φ}S{ψ}。
给定Spec(φ, ψ),若对输入x满足φ(x),当程序S计算终止时,满足ψ(x , z)。称S关于(φ, ψ)是部分正确的。记为[φ]S[ψ]。
4)Hoare关于程序部分正确和完全正确的定义有什么区别?为什么在证明程序S是完全正确时可以分别证明部分正确和终止?
答:Hoare关于程序部分正确和完全正确的定义的区别在于程序的部分正确不保证程序的终止,而程序的完全正确保证程序即是部分正确的,同时又是终止的。
因为一个程序S是完全正确的等价于该程序是部分正确的同时又是终止的,因此在证明程序S是完全正确时可以分别证明部分正确和终止。
5)何谓抽象数据类型(ADT),它解决了程序设计中的什么问题?
答:根据数据抽象的原则,符合“一个值集和作用在值集上的操作集”的数据类型,称为ADT。ADT解决了程序设计中如何描述大型程序的形式规范问题。其优点是:支持模块化、封装性、简化对正确性的验证、支持复用,提高软件质量。
6)面向对象的程序设计的本质是什么?与模块化程序设计的最大区别是什么?
答:面向对象程序设计的本质是以对象为软件的构件,以类来叙述对象的行为,以消息来引发对象的行为。与模块化程序设计相比,面向对象的程序设计将要构造的软件系统表示为对象集,每个对象是一组数据及其作用在其上的一组基本操作封装而成的实体,对象间通过消息传递实现联系。而模块化是把大程序划分成若干模块,每个模块完成一个子功能,模块间相互协调,共同完成特定功能,其实质是把复杂问题分解成许多容易解决的小问题。
7)令φ,ψ是程序S的前置谓词和后置谓词,φ,ψ与S是一个什么关系?
答:Spec可以表示为二元组(φ,ψ),称φ是初始(前置)断言,ψ是结果(后置)断言。
称{φ}S{Ψ}为S关于Spec(φ,Ψ)的程序断言。其含义是:若S执行前φ为T,那么S的执行一定终止,且终止时Ψ为T。
8)叙述最弱前置谓词WP的定义。试举一例。
答:设S是一个程序(语句),ψ是一个后置谓词,定义最弱前置谓词WP(S,ψ)为:满足S从其中任一状态开始执行,必定在有限的时间内终止。且满足ψ的所有状态的集合。例:
S1: i:=i+1;
ψ1:i≤10
WP(S1, ψ1)≡(i≤9)
9)可以用顺序语句“;”和重复语句“WHILE-DO”来描述判定语句“IF_THEN_ELSE”的功能吗?为什么?
答:可以,例如可以将判定语句“if C then A; else B;”用重复语句表示为:
While C do
{
A;
}
While !C do
{
B;
}
10)计算非负整数x和y的最大公约数:
gcd1(x,y) ≡if x=0 then y
else if y else gcd1(x,y-x) 是否正确?为什么? 答:不正确。因为当y 11)并行程序与顺序程序的区别是什么? 答:并行程序具有同时性和并发性的特点,即两个或多个事件可以在同一时刻或同一时间间隔内同时发生。而顺序程序没有上述特点,只能在一个事件执行完毕之后才能执行下一个事件。 12)何谓并行系统中的不确定性、平行性、并发性、分布性,它们间的关系如何? 答:不确定性指两个静态功能等价的并行程序,动态计算的结果可能不同。 平行性指两个或多个事件在同一时刻发生。 并发性指两个或多个事件在同一时间间隔内发生。 分布性指系统中各计算机异步独立工作。 二、证明题: 1)试证任何一个Proper程序功能等价基础系 { ; , IF_THEN_ELSE , WHILE } 语句复合而成的复合程序。 证:考虑任一Proper程序P,设P有n个结点(函数、谓词)。 i)对程序中的谓词、函数结点进行编号(1…n) ii)引入一个计数器L iii)在编号的基础上为各输入/输出线进行编号(规则:对结点i,输出线为该结点后继结点的编号;出口线为0) iv)对每个结点i构造新结点g i的方法是: v)将P改造成测试L的程序F(图示): 程序F:L=1, while L>0 do If L=1 Then g1; Else if L=2 Then g2; … Else if L=n Then g n; Else I; ∴F∈{;,IF-THEN-ELSE,WHILE} F与P等价。 2)试证WP(S,ψ1∧ψ2)⇒ WP(S,ψ1)∧WP(S,ψ2) 其中S是程序,ψ1,ψ2是其后置谓词。 证:∵(ψ1∧ψ2) ⇒ψ1 ∴由单调率,WP(S,ψ1∧ψ2)⇒ WP(S,ψ1) 同理:WP(S,ψ1∧ψ2)⇒ WP(S,ψ2) ∵A⇒B,A⇒C,有A⇒(B∧C) ∴结论成立。 3)若P、Q是任意语句S的任意两个后置谓词,试证: WP (S , P ∧Q) ⇒ WP (S , P) WP (S , P) ⇒ WP (S , P ∨Q) 证:i) ∵(P∧Q) ⇒ P ∴由单调率,WP(S,P∧Q)⇒ WP(S,P) ii) ∵P ⇒ P∨Q ∴由单调率,WP(S,P)⇒ WP(S,P∨Q) 4)a.下述框图程序计算x1除以x2,试用Floyd归纳断言法证明其关于规范(φ,ψ)是部分正确的。其 ?(给出用Floyd归纳断言法的证明) 证:a.(1)置切割点Ba,切割路径为: α(A→Ba):R:T r:(0,x1) β(Ba→Ba):R:y2>=x2 r:(y1+1,y2-x2) γ(Ba→C):R:y2 (2)在A、B、C各点上建立归纳断言 A:φ(x)≡x1>=0∧x2>=0 C:ψ(x,z)≡x1=z1*x2+z2∧0<=z2 B:IA(x,y1,y2) ≡x1=y1*x2+y2∧y2>=0 (3)证明各路径上的验证条件为true α:A→Baφ(x) ∧T⇒IA(x,0,x1) ∵φ(x) ∧T≡x1>=0∧x2>=0 IA(x,0,x1) ≡x>=0 ∴此验证条件成立 β:Ba→Ba IA(x,y1,y2) ∧Rβ(x,y) ⇒IA(x,rβ(x,y)) ≡IA(x,y1+1,y2-x2) ∵IA(x,y1,y2) ∧Rβ(x,y) ≡x1=y1*x2+y2∧y2>=0∧y2>=x2 ≡x1=y1*x2+y2∧y2>=x2 IA(x,rβ(x,y)) ≡x1=(y1+1)*x2+(y2-x2)∧(y2-x2)>=0 ≡x1=y1*x2+y2∧y2>=x2 ∴此验证条件成立 γ:Ba→C IA(x,y1,y2) ∧Rγ(x,y) ⇒ψ(x,z) Rγ(x,y) ≡y2 ∵IA(x,y1,y2) ∧Rγ(x,y) ≡x1=y1*x2+y2∧y2>=0∧y2 ≡x1=y1*x2+y2∧0<=y2 ψ(x,z) ≡x1=z1*x2+z2∧0<=z2 ∴此验证条件成立 ∵三条路径上的验证条件均成立,∴程序关于规范(φ,ψ)是部分正确的。 证:b.将φ(x)改为::x1>=0∧x2>0能使上述框图关于规范(φ,ψ)是完全正确的。 证明如下: