第 6 章 程序设计基础

56
22/3/30 1 第 6 第 第第第第第第

Upload: irma-cooley

Post on 03-Jan-2016

101 views

Category:

Documents


0 download

DESCRIPTION

第 6 章 程序设计基础. 本章主要内容. 程序设计的基本概念 程序文件建立与运行 三种程序控制结构 程序调试. 程序设计的基本概念. 一、 VFP 的工作方式 命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的。 程序工作方式 根据解决实际问题的需要,将一系列符合 Visual FoxPro 要求的命令按一定的逻辑结构编排成一个完整的应用程序,然后输入到计算机内自动地、连续地加以执行。. 程序设计的基本概念. 二、 VFP 的编程方式 面向过程编程方式 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 6 章 程序设计基础

23/4/20 1

第 6 章 程序设计基础

Page 2: 第 6 章 程序设计基础

23/4/20 2

本章主要内容程序设计的基本概念程序文件建立与运行 三种程序控制结构 程序调试

Page 3: 第 6 章 程序设计基础

23/4/20 3

程序设计的基本概念一、 VFP的工作方式命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的。程序工作方式 根据解决实际问题的需要,将一系列符合Visual FoxPro 要求的命令按一定的逻辑结构编排成一个完整的应用程序,然后输入到计算机内自动地、连续地加以执行。

Page 4: 第 6 章 程序设计基础

23/4/20 4

程序设计的基本概念二、 VFP的编程方式 面向过程编程方式 用结构化编程语言来编写结构化的程序,它把一个复杂的程序分成较小的过程,每个过程可以单独进行调试。 面向对象编程方式 用面向对象的技术编程,它把编程工作主要集中在描述的对象上,程序是事件驱动的,在执行过程中,等待的是一个事件。

对于制作简单短小的应用程序,使用过程编程方式比较容易,同时,这也是面向对象编程方式的基础。本章重点介绍面向过程的程序设计。

Page 5: 第 6 章 程序设计基础

23/4/20 5

程序设计的基本概念

三、程序设计的步骤 分析问题或任务,总结或抽象出问题的数学模型 根据数学模型确定解决问题的算法思想 确定要建立的数据表或数据库的基本结构及其数据表之间

的关系 画出程序流程图 编写程序,实现功能要求,并在计算机上调试通过 用典型数据对所编写的程序进行测试,验证程序的可靠性

编写使用说明书,整理有关资料,进行总结

Page 6: 第 6 章 程序设计基础

23/4/20 6

6.1 程序文件建立与运行程序文件程序是由命令组成的 ASCII码文本文件,所以

程序文件也称为命令文件。该文件可用任何文本编辑器或字处理软件来建立。

程序文件扩展名源文件的扩展名是 .PRG ,程序在运行时,会

产生主文件名与 .PRG 程序主文件名相同,扩展名为 .FXP的目标文件。

Page 7: 第 6 章 程序设计基础

23/4/20 7

6.1.1 程序文件建立

建立程序最简单的方法是用系统本身提供的编辑器。 VFP 有 2 种方式进入程序编辑器窗口:菜单方式和命令方式

Page 8: 第 6 章 程序设计基础

23/4/20 8

菜单方式建立程序文件

用菜单建立程序的步骤为: 单击菜单“文件”→“新建”命令或者单击常用工具栏的“新建”按钮,打开“新建”对话框。

选 择 “ 程 序 ” 单选按钮

单 击“ 新 建文 件 ”命 令 按钮

打开“程序 1” 的程序编辑新窗口。

程序编辑窗口标题栏,显示程序的文件名,这里“程序 1” 为临时文件名,可以保存为其他文件名。

在插入点“ |” 后可输入程序需要的命令。

Page 9: 第 6 章 程序设计基础

23/4/20 9

命令方式建立程序文件格式: MODIFY COMMAND [<程序文件名>]|?

功能:打开程序编辑窗口,从中可以修改或创建程序文件。

几点说明:< 程序文件名 > :指定修改或创建的程序文件名。如果用 MODIFY COMMAND ?,则出现“打开”对话框,如图所示。

在“查找范围”下拉列表框选择程序所在或要保存的文件夹。

在“文件类型”下拉列表框选择文件类型。

