第九章结构化程序设计_第1页
第九章结构化程序设计_第2页
第九章结构化程序设计_第3页
第九章结构化程序设计_第4页
第九章结构化程序设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、 院 系: 经济管理系 教研室: 信管 教 师: 数据库原理及应用课程教案课程名称数据库原理及应用课程学分3课程属性必修课( ) 专业选修课( ) 校定公共选修课( )课程总学时48学时其中:讲课:32学时实验:16学时先修课程信息技术基础授课专业、班级经管系工商、信管、经济学、会计、工程造价各专业主要教材教材名称出版社作者出版时间Visual FoxPro 程序设计教程(第二版)北京邮电大学出版社刘卫国2006教材名称出版社作者出版时间数据库系统概论(第三版)高等教育出版社王珊,萨师煊2006教学目的及要求教学目标: 本章主要介绍程序设计的概念和设计方法、VFP中三种结构程序的设计。通过课程

2、学习要求学生能够达到以下目标:1. 掌握程序设计的概念和结构化程序设计方法。2. 熟练掌握分支程序设计。3. 熟练掌握循环程序设计。3.重点难点: 本章的内容较多,其中三种结构化程序设计方法尤其是分支和循环程序设计是重点和难点部分。解决方法:通过对具体问题的分析,使学生掌握分析问题并形成算法的方法,然后通过大量的具体实例,使学生直观的学习程序设计的完整过程。同时课上通过课堂互动,让学生自己分析问题并设计程序,在课下通过实验练习,掌握分支和循环程序设计。教学方法和手段:多媒体教学、实例演示、板书讲授学时:4学时注:表中( )选项请打“”第九章 结构化程序设计教学目的与要求通过课程学习,掌握程序设

3、计的概念和结构化程序设计方法,熟练掌握分支程序设计,熟练掌握循环程序设计。4.教学内容程序设计的概念,结构化程序设计的方法,Visual FoxPro的中分支和循环结构程序设计方法,程序的模块化,子程序的调用方法,Visual FoxPro的调试方法。教学重点与难点Visual FoxPro中分支和循环程序设计方法。 9.1 程序设计基础9.1.1 程序设计的概念程序设计并不是简单地只是编写一个程序。程序设计反映了利用计算机解决问题的全过程,包含多方面的内容,而编写程序只是其中的一个方面。使用计算机解决实际问题,通常是先要对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法,并用某一种程

4、序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果。这个过程称为程序设计。9.1.2 程序的控制结构任何复杂的程序都由3种基本控制结构组成。它们是顺序结构、选择结构和循环结构。1. 顺序结构 这是最简单的一种基本结构,依次顺序执行不同的程序块。2. 选择结构 根据条件满足或不满足而去执行不同的程序块。3. 循环结构 循环结构是指重复执行某些操作,重复执行的部分称为循环体。9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。l 自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题。l 逐步求精是指程

5、序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤,以致能用某种程序设计语言的基本控制语句来实现。l 模块化是结构化程序的重要原则。所谓模块化就是把大程序按照功能分为较小的程序。9.1.4 程序文件的建立与执行1. 建立或修改程序文件同建立其他类型文件一样,建立或修改程序文件也有菜单和命令两种操作方式。(1)命令方式要建立或者修改一个程序文件,可使用MODIFY命令。其格式是: MODIFY COMMAND <文件名>|? MODIFY FILE <文件名>|?其中<文件名>指明要建立或者修改的

6、文件。如果省略文件名,编辑窗口会打开名为untitled.prg的文件。当关闭窗口时出现对话框,要求输入文件名。若使用?,则显示“打开”对话框。在此框中,用户可以选择一个已存在的文件或者输入要建立的新文件名。如果没有给文件指定扩展名,则MODIFY COMMAND默认为.prg,而MODIFY FILE却默认为空,所以使用MODIFY FILE建立程序文件时文件名必须带扩展名.prg。(2)菜单方式l 选择“文件”菜单中的“新建”命令,并选择“程序”单选按钮,并单击“新建文件”命令按钮。在文本编辑窗口输入程序内容。l 打开文本编辑窗口后,就可以一条一条地输入命令。在输入过程中出现错误,可用编辑

