59
7 7 第 第第第第第第第 第 第第第第第第第 第第第第第第第第第第 7.1 第第第第第第第第 7.2 第第第第第第第第 7.3 第第第第第第第第 7.4 第第第第第第第第 7.5 第第第第第第 7.6

第 7 章 结构化程序设计

  • Upload
    chelsey

  • View
    83

  • Download
    7

Embed Size (px)

DESCRIPTION

7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 程序文件的建立与运行. 顺序结构程序设计. 分支结构程序设计. 循环结构程序设计. 模块结构程序设计. 数组及其应用. 第 7 章 结构化程序设计. 7.1 程序文件的建立与运行. 7.1.1 程序文件的建立 1 .用菜单方式建立程序文件 执行“文件 / 新建 / 程序 / 新建文件”菜单命令。. 2 .用命令方式建立程序文件. 格式: MODIFY COMMAND < 程序文件名 > 功能:新建或修改指定的程序文件。. 7.1.2 程序文件的运行. 1 .用菜单方式运行程序文件 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 7 章 结构化程序设计

第第 77 章 结构化程序设计章 结构化程序设计程序文件的建立与运行7.1

顺序结构程序设计7.2

分支结构程序设计7.3

循环结构程序设计7.4

模块结构程序设计7.5

数组及其应用7.6

Page 2: 第 7 章 结构化程序设计

7.1 7.1 程序文件的建立与运行程序文件的建立与运行

7.1.1 程序文件的建立

1 .用菜单方式建立程序文件

执行“文件 / 新建 / 程序 / 新建文件”菜单命令。

Page 3: 第 7 章 结构化程序设计

2 .用命令方式建立程序文件

格式: MODIFY COMMAND < 程序文件名 >

功能:新建或修改指定的程序文件。

Page 4: 第 7 章 结构化程序设计

7.1.2 程序文件的运行

1 .用菜单方式运行程序文件执行“程序 / 运行”菜单命令。2 .用命令方式运行程序文件格式: DO < 程序文件名 >

功能:将指定的程序文件调入内存并运行。

Page 5: 第 7 章 结构化程序设计

7.1.3 程序中的辅助命令

1 .程序注释命令格式 1 : NOTE < 注释内容 >

格式 2 : * < 注释内容 >

格式 3 : [< 命令 >] && < 注释内容 >

Page 6: 第 7 章 结构化程序设计

2 .结束程序运行命令

格式 1 : RETURN

功能:返回到上级程序模块。格式 2 : RETURN MASTER

功能:返回到最上级主程序。

Page 7: 第 7 章 结构化程序设计

格式 3 : CANCEL

功能:停止程序执行,关闭所有文件,返回系统交互状态。格式 4 : QUIT

功能:停止所有程序执行,关闭所有文件,退回到宿主操作系统。

Page 8: 第 7 章 结构化程序设计

3 .运行环境设置命令

CLEAR 清屏幕CLEAR ALL 关闭所有文件、释放所有内存变量SET DEFAULT TO 设置文件访问时默认的驱动器SET PATH TO 设置文件访问时默认的路径SET TALK ON/off 设置所有命令执行的结果显示与否

Page 9: 第 7 章 结构化程序设计

7.1.4 程序中的交互输入命令

1 .字符串输入命令格式: ACCEPT [< 提示信息 >] TO < 内存变量 >

功能:暂停程序的运行,等待用户键入一串字符赋给指定的内存变量。

Page 10: 第 7 章 结构化程序设计

2 .表达式输入命令

格式: INPUT [< 提示信息 >] TO < 内存变量 >

功能:暂停程序运行,接受用户键入的表达式并将其值赋给指定的内存变量。

Page 11: 第 7 章 结构化程序设计

3 .等待或单字符输入命令

格式: WAIT [< 提示信息 >] [TO < 内存变量 >]

功能:暂停程序运行,若包含 [TO < 内存变量 >] 短语时,将用户所键入的一个字符赋给指定的内存变量;否则待用户按任一键后继续程序的执行。

Page 12: 第 7 章 结构化程序设计

4 .定位输出命令

格式: @ < 行 , 列 > SAY < 表达式 >

功能:在屏幕上指定的行、列位置输出指定表达式的值。

Page 13: 第 7 章 结构化程序设计

7.2 7.2 顺序结构程序设计顺序结构程序设计

7.2.1 基本程序结构1 .顺序程序结构2 .分支程序结构3 .循环程序结构

Page 14: 第 7 章 结构化程序设计

