程序设计学PPT课件 第6章 结构化程序的正确性证明

合集下载

第6章结构化程序设计基础教学课件VF

第6章结构化程序设计基础教学课件VF

语句格式: Do While <循环条件> <语句序列> Enddo 说明: Do While 与 Enddo 必须成对使用。
33/65
循环体后的语句 结束
6.5.1 Do While(当型)循环语句
例6.14,求前100个自然数的和: S=0 N=1 Do While N<=100 循环条件 S=S+N 循环体 N=N+1 Enddo
16/65
6.3.2 等待语句
Timeout <数值表达式>:用于设定等待的秒 数。在等待时间内按任意键或等待超时,程序 将继续向下执行。 例:Wait "显示时间:" Timeout 3 ?? Time()
17/65
6.3.3 输入表达式语句
语句格式: Input [<字符表达式>] To <内存变量> 说明:允许输入任何类型的表达式。Input输 入字符串时必须加上定界符。 例6.5: N=2 Input "请输入数据: " To M ? M
程序文件的类型
在 VFP 中,可以执行源程序、编译程序、 应用程序和可执行程序4种程序文件。 (1)源程序(PRG):源程序是文本文件,可 以对其内容进行修改。只要有源程序文件, 就可以生成其他3种程序文件。
8/65
6.2.3 程序的编译与执行
(2)编译程序(FXP):每个源程序文件都有 对应的编译程序文件,执行编译程序比执行 源程序的速度快。
说明2:若所有条件都不成立,而有Otherwise 项,则执行语句序列n+1,然后执行Endcase后 面的语句;若所有条件都不成立,且无 Otherwise项,则直接执行Endcase后面的语句。

Visual FoxPro程序设计实例教程第6章 结构化程序设计基础

Visual FoxPro程序设计实例教程第6章  结构化程序设计基础
在程序设计过程中,一般要完成数据的输入、 处理和输出3个部分的设计,有些数据是需要程序 在执行过程中用户输入的。VFP提供了此类命令, 常用的有3 1)INPUT 格式:INPUT [<提示信息>] TO <内存变量 名> 功能:在屏幕上输出[<提示信息>],并等待 用户通过键盘输入表达式,再将表达式的值赋给指 定的<内存变量>
30
分支结构体现了程序运行过程中的自我判断能 力,分支结构能够根据指定条件的当前值在两条或
31
图6.8 IF支结构
32
1)IF 格式:(IF<条件表达式> <语句序列1> ELSE <语句序列2> ENDIF
33
2 多分支结构即根据多个条件表达式的值,选 (1)用IF...ENDIF语句的嵌套实现多分支 (2)
34
图6.9
DO CASE分支结构
35
使用分支语句应注意以下几点: ①IF...ENDIF、DO CASE...ENDCASE 必须配 对使用,DO CASE与第一个CASE<条件表达式> ②<条件表达式>可以是各种表达式或函数的
第6章 结构化程序设计基础
VFP程序设计包括结构化程序设计和面向对象 程序设计。前者是传统的程序设计方法,但在设计 用户界面上难度很大,而后者则可以很方便的实现 ,但仍需用户编写一些过程代码,因此,结构化程
1
第一节 结构化程序设计通常采用“自顶向下、逐步求 精”的方法,简单地说就是把一个模块的功能逐步 分解,细化为一系列具体的步骤,进而编写成一系
2
程序是能够完成某一特定任务的有序命令集合 。这些命令按照一定的逻辑顺序有机地结合在一起 ,并以文件形式存储在磁盘上,这种文件称为程序 文件。程序设计是计算机用户为解决某一实际问题 而编制程序,并以文件的形式存放于磁盘的过程。

第六章17节 结构化与面向对象程序设计基础PPT课件

第六章17节 结构化与面向对象程序设计基础PPT课件
9
②有穷性。一个算法必须在执行有穷多个计算步骤后终止。 在【例6.2】中执行4
③有效性。算法中的每一个步骤必须能够有效地执行,并能
④输入。一个算法可以有0个或1个以上的输入。在【例6.2】 中需要输入a、b、c 3
⑤输出。一个算法有1个或多个的输出,一个算法得到的结 果就是算法的输出。在【例6.2】中输出的是max
▪ 基本的输入/输出命令 ▪ 程序文件中的辅助命令 ❖ 程序的基本结构 ▪ 顺序结构 ▪ 选择结构 ▪ 循环结构
3
主要内容
❖ 模块的定义和调用 ▪ 子程序 ▪ 过程 ▪ 函数
❖ 变量的作用域 ▪ 公共变量 ▪ 本地变量 ▪ 私有变量 ▪ 变量屏蔽
4
6.1 结构化程序设计的基本概念
6.1.1 程序 程序:是一组能够完成特定任务的命令序列的集合,并以文件形
10
2)算法的描述 算法的描述方法有很多,如自然语言、伪代码、流程图 等。
通常采用流程图的方法。流程图是用一些几何图形 符号、线条及文字说明来表征一个问题的处理过程。
一般采用传统流程图和N-S图来描述算法。
11
开始 输入a,b,c 将a,b中大的数放在max中 将c,max中大的数放在max中 输出max
8
第1步:输入a、b、c 第2步:将a、b中大的一个数放入max 第3步:将c与max中大的数放入max 第4步:输出max 从该例子可以看出,算法是对一个问题的解决方法和步 骤的描述,是一个有穷规则的集合。一个算法应该具有以下
①确定性。一个算法给出的每个计算步骤都必须是准确的、 无二义性。在【例6.2】中每一个步骤的含义都是确定的。
① 当型循环结构,如图6-4所示。
② 直到型循环结构,如图6-5所示 。