7、命令进行修改。l 当程序建立或修改完毕后,可用Ctrl+W或Ctrl+End存盘,退出编辑窗口。l 要修改程序文件,选择“文件”菜单中的“打开”命令打开文件即可。2. 执行程序 使用DO命令执行一个Visual FoxPro程序文件或其它文件。命令格式为: DO <文件名> 如果文件名不带扩展名,则Visual FoxPro按下列顺序寻找并执行:可执行文件(.EXE)、应用程序(.app)、编译后的目标程序文件(.fxp)和程序文件(.prg)。9.2 顺序结构程序9.2.1 程序文件中的辅助命令1.程序注释命令 Visual FoxPro中有两种程序注释命令。 命令格式: NOT

8、E|* 注释 && 注释第一个命令在程序中加注释行信息。执行程序文件时,不执行以NOTE或*开头的行。如果要在下一行继续注释,可在本注释行尾加上一个分号;,或者直接回车再另用一个注释命令。第二个命令在命令语句的尾部加注释信息。2常用状态设置命令 (1)置会话状态命令 命令格式: SET TALK ON|OFF (2)置打印状态命令 命令格式: SET PRINT ON|OFF (3)置屏幕状态命令 命令格式: SET CONSOLE ON|OFF (4)置缺省驱动器和目录命令 命令格式: SET DEFAULT TO 盘符:路径9.2.2 交互式输入命令1. 字符串接收命令 字

9、符串接收命令显示提示信息,等待用户从键盘输入一个字符串并按回车键后,存入指定的内存变量中。命令格式为: ACCEPT <提示信息> TO <内存变量> 其中<提示信息>可以是字符型内存变量、字符串常量或合法的字符表达式。输入的数据不需要用定界符括起来,ACCEPT命令总是将它作字符型数据处理。例 在学生表中,按学号查询学生的姓名和入学成绩。 CLEAR SET TALK OFF USE 学生 ACCEPT "请输入待查学生的编号:" TO bh1 LOCATE FOR 学号=bh1 DISP 学号,姓名,入学成绩 USE SET TALK

10、 ON RETURN 若输入的编号在学生表中不存在,程序并未反应,因此程序需进一步完善。2. 任意数据输入命令 命令格式: INPUT <提示信息> TO <内存变量> 该命令不仅可以接收字符型数据,还可以接收数值型、日期型和逻辑型表达式的值。其中,对于字符串的输入必须用定界符括起来,输入数值或表达式,不加任何定界符;输入日期型数据,除使用日期型的格式外,还要用大括号将其括起来。例如 INPUT "请输入一个数值表达式:" TO num INPUT "请输入一个日期:" TO dat 执行情况如下: 请输入一个数值表达式:98/1

11、0/10 请输入一个日期:1998-10-103. 单个字符接收命令 命令格式: WAIT <提示信息> TO <内存变量> WINDOW NOWAIT TIMEOUT <数值表达式> 暂停程序执行,等待用户键入任何一个字符后继续。 使用说明:l 当命令中包括TO <内存变量>可选项时,则定义一个字符型内存变量,并将键入的一个字符存入该变量中。l 若只按回车键,则在内存变量中存入的内容将是一个空字符。l 若包含提示信息,则在屏幕上显示提示信息的内容;若没有该选择项,则显示系统默认的提示信息: Press any key to continuel

12、如果选择WINDOW,命令执行时,在Visual FoxPro主窗口左上角会出现一个提示信息窗口,显示提示信息。l 如果选择NOWAIT,则WAIT命令并不会暂停程序的执行,而是仅在Visual FoxPro主窗口的左上角提示窗口中显示提示信息。l TIMEOUT子句用于指定WAIT命令等待的时间。l WAIT只需用户按一个键,而不像INPUT或ACCEPT命令需要用回车键确认输入结束。因此,WAIT命令的执行速度快,常用于等待用户对某个问题的确认。9.2.3 格式输入输出命令的基本形式Visual FoxPro提供了格式输入输出命令,这里先介绍其基本用法。1格式输出命令的基本形式 命令格式:

13、 <行,列> SAY <表达式> 命令在指定位置输出表达式的值。 使用说明: (1) <行,列>指定了输出的位置。标准屏幕是25行80列,左上角顶点为(0,0),右下角坐标为(24,79)。 (2) 行、列都可为表达式,还可为小数。2格式输入命令的基本形式 命令格式: <行,列> SAY <提示信息> GET <变量> READ SAVE CYCLE TIMEOUT <等待时间> 命令用READ命令来激活当前所有的GET变量,显示并允许修改变量的值。 使用说明: (1) SAY子句用于显示提示信息,GET子句用