7.2.2 顺序结构程序设计严格按照程序中各命令的先后排列顺序自上而下逐条执行。【例 7-6 】在职工档案表中查看指定职工的有关情况。USE zgdaACCEPT " 请输入被查询者姓名: " TO xmLOCATE FOR 姓名 =xmCLEAR? " 姓名: "+ 姓名? " 性别: "+ 性别? " 职称: "+ 职称? " 出生日期: "+DTOC( 出生日期 )USERETURN

Page 15: 第 7 章 结构化程序设计

7.3 7.3 分支结构程序设计分支结构程序设计

7.3.1 简单分支结构

格式:IF < 条件 >

< 语句序列 >ENDIF执行过程:当 < 条件 > 成立时,逐条执行 IF 与ENDIF 之间的 < 语句序列 > ,然后执行 ENDIF后的语句;当 < 条件 > 不成立时,不执行 < 语句序列 > 而直接执行 ENDIF 后的语句。

Page 16: 第 7 章 结构化程序设计

【例 7-8 】某种商品一次购买 100 件以上时,可享受 8%的优惠。试编程根据输入的单价和数量计算应付金额。CLEARINPUT " 数量: " TO slINPUT " 单价: " TO djje=dj*slIF sl>=100

je=je*0.92ENDIF? " 应付金额: "+STR(je,8,2)RETURN

Page 17: 第 7 章 结构化程序设计

7.3.2 选择分支结构

格式:IF < 条件 >

< 语句序列 1>ELSE

< 语句序列 2>ENDIF执行过程:若 < 条件 > 成立仅执行 < 语句序列 1> ,而后执行 ENDIF 后的语句;否则仅执行 <语句序列 2> ,而后转去执行 ENDIF 后的语句。

Page 18: 第 7 章 结构化程序设计

【例 7-10 】出租车不超过 5 公里时一律收费 10 元,超过时则超过部分每公里加收 1.6 元。试编程根据里程数计算并显示出应付车费。CLEARINPUT " 里程: " TO lcIF lc<=5

? " 车费为:十元 "ELSE

cf=10+(lc-5)*1.6? " 车费为: "+STR(cf, 6, 2)

ENDIFRETURN

Page 19: 第 7 章 结构化程序设计

7.3.3 分支嵌套结构

在分支结构的 < 语句序列 > 中,允许包括另一个合法的分支结构语句。【例 7-12 】设硅谷公司员工的工资计算方法如下:每工时按 68 元发放;工作时数超过 120 小时者,超过部分加发百分之十五;工作时数不到 80 小时者,扣发 500 元。

Page 20: 第 7 章 结构化程序设计

试编程按输入的员工号和该号员工的工时数,计算并输出其应发工资。CLEARACCEPT " 员工号: " TO yghINPUT " 工时: " TO gsIF gs>120 gz=gs*68+(gs-120)*68*0.15ELSE

IF gs<80gz=gs*68-500

ELSEgz=gs*68

ENDIFENDIF? && 输出一个空行? ygh+" 号员工应发工资: "+STR(gz, 8, 2)RETURN

Page 21: 第 7 章 结构化程序设计

7.3.4 多路分支结构用来解决在多种不同情况下的程序选择执行问题。格式:DO CASE

CASE < 条件 1>< 语句序列 1>

CASE < 条件 2>< 语句序列 2>

……CASE < 条件 n>

< 语句序列 n>[OTHERWISE

< 语句序列 n+1>]ENDCASE

Page 22: 第 7 章 结构化程序设计

【例 7-13 】编程计算银行存款整存整取应得的利息。CLEARINPUT "本金(元): " TO bjINPUT " 存期(年): " TO cqDO CASE

CASE cq>=5rate =4.5 &&年利率为 4.5%

CASE cq>=3 rate =3.6 &&年利率为 3.6%

CASE cq>=2rate =3.1 &&年利率为 3.1%

CASE cq>=1rate =2.7 &&年利率为 2.7%

CASE cq>=0.5rate =2.21 &&年利率为 2.21%

OTHERWISErate =1.23 &&年利率为 1.23%

ENDCASElixi=bj*cq*rate /100? && 输出一个空行? " 应得利息: "+STR(lixi, 8, 2)RETURN

Page 23: 第 7 章 结构化程序设计

7.4 7.4 循环结构程序设计循环结构程序设计

7.4.1 当型循环结构

格式:DO WHILE < 条件 >

