第七章 程序设计基础
Download
1 / 74

本 章 内 容 - PowerPoint PPT Presentation


  • 117 Views
  • Uploaded on

第七章 程序设计基础. 本 章 内 容. §7.1  程序文件的建立与运行 §7.2  结构化程序设计初步 §7.3  程序设计基本语句 §7.4  顺序结构 §7.5  选择结构 §7.6  循环结构. §7.7  过程 §7.8  参数传递与变量作用域 §7.9  自定义函数. Visual FoxPro 的工作方式分为 交互方式 和 程序方式 两大类 命令 1       程序 .prg 响应 1 命令 2 响应 2 …… …… …… 命令 n 响应 n. 命令 1 命令 2 命令 3 …… …… …… 命令 n.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 本 章 内 容' - zelda


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

第七章 程序设计基础

本 章 内 容

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

§7.2 结构化程序设计初步

§7.3 程序设计基本语句

§7.4 顺序结构

§7.5 选择结构

§7.6 循环结构

§7.7 过程

§7.8 参数传递与变量作用域

§7.9 自定义函数


Visual FoxPro的工作方式分为交互方式和程序方式两大类

命令1      程序.prg

响应1

命令2

响应2

……

……

……

命令n

响应n

命令1

命令2

命令3

……

……

……

命令n

单命令工作方式 程序工作方式(批命令)


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

1.程序

 程序是为完成某一特定任务而编写的命令序列。

2.程序文件

VFP的程序文件是文本文件,其扩展名是.prg,编译后的程序文件的扩展名为.fxp。程序文件可用VFP内置的文本编辑器编写,也可以使用其他文本编辑器编写。

  程序文件的内容是VFP命令,在程序中,习惯将命令称作语句。VFP程序的语句分为两大类:普通语句(包括VFP语句和SQL语句)和专用于程序中的程序流程控制语句。


§7.1.1 程序文件的建立与修改

1.程序文件的建立

(1)打开程序编辑窗口

 打开程序编辑窗口有以下3种方法:

1)在“项目管理器”中打开程序编辑窗口

 “项目管理器”窗口→ “程序”选项→ “新建”按钮→程序编辑窗口。

2)使用“新建”对话框打开程序编辑窗口

 单击“新建”按钮→弹出“新建”对话框→选择“程序”选项→单击“新建文件”按钮→打开程序编辑窗口。


3)使用命令打开程序编辑窗口

 在命令窗口中键入以下命令,然后按回车键执行。

 命令格式1:MODIFY COMMAND [<文件名>]

 命令格式2:MODIFY FILE [<文件名>]

 功能:在文本编辑窗口中打开指定的文件。

 说明:

1)在命令格式1中,若缺省扩展名,则默认程序文件(.PRG);在命令格式2中,若缺省扩展名,则默认文本文件(.TXT)。

2)在命令格式1中,若指定扩展名为.TXT,则编辑文本文件;在命令格式2中,若指定扩展名为.PRG,则编辑程序文件。

3)若指定的文件已存在,则打开已存在的文件;否则为新建文件。


 (2)在程序编辑窗口中输入程序的内容(语句)。

 (3)保存程序文件

  程序的内容输入完毕。单击工具栏中的“保存”按钮,打开“另存为”对话框。在此对话框中,指定程序文件存放的位置,输入程序文件的名称,然后单击“保存”按钮。


2.程序文件的修改

要修改程序文件,先要打开程序文件。程序文件的修改与新建一样,也是在程序编辑窗口中进行。

(1)打开程序文件

 打开程序文件有以下3种方法:

1)若程序文件建立在某个项目中,则在“项目管理器”中选定该程序,然后单击“修改”按钮,在程序编辑窗口中打开要修改的程序。

2)使用“打开”对话框打开程序文件

 单击工具栏中的“打开”按钮,弹出“打开”对话框。在“查找范围”文本框中输入程序存放的位置;在“文件类型”列表框中选择“程序”;在“文件名”文本框中输入要打开的程序文件的名称,然后单击“确定”按钮。


