第7章 结构化程序设计.ppt_第1页
第7章 结构化程序设计.ppt_第2页
第7章 结构化程序设计.ppt_第3页
第7章 结构化程序设计.ppt_第4页
第7章 结构化程序设计.ppt_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章结构化程序设计,迄今为止,前面介绍的操作都是通过菜单或在命令窗口中逐条输入命令的方法来执行的,这种工作方式称为单命令方式或交互工作方式。但此方式不适合复杂的数据管理任务。为此,Visual FoxPro提供了批命令处理方式,即程序工作方式。 程序工作方式是根据解决实际问题的需要,将一系列的命令按一定的逻辑结构编排成一个完整的应用程序,然后由计算机自动地、连续地按程序的顺序执行。 Visual FoxPro系统支持传统的面向过程的程序设计,也支持面向对象的程序设计。 本章介绍面向过程的程序设计方法,程序中的命令一般称为语句,每一行为一个语句,不同的语句应放在不同的行。,7.1.1程序文件的

2、建立 程序文件(简称程序)也叫命令文件。在Visual FoxPro环境下,利用程序文件方式进行数据库管理,是通过程序文件编辑工具,将对数据库操作的命令和对系统环境进行设置的命令,集中在一个以.PRG为扩展名的程序文件中,然后再通过菜单方式或命令方式运行该程序文件。 程序文件的建立可以用Visual FoxPro本身自带的编辑工具建立,也可用其它文本编辑软件建立(保存时以带分行符的纯文本文件保存,扩展名为.prg),7.1程序文件的建立与运行,程序的五要素 1,有穷性:程序的操作步骤必须是有限的,不能出现死循环。 2,确定性:每个语句都必须有确定的含义,不能有二义性。 3,有0个或多个输入。

3、4,有一个或多个输出:程序必须有输出。 5,有效性:程序中的每一步都必须是能有效地执行的。,1,用菜单方式建立程序文件 操作步骤(1)执行“文件/新建/程序/新建文件” (2)输入程序文件的内容(每行输入完后按回车键) (3)保存文件 2,以命令方式建立程序文件 在命令窗口中输入命令: modify command 程序文件名 文件名必须包括路径,缺省时为程序1,关闭窗口时可以修改。,7.1.2程序文件的运行 方法一:打开程序文件后或编辑完程序后,执行“程序”菜单中的“运行”命令,或单击工具栏中的“ !” 方法二:在没有打开程序编辑窗口的情况下,在命令窗口中输入以下格式的命令: do 当程序文

4、件不在默认目录下时,程序文件名中必须包含路径。 中止程序的执行:在程序的执行过程中可按ESC键中止程序的执行。 程序的修改:当关闭程序的编辑窗口后,要修改程序,可以通过文件菜单中的打开命令,文件类型选择“程序”,然后选择要打开的文件。,7.1.3程序中的辅助命令 1,注释命令 以note或或开头的内容。其中note和只能作用于整行内容作为注释的情形,要在一行命令右边加上注释只能用& 【例7-1】 :程序中的注释命令示例,* * 程序:职工档案管理系统 * * 作者: 高路 * * 日期 2005年月 * All Rights Reserved * * note 设置系统运行环境 set tal

5、k off &关闭人机对话 set default to e:liang &指定默认目录 set date to YMD &指定日期格式,2,结束运行程序运行命令 格式1:RETURN 功能:返回到上级程序模块。若本程序模块是以菜单方式或命令方式调用的,则返回交互状态(命令窗口中) 格式2:RETURNMASTER 功能:返回到最上级主程序。 格式3:CANCEL 功能:终止程序的执行,返回交互状态(命令窗口中) 格式4:QUIT 功能:关闭所有文件,关闭Visual FoxPro,3,运行环境设置 在程序的开始部分经常要进行运行环境的设置,其设置见表61,7.1.4程序的交互输入命令 1,字

6、符串输入命令 格式:accept to 功能:暂停程序的运行,等待用户从键盘输入一串字符并赋给指定的内存变量。 说明:(1),提示信息用于提示用户的输入,其内容必须是字符型的。 (2),用此命令输入的所有内容均作为字符型数据。 (3),输入的字符串以回车符结束。,【例7-2】以下程序段是打开用户从键盘输入的表名,并根据输入的姓名进行简单的查询输出。 accept 请输入要打开的数据表名: to tab_name use &tab_name accept 请输入被查者姓名: to name locate for 姓名=name display,2,表达式输入命令 格式:INPUT to 功能:暂