结构化程序设计.ppt

结构化程序设计.ppt

2019年11月2
谢谢你的阅读
29
(2)USE XJK ACCEPT “请输姓名” TO XM IF FOUND( ) DISP 姓名,语文 ELSE ? “查无此人” ENDIF
2019年11月2
谢谢你的阅读
30
(3)如果有多个条件,可用多个IF语句
X X>0
Y= X+1 X<-2
X+3 -2<X<0
3. 命令:MODIFY COMMAND 程序文件名
输入命令语句时,必须一条命令占一行,一行写不下时, 在行尾加续行符(;),换行后接着书写该命令语句。
2019年11月2
谢谢你的阅读
3
命令序列
注释语句
2019年11月2
谢谢你的阅读
4
6.1.3 程序文件的修改
对已建立的程序文件可以重新进入代码编辑窗口修改内容。 1.项目管理器:选中要修改的程序文件,单击“修改”按 钮,重新打开代码编辑窗口。修改后,选择“文件|保存” 命令,保存程序。 2.菜单:选择“文件|打开”命令,将要修改的程序文件调 入代码编辑窗口。
谢谢你的阅读
17
6.3 程序的基本控制结构
应用程序是用户为解决一个特定的
问题而将有关的命令按一定的结构组成 的序列.顺序结构、选择结构、循环结 构是三种基本的控制结构。
在进行程序设计时,为了把解题的
步骤清晰的表达出来,我们常常图形来 描述——流程图。它是用特定的图形符 号和必要的文字来描述解题步骤。
示例:input “请输入数据” to z
2019年11月2
谢谢你的阅读
15
5.格式输入输出命令
格式1:@ 行号,列号 SAY 表达式 功能:在主窗口指定的位置处显示表达式的值

第6章 详细设计 软件工程-课件

第6章 详细设计  软件工程-课件
如果再加上允许使用LEAVE(或BREAK)结 构,则称为修正的结构程序设计。
图6.2 其他常用的控制结构
6.2 人机界面设计
人机界面的设计质量,直接影响用户对软 件产品的评价,从而影响软件产品的竞争力 和寿命
6.2.1 设计问题
4个问题: 系统响应时间、 用户帮助设施、 出错信息处理 命令交互。
“结构程序设计是尽可能少用GO TO语句 的程序设计方法。最好仅在检测出错误时才 使用GO TO语句,而且应该总是使用前向 GO TO语句。”
如果只允许使用顺序、IF-THEN-ELSE型 分支和DO-WHILE型循环这3种基本控制结 构,则称为经典的结构程序设计;
如果除了上述3种基本控制结构之外,还允 许使用DO-CASE型多分支结构和DO-UNTIL 型循环结构,则称为扩展的结构程序设计
集成
附加
(1) 在用户与系统交互期间,是否在任何时候都能 获得关于系统任何功能的帮助信息?有两种选择: 提供部分功能的帮助信息和提供全部功能的帮助信 息。
(2) 用户怎样请求帮助?有3种选择:帮助菜单,特 殊功能键和HELP命令。
(3) 怎样显示帮助信息?有3种选择:在独立的窗口 中,指出参考某个文档(不理想)和在屏幕固定位置 显示简短提示。
用户界面的评估周期如下所述:
完成初步设计之后就创建第一级原型;
用户试用并评估该原型,直接向设计者表述对界 面的评价;
设计者根据用户意见修改设计并实现下一级原型。
上述评估过程持续进行下去,直到用户感 到满意,不需要再修改界面设计时为止。

