1、第6章 结构化程序设计(7学时),程序是指能够完成一定任务的一组有序命令的集合。程序中的命令称为语句。程序以文件形式保存。,方法三:在命令窗口中执行命令。Modify Command ,1. 建立源程序文件 方法一:文件菜单新建选择程序新建文件。进入程序编辑器。,6.2 程序的建立与执行,方法四:关闭程序编辑器窗口时,系统将提示用户是否保存文件。,方法三:按Ctrl+W键,保存文件的同时关闭程序编辑器;,方法二:“保存”常用工具。,方法一:文件菜单保存(或按Ctrl+S键)。 不关闭程序编辑器。,2. 保存程序文件,方法一:文件菜单打开选择“文件类型”为“程序”选择或键入程序文件名“确定”。,
2、6.2.2 打开源程序文件,方法三:在命令窗口中执行命令:Modify Command | ? 。,6.2.2 打开源程序文件,1. 程序文件类型:,源程序:扩展名是PRG 编译程序:扩展名是FXP 应用程序:扩展名是APP 可执行程序:扩展名是EXE。,6.2.3 程序的编译与执行,方法二:程序编辑器中,常用工具 “ ! ”,方法三:程序菜单运行选择“文件类型” 为程序选择或输入程序文件名运行。,方法一:在程序编辑器中,程序菜单执行。,3. 执行程序,方法四:执行命令。 Do ,3. 执行程序,4. 中断程序Set Escape On | Off,退出中断程序。,暂停(Suspend)当前程
3、序,允许用户在命令窗口中执行一些命令。执行Resume命令,从程序中被“中断”语句的下一条语句继续执行。,忽略Esc按键,继续执行程序中被“中断”语句的下一条语句。,转入系统提供的与“中断” 相关的说明信息。,6.2.3 程序的编译与执行,6.3.1 输入字符串语句Accept,Accept To ,2011130416,2011130416,请输入学号:,输入的学号是:,例,允许输入任何类型表达式。,执行时,系统先输出字符表达式的值,然后,等待键入表达式,按回车键表示结束输入,系统会将表达式的值赋给内存变量。,6.3.3 输入表达式语句 Input,Input To ,Messagebox(
4、, ,) 例:Messagebox(“关闭电源“,1+48+256,“警示“),6.3.5 对话框函数,函数返回值是1,6.4.1 If 分支语句,语句格式:If ThenEndif,开始,语句序列,结束,条件?,Y,N,分支结构后面语句,单分支If语句,其中IF-ENDIF必须配对出现。,6.4.1 If 分支语句,双分支If语句,语句格式:If ThenELSEEndif,开始,语句序列1,结束,条件?,Y,N,语句序列2,分支结构后面语句,暂停程序,Cancel :结束当前程序的运行。,? DATE() CANCEL? TIME(),执行程序,结束程序的执行,输出系统当前日期,不执行此语
5、句,X=1 SuspendY=2 ? X+Y,暂停程序,执行程序,? X,X=4,Resume,输出结果为:6,例: Iif(50,Date( ), 英语),6.4.3 条件函数 Iif,iif ( , )表达式1和表达式2可以是不同的数据类型。,=英语,格式:Do CaseCase Case Case OtherwiseEndcase,开始,语句序列 1,结束,条件1?,Y,N,语句序列 2,条件2?,Y,N,语句序列 n,条件n?,Y,N,OTHERWISE,语句序列 n+1,6.4.4 多分支语句,6.5 循环结构程序设计,循环结构指在执行程序过程中,重复执行某程序段。重复执行的程序段称
6、为循环体,重复执行的次数称为循环次数。,如:求前100个自然数的和。S=0 N=1 Do While N=100 S=S+NN=N+1Enddo? S,Do While Loop Exit Enddo,6.5.1 Do While(当型)循环语句,例,为避免出现死循环,实际编程时,可以在循环体中的分支结构里使用Loop 和Exit 语句。,6.5.1 Do While(当型)循环语句,语句格式:Do While Enddo,开始,语句序列,结束,循环条件?,Y,N,循环前的语句,循环后的语句,语句序列,Y,说明:Do While与Enddo必须成对使用。,语句格式:For = To Step
7、Endfor | Next ,6.5.2 For(步长型)循环语句,开始,结束,循环条件?,N,初值赋给循环变量,循环后的语句,语句序列,Y,循环变量增加一个步长值,6.5.2 For循环语句,例:求前100个自然数的和,Use CJB Scan For 重修Repl 实验成绩 with 10 Endscan,Scan For While Endscan,6.5.3 Scan(扫描)循环语句,Locate For While Do While Found()ContinueEnddo,Scan与Endscan必须成对使用。用于处理与数据表有关的循环问题,功能等效于:,6.5.3 Scan(扫描
8、)循环语句,例:使用 Scan循环结构编程。输出CJB.DBF中重修学生的学号和课程码,并统计出重修人次数,如:For M=1 To 9 For N=1 To M? Space(2),Str(M,1),“*“,?Str(N,1),“=“,Str(M*N,2)Endfor ?Endfor,6.5.4 结构嵌套 例,VFP允许相互嵌套。但不允许交叉嵌套,即一个结构必须完整地包含在另一个结构中。书写源程序时多采用缩进格式。,外层循环,内层循环,6.6 子程序及其调用,一个应用程序可能包含多个程序模块,通常将调用其它模块的模块称为主程序,被其它模块调用的模块称为子程序。主程序与子程序的概念是相对的。,
9、例:编程实现该公式的功能。,P1,.,Do P2,P2,Return,Do P3,程序P2是P1的子程序,程序P2是P3的主程序,主程序与子程序的概念是相对的,6.6 子程序及其调用,*程序1,.,DO ,DO ,程序2是程序1的子程序,程序3也是程序1的子程序,6.6.2 过程子程序及其调用, Parameters | Lparameters 子 程 序 体 Retry | Return To Master ,*主程序,Do With X, Y, Z,*子程序1,Return,Parameters|Lparameters M,N,P,6.6.2 过程子程序及其调用 例,对于没有形参语句(Pa
10、rameters或Lparameters)的过程子程序,调用时Do语句中不能写With短语,6.6.2 过程子程序及其调用,参数传递方式可以利用参数在主程序与子程序之间进行传递数据。在调用子程序时,实参个数不得超出形参个数;当实参个数少于形参个数时,多余的形参初值为.F. 。,值方式传递: 只能由实参传递给形参值的单向传递值方式。,引用方式传递:实参与形参之间双向传递值的方式。,6.6.2 过程子程序及其调用,Dimension X(3,3),Y(10) X(3,2)=3 Y(7)=“VFP“ Do P1 With X,Y ?X(3,2),Y(7),Parameters M(2),N(2,3)
11、 ?M(3,2),N(7) M(3,2)=2*M(3,2)-1 N(7)=N(7)+”中文版” Return,形参是数组声明时,对应实参必须是数组名。实参与形参之间按引用方式传递数据。,过程子程序调用的参数传递规则,系统自动将形参转换成与实参等价的数组,而与形参数组声明的维数和元素个数无关,输出:3 VFP,输出:5 VFP中文版,过程子程序调用的参数传递规则,实参是数组名时,实参与形参之间按引用方式传递数据。,Dimension X(3,3),Y(10) X(3,2)=3 Y(8)=“Good“ Do P2 With X,Y ?X(3,2),Y(8),Parameters M,N ? M(3
12、,2),N(8) M(3,2)=4 N(8)=“Bad“ Return,系统自动将形参转换成与实参等价的数组,输出: 3 Good,输出: 4 Bad,过程子程序调用的参数传递规则,当实参是简单内存变量(不含数组元素)时,实参与形参之间按引用方式传递数据。,Dimension M(5) Store 4 To M,N,K Do P3 With M(3),Sqrt(N),2*N,K ? M(3),Sqrt(N),2*N,K,Parameters X2, X3, X4, X5 X2=X2+1 X3=X3+1 X4=X4+1 X5=X5+1 Return,X2、 X3、X4 、X5的值分别是: 4 2
13、.00 8 4,按值方式传递,按引用方式传递,输出: 4 2.00 8 5,当实参是表达式(包括常数、数组元素和函数)时,实参与形参之间按值方式传递数据。,6.6.3 函数子程序及其调用,参数传递,表达式的值作为函数(返回)值,改变参数传递规则的命令:Set Udfparms To Value | Reference,6.6.3 函数子程序及其调用,参数传递规则系统默认函数子程序调用按值方式传递值,此命令仅针对函数子程序调用有影响。,6.6.4 过程子程序与函数子程序区别,在编写程序方面: 函数子程序通常用Return 语句返回到主程序 过程子程序通常用Return To Master或Ret
14、ry语句返回到主程序或主控程序。,在调用子程序方面, 用函数形式调用函数子程序,使之成为表达式的一部分; 用Do语句调用过程子程序,使之成为程序中的一条语句。,6.8 变量的作用域,所谓变量的作用域就是变量的作用范围,即变量在多大范围内有效。根据变量的作用域,VFP将变量分为公共变量、私有变量和局部变量3种。,在整个程序(包括主程序、子程序和对象事件过程等)中都有效的变量是公共变量。,在命令窗口中定义的简单变量或数组变量都是公共变量。,此外,用Public语句也可以定义公共变量。,6.8.1 公共变量,语句格式: Public ,定义公共变量,说明1:已定义但未赋的公共变量初值为.F.,说明2
15、:程序终止时公共变量不会被自动清除,需用RELEASE 或 CLEAR ALL命令清除,例如E6_31,6.8.2 私有变量,仅在定义变量的程序及其子程序中有效的变量称为私有变量。如果私有变量与主程序中的变量重名,则主程序中同名的变量将被“隐藏”。,方法一:程序中没有使用Public或Local语句说明而直接定义(赋值或Dimension说明)的内存变量是其所在程序的私有变量。,定义私有变量,6.8.2 私有变量,方法三:使用Private语句说明的变量是所在程序的私有变量。Private |All Like|Except,方法二:用Parameters指定的形参是其所在程序的私有变量。,例如
16、E6_32,6.8.3 局部变量,仅在定义变量的程序中有效,而在其主和子程序中都无效的变量称为该程序的局部变量,也称本地变量。在本级程序结束时,本地变量被自动释放。,定义局部变量,方法一:使用Local语句定义局部变量。Local ,说明:此语句必须放在形参语句之后,在变量被赋值和引用之前。初值被赋为逻辑假。,6.8.3 局部变量,方法二:用Lparameters指定的形参是其所在程序的局部变量。,*主程序.prg PUBLIC X,*子程序1.prg PRIVATE Y,*子程序2.prg LOCAL Z,子程序3.prg,公共变量 X,私有变量 Y,本地变量 Z,公共变量、私用变量及本地变
17、量的作用范围示意图,例如E6_33,6.9.1 程序错误的信息,在程序运行过程中,执行到错误语句时,在系统默认情况下,弹出“程序错误”对话框,要求用户做适当的处理。,Clear Memory ?X Select 1 Use d:xsbb Displya,第 6 章 结 束 谢 谢!,终止运行(退出)当前程序。,暂停(Suspend)当前程序,允许用户在命令窗口中执行一些命令。执行Resume命令,从程序中错误语句处继续执行。,跳过有错误的语句,继续执行“有错误语句”的下一条语句。,查看系统提供的与错误有关的说明信息。,“程序错误”对话框,程序编辑器,开始,循环条件,Y,分支条件,Y,LOOP,
18、N,分支结构下面的语句,N,循环后的语句,结束,一旦执行到Loop语句,就提前结束本次循环。不执行Loop与Enddo之间的语句,而直接转到对应的Do While语句再次判断条件是否成立。,Loop 语句,开始,循环体前语句,循环条件,Y,分支条件,N,EXIT,Y,分支结构后的语句,N,循环后的语句,结束,一旦执行到Exit语句,就结束整个循环。即不执行Exit与Enddo之间的语句,而直接执行对应的Enddo后面语句。,Exit 语句,*主程序,.,Do ,Do ,6.6.2 过程子程序及其调用,*主程序,.,Do ,*子程序1,Return,Do ,返回到主控程序中调用语句(Do)的下一条语句继续执行,6.6.2 过程子程序及其调用,