在“文件名”文本框输入要创建的文件名;如果选择了一个已存在的文件,该文件名也会出现在该处。

单击“确定”按钮,进入程序编辑窗口修改或编写程序。

Page 10: 第 6 章 程序设计基础

23/4/20 10

命令方式建立程序文件 在用命令建立程序文件时,最好在命令后加上程序文件名,这样可以直接创建或修改用户给出的程序文件。 建好的文件将保存在“默认目录”指定的文件夹下,默认的扩展名是 .PRG。如果需要保存在其它文件夹下,还可在命令中指定路径。如: MODI COMM D:\excercise\example

注 意 : 这 里 的 命 令 动词 “ MODIFY COMMAND”用了简写形式。

Page 11: 第 6 章 程序设计基础

23/4/20 11

程序输入与保存[ 例 6-1] 在程序编辑窗口输入如下 6 条命令。CLEAR &&将屏幕输出窗口内容清空a=12 &&将数值 12赋值给变量 ab=18 &&将数值 18赋值给变量 bc=a+b &&将变量 a 与 b 和计算出来,赋值给变量 c?a,b,c &&输出变量 a 、 b 、 c 的值RETURN &&表示程序结束

打开程序编辑窗口,即可输入上述程序代码,如图所示。

CLEAR

a=12

b=18

c=a+b

?a,b,c

RETURN

Page 12: 第 6 章 程序设计基础

23/4/20 12

程序输入与保存在输入一个程序时,请用户注意以下几点:一个命令语句中只能有一个命令动词。每输入完一个语句按回车键表示该语句结束。程序中用到的所有作为“分隔符号”的标点符号一律用英文半角符号。

输入或修改结束按“ Ctrl+W” 存盘,“ Ctrl+Q”取消本次输入或修改结果。还可使用“文件”→“另存为”命令将编辑好的程序以另外的名称存盘。

Page 13: 第 6 章 程序设计基础

23/4/20 13

6.1.2 程序运行 菜单方式运行程序 单击菜单“程序”→“运行”命令,打开“运行”对话框。选定定要执行的程序文件,如选择:cx1 ,单击“运行”按钮,如图所示。

通过“查找范围”下拉列表框确定文件所在的文件夹。

选择要执行的文件(即单击该文件)。

选择的文件出现在“执行文件”文本框中。

单 击 “ 运行 ” 按 钮 执行程序。

Page 14: 第 6 章 程序设计基础

23/4/20 14

6.1.2 程序运行命令方式运行程序格式: DO < 程序文件名 >功能:将指定的程序文件调入内存并运行。如在命令窗口里输入: DO cx1将在屏幕输出程序计算结果: 12 18 30

Page 15: 第 6 章 程序设计基础

23/4/20 15

6.1.2 程序运行 单击常用工具栏上“ !” 命令按钮执行该程序 在程序打开并且为当前程序的情况下,单击常用工具栏上“ !” 命令按钮可执行该程序。

Page 16: 第 6 章 程序设计基础

23/4/20 16

6.1.2 程序运行 程序错误对话框 在程序执行过程中,如果程序出现运行错误或用户按下了“ Esc” 键,将弹出“程序错误”对话框,如图所示。

单 击 “ 取消 ” 按 钮 可取 消 程 序 的执行。

单击“挂起”按钮,可暂时停止程序的运行,可在命令窗口里输入命令: RESUME ,或单击菜单“程序”→“继续执行”命令可继续执行程序 。

单 击 “ 忽 略 ” 命令 按 钮 忽 略 程 序的 错 误 继 续 执 行程序 。

单击“帮助”命令按钮可提示相关帮助信息。

Page 17: 第 6 章 程序设计基础

23/4/20 17

6.1.3 程序辅助命令 以前介绍的所有 Visual FoxPro命令都可以用在程序设计中。另外Visual FoxPro 还提供了一些辅助命令,这些命令能使程序更好地阅读和有效地运行。本小节介绍: 程序注释命令 程序结束命令 信息对话框函数 MESSAGEBOX

Page 18: 第 6 章 程序设计基础

23/4/20 18