也可以在创建原型之前就对用户界面的设 计质量进行初步评估。
在创建了用户界面的设计模型之后,可以 运用下述评估标准对设计进行早期复审。

第 06 章 结构化程序设计

第 06 章 结构化程序设计

Student对象2
age=20 age=10 Student对象1 age=20 age=10
main s2 s1
成绩统计程序
成绩统计程序
案例 描述
现有M位学生的姓名保存在一维String数组中,有N门课程的名称保存在一 维String数组中,另有M×N的二维数组保存这M位学生的每门课程的成绩 数据保存结构如下: 学生名数组:{“张三丰”,”郭靖”,”乔峰”,”张无忌”,”杨过”} 课程名数组:{”JAVA”,”C++”,”Oracle”,”Android”} 成绩数组: { {87,76,63,98}, {67,79,83,75}, {90,76,65,60}, {84,88,63,79}, {72,66,58,77} }
}
方法的定义与调用
方法定义时需要注意以下语法要求:
1.方法在声明时必须指定返回值的类型。
若方法不需要返回数据,将返回值类型声明为void。
若方法需要返回数据,将返回值类型声明为特定数据类型,
通过return语句结束方法且将数据返回给调用方。
2.如果我们想在main方法中直接调用A方法,则A方法必须声明为static。 3.方法的参数是指:在调用时传递给方法,需要被方法处理的数据。
方法的调用分析
public static void main(String[] args){ int a=10,b=20; 形参 a 20 swap(a,b); Swap()方法的临时存储空间 形参 b 10 System.out.println(a+" "+b); } 实参 a 10 public static void swap(int a,int b){ Main()方法的临时存储空间 int temp=a; 实参 b 20 a=b; b=temp; } swap方法中两个形参的值交换,这种交换不会影响 到main方法中的实参值

第六章结构化程序设计

第六章结构化程序设计
?"HAPPY BIRTHDAY TO YOU !"
(2)格式化输出语句 格式:@行号,列号 SAY <表达式>
例:
@3,10 say "我叫王小力," @4,10 say “我是学会计."
6.3程序的基本控制结构
授课内容:
6.3.1 顺序结构
6.3.2 选择结构 6.3.3 循环结构
授课重点:
substr(t,6-i,1)意 思是:对字符 串t取子串,从第 6-i个位置取, 取1个字符串。
Exit命令在程序当中的应用。
例:
i=0 do while .t.
?“好好学习!” i=i+1 if i=5
Exit:退出DO WHILE 循环。如果没有绿色方 框里的语句,程序将永 远执行,也就是常说的 “死循环”。
input "请输入X的值" TO X do case
计算y的值:
case X<1 Y=2*X-5
case x>=1.and.X<10
x<1 y=2*x-5 x<10 y=2*x
Y=2*X case x>=10
X>=10 y=2*x+5
Y=2*X+5
endcase
?Y
例6-8:输入学生成绩,判断并输出成绩等级。 (见书173页)。
单分支结构
Use
return
2.双分支结构
语句格式:
IF 条件表达式 命令行序列1
ELSE 命令行序列2
ENDIF
功能:即根据用户设置的条件表达式的值,选择两个操作 中的一个来执行.
YES
NO

Visual Basic程序设计教程电子课件——程序设计基础