7、停程序的运行,等待用户从键盘输入数据并赋给指定的内存变量。若输入的是一个表达式,则先计算表达式的值,然后将表达式的值赋给内存变量。 说明:(1)提示信息为字符型常量 (2)输入的内容可以是任何一个合法的N、C、D、L型表达式 (3)若输入的是字符串,则必须加上定界符。,【例7-3】根据输入的某种商品的单价和数量,计算并输出应付的金额。 CLEAR ALL INPUT 单价: TO dj INPUT 数量: TO sl ?应付金额:+str(dj*sl,9,2) RETURN,3,等待或单字符输入命令 格式:WAIT to 功能:暂停程序的运行,等待用户从键盘输入一个字符。当包含to 短语时,将

8、输入的字符赋给指定的内存变量,否则当用户按下任意键后继续执行程序。 说明: 当命令中包含了提示信息时,将显示提示信息。 本命令只能输入一个字符(按下后不能修改,也不用按回车键结束输入) 若命令中不带任何选项,只有WAIT,则程序暂停并显示“按任意键后继续.”,【例7-4】下面的程序段是用WAIT命令接收用户的回答,当输入N或n时终止程序的运行,返回命令窗口。 . wait 继续运行吗?(Y/N) to jx if upper(jx)=N cancel endif .,4,定位输出与输入命令 格式1:say 功能:在屏幕上的指定行、列位置,输出表达式的值 格式2:sayget read 功能:在

9、屏幕上的指定行、列位置,输出表达式的值,并在其后显示变量的值,当执行read语句后可在原位置修改变量的值,修改后的值会自动返回给变量。 格式3:saygetrange,valid 功能:在格式2的基础上用表达式1和表达式2的值来规定数值或日期型变量的上限和下限。 valid用于规定输入的变量值要满足的条件。,【例7-5】定位输出输入命令应用举例。 clear use zgda append blank 6,12 say 请输入新职工的信息: 7,12 say 姓名: get 姓名 8,12 say 性别: get 性别 valid 性别$男女 9,12 say 年龄 get 年龄 range

10、18,60 read browse use return,7.2 顺序结构程序设计,7.2.13种基本程序结构 程序中的基本语句由一般语句(能在命令窗口中运行的语句)和结构控制语句组成。结构控制语句有选择结构(分支结构)和循环结构。 程序的基本结构有:顺序结构、分支结构(又称为选择结构)和循环结构。,1,顺序结构:由一般语句按一定的顺序排列而成,执行时严格地从上至下执行 2,分支结构:根据给定的条件决定执行哪一个程序块。分为简单分支、选择分支和多路分支。 3,循环结构:在一定的条件下反复执行某一程序段,直至条件不满足时止。此条件又称为循环条件。 循环结构分为:当型循环(dowhile循环)、计

11、数型循环(for循环)、扫描型循环(scan循环),7.2.2顺序结构程序设计 顺序结构的一般格式为: 设置工作环境 打开表等 给变量赋值 计算或操作语句 输出语句 关闭文件 恢复工作环境,【例7-6】在职工档案表中查看指定职工的有关情况。,算法: S1:打开职工档案表 S2:输入要查询的职工的姓名 S3:按姓名查询 S4:显示查询结果 S5:关闭表,use zgda accept 请输入被查询者姓名: to xm locate for 姓名=xm clear ?姓名:+姓名 ?职称:+职称 ?出生日期:+DTOC(出生日期) use return,【例7-7】根据输入的人口基数和年平均增长率

12、,计算二十年后的人口数.,算法: S1:清屏 S2:输入人口基数 S3:输入年平均增长率 S4:计算二十年后的人口数 S5:输出计算结果,clear input 人口基数: TO aa input 年平均增长率: to bb cc=aa*(1+bb)20 ?二十年后的人口数为:+str(cc) return,7.3 分支结构程序设计,7.3.1 简单分支结构 格式: IF ENDIF 功能:若条件成立,则执行其后的语句系列,否则跳过语句系列,执行ENDIF后面的语句。 说明:1,IF和ENDIF必须成对出现,且各占一行 2,书写时最好将IF后面的语句系列向右缩进,将IF与其相对应的ENDIF对