程序注释命令 Visual FoxPro提供了 3 种注释命令:格式 1 : NOTE < 注释内容 >格式 2 : * < 注释内容 >功能:使 NOTE 或 * 后面的内容成为注释内容。格式 3 : [< 命令 >] &&< 注释内容 >

功能: < 注释内容 > 对 && 左面的命令做出解释或给出运行结果,又称为行尾注释命令。

Page 19: 第 6 章 程序设计基础

23/4/20 19

格式 1 : RETURN功能:返回到上一级模块。如果本程序是以菜单方式或在命令窗口中调用执行的,则返回到命令交互状态。格式 2 : CANCEL功能:终止程序运行,清除程序中的私有变量,返回到命令窗口。格式 3 : QUIT功能:关闭 Visual FoxPro ,返回到操作系统。

程序结束命令

Page 20: 第 6 章 程序设计基础

23/4/20 20

信息对话框函数MESSAGEBOX

MessageBox函数用于显示一个信息对话框,可以在程序运行过程中,显示一些信息,例如提示信息、错误信息等。其构成如图所示。

信 息 对 话 框 的“标题”部分。

信息对话框的“图标”部分。

信 息 对 话 框 的“提示信息 ”部分。

信 息 对 话 框 的“按钮”部分。

Page 21: 第 6 章 程序设计基础

23/4/20 21

信息对话框函数MESSAGEBOX

格式: MESSAGEBOX(< 字符表达式 1>[,< 数值表达式 >[,< 字符表达式 2>]])

功能:供用户定义信息对话框,按下相应的按钮返回一个数值。说明: < 字符表达式 1> 用于指定在对话框中显示的信息文本。 < 数值表达式 > 用于根据表 6-1 的内容设置对话框中的按钮、图标和默认按钮,缺省该参数表示取0 。

Page 22: 第 6 章 程序设计基础

23/4/20 22

信息对话框函数MESSAGEBOX

< 字符表达式 2>用于指定对话框标题栏的显示文本。缺省该参数表示在标题栏显示“ Microsoft Visual FoxPro” 。

函数值返回一个数值,用户可根据操作时按下的按钮来获得相应的返回值,返回值见表 6-2 ,用户编程时根据返回值来设置动作。

Page 23: 第 6 章 程序设计基础

23/4/20 23

信息对话框函数MESSAGEBOX

[ 例 6-3] 在信息对话框中使用 2 个按钮“是”和“否”,使用“问号”图标,默认按钮为第二个按钮,显示“真的要退出系统吗?”信息,对话框标题为“提示信息”。 在命令窗口里输入:a=MESSAGEBOX("真的要退出系统吗? ",4+32+256,"提示信息 ")

就会显示如图所示的信息对话框。

Page 24: 第 6 章 程序设计基础

23/4/20 24

6.1.4 交互式输入命令 根据解决实际问题的需要,往往在程序运行的过程中,由用户向程序输入一些数据或信息,完成这种功能的一些命令称为交互式输入命令。 Visual FoxPro 提供了多种交互式输入命令。本小节介绍三种命令: ACCEPT INPUT WAIT

Page 25: 第 6 章 程序设计基础

23/4/20 25

字符型数据输入命令 ACCEPT 格式: ACCEPT [< 提示信息 >] TO < 内存变量 >功能:暂停程序的执行,等待用户输入一个字符串给变量。说明:( 1 ) [< 提示信息 >] ,是在屏幕上出现的提示信息。它可以是字符串,此时必须用双引号将其括起来,也可以是字符型内存变量,该内存变量必须预先赋值。( 2 )用户在键盘输入的任何字符信息都被赋值给“内存变量”。输入的数据将作为字符型数据处理,不需要定界符括起来,如果输入了定界符,则这些定界符也被作为输入字符的一部分。( 3 )输入完需要的信息后,按“ Enter” 键结束本命令的输入。如果没有输入其他信息,只按回车键,将把一个空字符串赋值给内存变量。

Page 26: 第 6 章 程序设计基础

23/4/20 26

ACCEPT 使用举例[ 例 6-4] 编一程序,将人事数据表打开,在程序运行中输入人员姓名,显示指定姓名的人员记录。程序代码如下:NOTE 该程序用于从人事数据表中查找用户指定姓名的人员信息。CLEARUSE rsbACCEPT " 请输入要查找的姓名: " TO nameLOCATE FOR ALLTRIM( 姓名 )=nameDISPLAYRETURN