3)使用命令打开程序

 在命令窗口中执行以下命令:

MODIFY COMMAND [<盘符>][<路径>][<程序文件名>]

 说明:若缺省盘符和路径,则默认当前文件夹。

(2)修改程序文件

 在程序编辑窗口中,修改程序的语句内容。

(3)保存或放弃修改

 若要保存修改的结果,则单击工具栏中的“保存”按钮  ,或选择“文件”菜单中的“保存”命令,或按快捷键Ctrl+W写盘。

 若要放弃修改,则选择“文件”菜单中的“还原”命令,或按ESC键。


§7.1.2 程序文件的运行

1.在“项目管理器”中运行程序

 被运行的程序必须属于项目,才能在该项目中运行。具体操作方法如下:

 在“项目管理器”窗口中,选定要运行的程序文件名,单击“运行”按钮  ,即运行该程序。

2.使用“程序”菜单运行程序

 “程序”菜单→ “运行”命令→ “运行”对话框→选择要运行的程序文件→ “运行”按钮。


3.使用命令运行程序

 命令格式:DO [<盘符>][<路径>]<文件名>

 功能:运行指定的程序。

说明:

(1)该命令既可以在命令窗口中执行,也可以作为程序中的一个语句。

(2)若缺省扩展名,程序执行的顺序是:.EXE(VFP可执行文件)→.APP(VFP应用程序)→.FXP(编译文件)→.PRG(源程序文件)。

(3)DO命令除了可以运行程序文件之外,还可以运行其他文件,例如查询文件(.qpr),菜单程序文件(.mpr),应用程序文件(.app)。


§7.2 结构化程序设计初步

§7.2.1 算法与流程图

1.算法的概念

 程序设计一般分为以下两个大步骤:

 第一步:根据问题的要求拟定用计算机进行求解的方法和步骤,称之为算法。

 第二步:根据拟定的算法,按照编程语言约定的规则,编写程序代码,即通常所说的编程。

2.算法的描述(表示)

 描述算法的方式是多种多样的,可以用自然语言、流程图、伪代码等方式描述算法。不论用哪一种方式,描述算法应满足两个要求:一是简练,二是容易转化为程序代码。


3.算法的流程图描述

 在程序设计中,常用流程图描述算法。它用一些简单的几何框图表示各种类型的操作,然后用带有箭头的有向流线将各个框图连接起来,以表示执行的先后顺序,就构成了描述算法的流程图。用流程图描述算法,直观形象,易于理解。流程图中用到的符号如下所示:

半圆框称为起止框,用于表示程序运行的开始和结束。

  平行四边形框称为输入输出框,用于表示数据输入和输出的操作。

  矩形框称为处理框,用于表示数据加工操作。

  菱形框称为判断框,用于表示条件判断。

  箭头线称为指向线,用于表示程序运行的流向和路径。


§7.2.2 结构化程序设计的方法

1.结构化程序的基本结构

 结构化程序由顺序结构、选择结构和循环结构组成。在结构化程序中,任何复杂的算法都可以用顺序结构、选择结构、循环结构这3种基本结构表示。

2.结构化程序设计的要点

 结构化程序要点是:自顶向下、逐步求精和模块化设计。

 (1)自顶向下逐步求精

 自顶向下逐步求精的含义是:从全局出发,通盘考虑。把整个问题分解成若干个相对独立的小问题,然后再把小问题分解成若干个相对独立的更小的问题,直到能表示为程序为止。

 (2)模块化设计

 将一个大问题分解为若干个相对独立的小问题,每个小问题称为一个功能模块。各个功能模块相对独立且功能单一,这样便于模块的编写与调试和多人协作完成一个大型的程序开发。程序的模块结构图就像一棵倒挂树。