< 语句序列 >ENDDO执行过程:若 < 条件 > 成立,执行 DO WHILE 和 ENDDO 之间的 < 语句序列 > ;若 < 条件 > 不成立则不执行 <语句序列 > ,直接转去执行 ENDDO 后的语句。每执行一遍后再对 < 条件 >判断一次,一旦 < 条件 > 不成立就结束循环转去执行 ENDDO 后面的语句。

Page 24: 第 7 章 结构化程序设计

【例 7-14 】求 1+2+3+...+100 的累计值。CLEARSTORE 0 TO n, sDO WHILE n<100

n=n+1s=s+n

ENDDO? "累计值为: "+STR(s, 6)RETURN

Page 25: 第 7 章 结构化程序设计

7.4.2 步长型循环结构

格式:FOR < 循环变量 >=<初值 > TO <终值 > [STEP <步长值>]

< 语句序列 >ENDFOR|NEXT执行过程:首先将初值赋给指定的循环变量,然后判断其值是否超过终值,不超过即执行循环体,超过则不执行循环体。遇到 ENDFOR(或 NEXT)语句时自动给循环变量增加一个步长值,再判断循环变量的当前值是否超过终值,不超过再次执行循环体,超过则结束循环转去执行 ENDFOR(或 NEXT)后的语句。

Page 26: 第 7 章 结构化程序设计

【例 7-18 】用步长型循环结构编程求 1+2+3+...+100 的累计值。CLEARs=0FOR n=1 TO 100 s=s+nENDFOR? "S="+STR(S,6)RETURN

Page 27: 第 7 章 结构化程序设计

7.4.3 扫描型循环结构

格式:SCAN [<范围 >] [FOR < 条件 1>] [WHILE < 条件 2>]

< 语句序列 >ENDSCAN执行过程:对当前数据表中指定范围内符合条件的记录,逐个进行 < 语句序列 > 所规定的操作;缺省范围和条件短语时,则对所有记录逐个进行< 语句序列 > 所规定的操作。

Page 28: 第 7 章 结构化程序设计

【例 7-20 】 用扫描型循环结构编程,输出职工档案数据表中基本工资在 800 元以下的职工姓名及其基本工资数,并输出这些职工的人数。CLEAR ALLUSE zgdaCLEARSTORE 0 TO nSCAN FOR基本工资 <800 ? 姓名 , 基本工资 n=n+1ENDSCAN? "基本工资在 800 元以下的职工共有: "+STR(n, 3)+ "人 "CLOSE DATABASERETURN

Page 29: 第 7 章 结构化程序设计

7.4.4 循环嵌套结构

在一个循环结构的循环体内包含有其它循环结构,便形成了循环的嵌套。【例 7-21 】输出下图所示的乘法九九表。

Page 30: 第 7 章 结构化程序设计
Page 31: 第 7 章 结构化程序设计

CLEAR ALLCLEARa=1DO WHILE a<=9

b=1? && 用于换行输出DO WHILE b<=a

?? SPACE(2)+STR(a, 1)+"×"+ STR(b, 1)+"="+ STR(a*b, 2)

b=b+1ENDDOa=a+1

ENDDORETURN

Page 32: 第 7 章 结构化程序设计

7.5 7.5 模块结构程序设计模块结构程序设计

一个应用程序通常可由多个相关的功能模块(Module)组成,这里所说的模块是指具有某种功能的一段相对独立的程序。 采用模块结构程序设计的好处在于:整个程序结构清晰,易于分别编写与调试,便于维护与调用,并利于程序功能的进一步扩充与完善。

Page 33: 第 7 章 结构化程序设计

7.5.1 程序模块的建立与运行【例 7-26 】采用主程序调用子程序的方法,对于任意输入的整数 x 、 y 、z 的值,计算 w=x!+y!+z! 的值。** 主程序 main1.prgCLEAR ALLINPUT "x= " TO xINPUT "y= " TO yINPUT "z= " TO zn=x && 将 x 的值赋给 n ,为计算 x 的阶乘做准备DO subp1 && 调用 subp1子程序计算 x 的阶乘a=t &&把子程序计算的结果存入变量 an=yDO subp1b=tn=z

Page 34: 第 7 章 结构化程序设计

DO subp1w=a+b+t? "w=x!+y!+z!= ", wRETURN**子程序 subp1.prgPUBLIC t &&宣告 t 为全局变量,详见 7.5.4节t=1FOR i=1 TO n

t=t*iNEXTRETURN

Page 35: 第 7 章 结构化程序设计

7.5.2 应用程序的模块化设计