Visual Basic程序设计教程电子课件——程序设计基础
6
2.1.2 如何学习Visual Basic
2.编程实验对能力提高最重要
学习Visual Basic与学习下棋有很多相似,值得类比、 借鉴。
学下棋必须先学各棋子的移动规则,但记住了“马走日、 象走田”并不意味着你就会下棋了,必须要勤于对奕并潜 心钻研。学习Visual Basic必须先了解Visual Basic语 言的基本规则,而更重要的是在实际应用中逐步提高编程 能力。
有懂不懂的问题。有此认识,才能避免进入许多初 学者都易于陷入的误区,从而使我们的学习获得事 半功倍的效果。
时常有学生为没有用心去记因此没有记住这些 规则而苦恼,经常有学生用一句“一点都不懂”来 表达此时的心情,是非常有害的,使得学习 Visual Basic迟பைடு நூலகம்才得以入门,从而耽误了宝贵 的学习时间。
4
2.1.1 计算机高级语言与语言处理系 统
再譬如,可以在一行上写上这样的两条语句“x=5: y=x*7.3”,但决不允许写成“x=5, y=x*7.3”,因为 Visual Basic的规则是一行上的多条语句之间必须用冒号 间隔。
(2) 语言处理系统开发者必须根据这套规则去设计、 制作语言处理系统,对于用户严格按照相应语言的规定编 写的程序,该系统应能够处理它并最终生成该程序的可执 行文件。
关于Visual Basic语言我们只能了解并熟记,我们只 能遵守规则而不能去创造规则,我们学习的意义在于用高 级语言编写程序去解决实际问题。
5
2.1.2 如何学习Visual Basic
1.语言规则要熟记 学习Visual Basic首先要做到熟记Visual
Basic语言的规则。 对于规则,只有记得住与记不住的问题,而没
若计算圆柱体的体积并存入变量v,声明v为Single 类型,半径和圆周率也采用Single类型,则结果v具有6位 有效数字;如果要求计算结果具有更高的精确度,可以考 虑采用Double类型声明v与相关变量。

结构化程序设计PPT课件_OK

结构化程序设计PPT课件_OK
• 折中派(Knuth)
• 不加限制地使用GOTO语句,特别往回跳的GOTO语句,会使 程序结构难以理解,这种情形应尽量避免使用GOTO语句。
• 为提高效率,同时又不破坏程序的良好结构,有控制地使用G4O TO语句是有必要的。
Chap4 结构化程序设计及正确性证明
结构程序设计结论
• 结论: • 结构程序设计讨论的是一种程序设计的方法和风格。关注的焦点是得到的程序的 结构的好坏,而有无GOTO语句并不是一个程序结构好坏的标志。避免和限制使 用GOTO语句是得到结构化程序的一种手段,而不是我们的目的。 • 结构化程序设计既着眼于程序设计的思路清晰,又着眼于程序的结构清晰。即通 过结构化的设计方法获得结构化产品
• GOTO语句使程序的静态结构与它的动态执行之间有很大的差 别。这样使程序难阅读、难查错。
• 去掉GOTO语句可以直接从程序结构上反映出程序运行的过程, 结构清晰、便于查错、易验证。
• 保留GOTO语句
• GOTO语句使用起来比较灵活,而且有些情况下能够提高程序 的效率,若一味地强调删除GOTO语句,有些情形会使程序过 于复杂,增加不必要的计算量。
p f
8
Chap4 结构化程序设计及正确性证明
正规程序
• 4. 正规程序
• 定义:满足以下两个条件的流程图程序称为正规程 序。条件:
• 具有一条入口线和一条出口线,且 • 对每个节点,都有一条从入口线到出口线的通ห้องสมุดไป่ตู้通过该
节点。
• 例:下面两个流程图程序不是正规程序
f
p
g
f p
9
Chap4 结构化程序设计及正确性证明
程序。
14
Chap4 结构化程序设计及正确性证明
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

循环不变式产生的方法
对于程序部分正确性证明的不变式断言法,这一 方法的关键是建立一个正确的不变式断言,对一般程 序来说,不变式断言的建立主要依靠程序员对程序的 理解,尚无系统的方法。 但对结构化程序来说,如果已知它的程序函数, 则可以根据不变式状态定理,来确定它的一个循环不 变式。
循环不变式产生的方法
例子1
预期函数 f=(x:=-x) 程序P为 if x>0 then x:=x-2*x else x:=x+2*abs(x) [P]=(x>0 x:=x-2*x| x≤0 x:=x+2*abs(x)) 证明