Page 27: 第 6 章 程序设计基础

23/4/20 27

表达式输入命令 INPUT

格式: INPUT[< 提示信息 >] TO < 内存变量 >功能:暂停程序的执行,接受用户输入合法的表达式并将表达式的值赋值给内存变量。说明:( 1 ) [< 提示信息 >] ,同“ ACCEPT” 命令中的 [< 提示信息 >] 。( 2 )用户可输入任何一个合法的数值型( N )、字符型( C )、日期型( D )、逻辑型( L )表达式,系统先计算表达式的值并将该值赋值给内存变量。( 3 )如果输入字符串信息,则必须加上双引号或单引号定界符,如 "ABC" 。( 4 )按“ Enter” 键结束输入,如果输入的是非法表达式,系统将提示重新输入。

Page 28: 第 6 章 程序设计基础

23/4/20 28

INPUT 使用举例[ 例 6-5] 已知圆半径为 r ,求圆面积 s (要求四舍五入保留三位小数)。分析:假设圆的半径为 r ,则计算圆面积 s 的公式为:s=πr2 ,计算圆面积公式的 Visual FoxPro 表达式为:PI()*r^2 。程序代码如下:* 该程序用于计算用户指定半径的圆的面积。CLEARINPUT " 请输入圆半径 r=" TO rs=ROUND(PI()*r^2,3) &&PI() 为圆周率函数 π , ROUND 函数为四舍五入函数?" 该圆半径为: ",r?" 该圆面积为: ",sRETURN

Page 29: 第 6 章 程序设计基础

23/4/20 29

接收单字符命令 WAIT

格式: WAIT [< 提示信息 >] [TO < 内存变量 >] [WINDOWS [AT < 行坐标>,<列坐标>]] [TIMEOUT< 等待秒数 >] [NOWAIT]功能:暂停程序,用户按任意键或者时间超过等待的秒数后,程序继续执行。如果包含[TO < 内存变量 >]短语,将用户所按键盘字符赋值给指定的内存变量。

说明:

( 1 ) [< 提示信息 >] ,指定要显示的自定义信息。若省略该参数,则 Visual FoxPro 显示默认的信息“按任意键继续……”。如果该参数为空字符,则不显示信息。( 2 ) [WINDOWS] :在 Visual FoxPro 主窗口右上角的系统信息窗口中,显示提示信息。如果指定 [AT < 行坐标>,<列坐标>] ,则该窗口在指定屏幕坐标位置显示。

( 3 ) TIMEOUT < 等待秒数 > :指定在执行 WAIT 命令之后,程序暂停的时间, < 等待秒数 >参数指定等待的时间秒数。( 4 ) NOWAIT子句指在前述指定的 Windows窗口中显示 WAIT 信息的同时,程序继续执行而不暂停。

Page 30: 第 6 章 程序设计基础

23/4/20 30

WAIT 使用举例 下列命令将在屏幕 16 行、 16列位置处显示一含有提示信息的小窗口,如图所示,此时单击鼠标按键、按下键盘上任意一个按键或小窗口在屏幕上停留 7 秒后,从屏幕上消失。

WAIT " 请稍后,程序将继续执行 ...... 。 " WINDOWS AT 16,16 TIMEOUT 7

Page 31: 第 6 章 程序设计基础

23/4/20 31

课堂提问程序设计的步骤有哪些 ?进入程序编辑器窗口的方法有哪 2种 ?

进入程序编辑器窗口的命令是什么 ?

Page 32: 第 6 章 程序设计基础

23/4/20 32

6.2 程序控制结构

结构化程序包括三种基本结构,即 顺序结构 选择结构 循环结构

Page 33: 第 6 章 程序设计基础

23/4/20 33

6.2.1 顺序结构

顺序结构是程序设计中最基本的结构,该结构按照程序命令出现的先后顺序依次执行。事实上,如果不进行特殊说明,程序中的命令就自动按其前后排列顺序执行。

Page 34: 第 6 章 程序设计基础

23/4/20 34

顺序结构程序举例 1