目前,各种基于数据库的事务管理应用程序的开发大都采用“自顶向下”的模块化程序设计方法,大大方便了整个程序的开发与调试,并极大地增加了程序的灵活性和可维护性。

Page 36: 第 7 章 结构化程序设计

例如,下图是一个简化的职工档案管理系统的程序模块结构,每个程序模块都对应一个磁盘上的 .PRG 文件。

Page 37: 第 7 章 结构化程序设计
Page 38: 第 7 章 结构化程序设计

7.5.3 带参模块的建立与调用

1 .主模块的带参调用命令

格式: DO < 程序模块名 > WITH <参数表 >

功能:调用指定名称的程序模块,并将 <参数表 > 中各个参数的值分别传递给所调用模块中的对应参数。

Page 39: 第 7 章 结构化程序设计

2 .子模块的接受参数命令

格式: PARAMETERS <参数表 >功能:接受主模块带参调用命令传递过来的各个参数。【例 7-28 】利用主模块带参调用子模块的方法计算圆柱的体积。*** 计算圆柱体积的主模块 abc.prgCLEARINPUT " 圆柱半径: " TO aINPUT " 圆柱高: " TO bSTORE 0 TO cDO rhv WITH a, b, c? " 圆柱体积为: ", cRETURN*** 计算圆柱体积的子模块 rhv.prgPARAMETERS r, h, vs=3.14159*r*rv=s*hRETURN

Page 40: 第 7 章 结构化程序设计

7.5.4 内存变量作用域

内存变量的作用域是指该变量在各程序模块内发挥作用的有效范围。按作用域的不同,可将内存变量划分为全局变量、私有变量和局部变量。

Page 41: 第 7 章 结构化程序设计

1 .全局变量

全局变量又称公共变量,是指在任何命令语句以及任何嵌套层次的程序模块中均起作用的内存变量。定义全局变量的命令格式如下。格式: PUBLIC < 内存变量表 >

功能:将 < 内存变量表 > 中指定的内存变量定义为全局变量。

Page 42: 第 7 章 结构化程序设计

2 .私有变量

在某个模块中创建的内存变量,只能在该模块及其下属模块中使用,而不与其它模块中的同名变量相关。定义私有变量的命令格式如下。格式 1 : PRIVATE < 内存变量表 >格式 2 : PRIVATE ALL [LIKE/EXCEPT < 统配符 >]功能:指定某些变量只限于本模块及其下属模块使用,并使其上级模块或其他模块中的同名变量隐蔽起来直至本级模块运行结束为止。

Page 43: 第 7 章 结构化程序设计

3 .局部变量

在当前模块中定义并只有在当前模块中有效的内存变量,一旦当前模块执行完毕,此种变量便自动释放。定义局部变量的命令格式如下。格式: LOCAL < 内存变量表 >

功能:将 < 内存变量表 > 所列的各个内存变量定义为局部变量。

Page 44: 第 7 章 结构化程序设计

7.5.5 过程与过程文件

1 .过程的概念过程可以看作是以下形式的一个程序段:PROCEDURE < 过程名 >[PARAMETERS <参数表 >]

< 语句序列 >ENDPROC此种过程通常被包含在调用它的应用程序文件中,作为该程序的一个组成部分。一个应用程序文件可以包含多个这样的过程,习惯上把它们放在应用程序的最后面。

Page 45: 第 7 章 结构化程序设计

2 .过程文件

将某个应用程序系统所包含的多个子模块分别作为不同的过程保存在同一个程序文件中,这样的程序文件被称为过程文件。过程文件的结构形式如下。PROCEDURE < 过程名 1>

< 语句序列 1>ENDPROCPROCEDURE < 过程名 2>

< 语句序列 2>ENDPROC…………PROCEDURE < 过程名 n>

< 语句序列 n>ENDPROC

Page 46: 第 7 章 结构化程序设计

7.5.6 用户自定义函数

1 .自定义函数的概念 自定义函数实际上是由用户自行编写的一个具有特定功能的程序段,其程序组成结构如下。[FUNCTION <函数名 >]

[PARAMETERS <参数表 >]

< 语句序列 >

RETURN < 表达式 >

ENDFUNC

Page 47: 第 7 章 结构化程序设计

2 .自定义函数举例