(1) f和P的定义域均为整数,相同。 (2) [P]是一个分离规则,且 x>0 (x:=x-2*x) = (x:=-x) x≤0 (x:=x+2*abs(x))=(x:=x+2*(-x))=(x:=-x)

对于任意的条件规则 (p1 r1 | p2 r2 | p3 r3 | …) 化为分离规则
(p1r1 |¬ p1∧p2r2|¬ p1∧¬ p2∧p3r3 | …)
条件语句的正确性证明

假设某一条语句的程序函数是分离规则: (p1r1|p2r2|p3r3) 预期函数是f,由于f可以是赋值的形式,例如y:=f(x)的形式 给出时,为了证明条件语句的正确性,需证明以下两点: (1) f(x)的定义域和分离规则式的定义域是相同的; (2) 利用分离规则的谓词将f(x)的定义域分解,并有以下 关系成立: p (x)r (x)=f(x) 1 1 p (x)r (x)=f(x) 2 2 p (x)r (x)=f(x) 3 3
重复递归引理-引理2和引理3


引理2 已知函数f和循环程序P:do g until p ,则 f=[P]的充要条件是:对所有x∈D(f),程序P终止, 且 f=[g;if ¬ p then f ] 引理3 已知函数f和循环程序P:do1 g while p do2 h ,则 f=[P]的充要条件是:对所有x∈D(f),程序P终止, 且 f=[g;if p then h;f ]
跟踪表为: 语句 1 2 y:=a y:=x*y+b y:=x*y+c y:= x*y+d x x1=x0 x2=x1 y y1=a y2:=x1*y1+b
3 4
x3=x2 x4=x3
y3:=x2*y2+c y4:=x3*y3+d
代数方法——跟踪表
所以,
x4=x3= x2=x1=x0 y4= x3*y3+d =x2*(x2*y2+c)+d = x1*(x1*(x1*y1+b)+c)+d = x0*(x0*(x0*a+b)+c)+d 相应的程序函数为: (x,y=x, x*(x*(x*a+b)+c)+d) 即 y=ax3+bx2+cx+d
代数方法——跟踪表
1.已知程序P:x:=x+y;y:=x-y;x:=x-y;求它的程序函数。 假设变量x,y的初值是x0,y0 ,执行第一个赋值语句后变量 值为x1,y1 ……,则可以建立赋值表如下: 语句 1 2 x:=x+y y:=x-y x x1=x0+y0 x2=x1 y y1=y0 y2=x1-y1
不变式状态定理: 假设f=[while p(x) do g(x) ], x0是初始值,则
循环不变式q(x)为:f(x) = f(x0) 证明: 1.在进入循环时, f(x0) = f(x0),因此q(x)成立。
2.试证假设在每一次进入循环前q(x) 成立,即f(x) = f(x0) , 则执行循环后q(x)也成立,即证明 p(x)∧q(x) => qg(x) 由p(x)为真,及正确性定理 f={(x,y)|p(x)y=fg(x)|¬ p(x)y=x}可知 即 p(x) => (f(x)=fg(x))
重复递归引理告诉我们,循环程序的验证可以通 过将循环化为递归的方法,将程序转化为由选择 以及序列组成的无循环程序进行验证!
正确性定理

已知预期函数f和基本程序P,则f=[P]的充要条件 是: x∈D(f),程序P终止,且对于不同的基本程 序,函数f分别满足下列关系:

情形a,对于序列,p=g;h,有f={(x,y)|y=hg(x)} 情形b,对于if-then程序,if p then g,有 f={(x,y)|p(x) y=g(x) | ¬ p(x) y=x} 情形c,对于if-then-else,if p then g else h,有 f={(x,y)|p(x) y=g(x)| ¬ p(x) y=h(x)} 情形d,对while-do程序,while p do g,有 f={(x,y)|p(x) y=fg(x)| ¬ p(x) y=x} 情形e,对于do-until程序,do g until p od,有 f={(x,y)|pg(x) y=g(x)| ¬ pg(x) y=fg(x)} 情形f,对于do-while-do程序,do1 g while p do2 h od, 有 f={(x,y)|pg(x) y= fhg(x)| ¬ pg(x) y=g(x)}
将条件规则化为分离规则