[ 例 6-6] 假设我国 2007年国民生产总值为200,000 亿元,按每年平均 10% 的速度递增,编程计算到 2020年我国国民生产总值将会达到多少? 国民生产总值计算公式为:未来值 p1=初值p0× ( 1+速度a )时间间隔 n

这 里 ,初值 p0=200000 亿元,速度为 a=0.1 ,时间间隔 n=2020-2007=13 , P1为未来待计算的值。 Visual FoxPro 计算表达式为: p1=p0*(1+a)^n 。该程序流程图如图所示。

程序代码如下:CLEARp0=200000a=0.1n=13p1=p0*(1+a)^n?" 我国 2007 年的国民生产总值为: ",p0, " 亿元。 "?" 我国 2020 年的国民生产总值为: ",p1, " 亿元。 "RETURN

Page 35: 第 6 章 程序设计基础

23/4/20 36

6.2.2 选择结构 选择结构,是一种常用的基本结构,是

根据所给条件是否为真,选择执行某一分支的相应操作。按照选择结构执行路径的多少,可分为:

简单分支结构双分支选择结构多分支选择结构

Page 36: 第 6 章 程序设计基础

23/4/20 37

简单分支结构 格式: IF <条件 > [ 命令序列 ] ENDIF

功能:根据条件的逻辑值来确定是否执行[ 命令序列 ] 。

说明:( 1 )根据 < 条件 > 的逻辑值进行判断。如果 < 条件 > 的逻辑值为 .T. ,就依次执行 [ 命令序列 ] ,执行完后就转去执行ENDIF 之后的命令。如果 <条件 > 的 逻 辑 值 为 .F. , 则IF< 条件 > 和 ENDIF 之间的所有命令都不执行,而直接转到 ENDIF之后的命令。

( 2 ) IF语句和 ENDIF语句必须成对出现,且各占一行。

( 3 )为了程序阅读方便,便于以后维护修改,建议对于[ 命令序列 ] 部分采取向右缩进书写的方式。

Page 37: 第 6 章 程序设计基础

23/4/20 38

简单分支结构举例 1

[ 例 6-8] 铁路托运行李,按规定每张客票托运行李不超过 50公斤时,每公斤 0.25元,如超过 50 公斤,超过部分按每公斤0.45元计算。编写一个程序,把行李重量输入计算机,计算出运费,并打印出付款清单。 问题分析:设行李重量为W 公斤,应付运费为 P 元,则运费公式为: 当 W≤50 , p=0.25×w 当W > 50 , p=50×0.25+(w-50)×0.45

该问题计算机程序框图如图所示 程序代码如下:NOTE 计算铁路托运行李费,W 为行李重量, P 为运费。CLEARINPUT " 请输入行李重量: " TO wP=0.25*wIF w>50 P=50*0.25+(w-50)*0.45ENDIF?" 行李重量为: ",w,"公斤 "?"应付运费为: ",p," 元 "RETURN

Page 38: 第 6 章 程序设计基础

23/4/20 40

双分支选择结构 格式: IF <条件 > [ 命令序列 1] ELSE [ 命令序列 2] ENDIF功能:根据条件的逻辑值来决定程序执行[ 命令序列 1] 还是 [ 命令序列 2] 。

说明:

( 1 )如果 < 条件 > 的逻辑值为 .T. ,就执行 [ 命令序列1] , 执 行 完 后就转到执 行ENDIF之后的命令。如果 <条件 > 的逻辑值为 .F. ,就执行 [ 命令序列 2] ,完成后,转去执行 ENDIF之后的命令。

( 2 ) ELSE语句单独占一行, IF语句和 ENDIF语句必须成对出现,且各占一行。

Page 39: 第 6 章 程序设计基础

23/4/20 41

双分支选择结构举例

[ 例 6-10] 设出租车不超过 2公里时一律收费 7元钱,超过时则超过部分每公里加收 2.6 元。试根据里程数编程计算并显示出应付车费(用双分支选择结构编程)。

程序代码如下:

CLEARINPUT " 请输入里程数: " TO kIF k<=2 cf=7ELSE cf=7+(k-2)*2.6ENDIF?" 里程为: ",k," 公里 "?" 车费为: ",cf," 元 "RETURN

Page 40: 第 6 章 程序设计基础

23/4/20 42

分支结构嵌套

