第4章 结构化程序设计(16课时)

 

一、【教学目标】

1.     掌握程序的建立与运行方法

2.     掌握程序设计中常用的输入、输出语句

3.     理解并掌握程序的基本控制结构:顺序结构、分支(选择)结构、循环结构

4.     理解并掌握过程与用户自定义函数

二、【重点和难点】

重点:

1.     程序的概念、程序的建立与运行方法

2.     程序设计中常用的输入输出语句

3.     程序的控制结构:顺序结构、分支(选择)结构、循环结构

4.     过程的概念、用户自定义函数的目的与方法

难点:

1.程序设计算法

2.分支程序设计

3.循环程序设计

三、【学法指导】

1.     VFP系统支持两种工作方式:交互方式、程序方式。程序方式,可大量减少重复劳动,达到事半功倍的目的。

2.     结构化程序设计是VFP的重要组成部分,是进行系统设计的基本功,要在教师的指导下,加强上机练习,循序渐进地学习。

3.     程序的控制结构设计是本章的重中之重,要加强学习,勤于思考。

4.     通过本章的学习,有助于提高分析问题、解决问题的能力。

四、【教学要点】

4.1 程序和程序文件

4.1.1 程序的概念

1)程序是能够完成一定任务的命令的集合。这组命令被存放在称为程序文件或命令文件的文本文件中,VFP默认的程序文件的扩展名为PRG

程序方式与单命令处理方式有以下优势:

²可以利用编辑器,方便地输入、修改和修改程序。

²可以用多种方式、多次运行程序。

²可以在一个程序中调用另一个程序。

程序代码除了可以保存在程序文件中,还可以出现在报表设计器和菜单设计器的过程代码窗口、表单设计器和类设计器的事件或方法代码窗口中,并保存在相应的内容中。

当然在命令窗口中也可以像执行程序一样,一次执行多条命令。

2)示例程序:

SET TALK OFF

CLEAR

OPEN DATABASE  商品管理   &&打开数据库      

USE  商品                &&打开表

LIST

CLOSE DATABASE          &&关闭数据库

SET TALK ON

RETURN

 

程序的书写规则和说明:

①程序一般以SET TALK OFF开头,以SET TALK ONRETURN语句结束。

SET TALK ON|OFF的意义是打开或关闭人机会话方式,控制VFP在主窗口、状态栏或用户自定义的窗口里是否显示。

&&是在程序中插入的命令注释,注释为非执行代码,不影响程序的功能。以NOTE*开头的代码行也是注释行。注释行能增强程序文件的易读性,修改调试程序时可加上注释服放弃<注释内容>中语句的执行VFP中的注释行显示为绿色。

另外在程序代码中蓝色代表是命令关键字,黑色表明是非命令关键字或用户使用的字符。红色表明有语法错误,以提醒用户改正。这些颜色的设定与含义是系统默认的,用户可以改变,选择并执行“工具|选项|语法着色”命令

③程序中每条命令以回车键结尾,一行只能写一条命令。若命令太长时需要分行书写,在一行末尾键入续行符“;”,再按回车键。

④程序中常出现CANCELRETURNQUITDO 等命令,其意义如下:

CANCEL:终止程序运行,清楚所有私有变量,返回命令窗口。

RETURN:结束当前程序的运行,返回调用它的上级程序,若无上级则返回到命令窗口。

QUIT:退出VFP系统。

DO:转去执行另一个程序。

4.1.2 程序的建立与运行

1)建立源程序有多种方法,常用的有:

①执行“文件|新建”命令,在对话框中选取择“程序”文件

②在“项目管理器”中选定“代码”选取项卡中的“程序”项,选择“新建”按钮

③在“命令”窗口执行命令:MODIFY COMMAND FileName

在编辑过程中注意保存程序。修改程序的方法与建立程序的方法类似。

2)程序的运行方法:

①执行“程序|运行”命令,在“运行”对话框中选择要运行的程序名