§7.3 程序设计基本语句

§7.3.1 环境设置语句

1.清屏语句

命令格式:CLEAR

功能:清除VFP主窗口中的内容。

2.会话开关语句

命令格式:SET TALK ON|OFF

功能:打开或关闭会话开关。

说明:

1)VFP初态默认SET TALK ON。

2)一般整个程序只需要一个总的输出结果,而不需要输出程序的每一条语句的结果,因此程序的第一条语句通常是SET TALK OFF。


3 . 安全开关

命令格式:SET SAFETY ON|OFF

功能:打开或关闭安全开关。

说明:

1)VFP初态默认SET SAFETY ON,即改写数据时系统弹出提示框。

2)若程序中要对数据进行改写,则应在程序的开始设置SET SAFETY OFF。


4.注释语句

 命令格式1:* <注释文本>

 命令格式2:NOTE <注释文本>

 命令格式3:&&<注释文本>

 功能:在编辑程序时显示注释的内容,以提高程序的可读性。

 说明:

1)注释语句是非执行语句,是写给编程人员看的,目的是为了提高程序的可读性。在程序运行时,计算机不产生任何操作。

2)作为注释的文本不必加字符定界符。

3)* <注释文本>通常写在程序的开始或者中间,作为整个程序的说明或者一段程序的说明。

4)&&<注释文本>通常写在语句的结尾,作为该语句的注释。其常用的格式为:<语句> &&<注释文本>


§7.3.2 输入输出语句

1.交互语句

(1)INPUT命令

命令格式:INPUT [<字符表达式>] TO <内存变量>

功能:执行该语句时,暂停程序运行,等待用户从键盘输入数据,按回车键结束输入,并将输入的数据存入指定的内存变量,继续运行程序。

说明:

1)可输入除M和G型之外的各种类型的数据。

2)<字符表达式>的值作为提示。

【例7-3】编程查询基本工资大于等于指定数额的职工的情况。

操作步骤如下:

①打开程序编辑窗口。

②输入如下程序的内容:


CLEAR &&清屏

USE Zgjk &&打开职工简况表

INPUT "请输入基本工资:" TO gz&&从键盘输入一个基本工资值

LIST FOR 基本工资>=gz &&显示满足条件的职工的记录内容

③单击工具栏中的“保存”按钮,打开“另存为”对话框,输入程序文件名,然后单击“保存”按钮。

④单击工具栏中的“运行”按钮,程序运行结果如图7-4所示。

图7-4 例7-3的程序运行结果


2)ACCEPT命令

命令格式:ACCEPT [<字符表达式>] TO <内存变量>

功能:执行该语句时,暂停程序运行,等待用户从键盘输入数据,按回车键结束输入,并将输入的数据存入指定的内存变量,继续运行程序。

说明:

1)只能输入C型数据。

2)输入的字符串不必加定界符。

3)直接按回车键,则输入空串。


3)WAIT命令

命令格式:WAIT [<字符表达式>] [TO <内存变量>] [WINDOW] [TIMEOUT <数值表达式>]

功能:执行该语句时,暂停程序运行,等待用户从键盘输入字符(不必按回车键)或单击鼠标,并将输入的字符或空串存入指定的内存变量,继续运行程序。

说明:

1)只能输入单个C型字符。

2)输入的单个字符不必加定界符。

3)若缺省提示,则显示默认的提示“按任意键继续…”。

4)若缺省WINDOW子句,则提示信息显示于VFP主窗口;若选用WINDOW子句,则提示信息显示于WAIT提示框中。

5)若选用TIMEOUT子句,当等待时间超过<数值表达式>设定的秒数时,自动执行后继语句。


例7-4】打开职工简况表,从键盘输入某职工的姓名,查询该职工的信息。如果找到,则显示该职工的职工号、姓名、出生日期和基本工资;如果没有找到,则在提示框中显示“查无此人!”的提示信息,并延时5秒钟。