在化简和比较条件规则时,分离规则比一般的条件 规则使用更方便一些。 一般的复合规则不一定能展开,但分离的复合规则 总可以展开。 一般的条件规则的前后顺序是不能交换的,而分离 规则的顺序是可以交换的。 讨论程序的正确性时,总是首先将条件规则化为分 离规则。
将条件规则化为分离规则
重复递归引理--引理1

已知预期函数f和循环程序P while p do g 则f=[P]的充要条件是:对所有x∈D(f), 程序P终止,且f=[if p then g;f]
重复递归引理--引理1
证明: 必要性 f= [P]=[while p do g ] => f=[if p then g;f] [P]=[while p do g]=[if p then g; while p do g]
循环不变式产生的方法--例1
对于循环程序P:while v≠0 do u,v=u+1,v-1 , 其程序函数为{(u,v),(u+v,0)},求其循环不变式。 对循环中所有变量,分别计算f(x)和f(x0),列表如下:
例子2
语句 x y
y1 =y0+a0 y2=a0* x1 + y1 x,y:=x-1,y+a x1 =x0-1 x,y,a:=0,a*x+y,a x2 =0 于是有: x2 =0 ∧ y2=a0*(x0-1)+y0+a0=a0* x0 +y0 即当x>0时 x,y,a :=0,a*x+y,a; 当x=0时 x,y,a :=0,y,a = 0,a*0+y,a 因此可知,f= {(x,y,a),(0,a*x+y,a)},与预期函数相等,因此 得证。
正确性定理--证明
情形a,b,c由程序函数直接可得 情形d,由下式可得(根据引理1): 对while-do程序,while p do g ,有 [while p do g] = [if p then g;f ] = {(x,y)|p(x) y=f g(x)| ¬ p(x) y=x} = f 情形e,f由引理2,3可证
=[if p then g;f ]
充分性 f=[if p then g;f] => f= [while p do g]
[if p then g;f ]=[if p then g;if p then g;f ]= [if p then g;if p then g;……(if p then g) ]= [if p then g;if p then g;……I ]= [while p do g ]
分离规则

条件语句 if p then g else h 可用条件规则表示出 来 (pg | ¬ ph)。 为了证明条件语句的正确性,就需要比较预期函 数f和条件规则是否相等。

复合条件规则的化简



(p1 (q11 r11 | q12 r12 ) | p2 (q21 r21 | q22 r22 ) ) (p1 ∧ q11) r11 | (p1 ∧ q12) r12 | (p2 ∧ q21) r21 | (p2 ∧ q22) r22 p1,p2是分离的,即p1 ∧ p2为假。 如果一个条件规则的所有谓词都是分离的, 称它为分离规则。

重复递归引理

基本概念:基于程序函数的程序正确性概念。
假设已知一个程序P和一个预期函数f,若有 f=[P] 则称程序P正确地实现了函数f,或说程序P是正确的。
重复递归引理

重复递归引理内容 引理1 while-do的正确性定理 引理2 do-until的正确性定理 引理3 do-while-do的正确性定理
得证
例子2
已知预期函数f是(x,y,a是整数,且x≥0) {(x,y,a),(0,a*x+y,a)} 程序P如下,其中x≥0: while x≠0 do x,y=x-1,y+a 证明程序P是正确的,即f=[P] 证明1:程序是终止的 证明2:定义域相同 证明3:f={(x,y)|p(x) y=fg(x) | ¬ p(x) y=x}, 其中,p(x)=(x>0), ¬ p(x)=(x=0) 利用fg(x)的跟踪表证明3
循环不变式产生的方法
又进入循环前q(x) 成立,即q(x)=(f(x0)=f(x))
∴ p(x)∧q(x) => (f(x0)= fg(x))
而(f(x0)= fg(x))= (fg(x) =f(x0)) = (f(g(x)) =f(x0)) = q(g(x)) (归纳假设q(x)=(f(x0)=f(x))) = qg(x)
相关文档
最新文档