【例 7-33 】 编写一个计算阶乘的自定义函数包含在调用它的程序中,并调用此函数来计算组合数 的值。** 包含自定义函数的计算组合数程序 zhs.prgCLEARINPUT " 请输入 m 的值: " TO mINPUT " 请输入 n 的值: " TO n** 调用自定义函数 jiech 计算组合数:y=jiech(m)/(jiech(n)*jiech(m-n))? " 组合数的计算结果是: " +str(y, 8)RETURN

Page 48: 第 7 章 结构化程序设计

** 计算阶乘的自定义函数 jiech :FUNCTION jiech

PARAMETERS kt=1FOR i=1 TO k

t=t*iENDFORRETURN t

ENDFUNC

Page 49: 第 7 章 结构化程序设计

7.6 7.6 数组及其应用数组及其应用

数组是一批相同名称不同下标的内存变量,数组中的每个元素用数组名及下标(表明在该数组中的排列顺序)表示,下标的个数决定了数组的维数。 Visual FoxPro 支持一维数组和二维数组。

Page 50: 第 7 章 结构化程序设计

7.6.1 数组的定义与使用

1 .数组的定义格式 1 : DIMENSION < 数组名 >(<expN1>[,<expN2>])[,< 数组名 >(<expN1>[,<expN2>]),...

格式 1 : DECLARE < 数组名 >(<expN1>[,<expN2>])[,< 数组名 >(<expN1>[,<expN2>]),...

功能:建立指定的若干个一维或二维数组。

Page 51: 第 7 章 结构化程序设计

2 .数组的使用

在使用数组与数组元素时,应注意以下几点: 在可以使用内存变量的地方,均可使用数组元素。 可用各种对内存变量赋值的命令对数组元素赋值。若用赋值命令对数组名赋值时,则表示对该数组的所有元素赋予这同一个值。

Page 52: 第 7 章 结构化程序设计

可用 LIST/DISPLAY MEMORY 、 RELEASE 、 CLEAR MEMORY 等命令查看、释放、清除已建立的数组变量。 可用 SAVE 命令将数组存入指定的内存变量文件( .MEM),或用 RESTORE命令将其恢复到内存中来。

Page 53: 第 7 章 结构化程序设计

7.6.2 一维数组应用举例

【例 7-36 】编程实现自动输出级数 1 、 2 、 3 、 5 、 8 、13 、 21 、 34 、…… 的前 20项。***pbnq.prgDIMENSION x(20)x(1)=1x(2)=2? x(1), x(2)FOR i=3 TO 20

x(i)=x(i-2)+x(i-1)?? x(i)

ENDFORRETURN

Page 54: 第 7 章 结构化程序设计

7.6.3 二维数组应用举例【例 7-38 】编程将下面表格中的数据读入计算机,并计算每行数据之和。

1162 787 1105 851 498

861 546 579 974 845

766 443 645 1233 789

1081 357 878 787 597

Page 55: 第 7 章 结构化程序设计

***table .prgCLEAR MEMORY** 定义一个 4 行 6 列的二维数组:DIMENSION a(4, 6)** 用双重循环将已有的表格数据读入二维数组:FOR i=1 TO 4

FOR j=1 TO 5INTUT TO a(i, j)

NEXT jNEXT i** 用双重循环计算每行数据之和:FOR i=1 TO 4

a(i, 6)=0FOR j=1 TO 5

a(i, 6)= a(i, 6)+ a(i, j)NEXT j

NEXT i

Page 56: 第 7 章 结构化程序设计

7.6.4 数组与数据表的数据传递

1 .一维数组与记录之间的数据传递

( 1)记录内容传送到数组格式: SCATTER [FIELDS < 字段表 >] TO < 数组名 >

功能:将打开数据表中当前记录的各个数据复制并传送到指定数组的各个元素中。

Page 57: 第 7 章 结构化程序设计

( 2)数组内容传送到记录命令

格式: GATHER FROM < 数组名 > [FIELDS< 字段表 >]

功能:将指定数组变量中各元素的数据,复制并传递到当前数据表中的当前记录。

Page 58: 第 7 章 结构化程序设计

2 .二维数组与整表之间的数据传递

( 1)复制数据表内容到数组命令

格式: COPY TO ARRAY < 数组名 > [<范围 >] [FOR < 条件 >] [FIELDS < 字段表>]

功能:将当前数据表中指定范围内符合条件的记录数据复制到指定的数组中。

Page 59: 第 7 章 结构化程序设计

( 2)数组内容添加到数据表命令

格式: APPEND FROM ARRAY < 数组名> [FIELDS< 字段表 >]

功能:将指定数组变量中各元素的数据,复制并添加到当前数据表中。