13、齐。,【例7-8】某种商品一次购买100件以上时,可享受8%的优惠,试编程根据输入的单价和数量计算应付的金额。,算法设计: S1:输入数量与单价 S2:计算金额je S3:IF 数量=100 je=je*0.92 ENDIF S4:输出金额,clear input 数量: to sl input 单价: to dj je=dj*sl if sl=100 je=je*0.92 endif ?应付金额:+str(je,8,2) return,【例7-9】在程序中设置简单口令核对的一段程序 ?口令 set console off accept to password set console on i

14、f passwordABCD cancel endif,7.3.2选择分支结构 格式: IF条件 语句系列1 ELSE 语句系列2 ENDIF 功能:若条件为真则执行语句系列1而不执行语句系列2,否则执行语句系列2而不执行语句系列1。 说明:1,IF和ENDIF必须成对出现,且各占一行,ELSE也必须独占一行。 2,语句系列中的语句可以是一句,也可以是多句。,【例7-10】设出租车不超过5公里时一律收费10元,超过时则超过部分每公里加收1.5元,试编程根据里程数计算车费。 clear input 里程数: to lc if lc=5 ?车费十元 else cf=10+(lc-5)*1.5 ?车

15、费为:+str(cf,6,2) endif return,【例7-11】按姓名查询职工档案表中职工的基本情况。 clear use zgda input 请输入要查询的职工的姓名: to xm locate for 姓名=xm if found() display else ?查无此人! endif clear all return,7.3.3 分支嵌套结构 前面的分支结构中的语句系列也可以是IF.ELSE语句,即分支结构可以嵌套。 【例7-12】设硅谷公司员工的工资计算方法如下: 工作时数超过120小时者,超过部分加百分之十五 工作时数低于80者,扣发500元 余者按每小时68元计发,cle

16、ar input 请输入工时: to gs if gs120 gz=gs*68+(gs-120)*68*0.15 else if gs80 gz=gs*68-500 else gz=gs*68 endif endif ? gz,7.3.4多路分支结构 格式: DOCASE CASE条件1 CASE条件2 CASE条件n OTHERWISE ENDCASE 功能:根据条件执行相应的语句,当前面n个条件均不成立时执行语句系列n+1,说明:1,DO CASE必须和CASE成对出现,且 各占一行 2, 各CASE语句的执行是从CASE开始 按顺序执行,因此必须对条件的顺序加以考虑。 3,DO CASE

17、与第1个CASE语句之间的语句将不执行 【例7-13】编程计算银行存款整存整取应得的利息。,clear input本金(元): to bj input存期(年): to cq do case case cq=5 rate=7.5 case cq=3 rate=6.9 case cq=2 rate=6.6 case cq=1 rate=6.3 case cq=0.5 rate=4.5 otherwise rate=1.7 endcase lixi=bj*cq*rate/1000 ?应得利息:+str(lixi,8,2) return,作业,1,编程求下面分段函数的值(其中自变量x的值由键盘输入)

18、。 2,编程求一元二次方程的根。 3,从键盘输入成绩,然后根据下面标准给出等级成绩(要求用 DO CASE语句完成) 成绩 等级成绩 等级 90100 A60-69 D 80-69 B60 E 70-79 C,提示: 1,S1:输入x的值 S2:使用if语句根据x的值计算出y的值 S3:输出y的值 2,S1:输入一元二次方程的二次项、一次项系数和常数项 S2:ifa=0则输出“不是一元二次方程”,终止程序 S3:计算disc=b2-4*a*c S4:根据disc的不同情况分别计算出方程的根:实根、虚根,并输出 3,S1:输入成绩 S2:do case case 成绩=90 输出评语 . end

19、case,7.4 循环结构程序设计,三种循环结构:当型循环、步长型循环和扫描型循环 循环结构的组成: 循环开始语句 循环体 循环结束语句 其中:循环开始语句一般由循环结构语句和条件判断组成。 循环体是要反复执行的程序段,7.4.1当型循环结构 1, DO WHILE循环语句 【格式】DO WHILE ENDDO,一个循环结构一般应具备如下的条件: (1)循环的初始条件:一般为给循环控制变量赋初值; (2)循环头:循环语句的起始,设置、判断循环条件; (3)循环尾:循环语句的结尾; (4)循环体:位于循环头和循环尾之间、循环控制重复执行的语句序列,循环的终止: 正常终止:当循环条件为假(即不成立

20、)时,将终止循环的执行转到执行ENDDO后面的语句。 非正常终止:通过EXIT、QIUT、CANCEL和LOOP等语句控制循环的执行。其中: EXIT:终止本层循环的执行转到执行ENDDO后面的语句。 CANCEL:终止程序的执行,返回命令窗口 QUIT:终止程序的执行,关闭所有文件,关闭Visual FoxPro LOOP:终止从本语句的下一语句开始到ENDDO之间的语句的执行,回到循环的开始处。 以上4个命令一般和IF语句配合使用,当某一条件满足时执行相应的语句。,【例7-14】求123.100的累计值 clear store 0 to n,sum do while n100 n=n+1