②在“项目管理器”中选定“代码”选取项卡中“程序”项下的程序,选择“运行”按钮

③在“命令”窗口中,输入:DO [<盘符>][<路径>\]<文件名>

选择多条命令,然后单击鼠标右键,在弹出的快捷菜单菜单中选择“运行所选区域”,可运行程序的一部分。

VFP程序文件通过编译、连编,可产生不同的目标代码文件,以不同的扩展名标识。用DO命令执行程序文件时,如果没有指定扩展名,系统将按以下顺序执行某种目标代码文件:

EXEVFP的可执行文件)、APPVFP的应用程序文件)、FXPVFP的编译文件)、PRGVFP的源程序文件)。

4.1.3 程序设计中常用的输入输出语句

1ACCEPT命令

【格式】ACCEPT  [<提示信息>]  TO  <内存变量>

【功能】 在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。

【说明】①若选用提示信息,系统将先显示提示信息的值作为提示信息,并将输入的字符串赋值给<内存变量>

       ②该命令只能接收字符串,而不需加定界符,否则系统将把定界符作为字符串的一部分。

       ③若不输入任何字符而直接按回车键,系统将把空串赋值给指定的内存变量。     

【例4-1】编程从键盘输入某数据库的文件名,要求打开该数据库、表并显示其内容。程序文件名为PROG1.PRG

SET TALK OFF

CLEAR

ACCEPT   "请输入数据库名:"  TO  AAA

OPEN DATABASE  &AAA      

ACCEPT  "请输入表名"  TO  BBB

USE  &BBB

LIST

USE

SET TALK ON

RETURN

2INPUT命令

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

 【功能】在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量

 【说明】①若选用提示信息,系统将先显示提示信息的值作为提示信息,并将输入的数据赋值给<内存变量>

         ②可以输入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,而且可以是常量、变量、函数或表达式等形式,按回车键结束输入。

         ③输入非数值型数据要加定界符。如输入逻辑型常量时要用圆点定界(.T.)、输入日期型常量要用大括号{^2004-05-10}等。

        

【例4-2】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。程序文件名为PROG2.PRG

SET TALK OFF

CLEAR

INPUT  "长方形一边的长为:"  TO A

INPUT  "长方形另一边的长为:" TO B

S=A*B

? "长方形的面积为:" , S

SET TALK ON

RETURN

3WAIT命令

【格式】WAIT [提示信息] [ TO <内存变量>] [WINDOW [ AT <>,<>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<数值表达式>]

功能显示信息并暂停程序执行,当按下任意键或单击鼠标后继续执行。

说明①若选用提示信息,系统将先显示提示信息的值作为提示信息,并将输入的单字符赋值给<内存变量>。若不选用提示信息,则显示默认的提示信息“按任意键继续……”。

       <内存变量>用来保存用户键入的单字符,其类型只能是字符型。若不选TO <内存变量>短语,键入的单字符不保留。

       ③如果指定WINDOW子句,则会出现一个WAIT提示窗口,在窗口中显示提示信息。提示窗口一般定位于WINDOW子句,也可用AT短语指定其在主窗口中的位置。

④若同时选用NOWAIT短语和WINDOW子句,系统不等待用户按键,直接向下执行。

⑤若选用NOCLEAR短语,则不关闭提示窗口,直到用户执行下一条WAIT WINDOW命令或WAIT CLEAR命令为止。

TIMEOUT 选项指在中断WAIT 命令之前,等待键盘或鼠标输入的秒数,一旦超时就不再等待用户按键,自动向下执行。

【例4-3】用WAIT 命令在信息提示窗口显示:谢谢使用Visual FoxPro!

WAIT “谢谢使用Visual FoxPro! WINDOWS  TIMEOUT 10

三条输入命令的异同

l         ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;

l          WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键;

l          INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。

4? | ?? 输出命令

【格式】? | ?? 表达式1  [,表达式2 ]

【功能】计算表达式的值,输出计算结果。

【说明】①?计算表达式的值,输出一个回车换行符,再将计算结果输出到主窗口;若省略表达式,则显示或打印一空行。

??功能同上,但不输出回车换行符,即同行输出。

5)格式输入输出命令