程序内容如下:

CLEAR

CLOSE ALL &&关闭所有文件

USE Zgjk

ACCEPT “请输入待查职工的姓名:” TO NAME&&输入姓名不必加定界符

LOCATE FOR 姓名=NAME &&查找目标记录

IF !EOF() &&假如在表的记录区域找到目标记录

?“职工号:”+职工号 &&前者是字符串常量,后者是字符型字段变量

?"姓名:"+姓名

?“出生日期:”+DTOC(出生日期) &&构造表达式时要保证数据类型统一

?"基本工资:"+STR(基本工资,7,2)

ELSE

WAIT "查无此人!" WINDOW TIMEOUT 5 &&提示信息显示于窗口,延时5秒

ENDIF


程序运行结果如图7-5所示。

图7-5 例7-4的程序运行结果

请思考:为什么只输入“李”字,就找到了“李成华” ?


2.无格式输出语句

 命令格式:? | ?? [<表达式表>]

 功能:先计算表达式的值,然后输出。

 说明:

1)若使用?,则换行输出表达式的值。

2)若使用??,则从光标当前位置输出表达式的值。

3)若?后不跟表达式,则另起一行。

【例7-5】修改[例7-4]的程序,要求分两行显示找到职工的职工号、姓名与出生日期、基本工资。


操作步骤如下:

(1)打开[例7-4]的程序,以新的程序名将其另存,[例7-5]的程序成为当前程序。

(2)在程序编辑窗口中,修改程序的内容如下:

CLEAR

USE Zgjk

ACCEPT "请输入待查职工的姓名:" TO NAME &&输入姓名不必加定界符

LOCATE FOR 姓名=NAME &&查找目标记录

IF !EOF() &&假如在表的记录区域找到目标记录

?"职工号:"+职工号 &&前者是字符串常量,后者是字段变量

??“姓名:”+姓名 &&不换行,直接在当前位置输出表达式的值

?"出生日期:"+DTOC(出生日期) &&构造表达式时要保证数据类型统一

??"基本工资:"+STR(基本工资,7,2)&&不换行直接在当前位置输出表达式值

ELSE

WAIT "查无此人!" WINDOW TIMEOUT 5&&提示信息显示于窗口,延时5秒

ENDIF


3)单击工具栏中的“保存”按钮,保存程序修改的结果。

(4)单击工具栏中的“运行”按钮,程序运行结果如图7-6所示。

图7-6 例7-5的程序运行结果


§7.3.3 结束程序运行的语句

1.返回语句

命令格式:RETURN

功能:结束当前程序的执行,返回调用点。

说明:

1)子程序的结尾必须是RETURN语句,否则系统无法返回调用点。

2)主程序的结尾也可以用RETURN语句,程序运行结束返回命令窗口。

2.退出VFP语句

命令格式:QUIT

功能:退出VFP系统,关闭VFP窗口,返回操作系统。


§7.3.4 消息框函数

命令格式:

MessageBox(<提示信息> [,<按钮类型>] [,<对话框标题>])

功能:暂停程序运行,弹出对话框,显示提示信息,等待用户单击按钮,返回一个整数,以表示所单击的按钮。

说明:<按钮类型>由3个数码相加产生,即:

<按钮类型码>+<图标类型码>+<默认按钮码>。

MessageBox函数的按钮类型码及其含义见表7-2,


MessageBox函数的返回值及其对应的图标见表7-3。


7-4MessageBox函数举例


§7.4 顺序结构

1.顺序结构的定义

编写程序时,按处理过程的先后顺序排列语句;程序执行时,按语句排列的先后顺序逐条执行的结构称为顺序结构。它是最基本、最常用的结构。其流程图如图7-7所示。

图7-7 顺序结构流程图


2.顺序结构的实例

【例7-6】设2001年我国的国民经济产值为一个单位,若每年增长8%,求2010年的产值。