21、sum=sum+n enddo ?累计值为:+str(sum,6),已知递推公式,求其通项的值 若 Si=Si-1+f(i) 求Sn的值的程序段为 s=0 i=1 do while i=n s=s+f(i) i=i+1 enddo,例:求1 到100的所有偶数之和,si=si-1+2i 程序段为: s=0 i=1 do while i=50 s=s+2*i i=i+1 enddo,【例7-15】鸡兔同笼问题。设鸡和兔共有头37个、脚134个,问鸡和兔各有多少? 设鸡有cock个,兔有rabbit个,则有: cock+rabbit=37 2*cock+4*rabbit=134 解题方法:对鸡、兔

22、的各种情形(鸡数从0到37)进行判断 cock=0 do while cock=37 rabbit=37-cock if 2*cock+4*rabbit=134 ?鸡:+str(cock,2)+ 兔:+str(rabbit,2) endif cock=cock+1 enddo,【例7-16】简单的程序功能选择程序。下面程序是打开职工档案表后,在屏幕上显示一个可对该表进行“浏览”、“修改”或“追加”操作的菜单供用户选择,根据选择结果由多路分支语句控制所做的相应的操作。,算法设计: S1:打开表 S2:do while .t. S21: 显示选择菜单:1,浏览,2,修改,3,追加,4,退出 S22

23、:选择 S23:根据选择结果执行相应的操作,SET TALK OFF SET STATUS OFF &关闭状态行 CLEAR ALL USE ZGDA DO WHILE .T. CLEAR TEXT 1-浏览 2修改 3追加0退出 ENDTEXT ? WAIT 请选择(03): TO X,CLEAR DO CASE CASE X=1 GO TOP BROWSE NOMODIFY CASE X=2 INPUT 请输入修改的记录号: TO jlh EDIT CASE X=3 APPEND LIST CASE X=0 EXIT OTHERWISE WAIT 选择错,按任意键继续 ENDCASE EN

24、DDO CLOSE ALL SET TALK ON RETURN,【例7-17】编程输出职工档案表中基本工资在800元以下的职工的姓名及基本工资,并统计这些职工的人数。,clear all use zgda n=0 do while !EOF() if 基本工资800 ?姓名,基本工资 n=n+1 endif skip enddo ?基本工资小于800的共有+str(n)+人 use return,clear all use zgda n=0 do while !EOF() if 基本工资=800 skip loop endif ?姓名,基本工资 n=n+1 skip enddo ?基本工资小

25、于800的共有+str(n)+人 use return,7.4.2步长型循环结构,格式: FOR = TO STEP ENDFOR或NEXT 功能:当循环变量不超过终值时执行循环体,超过终值时执行ENDFOR后的语句。超过的意义为:当步长为正时循环变量大于终值为超过;当步长为负时循环变量小于终值为超过。,使用FOR循环语句的有关说明: 省略STEP ,则步长为默认值1; 初值、终值和步长都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数; 可以在循环体内改变循环变量的值,但会改变循环执行次数; EXIT和LOO

26、P命令可以出现在循环体内。执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。执行EXIT命令时,程序跳出循环,执行循环尾后面的语句,【例7-18】用步长型循环求1到100之和,sum=0 for i=1 to 100 sum=sum+i endfor ?1+2+.+100=,sum,sum=0 for i=2 to 100 step 2 sum=sum+i endfor ?1+2+.+100=,sum,sum=0 for i=1 to 100 step 2 sum=sum+i endfor ?1+2+.+100=,sum,例:求n! set tal

27、k off input n=: to n p=1 for i=1 to n p=p*i endfor ?p set talk on,例:求1!+2!+ +n! set talk off input n=: to n sum=0 p=1 for i=1 to n p=p*i sum=sum+p endfor ?sum set talk on,【例7-19】从键盘输入10个数,编程找出其中的最大值和最小值。 SET TALK OFF CLEAR INPUT “请从键盘输入一个数:” TO A STORE A TO MAX,MIN FOR I=2 TO 10 INPUT “请从键盘输入一个数:” T