在分支结构的 < 命令序列 > 中,可以包含任何 Visual FoxPro 命令语句,也可以包括另外一个或几个合法的分支结构语句,也就是说分支结构可以嵌套。对于嵌套的分支结构语句,一定注意内外层分支结构层次分明,即注意各个层次的 IF…ELSE…ENDIF 语句的配对情况。

Page 41: 第 6 章 程序设计基础

23/4/20 43

分支结构嵌套举例 [ 例 6-11] 永立公司对销售人员的报酬计算方法如下:每月销售 10万元(含 10万元)以下者,只得基本工资 1000 元;每月销售 10万元以上至 30万元(含 30万元)者,则超过10万元以上部分按 2% 提成;每月销售 30万至 50万(含 50万元)者,超过 30万元部分按 5% 提成;超过 50万元部分按 10% 提成。以上各个级别的计算实行累加计算。编程按输入每个销售人员编号和销售额,计算每个销售人员的报酬(报酬结果按四舍五入规则取整)。

编程思路:为了编程方便,先将每个级别的基准报酬计算出来,再根据销售额的多少用嵌套分支结构判断计算。该程序代码如下:

CLEARACCEPT "销售员编号: " TO salenumberINPUT "销售额: " TO salevolumepay1=1000pay2=pay1+ROUND((300000-100000)*0.02,0)pay3=pay2+ROUND((500000-300000)*0.05,0)

IF salevolume<=100000 pays=pay1ELSE IF salevolume<=300000 pays=pay1+ROUND((salevolume-100000)*0.02,0) ELSE IF salevolume<=500000 pays=pay2+ROUND((salevolume-300000)*0.05,0) ELSE

pays=pay3+ROUND((salevolume-500000)*0.1,0) ENDIF ENDIFENDIF?salenumber+" 号销售员工作报酬: "+STR(pays,6,0)+"元。 "RETURN

Page 42: 第 6 章 程序设计基础

23/4/20 44

多分支选择结构 格式:

DO CASE CASE <条件 1>

< 命令序列 1> CASE <条件 2>

< 命令序列 2> ... ... CASE <条件 n>

< 命令序列 n> [OTHERWISE

< 命令序列 n+1>]ENDCASE

功能:根据 < 条件 > 是否成立来决定是否执行其下的命令序列。

说明:

( 1 )多分支选择结构执行的过程是:系统依次判断各 < 条件 > 是否满足,若某一 < 条件 > 为 .T. ,就执行该 <条件 > 下的 < 命令序列 > ,执行后不再判断其它 < 条件 > ,而转去执行ENDCASE 后面的第一条命令。如果没有一个 < 条件 > 为 .T. ,就执行OTHERWISE 后 面 的 [ 命 令 序列n+1] ,直到 ENDCASE;如果没有OTHERWISE ,则不作任何操作就转向 ENDCASE之后的第一条命令。

( 2 ) DO CASE语句和ENDCASE语句必须成对出现,各占一行。

( 3 )多分支选择结构中各CASE语句后的 < 条件 > 是按其先后顺序判断执行的,因此对实际问题进行编程时,应认真考虑各个条件排列的先后顺序。

Page 43: 第 6 章 程序设计基础

23/4/20 45

多分支选择结构[ 例 6-12] 用多分支选择结构编程计算 [ 例 6-11] 。程序代码如下: CLEARACCEPT "销售员编号: " TO salenumberINPUT "销售额: " TO salevolumepay1=1000pay2=pay1+ROUND((300000-100000)*0.02,0)pay3=pay2+ROUND((500000-300000)*0.05,0)

DO CASE CASE salevolume<=100000

pays=pay1 CASE salevolume<=300000

pays=pay1+ROUND((salevolume-100000)*0.02,0) CASE salevolume<=500000

pays=pay2+ROUND((salevolume-300000)*0.05,0) OTHERWISE

pays=pay3+ROUND((salevolume-500000)*0.1,0)ENDCASE?salenumber+" 号销售员工作报酬: "+STR(pays,6,0)+"元。 "RETURN

Page 44: 第 6 章 程序设计基础

23/4/20 46