14、于为变量输入新值。 (2) GET子句中的变量必须有确定的初值。初值决定了该变量的类型和宽度。例如: name=SPACE(8) 5,10 SAY "请输入学生姓名" GET name && name的宽度为8个字符 READ(3) 激活CET变量是指使该变量进入编辑状态,让光标自动跳到该变量值所在位置上等待编辑修改。若有多个GET变量,则它们将依次被激活(其中无须修改的变量可按回车键越过),直至最后一个GET变量处理结束后,READ命令的作用才终止。如果在READ命令中使用了CYCLE可选项,则在编辑最后一个GET变量后,又回过去重新激活第一个GET变量,

15、如此不断地循环,直至按Ctrl+W(保存编辑内容)或按Esc(舍弃编辑内容)或执行命令CLEAR READ。 READ命令使用TIMEOUT子句来约束执行命令的等待时间(以秒为单位),若超过了预定的等待时间却还没有输入数据,则将中断READ的执行。 (4) 一般说来,已被激活过的GET变量便被清除,但若在READ命令中带有可选项ASVE,就不做清除工作,当遇到下一个READ命令时,这些GET变量将被再一次激活。9.3选择结构程序设计9.3.1 双分支选择语句 语句格式: IF <条件> <命令组1> ELSE <命令组2> ENDIF使用说明: (1) 选择

16、语句只能在程序中使用,正因为只能在程序中使用,我们称之为语句,而不叫作命令。以后其它语句也是这样。 (2) IF、ELSE、ENDIF必须各占一行。每一个IF都必须有一个ENDIF与其对应,即IF和ENDIF必须成对出现。 (3) <条件>可以为关系表达式、逻辑表达式或其它逻辑量。 (4) 命令组1或命令组2中可以包含IF语句,即IF语句可以嵌套。例 根据输入的学生姓名,在学生表中查找学生记录 SET TALK OFF USE 学生 name=space(8) 10,5 SAY "请输入学生姓名:" GET name READ LOCATE FOR 姓名=nam

17、e &&在学生表中查找记录 IF FOUND() &&判断是否找到。 DISPLAY &&找到,显示该记录 ELSE 12,5 SAY "对不起,该单位无此人!" ENDIF SET TALK ON USE RETURN9.3.2 多分支选择语句 语句格式: DO CASE CASE <条件1> <命令组1> CASE <条件2> <命令组2> OTHERWISE <命令组n> ENDCASE执行过程:在执行DO CASE语句时,依次判断各<条件>是否满足

18、,若<条件>满足,就执行该条件后的命令组,直到遇到下一个CASE、OTHERWISE或ENDCASE。命令组执行后不再判断其他条件,而转向执行ENDCASE后面的第一条命令。所以在一个DO CASE结构中,最多只能执行一个CASE语句。如果没有一个<条件>满足,就执行OTHERWISE后面的命令组,直到ENDCASE。如果没有OTHERWISE,则不作任何操作就转向ENDCASE之后的第一条命令。例 在学生表中,查询“周文杰”的记录,根据其性别和年龄确定参加运动会的项目。 SET TALK OFF USE 学生 LOCATE FOR 姓名="周文杰"