28、O A IF MAXA MIN=A ENDIF ENDFOR ? “最大值为:” , MAX ? “最小值为:” , MIN SET TALK ON RETURN,7.4.3 扫描型循环结构(scan循环),1,SCAN ENDSCAN 语法:SCAN 范围 for|while 条件 语句序列 ENDSCAN 功能:对当前表的指定范围内的满足条件的记录逐个 执行一次语句序列,直到条件不成立或记录指针指向表尾。,说明:(1)使用SCAN循环之前必须先打开要操作的表。 (2)缺省范围短语时,指ALL。 (3) 执行完循环体后记录指针自动指向下一记录。 (4)SCAN为循环起始语句,ENDSCAN为

29、循环结束语句,这两个语句必须配对使用。 (5) 循环体内可以使用LOOP语句和EXIT语句。,【例7-20】编程输出职工档案表中基本工资在800元以下的职工的姓名及基本工资,并统计这些职工的人数。,clear all use zgda n=0 do while !EOF() if 基本工资800 ?姓名,基本工资 n=n+1 endif skip enddo ?基本工资小于800的共有+str(n,3)+人 use return,clear all use zgda n=0 scan if 基本工资800 ?姓名,基本工资 n=n+1 endif endscan ?基本工资小于800的共有+s

30、tr(n,3)+人 use return,作业,1,用FOR循环语句编程求 1+1/1!1/2!1/n! 2,编程求学生表中入学成绩大于550的人数(用SCAN语句) 3,由键盘输入多串字符,每个字符串输入完成后给一 个选择提示:“是否继续(Y/N?),若输入Y或y则继续,否则退出输出字母个数和数字个数。,习题讲解,1,编程求下面分段函数的值(其中自变量x的值由键盘输入)。 2,编程求一元二次方程的根。 3,从键盘输入成绩,然后根据下面标准给出等级成绩(要求用 DO CASE语句完成) 成绩 等级成绩 等级 90100 A60-69 D 80-69 B60 E 70-79 C,input 请输

