800 likes | 1.06k Views
第 9 章 结构化程序设计. 9.1 程序设计基础. 9.1.1 程序设计的概念. V FP 提供一种程序执行方式,这种方式就是预先把需要执行的多条命令按一定的结构组成一个有机序列以文件的形式存储在磁盘上,这个文件就称为 程序文件 ,这个序列的设计、编码和调试的过程就是 程序设计 。. 9.1.2 程序的控制结构 任何复杂的程序都由 3 种基本控制结构组成。它们是顺序结构、选择结构和循环结构。. 图 9.1 程序的控制结构. 9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。
E N D
9.1 程序设计基础 9.1.1 程序设计的概念 VFP提供一种程序执行方式,这种方式就是预先把需要执行的多条命令按一定的结构组成一个有机序列以文件的形式存储在磁盘上,这个文件就称为程序文件,这个序列的设计、编码和调试的过程就是程序设计。
9.1.2 程序的控制结构 任何复杂的程序都由3种基本控制结构组成。它们是顺序结构、选择结构和循环结构。 图9.1程序的控制结构
9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。 自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题 。逐步求精是指程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤 。模块化是结构化程序的重要原则。所谓模块化就是把大程序按照功能分为较小的程序。
9.1.4 程序文件的建立与执行 1.命令方式建立或修改程序文件 命令格式: MODIFY COMMAND [<程序文件名> |?] MODIFY.FILE.[〈文件名〉|?] 功能:启动VFP提供的文本编辑器来建立或编辑程序文件。 2.菜单方式建立编辑程序文件
3.程序文件的执行 命令格式: DO<程序文件名> 功 能 : 将程序文件从磁盘调入内存, 编译成.FXP目 标文件后并执行。 菜单方式:①.CANCEL:终止程序运行,清除所有的私有变量,返回命令窗口。 ②.RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口。 ③.QUIT:结束程序执行并退出Visual.FoxPro系统,返回操作系统。
9.2 顺序结构程序 顺序结构是最简单、最基本的一种程序结构。在顺序结构程序中,各命令按照各自出现的先后顺序,依次执行。
9.2.1 程序文件中的辅助命令 一.输入类语句 ㈠. 赋值语句 格 式1: STORE<表达式> TO<内存变量名表> 格 式2: <内存变量> = <表达式> 功 能:给内存变量赋值。
㈡. 交互式语句/键盘输入命令 键盘输入命令主要用于程序执行过程中原始数据的输入。 1. 字符串数据输入命令 格式: ACCEPT[<提示信息>] TO <内存变量> 功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。 注:ACCEPT命令只能接受字符型常量,输入时不需加定界符。
例9-1:要求用户从键盘上输入用户名,然后把输入的用户名显示出来。例9-1:要求用户从键盘上输入用户名,然后把输入的用户名显示出来。 ACCEPT “请输入用户名:” TO NAME ?NAME
2. 数据输入命令 格式:INPUT[<提示信息>] TO <内存变量> 功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。 注:INPUT命令能接受任何类型的表达式: ① 输入C型数据时,要使用 ‘ ’ 或 “ ” 作为定界符; ② 输入L型数据时,.T.和 .F.,两边的 .不能省; ③ 输入D 型数据时,要用{ } 或CTOD( )将字符串转成日期型变量。
例9-2:求任意两数之和。 INPUT “请输入一个数x:”TO X INPUT “请输入另一个数y:”TO Y ?X+Y
例9-3:给出下列A、B的结果 J=2800 INPUT “输入 J+200 :”TO A ACCEPT“输入 J+200 :”TO B ?“A=”,A ? “B=”,B 注:执行时,先后两次输入同样的内容:J+200
3. 只能输入一个字符的命令 格式:WAIT[<提示信息>] TO <内存变量> [TIMEOUT <数值表达式>] 功能:当程序执行某一处需要暂停时使用此命令。 注:WAIT命令响应速度快,它只接受一个字符,不需用户键入回车键。
例9-4: • **** 数据表操作命令菜单 **** • 打开工作数据表 • 增加数据表记录 • 删除数据表记录 • 修改数据表记录 • 打印数据表记录 • 关闭工作数据表 WAIT “请选择相应代码:” TO CHOICE ? “您选择的是第” + CHOICE + “个选项”
4. 格式输入语句 格式: @ <行,列> SAY <提示信息> GET <变量> [RANGE <数值表达式1>, <数值表达式2>] READ 功能:在屏幕指定的坐标位置上显示提示或输入数据。 注:① <变量> :该变量应在其前面定义过 ( 赋初值) 。 • ② READ一般与GET 联合起来用: • 当有READ时, GET <变量> 的内容可以从键盘上修改; • 没有READ时,GET 后的变量只能显示内容,不能修改; • 一个READ可以修改它前面的多个GET项的内容,但它可以由CLEARGETS命令隔断。
例9-5: @ 8, 18 SAY “**** 数据表操作命令菜单 ****” @ 9, 18 SAY “ 1.打开工作数据表 ” @ 10, 18 SAY “ 2. 增加数据表记录 ” @ 11, 18 SAY “ 3. 删除数据表记录 ” @ 12, 18 SAY “ 4. 修改数据表记录 ” @ 13, 18 SAY “ 5. 打印数据表记录 ” @ 14, 18 SAY “ 6. 关闭工作数据表 ” @ 16, 28 SAY “ 请选择相应代码:” GET CHOICE READ @ 18, 28 SAY “您选择的是:” + LTRIM(STR(CHOICE))
二.输出类语句 1. 非格式输出语句 格式1: ? <内存变量名表> 格式2: ?? <内存变量名表> 功 能:显示内存变量、常量或表达式的值。 注:语句1 是在光标所在行的下一行开始显示, 语句2 则是在当前光标位置开始显示。
2. 格式输出语句 格式: @ <行,列> SAY <表达式> [FUNCTION <功能符>][PICTURE <格式符>] 功能:按指定的坐标位置在屏幕上输出表达式的值。 注:若选用PICTURE、 FUNCTION子句,则按一定的格式输出 ,分别见教材P131的表6.1、6.2。
3. 文本输出语句 格式: TEXT <输出显示内容> ENDTEXT 功能:在屏幕上原样显示TEXT和ENDTEXT之间的内容。 注:TEXT、ENDTEXT是一条子句,不能省略其中任一条子句。
例6-6 TEXT • **** 数据表操作命令菜单 **** • 打开工作数据表 • 增加数据表记录 • 删除数据表记录 • 修改数据表记录 • 打印数据表记录 • 关闭工作数据表 ENDTEXT WAIT “请选择相应代码:” TO CHOICE ? “您选择的是第” + CHOICE + “个选项”
三. 设置会话状态语句 语句格式1: SET TALK ON 语句格式2: SET TALK OFF 功能 语句1:设置会话状态开通。 语句2:设置会话状态关闭。
四. 清屏与注释语句 1. 清屏语句 语句格式: CLEAR 功 能 :清除屏幕上所有显示内容,光标回到屏幕左上角。
2. 注释语句 语句格式1: NOTE <注释内容> 语句格式2: * <注释内容> 语句格式3: && <注释内容> 功 能 : 在程序中加入说明性语句。 注:语句1、2、3 在程序中,系统不执行。
五. RETURN命令 格式: RETURN [<表达式>/TO MASTER/TO <程序名>] 功能 : 结束一个程序的执行。 注:一般RETURN出现于程序末尾。
六. 终止程序执行语句 语句格式1: CANCEL 语句格式2: QUIT 功能:终止程序执行,关闭所有打开的命令文件。 注: 语句1:在终止程序执行后,返回到VFP命令状态; 语句2:返回到操作系统状态。
顺序结构程序设计 顺序结构程序:按语句的先后顺序组织的程序,即把处理过程的各个步骤按执行的先后顺序列出。 其流程图如右图所示。 A B C 图中箭头表示程序执行的方向,方框代表不同的可执行语句。 N
例9-7变量的初始化和变量的赋值。 SET TALK OFF STORE 0 TO X,Y,Z A=3 B=A+1 C=A*B ? X, Y, Z ? A, B, C SET TALK ON
例9-8执行以下命令序列,问答问题: USEzgb SUM 基本工资 FOR 基本工资>1000 TO SGZ COPY FOR 基本工资>1000 TO GZK2 USE GZK2 num=reccount( ) ave=sgz/num ? ave • 最后显示的值是: • 所有职工的平均工资; • 所有工资在1000元以上的职工的平均工资; • 所有工资在1000元以上的职工人数; • 所有职工人数 。
9.3 选择结构程序设计 在计算机应用的许多场合,要求程序根据不同的条件采用不同的处理方法。如果条件满足,则执行某一些语句;如果条件不满足,则执行另一些语句。这些需要根据判断条件来控制程序走向的程序设计称为选择结构程序设计,又称分支结构程序设计。 Visual FoxPro提供双分支选择语句、多分支选择语句两种选择结构。
条件 语句序列1 ENDIF后的语句 条件 语句序列2 语句序列1 ENDIF后的语句 9.3.1 双分支选择语句(选择判断语句) .T. 语句格式: IF<条件> <语句序列1> ENDIF .F. [ELSE <语句序列2>] .Y. .N.
执行过程: 如果<条件>成立,就执行语句序列1; 如果<条件>不成立,执行语句序列2。 注: (1)IF和ENDIF必须配对使用,而ELSE可选。 (2)IF、ELSE、ENDIF必须各占一行。 (3) <条件>可以为关系表达式、逻辑表达式。 (4)在<语句序列1>和<语句序列2>中可以嵌套IF语句。
例请改用分支结构语句编程计算电费: 不超过50度, 每度0.52元; 超过50度时, 超出部分每度0.75元。 SET TALK OFF INPUT “请输入所用电量:" TO DL DF=IIF(DL<=50,0.52*DL,0.52*50+0.75*(DL-50)) ? “应缴电费为:” + LTRIM(STR(DF,10,2)) + "元" SET TALK ON RETURN
例 火车托运行李: 每人不超过40公斤,每公斤0.22元;超过40公斤时, 超出部分每公斤0.40元。填空完成以下程序。 SET TALK OFF INPUT "请输入行李重量:" TO W IF 1 YF=0.22*W ELSE YF= 0.22*40 + 1 ENDIF ? "应交托运费为:"+LTRIM(STR(YF,10,2))+"元" SET TALK ON RETURN W < 40 (W-40) * 0.4
例编程:在ZGB.DBF中查找某人。 SET TALK OFF Set defa to f:\jfvfp\prg USE zgb ACCEPT “请输入要查找人的姓名: ” TO N LOCATE ALL FOR XM=N IF FOUND( ) DISP ELSE ? [查无此人] ENDIF USE SET TALK ON RETURN
9.3.2 多分支选择语句(选择语句|情况语句) 语句格式: DO CASE CASE<条件表达式1> <语句序列1> CASE<条件表达式2> <语句序列2> ┇ CASE<条件表达式n> <语句序列n> [ OTHERWISE <语句序列n+1> ] ENDCASE 说明: ①DO CASE和第一个CASE子句之间不能插入任何语句。 ②DO CASE和ENDCASE必须配对使用,且DO CASE,CASE,OTHERWISE和ENDCASE各子句必须各占一行。 ③在<语句序列>中可嵌套情况语句。
功能:系统依次测试语句中各个条件表达式的值: 若为真,即执行相应<条件表达式>后的<语句序列>, 然后脱离情况语句,执行ENDCASE的下一语句。若所有的条件表达式的值均为假,则执行OTHERWISE后面的语句序列, 然后脱离情况语句,执行ENDCASE下一语句 。 开始判断 条件1 条件2 条件n 其它 语句序列1 序列2 序列n 序列n+1 …… ENDCASE后面的语句
例已知cjb.dbf中包含xingming,avcj等字段。试用avcj来判断该生成绩属于优(≥90)、良(≥80)、及格(≥60)或不及格(<60)。例已知cjb.dbf中包含xingming,avcj等字段。试用avcj来判断该生成绩属于优(≥90)、良(≥80)、及格(≥60)或不及格(<60)。 USE cjb ACCEPT ′请输入姓名:′ TO xm LOCATE FOR ALLTRIM(xingming)=ALLTRIM(xm) n=avcj DO CASE CASE n>=90 dj=″优″ CASE n>=80 dj=″良″ CASE n>=60 dj=″及格″ OTHERWISE dj=″不及格″ ENDCASE @5,10 SAY xingming+[同学的成绩等级为:]+ dj
例阅读下列程序段,写出运行结果: A=3000 DO CASE CASE A<1000 B=A/2 CASE A>=1000 B=A CASE A>=2000 B=2*A CASE A>=3000 B=3*A ENDCASE ? B
例利用CASE语句实现简单的菜单功能 Set talk off Set defa to f:\yyfox clear cho=0 @ 8, 18 SAY “**** 数据表操作命令菜单 ****” @ 9, 18 SAY “ 1. 打开工作数据表 ” @ 10, 18 SAY “ 2. 增加数据表记录 ” @ 11, 18 SAY “ 3. 删除数据表记录 ” @ 12, 18 SAY “ 4. 修改数据表记录 ” @ 14, 18 SAY “ 5. 关闭工作数据表 ” @ 15, 28 SAY “ 请选择相应代码:” GET cho Read Do case case cho=1 accept “请输入表文件名:” to bm use &bm
case cho=2 append case cho=3 input “请输入要删除的记录号:” to jlh go jlh dele case cho=4 browse case cho=5 use otherwise @15, 28 SAY “选择代码错!” endcase Set talk on return
9.4 循环结构程序设计 循环,就是按给定的条件连续地重复执行一段特定功能的程序。循环结构也称为重复结构。 Visual FoxPro给出了三种循环结构: 条件循环(DO WHILE……ENDDO) 计算循环(FOR……ENDFOR) 扫描循环(SCAN……ENDSCAN)
一、条件循环 语句格式: DO WHILE <条件> <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDDO .F. 条件 条件 .T. 循环体 循环体 ENDDO后的语句 功能:有条件连续地重复执行DO WHILE与ENDDO之间的语句序列,直到<条件>为假或因执行EXIT语句而结束。 条件循环结构流程图
功能说明: (1)系统执行该语句时,先判断循环开始DO WHILE的条件是否成立, 如果条件为真,则执行循环体中的语句序列。当执行到ENDDO时,返回到DO WHILE,再次判断条件是否为真,以确定是否再次执行循环体。若条件为假,则结束循环 ,执行ENDDO后面的语句。 如果第一次判断条件时,条件即为假,则循环体一次都不执行,这就是称为“先判断后执行”的语句。 (2)循环体中的LOOP是可选项。遇到LOOP时,不再执行后面的语句,转回DO WHILE处重新判断。其作用相当于一个特殊的“短路”返回控制。 (3)循环体中的EXIT也是可选项。遇到它时便无条件地退出循环,转到ENDDO后面的语句。其作用相当于一个紧急出口。 (4)通常LOOP或EXIT出现在循环体内嵌套的分支语句中,根据条件来决定是LOOP回去,还是EXIT出去。
?[OK] ?[OK] … ?[OK] 例 在屏幕上换行显示字符串“OK”20次 SET TALK OFF CLEAR SET TALK ON RETURN
循环次数 循环前i值 循环后i值 … … … 例 在屏幕上换行显示字符串[OK]20次 SET TALK OFF CLEAR &&设置循环变量初值 i=1 1 1 2 DO WHILE i<=20 2 2 3 ? [OK] ? [OK] i=i+1 &&修改循环变量 20 20 21 ENDDO SET TALK ON RETURN
① DO WHILE 语句之前一定要有设置循环变量初 值的语句。 在以循环变量作为循环控制参数的条件循环中 注意 ② 循环体内一定要有修改循环变量的语句,否则 就会出现死循环。
例 求自然数1至4的和。 s= s+i ; i= i+1 ; 分析算法: 1. i=1 , s=0 ; 2.累加第 i 个数 3.累加次数加1 4.当 i<= 4 重复做2 ; 5. ? s 。
例 求自然数1至4的和。 i=1 DO WHILEi<=4 i=i+1 ENDDO SET TALK OFF S=0 &&定义一个变量表示和,并初始化 &&设置循环变量的初值 &&指定以循环次数作判断条件 S=S+i &&把S的值加上i后再赋给S,即求和 &&修改循环变量 &&输出求和的结果 ? S SET TALK ON RETURN
程序流程图 S=0 SET TALK OFF S=0 i=1 DO WHILE i<=4 S=S+i i=i+1 ENDDO ? S SET TALK ON RETURN i=1 .F. × 1<=4 5<=4 3<=4 2<=4 4<=4 .T. S=1+2 S=0+1 S=3+3 S=6+4 i=1+1 i=2+1 i=3+1 i= 4+1 ? 10