19、 IF .NOT.EOF() DO CASE CASE 性别="男" ? "请参加拔河比赛" CASE 性别="女" AND YEAR(DATE()-YEAR(出生日期)>25 ? "请参加投篮比赛" CASE 性别="女" AND YEAR(DATE()-YEAR(出生日期)<=23 ? "请参加1500米比赛" ENDCASE ELSE ? "该单位无此人" ENDIF SET TALK ON RETURN9.4 循环结构程序9.4.1 D

20、O WHILE循环 语句格式: DO WHILE <条件> <命令组> EXIT LOOP ENDDO执行过程: 当给定的条件满足时,执行DO WHILE和ENDDO之间的命令组。命令组执行完毕后,程序自动返回到DO WHILE语句,再一次判断DO WHILE语句中的<条件>。如果<条件>仍然满足,则再执行一遍命令组,如果<条件>不满足,则结束循环,转去执行ENDDO之后的命令。 EXIT控制从循环体内跳出,转去执行ENDDO后的第一条命令,可把EXIT放在循环体的任何地方。因此EXIT被称为无条件结束循环命令,只能在循环结构中使用。

21、 LOOP控制直接转回到DO WHILE语句,而不执行LOOP和ENDDO之间的命令。因此LOOP称为无条件循环命令,只能在循环结构中使用。例 逐条输出学生表中1984年出生的学生的记录。CLEARUSE 学生INDEX ON YEAR(出生日期) TAG csrqsySEEK 1984DO WHILE YEAR(出生日期)=1984 DISPLAY SKIPENDDOUSERETURN例 求1100之间全部奇数之和 SET TALK OFF STORE 0 TO x,y DO WHILE .T. x=x+1 DO CASE CASE INT(x/2)=x/2 LOOP CASE x>=

22、100 EXIT OTHERWISE y=y+x ENDCASE ENDDO ? "0100之间的奇数之和为:",y SET TALK ON RETURN9.4.2 FOR循环 语句格式: FOR <循环变量>=<初值> TO <终值> STEP <步长值> <命令组> EXIT LOOP执行过程: 首先计算初值、终值和步长值,并将初值赋给循环变量,再将循环变量的值与终值比较,如果循环变量的值在初值与终值范围内,则执行FOR与ENDFOR之间的命令,然后循环变量按步长值增加或减小,再重新比较,直到循环变量的值不在初

23、值与终值范围内,结束循环,转去执行ENDFOR后面的第一条命令。使用说明: (1) FOR、ENDFOR|NEXT必须各占一行,且它们必须成对出现。 (2) 循环变量可以是一个内存变量或数组元素。如果在FORENDFOR之间改变循环变量的值,将影响循环执行的次数。 (3) <初值>、<终值>和<步长值>均为数值型表达式。如果省略STEP子句,则默认步长值是1。 (4) 退出循环后,循环变量的值等于最后一次循环时的值为加上步长值。 (5) LOOP语句和EXIT语句的功能与前面的当型循环语句相同。9.4.3 SCAN循环 语句格式: SCAN <范围&g

24、t; FOR <条件> WHILE <条件> <命令组> EXIT LOOP ENDSCAN执行过程: 首先将表记录指针移动到指定范围内的第一条记录上,然后判断记录指针是否超过指定范围以及该记录是否满足WHILE子句所描述的条件,若记录指针超过指定范围或该记录不满足WHILE子句所描述的条件,则结束扫描循环,执行ENDSCAN后面的语句。若记录指针未超过指定范围且该记录满足WHILE子句所描述的条件,则判断该记录是否满足FOR子句所描述的条件,若不满足,记录指针移到下一条记录,进行下一轮循环判断,否则执行命令组后,记录指针下移一条记录,再进行下一轮循环判断。

25、使用说明: (1) 对指定范围内满足条件的记录执行命令组。若省略范围,则默认为ALL。 (2) SCAN语句自动把记录指针移向下一个符合指定条件的记录,并执行同样的命令组。 (3) LOOP语句和EXIT语句的功能与前面的当型循环语句相同。例 对学生表,分别统计少数民族男、女学生的人数。 CLEAR STORE 0 TO x,y USE 学生 SCAN FOR 少数民族否 IF 性别="男" x=x+1 ELSE y=y+1 ENDIF ENDSCAN ? "少数民族男生有:"+STR(x,2)+"人" ? "少数民族女生有

26、:"+STR(y,2)+"人" USE RETURN9.4.4 程序举例 例 某集团公司下属6个分公司,各分公司均已建立了各自的人事档案表,表结构相同,表文件名分别为rsda1.dbf、rsda2.dbf、rsda6.dbf。现要求统计各公司会计师、经济师和其他人员的人数。 SET TALK OFF FOR k=1 TO 6 db="rsda"+SUBSTR(STR(k),10,1) USE &db STORE 0 TO x,y,z SCAN DO CASE CASE 职称="会计师" x=x+1 CASE 职称=&

27、quot;经济师" y=y+1 OTHERWISE z=z+1ENDCASE ENDSCAN ? "第"+STR(k,1)+"分公司会计师有"+STR(x,3)+"名" ? "第"+STR(k,1)+"分公司经济师有"+STR(y,3)+"名" ? "第"+STR(k,1)+"分公司其他人员有"+STR(z,3)+"名" ENDFOR SET TALK ONRETURNCLEAR* 定义数组并输入数据INP

28、UT 'm=' TO mINPUT 'n=' TO nDIMENSION da(m,n)FOR i=1 TO m FOR j=1 TO n INPUT 'da('+STR(i,2)+','+STR(j,2)+')=' TO da(i,j)ENDFORENDFOR* 处理num=0 &&存放共有多少个元素符合条件FOR i=1 TO m &&考虑每一行 FOR j=1 TO n &&考虑i行的每个元素 FOR k=1 TO n &&判断当前元素是否在所在

29、行上最大IF da(i,j)<da(i,k) EXIT ENDIF ENDFOR IF k<=n &&若当前元素不是最大,考虑下一个元素 LOOP ENDIF FOR p=1 TO m &&判断当前元素是否在所在列上最小 IF da(i,j)>da(1,j) EXIT ENDIF ENDFORIF p<=m &&若当前元素不是最小,考虑下一个元素 LOOP ENDIF ? 'da('+STR(i,2)+','+STR(j,2)+')=',da(i,j) num=num+1 E

30、NDFORENDFOR? '共有'+STR(num,2)+'个元素符合条件'RETURN9.5 程序的模块化9.5.1 子程序、过程和函数1.子程序 (1)子程序的结构。在Visual FoxPro程序文件中,可以通过DO命令调用另一个程序文件,此时,被调用的程序文件就称为子程序。子程序的结构与一般的程序文件一样,而且也可以用MODIFY COMMAND命令来建立、修改和存盘,扩展名也默认为.PRG。 子程序和其他程序文件的惟一区别是其末尾或返回处必须有返回语句。命令格式: RETURN TO MASTER|TO <程序文件名>|<表达式>

31、; 命令功能: 中止一个程序、过程或用户定义函数的执行,返回到上一级调用程序、最高级调用程序、另外一个程序或者命令窗口。使用说明: 若程序是被另一个程序调用的,遇到RETURN时,则自动返回到上级调用程序。如果是在最高一级主程序中,遇到RETURN时,则返回到命令窗口。 选用TO MASTER子句时,则返回到最高一级调用程序,即在命令窗口下,调用的第一个主程序。 在程序最后,如果没有RETURN命令,则程序运行完后,将自动默认执行一个RETURN命令,但过程文件除外。执行RETURN命令时,释放本程序所建立的局部变量,恢复用PRIVATE隐藏起来的内存变量。 TO <程序名>表示将

32、控制权交给指定的程序。RETURN <表达式>表示将表达式的值返回调用程序,用于自定义函数。(2) 子程序的调用。子程序调用命令与主程序执行命令相同,其格式都为: DO <程序文件名>|<过程名> WITH <参数表>其中,WITH <参数表>子句指定传递到程序或过程的参数,在<参数表>中列出的参数可以是表达式、内存变量、常量、字段名或用户定义函数。可把参数放在圆括号中,各参数用逗号分隔。传递给一个程序的参数最多为24个。(3) 子程序的嵌套调用。主程序可以调用子程序,子程序还可以调用另外的子程序,这就是子程序的嵌套调用。

33、实际上,子程序和主程序都是相对的,任何一个程序可以调用其它程序,也可以被其他程序调用。每个被调用程序的末尾或返回处都要加上RETURN命令。l 一个程序或子程序遇到调用子程序命令就转去执行子程序,而本程序的余下部分要等从子程序返回后才得以继续执行。l 如果在某一个子程序的RETURN命令中使用TO MASTER短语,则从此子程序直接返回到第一级主程序,其间子程序DO命令以下的命令均不执行。l 在主程序中也可以使用RETURN命令,它将清除内存变量,使程序退回到命令窗口。RETURN命令也可以作为每个程序的结束标志。2.自定义函数(1)自定义函数的结构。一个自定义函数实际上就是一个子程序,惟一的

34、差别是在RETURN语句后带有表达式,以指出函数的返回值。 自定义函数的格式: FUNCTION <函数名> PARAMETERS <参数表> <命令组> RETURN <表达式>使用说明: 若不写FUNCTION <函数名>选项,则表明该自定义函数是一个独立的程序文件。若写上该选项,则表明该自定义函数不能作为一个独立的程序文件,而只能放在某程序中。 如果自定义函数名与Visual FoxPro的内部函数名相同,系统只承认内部函数,因此不能用内部函数名来命名自定义函数。 若自定义函数中包含自变量,程序的第一行必须是参数定义命令PARA

35、METERS。自定义函数除了可以作为一个函数被其它程序调用外,还可用DO <文件名>的形式来执行,在这种情况下,它不是作为函数,而是作为程序或过程来运行,它的RETURN语句中的<表达式>相应地不起作用。 自定义函数的数据类型取决于RETURN语句中<表达式>的数据类型。如果省略<表达式>,则返回.T.。(2)自定义函数的调用。自定义函数的调用形式是: <函数名>(<自变量表>) 其中,自变量可以是任何合法的表达式,自变量的个数必须与自定义函数中PARAMETERS语句里的变量个数相等,自变量的数据类型也应符合自定义函数的

36、要求。例 定义一个判断n是否素数的函数,然后调用该函数求21000内的全部素数。 *prime.prg判断n是否素数的函数 PARAMETERS n flag=.T. k=INT(SQRT(n) j=2 DO WHILE j<=k .AND. flag IF MOD(n,j)=0 flag=.F. ENDIF j=j+1 ENDDO RETURN flag *main.prg调用该函数求21000内的全部素数 FOR m=2 TO 1000 IF prime(m) ? m ENDIF ENDFOR CANCEL3过程与过程文件(1)过程的结构。过程的一般格式是: PROCEDURE &l

37、t;过程名> PARAMETERS <参数表> <命令组> RETURN使用说明:每一个过程均以PROCEDURE开始,以RETURN结束。每个过程实际上是一个独立的子程序或一个用户定义函数。PROCEDURE <过程名>用于过程的第一条语句,它标识了每个过程的开始,同时定义了过程名。过程如果以RETURN <表达式>作为结束语句,那么该过程既可用DO <过程名>的形式执行,又可当做一个合法的自定义函数,可供随时调用。例 使用带传递参数的过程调用方式计算三角形面积。 SET TALK OFF area=0 STORE .T. T

38、O rep DO WHILE rep CLEAR INPUT "请输入第一边大小:" TO x INPUT "请输入第二边大小:" TO y INPUT "请输入第三边大小:" TO z IF x=0.OR.y=0.OR.z=0.OR.x+y<=z.OR.y+z<=x.OR.x+z<=y ? "不能够成一个三角形,请重新输入!" LOOP ENDIF rep=.F. ENDDO DO sub WITH x,y,z,area ? "Area="+STR(area,6,2) RET

39、URN PROCEDURE sub PARAMETER a,b,c,s p=(a+b+c)/2 s=SQRT(p*(p-a)*(p-b)*(p-c) RETURN(2)过程文件。一个过程可以以文件形式单独存在,也可以将多个过程合并到一个文件中,这个文件称为过程文件。在过程文件中,每个过程仍然是独立的,可以单独调用。 由于过程文件是将许多过程集中起来以一个文件的形式存储在磁盘上的,当打开一个过程文件时,该过程文件中的所有过程即同时被打开,关闭一个过程文件时,过程文件中的所有过程也同时被关闭,从而大大减少访问磁盘的次数,提高程序运行速度。 过程文件也是程序文件,同其它程序文件一样,可以用MODIF

40、Y COMMAND命令或其它文字编辑软件进行编辑。例 假设有三个过程:p1,p2,p3,把它们组织到过程文件proc.prg中。 * proc.prg过程文件 PROCEDURE p1 ? "过程p1" RETURN PROCENURE p2 ? "过程p2" RETURN PROCEDURE p3 ? "过程p3" RETURN(3)过程文件的打开与关闭。在过程文件被打开之前,过程文件中所包含的过程是不能被任何程序调用的,因此,在调用过程前,先要打开过程文件。命令格式: SET PROCEDURE TO <过程文件名>

41、命令功能: 打开一个过程文件。使用说明: 任一时刻只能有一个被打开的过程文件,因此,每次打开过程文件时自动关闭先前打开的过程文件。过程文件被打开后,它所包括的过程便可被其它程序调用。调用时与子程序一样,仍使用DO命令。 打开过程文件命令在主程序中使用,一般应放在程序的前部,循环的外面,至少应放在调用过程文件中的过程命令之前。 也可把打开过程文件的主程序与过程合在一起,组成一个磁盘文件。但主程序必须在文件中的开始位置,这样才能在主程序中直接调用过程。 过程文件使用完后,要及时关闭,以释放它们占用的内存空间。关闭过程文件可以使用下列两条命令: SET PROCEDURE TO CLOSE PROC

42、EDURE9.5.2 内存变量的作用域1. 全局内存变量 全局内存变量是指在上、下各级程序中都有效的内存变量。全局变量就像在一个程序中定义的变量一样,可以任意改变和引用,当程序执行完后,其值仍然保存。若欲清除这种变量,必须用RELEASE命令。定义全局变量需用下面的命令。命令格式1: PUBLIC <内存变量表>|ALL|ALL LINK <通配符>|ALL EXCEPT <通配符>命令格式2: PUBLIC ARRAY <数组名>(<下标上界1>,<下标上界2>),<数组名>(<下标上界1>,&l

43、t;下标上界2>),命令功能: 定义全局内存变量或数组。使用说明: <内存变量表>中可以包含普通变量,也可以包含数组变量。 任何全局内存变量或数组必须先定义,后赋值。反之,如果程序中已给一个内存变量或数组赋值,或者已用DIMENSION建立了数组,再用PUBLIC将其定义为全局变量或数组将产生错误。 定义后尚未赋值的全局变量其值为逻辑值.F.。 使用ALL选择项时,定义所有内存变量;使用ALL LINK <通配符>时,定义所有变量名与<通配符>匹配的内存变量;使用ALL EXCEPT <通配符>时,定义所有变量名不与<通配符>匹

44、配的内存变量。<通配符>中允许用?和*。全局变量在程序结束时不释放,即使主程序也是这样。 当进入下一级子程序时,已在上级由PUBLIC说明过的与之同名的内存变量可以用PRIVATE命令暂时隐藏起来,作为本级程序的局部变量使用。待本级子程序结束返回上一级程序后,便释放它们作为本级程序的局部变量特性,恢复它们全局变量的特性和内容。 在命令窗口中建立的所有内存变量或者数组自动定义为全局型。 命令格式2可以定义数组,其规则与DIMENSION命令相同。2局部内存变量 局部内存变量只能在定义它的程序及其下级程序中使用,一旦定义它的程序运行结束,它便自动被清除。也就是说,在某一级程序中定义的局

45、部变量,不能进入其上级程序使用,但可以到其下级程序中使用,而且当在下级程序中改变了该变量的值时,在返回本级程序时被改变的值仍然保存,本级程序可以继续使用改变后的变量值。例 分析下列程序的执行情况 *主程序main.prg r=100 DO sub ? p RETURN *子程序sub.prg p=2*3.14*r RETURN3隐藏内存变量命令格式: PRIVATE <内存变量表>|ALL|ALL LIKE <通配符>|ALL EXCEPT <通配符>命令功能: 隐藏当前程序中指定的内存变量或数组。使用说明: <内存变量表>指出需要隐藏的内存变量

46、。 对PRIVATE中内存变量的修改并不影响上级程序中与之同名的内存变量的值。此命令只对本级程序及以下各级子程序有效,当返回到上级程序时,被PRIVATE隐藏的当前程序中的内存变量自动被删除。 在它们被隐藏期间,程序就不能再调用这些被隐藏的上级内存变量,但实际上它们仍然存在,一旦含有PRIVATE内存变量的程序结束后,被PRIVATE隐藏起来的哪些以前建立的同名的上级内存变量自动恢复以前的内容和状态。例 写出下列程序的输出 r=100 p=10 DO sub ? p RETURN PROCEDURE sub PRIVATE p p=2*3.14*r RETURN9.5.3 调用子程序时的数据传

47、递1利用变量的作用域实现数据传递合理地利用前面介绍的内存变量作用域特性,可以实现调用子程序时的数据传递。例 计算矩形面积的程序。 * main.prg主程序 gao=8 kuan=6 c=0 DO sub ? c CANCEL * sub.prg子程序 c=gao*kuan RETURN2利用参数实现数据传递 命令格式: PARAMETERS <内存变量表> 命令功能: 指定子程序中的局部变量名,并由这些局部变量接收上级程序中用DOWITH <参数表>传递来的参数,将其依次赋给<内存变量表>中的各局部变量,也可以回送子程序运行的结果。 充当传递数据的主程序中

48、的内存变量也称作实际参变量。子程序PARAMETERS中与之相对应的参变量称形式参变量。使用说明: (1) 该命令必须放在本级程序的首行。 (2) 必须和DOWITH配合使用。<内存变量表>中变量的个数要与上级程序中的WITH <参数表>中的参数个数相同。各变量用逗号分隔,最多能传递24个参数。 (3) 变量类型自动与上级程序中的参数相匹配。(4) 参数传递有两种方式:值传递和地址传递。如果使用值传递方式,则子程序中参数变化后的值不回传给上级调用程序。如果使用地址传递方式,则子程序中参数变化后的值要回传给上级调用程序。常量和表达式只能使用值传递方式,内存变量既可以使用值

49、传递方式,又可以使用地址传递方式。使用值传递方式的变量要用括号括起来,使用地址传递方式的变量不加括号。如果不允许子程序改变传递参数变量的值,应该使用值传递方式。如果允许子程序改变传递参数变量的值,则要使用地址传递方式。(5) 在自定义函数中,仍然使用PARAMETER语句接收上级调用程序传递来的参数。不过,在自定义函数中,默认的参数传递方式是值传递方式。要改变参数的传递方式,需要使用命令: SET UDFPARMS TO VALUE|REFERENCE 该命令用于设置参数传递方式。选择VALUE,按值传递方式传递参数,选择PREFERENCE,按地址传递方式传递参数。例 写出下列程序的输出 S

50、ET TALK OFF x=1 y=3 DO sub WITH x,(y),5 ? x,y RETURN PROCEDURE sub PARAMETER a,b,c a=a+b+c b=a+b-c RETURN9.6 程序调试程序调试就是确定程序出错的位置,然后加以改正,一直到达到预定的设计要求为止。程序调试往往是先分模块调试,当各模块都调试通过以后,再联合起来进行调试,通过联调后,便可试运行,试运行无误即可投入正常使用。9.6.1 程序调试概述程序的错误有两类:语法错误和逻辑错误。语法错误相对容易发现和修改,当程序运行遇到这类错误时,Visual FoxPro会自动中断程序的执行,并弹出编辑

51、窗口,显示出错的命令行,给出出错信息,这时可以方便地修改错误。逻辑错误就不那么容易发现了,这类错误系统是无法确定的,只有由用户自己来查错。这时往往需要跟踪程序的执行,在动态执行过程中监视并找出程序中的错误。9.6.2 调试器窗口选择“工具”菜单中的“调试器”命令或在命令窗口输入DEBUG命令,系统打开调试器窗口。在Visual FoxPro调试器窗口中,选择“窗口”菜单中的相应命令可有选择地打开5个子窗口:跟踪、监视、局部、调用堆栈和调试输出。要关闭子窗口,只需单击窗口右上方的关闭按钮。1. 跟踪窗口 跟踪窗口用于显示正在调试执行的程序文件。要打开一个需要调试的程序,可从调试器窗口的“文件”菜

52、单中选择“打开”命令,然后在打开的对话框中选定所需的程序文件。被选中的程序文件将显示在跟踪窗口里,以便调试和观察。跟踪窗口左端的灰色区域会显示某些符号,常见的符号及其意义如下:_:指向调试中正在执行的代码行。:断点。可以在某些代码行处设置断点,当程序执行到该代码行时,中断程序执行。可以控制跟踪窗口中的代码是否显示行号,方法是:在Visual FoxPro系统“选项”对话框的“调试”选项卡中选择“跟踪”单选按钮,然后设置“显示行号”复选框。2. 监视窗口监视窗口用于监视指定表达式在程序调试执行过程中的取值变化情况。要设置一个监视表达式,可单击窗口中的“监视”文本框,然后输入表达式的内容,按回车键后表达式便添入文本框下方的列表框中。当程序调试执行时,列表框内将显示所有监视表达式的名称、当前值及类型。双击列表框中的某个监视表式就可对它进行编辑。右键单击列表框中的某个监视表达式,然后在弹出的快捷菜单选择“删除监视”可删除一个监视表达式。在监视窗口中可以设置表达式类型的断点。3. 局部

温馨提示

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

评论

0/150

提交评论