程序内容如下:

Clear

N=2010-2001

V=1*(1+0.08)^N

?"2010年产值为:",V

Return

程序运行结果为:

2010年产值为:2.00

这说明国民经济产值翻了一翻。


§7.5 选择结构

选择结构只有一个入口和一个出口,但在结构内部根据条件有两条或者多条路径可供选择。选择结构分为二分支选择结构(IF语句)和多分支选择结构(CASE语句)。

§7.5.1 二分支选择结构

1.单向二分支结构

 命令格式:IF <条件>

<语句序列1>

ENDIF

功能:若条件为真,则执行语句序列1,然后执行ENDIF的后继语句;若条件为假,则直接执行ENDIF的后继语句。其流程图如图7-7所示。

图7-7 选择结构流程图


例7-7】从键盘输入任意两个数,然后按从小到大顺序输出。

 程序内容如下:

CLEAR

INPUT "X=" TO X &&不能使用ACCEPT语句或WAIT语句

INPUT "Y=" TO Y

IF X>Y

T=X

X=Y

Y=T

ENDIF

? "X=",X

? "Y=",Y

程序运行结果如图7-8所示。

图7-9 例7-7的程序运行结果


2.双向二分支结构

命令格式:

IF <条件>

<语句序列1>

[ ELSE

<语句序列2>]

ENDIF

功能:若条件为真,则执行语句序列1,然后执行ENDIF的后继语句;若条件为假,则执行语句序列2,然后执行ENDIF的后继语句。其流程图如图7-10所示。

图7-10 含ELSE的选择结构流程图


例7-8】编写一个程序,其功能是:输入职工号,在表文件Zgjk2.dbf中查找职工的记录。若找到了,则将基本工资低于1000元的增加50元,否则增加30元;若没有找到,则显示“查无此人!”。

程序内容如下:

* 这是一个双向分支问题,且需要分支嵌套。

CLEAR

USE Zgjk2

LIST

ACCEPT "请输入职工号:" TO Zgh

LOCAT FOR 职工号=Zgh

IF FOUND( )

IF 基本工资<1000

REPLACE 基本工资 WITH 基本工资+50

ELSE

REPLACE 基本工资 WITH 基本工资+30

ENDIF

DISPLAY

ELSE

MESSAGEBOX("查无此人!")

ENDIF


 程序运行结果如图7-11所示。

图7-11 例7-8的程序运行结果

【例7-9】编写一个程序,其功能是:输入职工号,在“职工业绩.dbc”数据库中查找。若找到了,则显示该职工的全部工资信息;若没有找到,则显示“查无此人!”。


程序内容如下:

* 这是一个双向分支的问题,且使用到两个数据库表内联查询的SQL语句。

CLEAR

ACCEPT "请输入职工号:" TO Zgh

OPEN DATABASE 职工业绩

USE Zgjk

LOCATE FOR 职工号= Zgh

IF FOUND( )

SELECTGz.职工号,姓名,基本工资,岗位工资,津贴,奖金,住房公积金,工会费,实发工资;

FROM Zgjk, Gz;

WHERE Zgjk.职工号= Zgh AND Zgjk.职工号=Gz.职工号

ELSE

MESSAGEBOX("查无此人!")

ENDIF

CLOSE DATABASE


程序运行结果如图7-12所示。

图7-12 例7-9的程序运行结果


§7.5.2 多分支选择结构

多分支选择结构是通过情况语句实现的。情况语句的格式如下:

命令格式:DO CASE

CASE <条件1>

<语句序列1>

CASE <条件2>

<语句序列2>

……

CASE <条件n>

<语句序列n>

[OTHERWISE

<语句序列>]

ENDCASE


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行OTHERWISE的语句序列,然后执行ENDCASE的后继语句。

说明:

1)不论有几个CASE条件成立,只有最先成立的那个CASE条件对应的语句序列被执行。

2)OTHERWISE子句用于容错。