【格式】@<行,列> [ SAY 表达式1 ] [ GET <内存变量>]

【功能】在指定的行、列位置显示或打印输出结果,也可接受数据的输入。

【说明】

rowcolumn 指定显示信息的起始位置(屏幕上的行、列号)

SAY Expression1 读取Expression1 的值,并在指定的起始位置显示

GET Memvar 等待输入变量Memvar 的值;GET 子句中的变量必须具有初值或用

DEFAULT 子句的Expression2 指定初值,GET 子句的变量必须用READ 命令激活(即GTE子句必须与READ 命令配合使用),在多个GET 子句后,仅用一个READ命令即可。

【例4-3】销售表关系模式为: 销售(商品编号,客户编号,销售量,售价,……),编程:能根据记录号修改某记录的“商品编号、客户编号、销售量,售价”信息。

程序如下:

Set talk off

Clear                                &&清屏幕

Use 销售

jlh=1                                &&设定get 变量的初值

@2,10 say “请输入记录号: get jlh

read                                 &&激活get 子句变量 jlh 用于编辑

go jlh                               &&指向第 jlh 条记录

@4,10 say “请修改第”+str(jlh1)+ “号记录的数据” &&输出字串

@6,10 say “商品编号” get 商品编号          

@8,10 say “客户编号” get 客户编号

@10,10 say “销售量” get 销售量

@12,10 say “售价” get 售价

read                                 &&激活get子句变量,用于编辑

set talk on

4.2 程序的基本结构

Visual FoxPro系统中编程,既可使用结构化程序设计方法,也可使用面向对象的程序设计方法。在

结构化程序设计中,类似于其它高级语言,程序的基本结构包括:顺序结构、分支(选择)结构、循环结构。

1.顺序结构

顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。Visual FoxPro系统中的大多数命令都可以作为顺序结构中的语句。

2.分支结构

分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。在处理实际问题中,往往需要根据具体的情况去控制程序的流程。例如,分段函数的求解,查找结果的处理等问题,都需要先做判断后再处理,实现这种分枝控制的程序,称为分支结构或选择结构。

3.循环结构

循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。

在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不在一个固定的位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样做增强了程序的可读性和模块化。我们称这种具有独立功能而且可以被其它程序调用的程序序列为过程。

 

4.2.1 选择结构

1.分支(选择)结构

分支结构形式有如下三种:

1)单向分支

单向分支语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。

1)【格式】

   IF〈条件表达式〉

     〈命令行序列〉    

   ENDIF

【功能】该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列〉;否则,执行ENDIF后面的第一条命令。

【例4-4】求解一般一元二次方程AX2BXC0的实根。程序如下:

SET TALK OFF

CLEAR

INPUT TO A

INPUT TO B

INPUT TO C

DB^2-4*A*C

IF  D>=0

X1=(-B+SQRT(D))/(2*A)

X2=(-B-SQRT(D))/(2*A)

? X1,X2

ENDIF

SET TALK ON

RETURN

2)双向分支


 双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。

 【格式】

          IF〈条件表达式〉        

          〈命令行序列1

        ELSE

            〈命令行序列2

        ENDIF

 【功能】该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。

4-5】编写一密码校验程序(假设密码为ABC)。程序如下:

SET TALK OFF

CLEAR

ACCEPT  请输入您的密码:  TO AAA

IF  AAA=”ABC”

CLEAR

? ”欢迎使用本系统!

ELSE

?”密码错误!

WAIT

QUIT

ENDIF

SET  TALK  ON

3)多向分支


 多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。

1)【格式】

  DO CASE

CASE〈条件表达式1