940 likes | 1.12k Views
第六章 结构化程序设计. 本 章 目 录. 第一节 程序文件 第二节 程序的基本结构 第三节 程序的模块化 第四节 程序调试. Visual FoxPro 的工作方式. Visual FoxPro 系统提供有三种工作方式:即单命令方式、菜单方式及程序文件方式。 1.单命令方式 Visual FoxPro 单命令方式是利用 Command 窗口来实现的。用户通过 Command 窗口输入命令,并执行操作。在 Command 窗口中,可以输入单个的操作命令和系统命令,完成对数据库的操作管理和系统环境的设置;也可以建立命令文件及运行命令文件。
E N D
本 章 目 录 • 第一节 程序文件 • 第二节 程序的基本结构 • 第三节 程序的模块化 • 第四节 程序调试
Visual FoxPro的工作方式 Visual FoxPro系统提供有三种工作方式:即单命令方式、菜单方式及程序文件方式。 1.单命令方式 Visual FoxPro单命令方式是利用Command 窗口来实现的。用户通过Command 窗口输入命令,并执行操作。在Command 窗口中,可以输入单个的操作命令和系统命令,完成对数据库的操作管理和系统环境的设置;也可以建立命令文件及运行命令文件。 Command 窗口不仅是Visual FoxPro命令的执行窗口,也是Visual FoxPro命令文件的编辑窗口。 所谓单命令方式,即输入一条命令,完成一个操作的工作方式。
2.菜单方式 在Visual FoxPro 环境下,也可以通过系统提供的菜单选项,对数据库资源进行操作管理和对系统环境进行设置;并通过菜单建立命令文件及运行命令文件。所谓菜单方式,即通过打开不同的菜单选择并完成不同的操作。我们在以前各章所讲的内容其实都可说是菜单方式。 3.程序文件方式 程序文件(简称程序)也叫做命令文件。运用程序文件方式进行数据库管理,是通过程序文件编辑工具,将对数据库资源进行操作管理的命令和对系统环境进行设置的命令,集中在一个以(.PRG)为扩展名的命令文件中,然后再通过菜单方式或命令方式运行该命令文件。所谓命令方式,即通过程序文件中的命令完成不同的操作。
第一节 程序文件 一、Visual FoxPro程序的几点说明 1.注释语句 【格式1】NOTE <注释内容> 【格式2】* <注释内容> 【格式3】&& <注释内容> 【功能】增强程序文件的易读性或放弃<注释内容>中语句的执行 2.对话开关语句 【格式】SET TALK OFF|ON 【功能】关闭或打开命令执行时的对话开关 3.命令的分行 Visual FoxPro程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符“;”,再按回车键。
二、程序文件的建立、修改与执行 1.建立或修改程序文件 可用以下方式调用系统内置的文本编辑器建立或修改程序文件 : 1)命令方式: MODIFY COMMAND [<盘符>] [<路径>]〈程序文件名〉 或 MODIFY FILE [<盘符>] [<路径>]〈程序文件名〉 2)菜单方式: 打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”
3)项目管理器: 选定项目管理器“代码”选项卡中的“程序”项,选择“新建”命令。 2.保存程序文件 程序输入、编辑完毕,单击【文件】|【保存】菜单项,或按Ctrl+W复合键,在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”按钮保存程序文件并退出文本编辑器。程序文件的默认扩展名是.PRG。
3.执行程序文件 程序文件建立后,可以用多种方式、多次执行它。 下面是两种常用的方式。 1)菜单方式 ① 单击【程序】|【运行】菜单项,打开“运行”对话框; ② 从文件列表框中选择要运行的程序文件,并单击“运 行”命令按钮,启动运行该程序文件 2)命令方式 【格式】DO [<盘符>][<路径>]<文件名> 【功能】执行指定<盘符>、<路径>下的程序文件 当程序文件被执行时,文件中包含的命令将被依次执行,直到所有命令被执行完毕,或者执行到以下命令:
执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令:执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令: (1) CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口; (2) RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口; (3) QUIT:结束程序执行并退出Visual FoxPro系统,返回操作系统 (4) DO <程序文件名>: 转去执行另一个程序。 3)项目管理器 若程序包含在一个项目中,则在项目管理器中选定它并选择“运行”命令。
第二节 程序的基本结构 Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。 Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。
一、结构化程序设计基础 1.原则和方法 结构化程序设计是一种程序设计方法,其设计原则和方法是:自顶向下,逐步求精,程序结构模块化。 2.基本结构 结构化程序由若干基本结构组成,每一个基本结构可以包含一个或多个命令,它们有以下三种基本结构。 (1)顺序结构,如图6-1所示,该结构先执行A操作,再执行B操作。 图6-1 顺序结构流程图 图6-2 分支结构流程图
(2)分支结构:如图6-2所示,该结构中P代表一个条件,当条件P成立时执行A操作,否则执行B操作。 (3)循环结构:循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。该结构有以下两种形式: ① 当型循环结构,如图6-3所示。 ② 直到型循环结构,如图6-4所示 。 图6-3 当型循环结构流程图形 图6-4 直到型循环结构流程图
(4)过程结构 在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不在一个固定的位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样做增强了程序的可读性和模块化。我们称这种具有独立功能而且可以被其它程序调用的程序序列为过程。
3.使用结构化程序设计的优点 (1)可读性强:每个模块功能明确、模块间的关系简单、 清晰。 (2)独立性好:每个模块内部的修改尽可能不影响其它 模块。 (3)易验证:每个模块的正确性容易验证,各模块连接 起来后,整个程序也便于验证。
二、 交互式命令 1.输入字符串语句ACCEPT 【格式】ACCEPT [<提示信息>] TO <内存变量> 【功能】在程序执行过程中,将用户交互式输入的内 容作为字符串赋值给指定内存变量。 【说明】该命令只接受字符型数据,输入的字符串不 需要加定界符 。
【例6-2】编程从键盘输入某数据库的文件名,要求打开该数据库并显示其内容。程序文件名为PROG2.PRG。【例6-2】编程从键盘输入某数据库的文件名,要求打开该数据库并显示其内容。程序文件名为PROG2.PRG。 MODI COMMAND PROG2 SET TALK OFF CLEAR ACCEPT “请输入数据库名:”TO AAA OPEN DATABASE &AAA ACCEPT "请输入表名" TO BBB USE &BBB LIST USE SET TALK ON RETURN
2.INPUT命令 【格式】INPUT [<提示信息>] TO <内存变量> 【功能】在程序执行过程中,将用户交互式输入的内 容赋值给指定内存变量。 【说明】可以输入字符型、数值型、逻辑型、日期型 和日期时间型等类型数据,而且可以是常量、 变量、函数或表达式等形式,按回车键结束 输入,系统将输入的数据赋值给<内存变量>。
【例6-4】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。程序文件名为PROG4.PRG【例6-4】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。程序文件名为PROG4.PRG SET TALK OFF CLEAR INPUT “长方形一边的长为:” TO A INPUT “长方形另一边的长为:” TO B S=A*B ? “长方形的面积为:” , S SET TALK ON RETURN
3.WAIT命令 【格式】WAIT [<提示信息>][TO<内存变量>] [WINDOW [AT<行>,<列>]] [NOWAIT] [CLEAR|NOCLEAR] [TIMEOUT<数值表达式>] 【功能】显示提示信息,暂停程序执行,直到用户按任意 键或单击鼠标时继续执行程序。 【说明】若选择可选项[TO <内存变量>],将输入的单个 字符作为字符型数据赋给指定的<内存变量>; 若用户是按Enter键或单击鼠标,<内存变量>的 值为空串。 若省略所有可选项,屏幕显示“键入任意键继 续……”默认提示信息。
【例6-6】在STUDENT数据库的STUD表中显示任意一个系学生的情况。程序文件名为PROG6.PRG【例6-6】在STUDENT数据库的STUD表中显示任意一个系学生的情况。程序文件名为PROG6.PRG SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD WAIT “请输入待查学生的系号(1—3):”TO N IF VAL(N)<1 .OR. VAL(N)>3 WAIT “输入无效,结束程序运行!”WINDOW TIMEOUT 5 RETURN ELSE STORE “0”+N TO AAA LIST FOR 系别号=AAA ENDIF CLOSE DATABASE SET TALK ON RETURN
4.三条输入命令的异同 ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束。 WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键。 INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。
5.编辑修改变量语句 【格式】@<行号,列号> [SAY “提示信息”] [GET<变量>] READ 【功能】在屏幕上或窗口中指定的坐标位置对内存变量 (它已预先赋值)或表中当前记录的字段名变量进 行编辑修改。 【说明】 @…GET语句必须与编辑修改语句READ一起使用 才有意义。当执行READ语句时,系统将光标移到 @…GET的变量位置,这时如果从键盘上键入新的 数据,则变量中原来的数据被取代
【例6-7】建立程序文件,要求通过程序方式在“读者”表中添加一条新记录,程序文件名为PROG7.PRG。【例6-7】建立程序文件,要求通过程序方式在“读者”表中添加一条新记录,程序文件名为PROG7.PRG。 CLEAR USE 读者 APPEND BLANK @ 2, 8 SAY "读者基本情况输入界面:" @ 4,10 SAY "读者编号:" GET 读者编号 @ 6,10 SAY "读者姓名:" GET 姓名 @ 8,10 SAY "读者性别:" GET 性别 @ 10,10 SAY "出生日期:" GET 出生日期 @ 12,10 SAY "少数民族否:" GET 少数民族否 @ 14,10 SAY "籍贯" GET 籍贯 READ USE
【例6-8】编写程序文件PROG8.PRG ,修改读者表中第三条记录的姓名和籍贯两个字段。 SET TALK OFF USE 读者 GO 3 @2,20 SAY “姓名”GET 姓名 @4,20 SAY "籍贯" GET 籍贯 READ DISPLAY USE RETURN
三、分支结构 分支结构形式有如下三种: 1.单向分支 单向分支语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。 【语句格式】 IF〈条件表达式〉 〈命令行序列〉 ENDIF 【语句功能】 该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列〉;否则,执行ENDIF后面的第一条命令。
【例6-9】求一元二次方程AX2+BX+C=0的实根。程序文件名为PROG9.PRG。【例6-9】求一元二次方程AX2+BX+C=0的实根。程序文件名为PROG9.PRG。 SET TALK OFF CLEAR INPUT TO A INPUT TO B INPUT TO C Z=B^2-4*A*C IF Z>=0 X1=(-B+SQRT(Z))/(2*A) X2=(-B-SQRT(Z))/(2*A) ? X1,X2 ENDIF SET TALK ON RETURN
2.双向分支 双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。 【语句格式】 IF〈条件表达式〉 〈命令行序列1〉 ELSE 〈命令行序列2〉 ENDIF 【语句功能】 该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。
【例6-10】编写一密码校验程序(假设密码为ABC)。程序文件名为PROG10.PRG。【例6-10】编写一密码校验程序(假设密码为ABC)。程序文件名为PROG10.PRG。 SET TALK OFF CLEAR ACCEPT “请输入您的密码:” TO AAA IF AAA=”ABC” CLEAR ? ”欢迎使用本系统!” ELSE ?”密码错误!” WAIT QUIT ENDIF SET TALK ON
3.多向分支 多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。 【语句格式】 DO CASE CASE〈条件表达式1〉 <命令行序列1〉 CASE〈条件表达式2〉 <命令行序列2〉 …… CASE〈条件表达式N〉 〈命令行序列N〉] [OTHERWISE 〈命令行序列N+1〉] ENDCASE
【语句功能】 该语句根据给出的N个〈条件表达式〉的值,选择N+1个〈命令行序列〉中的一个执行。当所有CASE中〈条件表达式〉的值都是假时,如果有OTHERWISE项,则执行〈命令行序列N+1〉,再执行ENDCASE后面的第一条命令;否则,直接执行ENDCASE后面的第一条命令。 【例6-11】假设收入(P)与税率(R)的关系如下表,编程求税金。程序文件名为PROG11.PRG。 0 P<800 R= 0.05 800 ≤ P<2000 0.08 2000≤P<5000 0.1 P≥5000
SET TALK OFF CLEAR INPUT “请输入收入:” TO P DO CASE CASE P<800 R=0 CASE P<2000 R=0.05 CASE P<5000 R=0.08 OTHERWISE R=0.1 ENDCASE TAX=P*R ? ”税金为:”,TAX SET TALK ON RETURN
4.使用分支语句应注意的几点 (1)IF…… ENDIF和DO CASE…… ENDCASE 必须配对使 用,DO CASE与第一个CASE(条件表达式)之间不应有 任何命令。 (2)(条件表达式)可以是各种表达式或函数的组合,其 值必须是逻辑值。 (3)(命令行序列)可以由一个或多个命令组成,可以是 条件控制语句组成的嵌套结构。 (4)DO CASE…… ENDCASE 命令,每次最多只能执行 一个(命令行序列)。在多个CASE项的(条件表达式〉 值为真时,只执行第一个(条件表达式)值为真的(命 令行序列),然后执行ENDCASE的后面的第一条命令。
四、循环结构 1.DO WHILE循环语句 【格式1】DO WHILE <条件表达式> <语句序列> ENDDO 一个循环结构一般应具备如下的条件: (1)循环的初始条件:一般为给循 环控制变量赋初值; (2)循环头:循环语句的起始,设 置、判断循环条件; (3)循环尾:循环语句的结尾; (4)循环体:位于循环头和循环尾 之间、循环控制重复执行的语 句序列。
【格式2】DO WHILE <条件表达式> <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDDO • LOOP语句:强行返回到循环开始语句。 • EXIT语句:强行跳出循环,接着执行ENDDO后的语句
【例6-12】编程求1+2+3+……+100之和。程序文件名为PROG12.PRG。【例6-12】编程求1+2+3+……+100之和。程序文件名为PROG12.PRG。 SET TALK OFF CLEAR S=0 I=1 DO WHILE I<=100 S=S+I I=I+1 ENDDO ? ”1+2+3+……+100=”,S SET TALK ON RETURN
【例6-13】逐条显示在STUDENT数据库的STUD表中性别为“男”的所有记录。程序文件名为PROG13.PRG。【例6-13】逐条显示在STUDENT数据库的STUD表中性别为“男”的所有记录。程序文件名为PROG13.PRG。 SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD DO WHILE .NOT. EOF() IF 性别=”男” DISPLAY ENDIF SKIP ENDDO CLOSE DATABASE SET TALK ON RETURN
【例6-14】编程显示STUDENT数据库的STUD表中除“李宁”以外的所有记录。程序文件名为PROG14.PRG。【例6-14】编程显示STUDENT数据库的STUD表中除“李宁”以外的所有记录。程序文件名为PROG14.PRG。 SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD DO WHILE .NOT. EOF() IF 姓名=”李宁” SKIP LOOP ENDIF DISPLAY SKIP ENDDO CLOSE DATABASE SET TALK ON RETURN
2.FOR循环语句 【格式】 FOR <循环变量>=<初值> TO <终值> [STEP<步长>] <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDFOR/NEXT FOR语句的执行流程如右图所示。
使用FOR循环语句的有关说明: ① 省略STEP <步长>,则〈步长〉为默认值1; ②〈初值〉、〈终值〉和〈步长〉都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数; ③ 可以在循环体内改变循环变量的值,但会改变循环执行次数; ④ EXIT和LOOP命令可以出现在循环体内。执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。执行EXIT命令时,程序跳出循环,执行循环尾后面的语句 。
【例6-15】从键盘输入10个数,编程找出其中的最大值和最小值。程序文件名为PROG15.PRG。【例6-15】从键盘输入10个数,编程找出其中的最大值和最小值。程序文件名为PROG15.PRG。 SET TALK OFF CLEAR INPUT “请从键盘输入一个数:” TO A STORE A TO MAX, MIN FOR I=2 TO 10 INPUT “请从键盘输入一个数:” TO A IF MAX<A MAX=A ENDIF IF MIN>A MIN=A ENDIF ENDFOR ? “最大值为:” , MAX ? “最小值为:” , MIN SET TALK ON RETURN
【例6-16】编程判断一个数是否素数,程序文件名为PROG16.PRG。【例6-16】编程判断一个数是否素数,程序文件名为PROG16.PRG。 SET TALK OFF CLEAR INPUT "请输入一个数:" TO x FOR i=2 TO x-1 IF Mod(x,i)=0 EXIT ENDIF ENDF IF i>=x ?STR(X)+“是素数” ELSE ?STR(X)+"不是素数" ENDIF 程序N-S流程图
【例6-17】从键盘输入任意的10个数,按从大到小的顺序依次输出 ,程序文件名为PROG17.PRG。 DIME A(10) FOR i=1 TO 10 INPUT "请输入一个数" TO a(i) ? a(i) ENDFOR FOR i=1 TO 9 FOR j=1 TO 10-i IF a(j)<a(j+1) t=a(j) a(j)=a(j+1) a(j+1)=t ENDIF ENDFOR ENDFOR FOR i=1 TO 10 ?? a(i) 程序N-S流程图 ENDFOR
3.“指针”型循环控制语句 “指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。 【语句格式】 SCAN[〈范围〉][FOR〈条件表达式1〉 [ WHILE 〈条件表达式2〉]] 〈命令行序列〉 ENDSCAN 【语句功能】 该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合(条件表达式1)或(条件表达式2),执行(命令行序列),记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF( )的值,直到函数EOF( )的值为真时结束循环。
【例6-18】输出STUDENT数据库的STUD表中所有团员的姓名和地址。程序文件名为PROG18.PRG。【例6-18】输出STUDENT数据库的STUD表中所有团员的姓名和地址。程序文件名为PROG18.PRG。 SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD SCAN FOR 是否团员 ? 姓名,地址 ENDSCAN CLOSE DATABASE SET TALK ON RETURN
4.使用循环语句时应注意的几点 (1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和 ENDSCAN必须配对使用。 (2)〈命令行序列〉可以是任何FoxPro命令或语句, 也可以是循环语句,即可以为多重循环。 (3)〈循环变量〉应是数值型的内存变量或数组元素。 (4)EXIT和LOOP命令嵌入在循环体内,可以改变循环 次数,但是不能单独使用。EXIT的功能是跳出循 环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第 一条命令;LOOP的功能是转回到循环的开始处, 重新对“条件”进行判断,相当于执行了一次 ENDDO、ENDFOR、ENDSCAN命令,它可以改变〈命 令行序列〉中部分命令的执行次数。EXIT、LOOP 可以出现在〈命令行序列〉的任意位置。
5.多重循环 多重循环即循环的嵌套,是在一个循环结构的循环体中又包含另一个循环。我们称外层循环为外循环,被包含的循环为内循环。嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉。正确的嵌套关系如: DO WHILE <条件表达式1> <语句序列11> DO WHILE <条件表达式2> <语句序列21> DO WHILE <条件表达式3> <语句序列3> ENDDO <语句行序列22> ENDDO <语句行序列12> ENDDO
【例6-19】编程输出下三角形乘法口诀表。程序文件名为PROG19.PRG。【例6-19】编程输出下三角形乘法口诀表。程序文件名为PROG19.PRG。 SET TALK OFF CLEAR X=1 DO WHILE X<=9 Y=1 DO WHILE Y<=X S=X*Y ?? STR(Y,1)+”*”+STR(X,1)+”=”+STR(S,2)+” “ Y=Y+1 ENDDO ? X=X+1 ENDDO SET TALK ON RETURN
第三节 过程的模块化 结构化程序设计方法要求将一个大的系统分解成若干个子系统,每个子系统就构成一个程序模块。模块是一个相对独立的程序段,它可以为其他模块所调用,也可以去调用其他模块。将一个应用程序划分成一个个功能相对简单、单一的模块程序,不仅有利于程序的开发,也有利于程序的阅读和维护。VFP模块化在具体实现上提供三种形式,它们是子程序、过程和函数。 主程序与子程序调用关系示意图
一、子程序 子程序也叫外部过程,是以程序文件(.PRG)的形式单独存储在磁盘上。子程序只需录入一次,就可反复被调用执行 。 1.子程序的结构 在VFP中,子程序的结构与一般的程序文件一样,可以用MODIFY COMMAND命令来建立、修改、和存盘,扩展名也默认为.PRG。 子程序与其他程序文件的唯一区别是其末尾或返回处必须有返回语句RETURN。 【语句格式】 RETURN [TO MASTER|TO 程序文件名|表达式] 【语句功能】该命令中止一个程序、过程、或用户自定义函数的执行,返回上一级调用程序、最高级调用程序、另外一个程序或命令窗口。
【语句说明】 (1)通常程序执行到RETURN时,会自动返回到上级调 用程序调用语句的下一条语句继续执行。如果是在 最高一级主程序中,则返回命令窗口。 (2)选用TO MASTER 子句时,则返回最高一级调用程 序,即在命令窗口下,调用的第一个主程序。 (3)TO 程序文件名表示程序将转向到指定的程序。 (4)如选用表达式,表示将表达式的值返回调用程序, 通常用于自定义函数。 (5) 在程序最后,如果没有RETURN命令,则程序运 行完毕后,将自动默认执行一个RETURN命令,但 过程文件除外。