多分支选择结构其流程图如图7-13所示。

图7-13 多分支选择结构流程图


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行例7-10】编写一个程序,其功能是:打开表文件Zgjk.dbf,用户输入部门号,然后显示指定部门的职工的信息;若输入的部门号不存在,则显示“无此部门!”。

CLEAR

USE Zgjk

INPUT "输入部门号(家电为1,服装为2,文具为3):" TO Bmh

DO CASE

CASE Bmh =1

BM="家电"

CASE Bmh =2

BM="服装"

CASE Bmh =3

BM="文具"

OTHERWISE

? "无此部门!"

RETURN

ENDCASE

LIST FOR 部门=BM


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-14所示

图7-14 例7-10的程序运行结果


§7.6功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行 循环结构

循环结构也称为重复结构,是指程序在执行过程中,某段语句被重复执行若干次。被重复执行的语句称为循环体。在VFP中有当型循环、计数循环和扫描循环3种循环结构。

1.DO WHILE-ENDDO语句

 命令格式:DO WHILE <条件> &&循环起始句

<语句序列>&&循环体

ENDDO&&循环终端句

§7.6.1 当型循环


 功能:执行循环起始句功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行DO WHILE <条件>时,先计算条件表达式,判断循环的条件。若条件表达式的值为真,则执行DO WHILE与ENDDO之间称为循环体的语句序列,执行到循环终端句ENDDO时,返回循环起始句DO WHILE,再次判断环的条件。若条件表达式的值为真,则重复上述过程;若条件表达式的值为假,则结束循环,执行ENDDO后继语句。

循环语句的流程图如图7-15所示。

图7-15 当循环结构


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行例7-11】编程计算S=1+2+3+…+100

程序内容如下:

* 计算S=1+2+3+…+100

CLEAR

S=0 &&累加变量的初值应设为0

K=1 &&循环变量的初值为1

DO WHILE K<=100

S=S+K &&累加

K=K+1 &&循环变量增加1

ENDDO

? "S=",S

程序运行结果为:S=5050


在循环过程中各变量变化如下:功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

S K S=S+K K=K+1

==========================

01 S=0+1 K=1+1

0+1 2 S=0+1+2 K=2+1

0+1+2 3 S=0+1+2+3 K=3+1

…………

0+1+2+3+…+99100S=0+1+2+3+…+99+100 K=100+1


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行例7-12】编程求阶乘20!=1*2*3*…*20的值。

程序内容如下:

* 求20!=1*2*3*…*20

Clear

S=1 &&累乘变量的初值设为1

K=1 &&K为循环变量

Do While K<=20

S=S*K &&累乘

K=K+1 &&循环变量增加1

Enddo

? "S=" , S

程序运行结果为:S=2432902008176640000


在循环过程中各变量变化如下:功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

S K S=S*K K=K+1

===========================

1 1 S=1*1 K=1+1

1*1 2 S=1*1*2 K=2+1

1*1*2 3 S=1*1*2*3 K=3+1

…………

1*1*2*3*…*19 20 S=1*1*2*3*…*19*20 K=20+1


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行例7-13】逐条显示职工简况表Zgjk.dbf记录。

程序内容如下:

* 逐条显示表记录

CLEAR

USE Zgjk

DO WHILE ! EOF( )

DISPLAY

WAIT "按任意键显示下一条记录…"

SKIP

ENDDO


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-16所示。

图7-16 例7-13的程序运行结果

【例7-14】编程统计学生表中各成绩段的人数。


? "功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行优的人数为:",A

? "良的人数为:",B

? "中的人数为:",C

? "及格的人数为:",D

? "不及格的人数为:",E

CLEAR

USE 学生

LIST &&显示表记录后,指针指向EOF

GO TOP &&指针指向首记录

STORE 0 TO A,B,C,D,E &&累加变量初值为0

DO WHILE !EOF()&&循环起始句