31、入自变量x的值: to x if x0 y=x2 else if x=1 y=sin(x) else y=1-2*x endif endif ?x=+str(x,4,2) ?y=+str(y,5,3),input请输入二次项系数: to a input请输入一次项系数: to b input请输入常数项: to c if a=0 ?不是一元二次方程 wait cancel endif disc=b*b-4*a*c if disc=0 x1=(-b+sqrt(disc)/(2*a) x2=(-b-sqrt(disc)/(2*a) ?方程有两个根:,x1,x2 endif if disc0 ?方程

32、有一对共轭复根,其实部为:,b/(2*a),虚部为:,sqrt(-disc)/(2*a) endif return,input 请输入百分制成绩: to score do case case score=90 ?等级为A case score=80 ?等级为B case score=70 ?等级为C case score=60 ?等级为D otherwise ?等级为E endcase,7.4.4 循环嵌套结构,循环的嵌套,是在一个循环结构的循环体中又包含另一个循环。我们称外层循环为外循环,被包含的循环为内循环。嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉

33、。正确的嵌套关系如: DO WHILE DO WHILE DO WHILE ENDDO ENDDO ENDDO,例7-21:输出乘法口诀表 基本思路:输出第1到第9行 a=1 do while a=9 输出第a行 换行 a=a+1 enddo 输出第a行:输出a1=a . aa=a*a共a个式子 b=1 do while b=a 不换行输出ab=a*b b=b+1 enddo 不换行输出ab=a*b:?a,b,=,a*b ? +str(a,1)+str(b,1)+=+str(a*b,2),clear a=1 do while a=9 b=1 ? do while b=a ?space(2)+s

34、tr(a,1)+str(b,1)+=+str(a*b,2) b=b+1 enddo a=a+1 enddo,例7-22:编程输出如下图形,clear for m=1 to 8 m+2,20-m say for n=1 to 2*m-1 ?* endfor endfor,输出8行“*”号,第m行输出2m-1个其中第1个星号的列号递减 for m=1 to 8 移动输出位置到m+2行20-m列 输出2m-1个“*”号 endfor,例7-23输出3到500之间的所有素数,for m=3 to 500 若m能被2.m-1中的某一个数整除则m不是素数 否则m为素数,输出m endfor for i=2

35、 to m-1 if m%i=0 exit endif,for m=3 to 500 step 2 for i=3 to m-1 if m%i=0 exit endif endfor if im-1 ?m endif endfor,【例7-24】某单位按部门建立了rsda1rsda8共个结构相同的人事档案数据表,其中日期型字段“工作日期”记载着各位职工参加工作的日期,试编程分别统计各部门各阶段(1978年前,1978年至1984年,1985年至1999年,2000年后)参加工作的职工人数。,算法设计 打开表rsda1 对当前表的各个记录求其工作日期所在的年份y 根据y的值修改各阶段参加工作的人

36、数 对其余表重复上面操作,clear all for n=1 to 8 bm=rsda+str(n,1) use &bm store 0 to a,b,c,d scan y=year(工作日期) do case case y1978 a=a+1 case y1985 b=b+1 case y2000 c=c+1 otherwise d=d+1,endcase endscan ?部门:+str(n,1) ?各年参加工作的人数为,a,b,c,d n=n+1 enddo close all,7.5模块结构程序设计,结构化程序设计采用的是自顶向下,逐步求精的模块化结构程序设计。 模块:具有某种功能的一

37、段独立的程序。 模块化程序设计:不同的功能用不同的模块实现,模块之间的连接用DO命令实现,被调用的模块称为子模块,调用子模块的模块称为主模块。 模块化程序设计的优点:程序结构清晰,易于分别编写与调试,便于维护与调用,有利于程序功能的进一步扩充与完善。,7.5.1 程序模块的建立与运行,程序模块的建立方法与建立程序的方法相同。利用模块建立完整的程序的步骤为: :用建立程序文件的方法分别建立各子模块并保存。 :用建立程序文件的方法建立主程序(在其中用命令 调用子模块) :调试程序(即运行主程序) 说明:,模块的最后一个语句为RETURN语句; ,子模块也可调用其余模块; ,当程序执行RETURN语

38、句后,将转向调用该子模块的DO语句的下一语句,模块中位于RETURN语句后的语句将不被执行。,【例7-25】用子模块调用完成例7-24,*主模块main.prg clear all n=1 do while n=8 clear bm=rsda+str(n,1) use &bm do subpro &调用子模块 close data n=n+1 enddo return,*子模块,文件名为subpro.prg store 0 to a,b,c,d scan y=year(工作日期) do case case y1978 a=a+1 case y1985 b=b+1 case y2000 c=c+

39、1 otherwise d=d+1 endcase endscan ?部门+str(n,1) ? 参加工作各阶段人数为:,a,b,c,d return,【例7-26】对于任意输入的x、y、z的正整数值,计算x!+y!+z!的值,子模块subp_1.prg public t t=1 for i=1 to n t=t*i next return,*主模块main_1.prg clear input x=: to x input y=: to y input z=: to z n=x do subp_1 a=t n=y do subp_1 b=t n=z,do subp_1 w=a+b+t ?x!+

40、y!+z!=,w return,【例7-27】一个简化的职工档案管理系统的“档案管理”主程序模块,档案管理 dagl.prg,添加记录 tjjl.prg,删除记录 scjl.prg,修改数据 xgsj.prg,查询检索 cxjs.prg,按记录修改 ajlxg.prg,按字段修改 azdxg.prg,主控程序模块算法 S1: 环境设置 S2: do while .t. S21: 显示简易菜单 S22: 使用wait命令进行菜单选择 S23: 用do case按不同的选择调用相应的子模块 S3: 结束,SET TALK OFF &不显示命令执行结果 SET SAFETY OFF &重写文件时不提

41、示 SET STATUS OFF &关闭状态行 SET DEFAULT TO D:ZGDAG1 &设置默认目录 CLEAR DO WHILE .T. CLEAR 2,20 SAY *职工档案管理系统* 3,20 SAY T_添加记录 S_删除记录 4,20 SAY X_修改数据 C_查询检索 5,20 SAY Q_退出 6,20 SAY *,? WAIT 请键入字母选择对应功能: TO ch ch=upper(ch) do case case ch=Q ?欢迎再次使用本系统! exit case ch=T do tjjl case ch=S do scjl case ch=X do xgsj

42、case ch=C do cxjs otherwise ?选择错误,重新选择 wait,endcase enddo set talk on close all return,7.5.3 带参模块的建立与调用,在模块程序设计中,各模块之间常需要传递数据:将主模块中的初始数据传递到子模块中,将子模块中的结果传回给主模块。 数据的传递有两种方法:一是通过带参调用程序模块的方法,二是通过全局变量。 带参调用程序模块的方法:要求子模块中必须有接受参数的命令,在主模块中通过带参模块调用命令调用子模块并将数据传递给子模块。,1,带参模块调用 格式:DO 程序模块名WITH参数表 功能:调用指定名称的程序模块

43、,并将参数表中的各参数的值分别传递给所调用模块中的对应位置的参数。 说明:(1)本命令通常在主模块中使用,也可在命令窗口中使用。 (2)程序模块名应是一个可被带参调用的程序模块,且应具有接收参数的功能。 (3)参数表中的参数称为实际参数,各参数间用逗号分隔,参数可以是常量、变量和表达式,变量和表达式必须有确定的值。,2,接收参数命令 格式:PARAMETERS参数表 功能:接收带参模块调用命令传递过来的各个参数。 说明:(1)本命令必须为第一个可执行语句。 (2)中的各参数为形式参数,其个数和类型必须和实际参数一一对应。 (3)当流程返回主模块时,形参的值将传递给实参变量。 【例7-28】利用

44、带参调用的方法计算圆柱体的体积,*计算圆柱体体积的可被带参调用的子模块 *程序名:rhv.prg PARAMETERS R,H,V S=PI()*R*R V=S*H RETURN,*带参调用计算圆柱体体积的主模块 *程序名:例7_28.prg CLEAR INPUT 圆住体的底面半径为: TO a INPUT 圆住体的高为: TO b c=0 DO rhv with a,b,c ?圆柱体的体积为:,c return,【例7-29】统计“分数.dbf”数据表中各门课程不及格的人数,并调用带参模块scr.prg显示统计结果。,store 0 to x,y,z use 分数 scan if 语文60

45、 x=x+1 endif if 数学60 y=y+1 endif if 英语60 z=z+1 endif endscan,do scr with x,语文 do scr with y,数学 do scr with z,英语 return,*scr.prg parameters rs,kc if rs0 cd=len(ltrim(str(rs) ? kc+不及格人数为+str(rs,cd)+人 endif return,7.5.4 内存变量作用域,不同的范围定义的变量有不同的使用范围, 1,子程序中能否使用主程序中定义的变量? 2,能否使用其它程序中定义的变量? 3,主程序中能否使用子程序中定义

46、的变量?, 4,程序中能否使用在命令窗口中定义的变量? 内存变量的作用域:内存变量在各程序模块内起作用的有效范围。 内存变量的分类:按作用域的不同,可把内存变量分为全局变量和局部变量。,,全局变量 又称为公共变量。是在任何命令语句以及任何嵌套层次的程序模块中均起作用的内存变量。定义全局变量的命令如下: 格式:PUBLIC 说明:(1) 全局变量在创建它的程序模块运行结束后并不释放,因而可在其后的各 模块中使用。 (2) 全局变量应先定义后赋值,不允许先赋值后定义。 (3) 全局变量可用RELEASE命令释放,没有释放前不能重新定义为局部变量。 (4) 在命令窗口中定义的变量为全局变量。,,局部

47、变量 只在当前模块和其下层模块中使用的变量。 格式1:PRIVATE 格式2:PRIVATEALLLIKE/EXCEPT 功能:指定某些变量为只在本模块及其下属模块中使用的局部变量,并使其上级模块中的同名变量隐蔽起来直至本级模块运行结束为止。,说明: 使用内存变量表时,表中所列的内存变量为局部变量。 使用短语ALL时,在本模块中建立的所有内存变量均为局部变量。 使用短语LIKE通配符时,与通配符相匹配的内存变量均为局部变量。 通配符有“*”号和“?”号,*号代表任意一串字符,?号则只代表一个字符,?号常用于确定字符的位置。如第1个字母为a的所有变量:a*,第2、3个字母为cd的内存变量:?cd

48、*。 使用短语EXCEPT通配符时,不与通配符相匹配的内存变量为局部变量。 在程序模块中所有未经特殊说明的内存变量均为局部变量,局部变量可在创建它的模块及其下属模块中使用,而不能在其上级模块中使用。,【例7-30】内存变量作用域示例,*子模块sub_3.prg PRIVATE b PUBLIC c a=10 b=11 c=12 d=13 ?子模块中,a=,a,b=,b,c=,c,d=,d RETURN,*主模块main_3.prg CLEAR ALL a=1 b=2 ?主模块中,a=,a,b=,b DO sub_3 ?返回主模块后,a=,a,b=,b,c=,c,d=,d RETURN,b为局部

49、变量,其值不会返回到主模块 c为全局变量,其值会返回到主模块中 d为局部变量,其值不会返回到主模块 a为主模块中定义的变量,其值会返回,7.5.5过程与过程文件,1,过程的概念 过程是由一个或多个命令、语句构成,以返回语句return结束的独立程序段。使用过程时,通过过程名调用并执行。过程一般放在主模块之后,与主模块在同一个程序文件中。 过程的一般形式为: procedure parameters return 调用过程的方法为:DO 在一个程序文件中可以包含多个过程,也可将多个过程组织成一个过程文件,*过程应用示例 CLEAR ALL INPUT x= TO x INPUT y= TO y

50、INPUT z= TO z n=x do factorial a=t n=y do factorial b=t n=z do factorial w=a+b+t ?w=x!+y!+z!=,w,【例7-32】编写一个计算阶乘的通用过程,并将其包含在一个求解w=x!+y!+z!之值的程序中.,*以下为计算阶乘的通用过程 PROCEDURE factorial PUBLIC t t=1 for i=1 to n t=t*i next return,2, 过程文件 当有多个过程时,可以将其放在一个文件中,此文件称为过程文件,过程文件的格式为: procedure parameters return p

51、rocedure parameters return . procedure parameters return 即由多个过程按顺序排列而成,过程文件的建立:与普通程序文件的建立方法相同。 过程文件中的过程的调用方法: 先打开过程文件,然后使用DO过程名调用过程文件中的过程。 过程文件的打开格式: SET PROCEDURE TO 过程文件名 过程文件的关闭: CLOSE PROCEDURE 或 SET PROCEDURE TO,7.5.6 用户自定义函数,除了使用系统提供的函数外,用户还可以定义函数. 函数定义的一般格式: function parameters return 调用方法与调用

52、系统函数相同: 函数名(参数表),说明: 自定义函数程序段允许以function 开头,并包含在调用它的程序文件中,作为其中的一部分出现.也可以在缺省function 的情况下,以一个独立的程序文件存储,此时程序名即为其函数名。 PARAMETERS语句用来接收调用此函数时传递过来的自变量的值,若函数不用接收参数,则去掉此句。 RETURN语句用来返回函数值,其返回的数据类型即函数的类型。 自定义函数的调用方法与调用系统函数的方法相同,例7-33:编写一个计算阶乘的自定义函数包含在调用它的程序中,并调用此函数计算组合数,clear input 请输入m的值: TO m input 请输入n的值

53、: TO n y=jiech(m)/(jiech(n)*jiech(m-n) ? 组合数的计算结果是:+str(y,8) return FUNCTION JIECH PARAMETERS K t=1 for i=1 to k t=t*i endfor return t endfunc,clear input 请输入m的值: TO m input 请输入n的值: TO n y=jiech(m)/(jiech(n)*jiech(m-n) ? 组合数的计算结果是:+str(y,8) return FUNCTION JIECH PARAMETERS K t=1 for i=1 to k t=t*i e

54、ndfor return t endfunc,【例7-34】编写一个独立保存的自定义函数,用来自动实现将阿拉伯数字的整数金额转换为对应的汉字大写金额。,PARAMETERS je z1=元拾佰仟万拾佰仟亿拾佰仟 z2=零壹贰叁肆伍陆柒捌玖 je=ALLTRIM(STR(je,12) cd=LEN(je) dxje=整 k=0 DO WHILE cd0 k=k+1 n=val(substr(je,cd,1) &n为从个位开始的阿拉伯数字 b1=substr(z2,n*2+1,2) &b1为与n对应的汉字 b2=subst(z1,k*2-1,2) &b2依次为元拾佰仟万拾佰仟亿拾佰仟 dxje=b1+b2+dxje cd=cd-1 enddo return dxje,7.6数组及其应用,数组是一批名称相同,而以不同下标加以区分的内存变量,数组中的每个内存变量称为数组元素,数组元素用数组名和下标表示,下标的个数决定数组的维数。Visual FoxPro中的数组有以下特点: ()只有一维数组和二维数组,二维数组相当于一个矩阵。 ()每个数组至多可有3600个元素,同一数组内的各元素的数据类型可以不同。 ()二维数组可作为一维数组进行访问。,7.6.1数组的定义与使用,,数组的定义,例:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论