6.2.3 循环结构 在程序设计中,有时需要从某处开始有规律地反复执行某些类似的操作,这些类似的操作一般用循环结构程序设计来解决。在 Visual FoxPro 中,提供了 3 种循环结构,即: 当型循环结构 步长型循环结构 表扫描型循环结构

Page 45: 第 6 章 程序设计基础

23/4/20 47

当型循环结构 格式: DO WHILE <条件 > [ 命令序列 ] ENDDO功能:根据 < 条件 > 是否满足来决定是否执行 [ 命令序列 ] 。

说明:( 1 )当型循环执行的过程是:根据< 条件 > 的逻辑值,进行判断。如果< 条件 > 的逻辑值为 .T. ,则执行DO WHILE 和 ENDDO 之间的 [ 命令序列 ] (也称为循环体),当 [ 命令序列 ] 包含的所有命令执行完毕后,程序自动返回到 DO WHILE 语句,每执行一遍就判断一次 DO WHILE 语句中的 < 条件 > 。如果 < 条件 > 仍然为 .T. ,则继续执行 DO WHILE和 ENDDO之间的 [ 命令序列 ] ,直到 < 条件 > 的逻辑值为 .F. ,结束循环,转去执行 ENDDO之后的第一条命令。

( 2 ) DO WHILE 和ENDDO 语句应配对使用,各占一行。

( 3 )在 [ 命令序列 ] 的适当位置可以放置 EXIT 和 LOOP 语句,用以对循环过程作特殊处理。 EXIT的功能是:结束循环命令,转去执行 ENDDO 之 后 的 第 一 条 命令。 LOOP 语句的功能是:终止本 次 循 环 命 令 , 返 回 到 循 环 入口。 EXIT 和 LOOP 语句只能在循环结构中使用,并且常常附加条件加以限制。

( 4 )在命令序列中可以嵌套 IF…ENDIF 、 DO CASE…ENDCASE 、 DO WHILE…ENDDO 、 FOR…ENDFOR 、 SCAN…ENDSCAN 等程序结构。

Page 46: 第 6 章 程序设计基础

23/4/20 48

当型循环结构程序举例 [ 例 6-13] 鸡兔同笼问题。设鸡和兔共有头 38个,脚 138 个,问鸡和兔各为多少只? 问题分析:设鸡为 cocks只,兔为 rabbits只 , 则 有 : cocks + rabbits=38 ;2*cocks+4*rabbits =138 。可令鸡和兔的头数之和或者脚数之和为一变量,如本题令二者脚数之和foots 为变量,开始令 cocks=0 , foots=0 ,用循环进行判断是否 foots<>138 ,如果是,则进行如下运算: cocks=cocks+1 ; rabbits=38-cocks ;foots=2*cocks+4*rabbits ;再进行循环判断,直到 foots<>138 不成立(即 foots=138 ),循环结束,输出结果。程序框图如图所示。

程序代码如下:CLEARcocks=0foots=0DO WHILE foots<>138 cocks=cocks+1 rabbits=38-cocks foots=2*cocks+4*rabbitsENDDO?" 鸡的数量为: ",cocks?" 兔的数量为: ",rabbitsRETURN

Page 47: 第 6 章 程序设计基础

23/4/20 49

步长型循环结构 格式: FOR <循环变量 >=<初值 > TO <终值 > [STEP <步长值 >]

[ 命令序列 ] ENDFOR|NEXT

功能:根据循环变量的值是否超过终值来决定是否执行 [ 命令序列 ] 。

说明:

Page 48: 第 6 章 程序设计基础

23/4/20 50

步长型循环结构程序举例 1

[ 例 6-15] 求 1+2+3+…+99+100的值。 问题分析:采用累加的办法,用循环变量产生 1 、 2 、 3 、…、 99 、 100 这些数。用 s 保存累加和, s 的初始值为 0 ,每次循环将 s 加上循环变量的值,再赋值给变量 s ,循环结束即求得 s 。 程序代码为:

CLEARs=0FOR x=1 TO 100 s=s+xENDFOR?"1--100自然数累加和是: ",sRETURN

Page 49: 第 6 章 程序设计基础

23/4/20 51

步长型循环结构程序举例 2 [ 例 6-16] 从键盘上输入任何一个自然数,求该自然数的阶乘。 问题分析:假设该自然数为 n ,那么求 n 的阶乘的公式是:

n*(n-1)*(n-2)*......*2*1 有了这样的公式,我们就可以用循环程序将该 n的阶乘求解出来。将循环变量的初值设为 n ,终值设为 1 ,步长值设为 -1 。用 factor 作为存放阶乘的变量, factor 的初始值为 1 ,每次循环都使factor 乘以循环变 量 的 值 ,循环结 束 即 求得factor 的值。该程序代码如下:

CLEARfactor=1INPUT " 请输入一个自然数: " TO nFOR x=n TO 1 STEP -1 factor=factor*xENDFOR? "自然数 "+ALLTRIM(STR(n,10))+" 的阶乘是: "+ALLTRIM(STR(factor,20))

RETURN

Page 50: 第 6 章 程序设计基础

23/4/20 52

表扫描循环结构 格式:SCAN [<范围>][FOR <条件 1> |WHILE <条件 2>] [ 命令序列 ] ENDSCAN

功能:根据对打开数据表的范围和条件来决定是否执行 [ 命令序列 ]。

说明:

Page 51: 第 6 章 程序设计基础

23/4/20 53

表扫描循环结构程序举例 [ 例 6-17] 将人事数据表中基本工资小于 1000 的姓名、基本工资两个字段输出,并 统 计 这 些职工 的 人 数 。 ( 用 SCAN… ENDSCAN 结构编程) 基本操作步骤为:关闭所有数据表,打开人事数据表,设计一个累加变量 n ,代表满足条件的记录数,给 n 赋初值 0 ,用表扫描循环结构定位满足条件的记录,输出姓名、基本工资两个字段,并对 n 进行累加 1 ,循环结束即求得n ,输出 n 。程序代码如下:

CLOSE DATABASECLEARUSE rsbn=0SCAN FOR 基本工资 <1000 ? 姓名 , 基本工资 n=n+1ENDSCAN ?" 基本工资在 1000 元以下的人数有: "+STR(N,2)+" 人。 "CLOSE DATABASERETURN

Page 52: 第 6 章 程序设计基础

23/4/20 54

循环结构嵌套 循环结构的嵌套是指在一个循环体内包含其它的循环结构,也称为多重循环结构。 同一种类型的循环结构可以嵌套,不同类型的循环结构也可以嵌套。 要编好循环结构嵌套程序,必须做到:循环开始语句和循环结束语句配对出现;内外层循环层次分明,不得交叉。 Visual FoxPro 最多允许 128 层嵌套。请看下面的例子。

Page 53: 第 6 章 程序设计基础

23/4/20 55

循环结构嵌套举例 1 [ 例 6-18] 用双重循环打印九九乘法表,即: 1×1=1 , 1×2=2 ,…, 1×9=9 2×1=2 , 1×2=4 ,…, 2×9=18 … … … … … … … … … … 9×1=9 , 9×2=18 ,…, 9×9=81 问题分析:这是一个有 9 个行、 9 个列数据项的矩阵,可以用双重循环解决。外循环用于控制各个行,内循环用于控制每一行的各个列项,一行输出完毕以后,换行输出下一行各个列的数据项。程序代码如下:

* 打印乘法九九表。CLEARFOR a=1 TO 9 FOR b=1 TO 9 p=a*b ??STR(a,1)+"×"+STR(b,1)+"="+STR(p,2)+" " ENDFOR ? && 注意 ?? 和 ? 的区别ENDFORRETURN

Page 54: 第 6 章 程序设计基础

23/4/20 56

循环结构嵌套举例 2如何在屏幕输出如下图形:

CLEARFOR i=1 TO 7 FOR j=1 TO i ??"*" AT 2*j ENDFOR ?ENDFORRETURN

Page 55: 第 6 章 程序设计基础

23/4/20 57

循环结构嵌套举例 3

在屏幕输出如下图形:CLEARFOR i=1 TO 7 FOR j=1 TO 2*i-1 ??"*" AT 28-2*i+2*j ENDFOR ?ENDFORRETURN

Page 56: 第 6 章 程序设计基础

23/4/20 58

课堂提问 三种常用的程序结构是什么 ?三种 VFP 分支结构是什么 ?三种 VFP循环结构是什么 ?