DO CASE

CASE 成绩>=90

A=A+1 &&累加90分以上的人数

CASE 成绩>=80

B=B+1 &&累加成绩>=80.AND.成绩<90的人数

CASE 成绩>=70

C=C+1 &&累加成绩>=70.AND.成绩<80的人数

CASE 成绩>=60

D=D+1 &&累加成绩>=60.AND.成绩<70的人数

OTHERWISE

E=E+1 &&累加成绩<60分的人数

ENDCASE

SKIP &&指针下移一个记录

ENDDO&&循环终端句


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-16所示。

图7-16 例7-14的程序运行结果


2功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行.循环体中两条特殊语句

(1)跳出(结束)循环语句

命令格式:EXIT

功能:无条件结束循环,执行ENDDO的后继语句。

(2)短跳循环语句

命令格式:LOOP

功能:不执行本次循环的余下语句,返回DO WHILE语句,重新判断下一次循环的条件。

说明:LOOP又称为短路语句,执行LOOP语句并没有结束循环。

(3)含LOOP或EXIT的循环语句结构


命令格式:功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

DO WHILE <条件>&&循环起始句

< 语句序列1>

[LOOP]

< 语句序列2> &&循环体

[EXIT]

< 语句序列3>

ENDDO&&循环终端句

功能:含LOOP或EXIT的循环结构的功能如流程图7-17所示。

图7-17 含LOOP或EXIT的循环结构流程图

【例7-15】向“学生.dbf”表追加记录,直到学号的首字符为Q时结束追加。


程序内容如下:功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

CLEAR

USE 学生

DO WHILE .T.

ACCEPT "输入学号(学号的首字符为Q,则结束追加记录):" TO XH

IF UPPER(XH)="Q"&&将输入的学号转换成大写字母

EXIT

ENDIF

ACCEPT "输入姓名:" TO XM

INPUT "输入成绩:" TO CJ

APPEND BLANK

REPLACE 学号 WITH XH,姓名 WITH XM,成绩WITH CJ

ENDDO

WAIT "记录追加结束!" TIMEOUT 5

LIST


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-19所示。

图7-19 例7-15的程序运行结果


§7.6.2功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行 计数循环

 计数循环是通过FOR-ENDFOR语句实现的。

 命令格式:

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

<循环体>

ENDFOR | NEXT

 功能:执行时先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值不超过终值时,执行循环体,之后循环变量增加一个步长,再与终值比较,若仍不超过终值,则再执行循环体;若循环变量超过终值,则结束循环,执行ENDFOR的后继语句,


计数循环的流程图如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-20所示。

图7-20 计数循环结构流程图

【例7-16】从键盘输入任意10个数,然后输出其中的最大数和最小数。


程序内容如下:功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

CLEAR

INPUT "请输入一个数:" TO ANY

STORE ANY TO MA, MI &&假设输入的第一个数为最大MA,和最小MI

FOR I=2 TO 10

INPUT "请输入一个数:" TO ANY &&输入余下的第2~10个数

IF MA < ANY &&如果ANY的值比MA还大,则将ANY的值放入MA

MA = ANY

ENDIF

IF MI > ANY &&如果ANY的值比MI还小,则将ANY的值放入MI

MI = ANY

ENDIF

ENDFOR

?"最大数是:", MA

?"最小数是:", MI


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-21所示。

【例7-17】求1000以内的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153=13+53+33,故153是水仙花数。

图7-21 例7-16的程序运行结果


程序内容如下 :功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

* 求1000以内的水仙花数

CLEAR

? "打印1000以内的水仙花数:"

FOR X=100 TO 999

X1=X%10 &&取出个位数

X2=INT(X/10)%10 &&取出十位数

X3=INT(X/100) &&取出百位数

IF X=X1^3+X2^3+X3^3

? X

ENDIF

ENDFOR


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-22所示。

图7-22 例7-17的程序运行结果


§7.6.3功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行 扫描循环

扫描循环是通过SCAN-ENDSCAN语句实现的。

命令格式:SCAN [<范围>] [ FOR | WHILE <条件> ]

<循环体>

ENDSCAN

功能:对当前表的指定范围内满足条件的记录,依次执行循环体中的语句。

说明:

1)扫描循环只对表文件操作,且记录指针自动移动。

2)<范围>的默认值为ALL。

【例7-18】编程分别统计男女职工的人数。


CLEAR功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

CLOSE ALL

USE Zgjk

M=0&&累加变量的初值应设为0

W=0

SCAN

IF 性别="男"

M=M+1 &&累加男职工人数

ELSE

W=W+1 &&累加女职工人数

ENDIF

ENDSCAN

? "男职工人数为:", M

? "女职工人数为:", W


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-23所示。

图7-23 例7-18的程序运行结果


功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行例7-19】编程统计家电部门职工的基本工资总额。

程序内容如下:

CLEAR

USE Zgjk

GZ=0 &&累加变量的初值应设为0

SCANFOR 部门="家电"&&设置扫描循环的条件

GZ = GZ +基本工资 &&累加基本工资

ENDSCAN

? "家电部门职工的基本工资总额为:",GZ


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-24所示。

图7-24 例7-19的程序运行结果


§7.6.4功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行 循环嵌套

当一个循环的循环体本身又是一个循环时就构成了循环嵌套。

【例7-20】编程打印九九乘法表。

程序内容如下:

* 用FOR―ENDFOR语句打印九九乘法表

CLEAR

FOR A=1 TO 9&&外循环的起始句

FOR B=1 TO 9&&内循环的起始句

C=A*B

?? STR(A,1)+"*"+STR(B,1)+"="+STR(C,2)+" "

ENDFOR&&内循环的终端句

? &&换行

ENDFOR&&外循环的终端句


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-24所示。

图7-24 例7-20的程序运行结果

【例7-21】求1~100之间所有的素数。


* 求功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行1~100之间所有的素数

CLEAR

FOR M=3 TO 100STEP 2

N=INT(SQRT(M)) &&若要判定M是否是素数,只需尝试到SQRT(M)

FOR I=3 TO N &&内循环判定每一个数是否是素数

IF MOD(M,I)=0&&若余为0,M被I整除,M中有I因子,M非素数

EXIT &&退出内循环

ENDIF

ENDFOR

IF I>N&&若N不被所有的I整除,必有I>N,则M为素数

?? M

ENDIF

ENDFOR


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-26所示。

图7-26 例7-21的程序运行结果

【例7-22】假设有两个班级,试编程统计各个班级学生成绩的等级。


* 统计各班级学生成绩的等级功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行

CLEAR

STORE 0 TO A,B,C,D,E &&设置存放各等级人数的变量的初值为0

DO WHILE .T.&&外循环的条件为逻辑常量 .T.

ACCEPT "请输入班级名称(03企1或03企2):" TO BJ

USE &BJ &&等效于USE 03企1或USE 03企2

SCAN&&扫描循环起始句

DO CASE

CASE 成绩>=90

A=A+1

CASE 成绩>=80

B=B+1

CASE 成绩>=70

C=C+1

CASE 成绩>=60

D=D+1

OTHERWISE

E=E+1

ENDCASE

ENDSCAN

? "优的人数为:",A

? "良的人数为:",B

? "中的人数为:",C

? "及格的人数为:",D

? "不及格的人数为:",E

WAIT "还要查询其他班级吗?(Y/N)" TO YN

IF UPPER(YN)="N"

EXIT&&用EXIT强行退出循环

ENDIF

?

ENDDO


程序运行结果如图功能:逐个检查条件,若为真则执行相应的语句序列;否则检查下一个条件;若条件都不满足,则执行7-27所示。

图7-27 例7-22的程序运行结果


ad