第9章 结构化程序设计.

Slides:



Advertisements
Similar presentations
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Advertisements

10.2.switch语句.
第6章结构化与面向对象程序设计基础.
第六章 Visual Foxpro 基 础 荆楚理工学院.
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
循环模式 流程图的画法: 条件 y 循环体 伪代码: n Do while 条件 循环体 loop 每个循环模式的结构都是一个入口,一个出口.
第六章 循环控制.
第七章 程序设计基础 信息工程系 李希敏.
Oracle数据库 Oracle 子程序.
C语言实验 第一课 标题:学号+姓名.
数学建模与MATLAB 第五讲:循环结构(1) 2017/9/12.
第3章 While循环程序设计.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
C#程序设计基础 $5 流程控制.
Hadoop I/O By ShiChaojie.
第7章:文件共享 与远程控制——回顾 第8章:bash脚本编程 本章教学目标: 了解shell程序的基本结构 网络文件系统NFS的概念
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
走进编程 程序的顺序结构(二).
辅导课程六.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第二章 Java语言基础.
动态规划(Dynamic Programming)
SOA – Experiment 2: Query Classification Web Service
第4章 PHP流程控制语句.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第七章 程序设计基础.
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
《计算机应用基础》 第9章 程序设计基础(二).
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
第4章 Excel电子表格制作软件 4.4 函数(一).
单元08:子程序的应用 主讲教师:鲁淑叶.
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
College of Computer Science & Technology
1.2基本算法语句 1.2.3循环语句.
输入语句 输出语句 赋值语句 条件语句 循环语句
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
HSC高速输出例程 HORNER APG.
第二章 Java基本语法 讲师:复凡.
初三VB 复习一.
正弦、余弦函数的性质 华容一中 伍立华 2017年2月24日.
Python 环境搭建 基于Anaconda和VSCode.
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
Visual FoxPro 应用基础与面向对象 程序设计教程
输入语句 输出语句 赋值语句 条件语句 循环语句
五 循环结构程序设计 厦大附中信息技术.
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
第7章 VFP6程序设计基础 数据库应用程序设计 山西国际商务职业学院 返回
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
WEB程序设计技术 数据库操作.
鸡兔同笼(续) ——选择结构.
第三讲 程序设计准备知识 一、程序编辑器.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
任课教师:戴开宇 TA:时均帅、谭肖、王安华 程序设计B班 :20-16:50(90分钟)
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
顺序结构程序设计 ——关于“字符串”和数值.
考察点:switch\while\for System.in\Scanner char vs int
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
第二次课后作业答案 函数式编程和逻辑式编程
Presentation transcript:

第9章 结构化程序设计

9.1 程序设计基础 9.1.1 程序设计的概念 VFP提供一种程序执行方式,这种方式就是预先把 需要执行的多条命令按一定的结构组成一个有机序列以 文件的形式存储在磁盘上,这个文件就称为程序文件, 这个序列的设计、编码和调试的过程就是程序设计。

任何复杂的程序都由3种基本控制结构组成。它们是顺序结构、选择结构和循环结构。 9.1.2 程序的控制结构 任何复杂的程序都由3种基本控制结构组成。它们是顺序结构、选择结构和循环结构。 图9.1程序的控制结构

9.1.3 结构化程序设计方法 结构化程序设计采用自顶向下、逐步求精和模块化的分析方法。 自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题 。逐步求精是指程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤 。模块化是结构化程序的重要原则。所谓模块化就是把大程序按照功能分为较小的程序。

9.1.4 程序文件的建立与执行 1.命令方式建立或修改程序文件 命令格式: MODIFY COMMAND [<程序文件名> |? ] MODIFY.FILE.[〈文件名〉|?] 功能:启动VFP提供的文本编辑器来建立或编辑程序文件。 2.菜单方式建立编辑程序文件

3.程序文件的执行 命令格式: DO <程序文件名> 功 能 : 将程序文件从磁盘调入内存, 编译成.FXP目 标文件后并执行。 菜单方式:①.CANCEL:终止程序运行,清除所有的私有变量,返回命令窗口。 ②.RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口。 ③.QUIT:结束程序执行并退出Visual.FoxPro系统,返回操作系统。

9.2 顺序结构程序 顺序结构是最简单、最基本的一种程序结构。在顺序结构程序中,各命令按照各自出现的先后顺序,依次执行。

9.2.1 程序文件中的辅助命令 一.输入类语句 ㈠. 赋值语句 格 式1: STORE <表达式> TO <内存变量名表> 格 式2: <内存变量> = <表达式> 功 能:给内存变量赋值。

㈡. 交互式语句/键盘输入命令 键盘输入命令主要用于程序执行过程中原始数据的输入。 1. 字符串数据输入命令 格式: ACCEPT [<提示信息>] TO <内存变量> 功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。 注:ACCEPT命令只能接受字符型常量,输入时不需加定界符。

例9-1:要求用户从键盘上输入用户名,然后把输入的用户名显示出来。 ACCEPT “请输入用户名:” TO NAME ?NAME

2. 数据输入命令 格式:INPUT [<提示信息>] TO <内存变量> 功能:在屏幕上显示提示信息,等待用户从键盘输入,再把输入内容赋值给指定的内存变量。 注:INPUT命令能接受任何类型的表达式: ① 输入C 型数据时,要使用 ‘ ’ 或 “ ” 作为定界符; ② 输入L 型数据时,.T. 和 .F. ,两边的 . 不能省; ③ 输入D 型数据时,要用{ } 或CTOD( ) 将字符串转成日期型变量。

例9-2:求任意两数之和。 INPUT “请输入一个数x:” TO X INPUT “请输入另一个数y:” TO Y ?X+Y

例9-3: 给出下列A、B的结果 J=2800 INPUT “输入 J+200 :” TO A ACCEPT “输入 J+200 :” TO B ?“A=”,A ? “B=”,B 注:执行时,先后两次输入同样的内容:J+200

[TIMEOUT <数值表达式>] 3. 只能输入一个字符的命令 格式:WAIT [<提示信息>] TO <内存变量> [TIMEOUT <数值表达式>] 功能:当程序执行某一处需要暂停时使用此命令。 注:WAIT命令响应速度快,它只接受一个字符,不需用户键入回车键。

**** 数据表操作命令菜单 **** 例9-4: 打开工作数据表 增加数据表记录 删除数据表记录 修改数据表记录 打印数据表记录 关闭工作数据表 WAIT “请选择相应代码:” TO CHOICE ? “您选择的是第” + CHOICE + “个选项”

[RANGE <数值表达式1>, <数值表达式2>] READ 4. 格式输入语句 格式: @ <行,列> SAY <提示信息> GET <变量> [RANGE <数值表达式1>, <数值表达式2>] READ 功能:在屏幕指定的坐标位置上显示提示或输入数据。 注:① <变量> :该变量应在其前面定义过 ( 赋初值 ) 。 ② READ 一般与GET 联合起来用: 当有READ时, GET <变量> 的内容可以从键盘上修改; 没有READ时,GET 后的变量只能显示内容,不能修改; 一个READ可以修改它前面的多个GET项的内容,但它可以由CLEARGETS命令隔断。

例9-5: @ 8, 18 SAY “**** 数据表操作命令菜单 ****” @ 9, 18 SAY “ 1.打开工作数据表 ” @ 10, 18 SAY “ 2. 增加数据表记录 ” @ 11, 18 SAY “ 3. 删除数据表记录 ” @ 12, 18 SAY “ 4. 修改数据表记录 ” @ 13, 18 SAY “ 5. 打印数据表记录 ” @ 14, 18 SAY “ 6. 关闭工作数据表 ” @ 16, 28 SAY “ 请选择相应代码:” GET CHOICE READ @ 18, 28 SAY “您选择的是:” + LTRIM(STR(CHOICE))

二.输出类语句 1. 非格式输出语句 格式1: ? <内存变量名表> 格式2: ?? <内存变量名表> 1. 非格式输出语句 格式1: ? <内存变量名表> 格式2: ?? <内存变量名表> 功 能:显示内存变量、常量或表达式的值。 注:语句1 是在光标所在行的下一行开始显示, 语句2 则是在当前光标位置开始显示。

[FUNCTION <功能符>][PICTURE <格式符>] 2. 格式输出语句 格式: @ <行,列> SAY <表达式> [FUNCTION <功能符>][PICTURE <格式符>] 功能:按指定的坐标位置在屏幕上输出表达式的值。 注: 若选用PICTURE、 FUNCTION子句,则按一定的格式输出 ,分别见教材P131的表6.1、6.2。

ENDTEXT 3. 文本输出语句 格式: TEXT <输出显示内容> 功能:在屏幕上原样显示TEXT和ENDTEXT之间的内容。 注: TEXT、ENDTEXT是一条子句,不能省略其中任一条子句。

**** 数据表操作命令菜单 **** 例6-6 TEXT 打开工作数据表 增加数据表记录 删除数据表记录 修改数据表记录 打印数据表记录 关闭工作数据表 ENDTEXT WAIT “请选择相应代码:” TO CHOICE ? “您选择的是第” + CHOICE + “个选项”

三. 设置会话状态语句 语句格式1: SET TALK ON 语句格式2: SET TALK OFF 功能 语句1:设置会话状态开通。 语句2:设置会话状态关闭。

四. 清屏与注释语句 1. 清屏语句 语句格式: CLEAR 功 能 :清除屏幕上所有显示内容,光标回到屏幕左上角。

2. 注释语句 语句格式1: NOTE <注释内容> 语句格式2: * <注释内容> 语句格式3: && <注释内容> 功 能 : 在程序中加入说明性语句。 注:语句1、2、3 在程序中,系统不执行。

五. RETURN命令 格式: RETURN [<表达式>/TO MASTER/TO <程序名>] 功能 : 结束一个程序的执行。 注:一般RETURN出现于程序末尾。

六. 终止程序执行语句 语句格式1: CANCEL 语句格式2: QUIT 功能:终止程序执行,关闭所有打开的命令文件。 注: 语句1:在终止程序执行后,返回到VFP命令状态; 语句2:返回到操作系统状态。

顺序结构程序设计 顺序结构程序:按语句的先后顺序组织的程序,即把处理过程的各个步骤按执行的先后顺序列出。 其流程图如右图所示。 A B C 图中箭头表示程序执行的方向,方框代表不同的可执行语句。 N

例9-7 变量的初始化和变量的赋值。 SET TALK OFF STORE 0 TO X,Y,Z A=3 B=A+1 C=A*B ? X, Y, Z ? A, B, C SET TALK ON

例9-8 执行以下命令序列,问答问题: USE zgb SUM 基本工资 FOR 基本工资>1000 TO SGZ COPY FOR 基本工资>1000 TO GZK2 USE GZK2 num=reccount( ) ave=sgz/num ? ave 最后显示的值是: 所有职工的平均工资; 所有工资在1000元以上的职工的平均工资; 所有工资在1000元以上的职工人数; 所有职工人数 。

9.3 选择结构程序设计 在计算机应用的许多场合,要求程序根据不同的条件采用不同的处理方法。如果条件满足,则执行某一些语句;如果条件不满足,则执行另一些语句。这些需要根据判断条件来控制程序走向的程序设计称为选择结构程序设计,又称分支结构程序设计。 Visual FoxPro提供双分支选择语句、多分支选择语句两种选择结构。

9.3.1 双分支选择语句(选择判断语句) .T. 语句格式: IF <条件> <语句序列1> ENDIF .F. [ELSE 9.3.1 双分支选择语句(选择判断语句) .T. 语句序列1 语句格式: IF <条件> <语句序列1> ENDIF .F. ENDIF后的语句 [ELSE <语句序列2>] 条件 .Y. .N. ENDIF后的语句 语句序列1 语句序列2

执行过程: 如果<条件>成立,就执行语句序列1; 如果<条件>不成立,执行语句序列2。 注: (1) IF和ENDIF必须配对使用,而ELSE可选。 (2) IF、ELSE、ENDIF必须各占一行。 (3) <条件>可以为关系表达式、逻辑表达式。 (4)在<语句序列1>和<语句序列2>中可以嵌套IF语句。

例 请改用分支结构语句编程计算电费: 不超过50度, 每度0.52元; 超过50度时, 超出部分每度0.75元。 SET TALK OFF INPUT “请输入所用电量:" TO DL DF=IIF(DL<=50,0.52*DL,0.52*50+0.75*(DL-50)) ? “应缴电费为:” + LTRIM(STR(DF,10,2)) + "元" SET TALK ON RETURN

例 火车托运行李: 每人不超过40公斤,每公斤0.22元;超过40公斤时, 超出部分每公斤0.40元。填空完成以下程序。 SET TALK OFF INPUT "请输入行李重量:" TO W IF 1 YF=0.22*W ELSE YF= 0.22*40 + 1 ENDIF ? "应交托运费为:"+LTRIM(STR(YF,10,2))+"元" SET TALK ON RETURN W < 40 (W-40) * 0.4

例 编程:在ZGB.DBF中查找某人。 SET TALK OFF Set defa to f:\jfvfp\prg USE zgb ACCEPT “请输入要查找人的姓名: ” TO N LOCATE ALL FOR XM=N IF FOUND( ) DISP ELSE ? [查无此人] ENDIF USE SET TALK ON RETURN

9.3.2 多分支选择语句(选择语句|情况语句) 语句格式: 说明: ①DO CASE和第一个CASE子句之间不能插入任何语句。 <语句序列1> CASE <条件表达式2> <语句序列2> ┇ CASE <条件表达式n> <语句序列n> [ OTHERWISE <语句序列n+1> ] ENDCASE 说明: ①DO CASE和第一个CASE子句之间不能插入任何语句。 ②DO CASE和ENDCASE必须配对使用,且DO CASE,CASE,OTHERWISE和ENDCASE各子句必须各占一行。 ③在<语句序列>中可嵌套情况语句。

功能:系统依次测试语句中各个条件表达式的值: 若为真,即执行相应<条件表达式>后的<语句序列>, 然后脱离情况语句,执行ENDCASE的下一语句。若所有的条件表达式的值均为假,则执行OTHERWISE后面的语句序列, 然后脱离情况语句,执行ENDCASE下一语句 。 开始判断 条件1 条件2 条件n 其它 语句序列1 序列2 序列n 序列n+1 …… ENDCASE后面的语句

例 已知cjb.dbf中包含xingming,avcj等字段。试用avcj来判断该生成绩属于优(≥90)、良(≥80)、及格(≥60)或不及格(<60)。 USE cjb ACCEPT ′请输入姓名:′ TO xm LOCATE FOR ALLTRIM(xingming)=ALLTRIM(xm) n=avcj DO CASE CASE n>=90 dj=″优″ CASE n>=80 dj=″良″ CASE n>=60 dj=″及格″ OTHERWISE dj=″不及格″ ENDCASE @5,10 SAY xingming+[同学的成绩等级为:]+ dj

例 阅读下列程序段,写出运行结果: A=3000 DO CASE CASE A<1000 B=A/2 CASE A>=1000 B=A CASE A>=2000 B=2*A CASE A>=3000 B=3*A ENDCASE ? B

例 利用CASE语句实现简单的菜单功能 Set talk off Set defa to f:\yyfox clear cho=0 @ 8, 18 SAY “**** 数据表操作命令菜单 ****” @ 9, 18 SAY “ 1. 打开工作数据表 ” @ 10, 18 SAY “ 2. 增加数据表记录 ” @ 11, 18 SAY “ 3. 删除数据表记录 ” @ 12, 18 SAY “ 4. 修改数据表记录 ” @ 14, 18 SAY “ 5. 关闭工作数据表 ” @ 15, 28 SAY “ 请选择相应代码:” GET cho Read Do case case cho=1 accept “请输入表文件名:” to bm use &bm

case cho=2 append case cho=3 input “请输入要删除的记录号:” to jlh go jlh dele case cho=4 browse case cho=5 use otherwise @15, 28 SAY “ 选择代码错!” endcase Set talk on return

9.4 循环结构程序设计 循环,就是按给定的条件连续地重复执行一段特定功能的程序。循环结构也称为重复结构。 9.4 循环结构程序设计 循环,就是按给定的条件连续地重复执行一段特定功能的程序。循环结构也称为重复结构。 Visual FoxPro给出了三种循环结构: 条件循环(DO WHILE……ENDDO) 计算循环(FOR……ENDFOR) 扫描循环(SCAN……ENDSCAN)

一、条件循环 语句格式: DO WHILE <条件> .F. <语句序列1> [LOOP] .T. <语句序列2> [EXIT] <语句序列3> ENDDO .F. 条件 条件 .T. 循环体 循环体 ENDDO后的语句 功能:有条件连续地重复执行DO WHILE与ENDDO之间的语句序列,直到<条件>为假或因执行EXIT语句而结束。 条件循环结构流程图

功能说明: (1)系统执行该语句时,先判断循环开始DO WHILE的条件是否成立, 如果条件为真,则执行循环体中的语句序列。当执行到ENDDO时,返回到DO WHILE,再次判断条件是否为真,以确定是否再次执行循环体。若条件为假,则结束循环 ,执行ENDDO后面的语句。 如果第一次判断条件时,条件即为假,则循环体一次都不执行,这就是称为“先判断后执行”的语句。 (2)循环体中的LOOP是可选项。遇到LOOP时,不再执行后面的语句,转回DO WHILE处重新判断。其作用相当于一个特殊的“短路”返回控制。 (3)循环体中的EXIT也是可选项。遇到它时便无条件地退出循环,转到ENDDO后面的语句。其作用相当于一个紧急出口。 (4)通常LOOP或EXIT出现在循环体内嵌套的分支语句中,根据条件来决定是LOOP回去,还是EXIT出去。

例 在屏幕上换行显示字符串“OK”20次 SET TALK OFF CLEAR ?[OK] … SET TALK ON RETURN

例 在屏幕上换行显示字符串[OK]20次 SET TALK OFF CLEAR i=1 1 1 2 DO WHILE i<=20 2 循环次数 循环前i值 循环后i值 i=1 &&设置循环变量初值 1 1 2 DO WHILE i<=20 2 2 3 ? [OK] ? [OK] … i=i+1 &&修改循环变量 ENDDO 20 20 21 SET TALK ON RETURN

在以循环变量作为循环控制参数的条件循环中 注意 ① DO WHILE 语句之前一定要有设置循环变量初 值的语句。 ② 循环体内一定要有修改循环变量的语句,否则 就会出现死循环。

例 求自然数1至4的和。 分析算法: 1. i=1 , s=0 ; 2. 累加第 i 个数 s= s+i ; 3. 累加次数加1 i= i+1 ; 4. 当 i<= 4 重复做2 ; 5. ? s 。

例 求自然数1至4的和。 SET TALK OFF S=0 &&定义一个变量表示和,并初始化 i=1 DO WHILE i<=4 i=i+1 ENDDO &&设置循环变量的初值 &&指定以循环次数作判断条件 S=S+i &&把S的值加上i后再赋给S,即求和 &&修改循环变量 &&输出求和的结果 ? S SET TALK ON RETURN

× 程序流程图 S=0 i=1 .F. 4<=4 5<=4 3<=4 2<=4 1<=4 .T. S=0+1 SET TALK OFF S=0 i=1 DO WHILE i<=4 S=S+i i=i+1 ENDDO ? S SET TALK ON RETURN i=1 .F. × 4<=4 5<=4 3<=4 2<=4 1<=4 .T. S=0+1 S=6+4 S=3+3 S=1+2 i=2+1 i=1+1 i= 4+1 i=3+1 ? 10

推广1 [程序:求自然数1至4的和] i<=N 若求自然数1至N的和呢? SET TALK OFF INPUT 〞请输入N的值:〞 TO N S=0 i=1 DO WHILE i<=4 i<=N S=S+i i=i+1 ENDDO ?S SET TALK ON RETURN

推广2 [程序:求自然数1至N的和] 若求自然数1至N的积呢? SET TALK OFF INPUT 〞请输入N的值:〞 TO N S=1 DO WHILE i<=N S =S + i S=S*i i =i + 1 ENDDO ?S SET TALK ON RETURN

例 阅读程序,并说出程序的运行结果 RETURN SET TALK ON SET TALK OFF i=1 DO WHILE i<=5 i=i+1 ENDDO ? i ? “E” 程序结果 程序结果 2 2 IF i=3 LOOP ENDIF 3 4 4 5 5 6 6 E E

以循环变量作为控制参数控制循环。 例 求1~100以内所有奇数的和。 SET TALK OFF S=0 I=0 例 求1~100以内所有奇数的和。 SET TALK OFF S=0 I=0 Do while I<100 I = I + 1 If int(I/2) = I/2 Loop endif S = S + I Enddo ? “1到100的奇数和 S= ”, S SET TALK ON Return 程序改进: S=0 I=1 Do while I<100  S = S + I I = I + 2 Enddo ? s

利用数据表的操作函数的返回值控制循环 例 编程:在zgb.dbf中查找某人。 —————— SET TALK OFF CLEAR  USE zgb ACCEPT “请输入要查找人的姓名: ” TO N LOCATE ALL FOR XM=N DO WHILE .NOT. EOF( ) DISP CONTINU WAIT “按任意键继续,按ESC键退出” ENDDO USE ?“查找结束” SET TALK ON RETURN ——————

例 求连乘数1*2*3*4*……,当积大于720时退出程序。 循环控制条件恒为真,要使用EXIT语句结束循环 Set talk off Clear S=1 I=1 Do while .T. S = S * I  I = I + 1 Enddo ? “ S= ”, S  Set talk on Return —— IF S > 720 EXIT ENDIF ———

例 求[1,100]内所有能被3或被5整除的数的个数。 SET TALK OFF N= 0 &&定义一个变量表示个数,并初始化 i=1 DO WHILE i<=100 i=i+1 ENDDO IF MOD(i,3)=0 .OR. MOD(i,5)=0 &&显示满足条件的这个数 ? i N=N+1 &&总个数增加1 ENDIF ? 〞满足条件的数的个数为〞,N SET TALK ON RETURN

二、计数循环 语句格式: FOR X=A TO B [STEP C ] <语句序列1> [LOOP] 循环初值 循环终值 语句格式: FOR X=A TO B [STEP C ] <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDFOR | NEXT 步长值 循环变量 循环体 功能:将FOR……ENDFOR循环中的<语句序列>执行指定的次数。

思考1 若求100的阶乘呢? 例 求1~100之和。 SET TALK OFF Clear  S=0 for I=1 to 100  例 求1~100之和。 SET TALK OFF Clear  S=0 for I=1 to 100  S = S + I Endfor ? “S = ”, S SET TALK ON Return

思考2 若求1~100的偶数和呢? 例 求1~100之奇数和。 SET TALK OFF Clear  S=0 例 求1~100之奇数和。 SET TALK OFF Clear  S=0 for I=1 to 100 step 2 S = S + I Next ? “S = ”, S SET TALK ON Return

例 阅读程序,写出程序运行结果 SET TALK ON SET TALK OFF S=0 FOR K=1 TO 10 STEP 2 S=S+K ENDFOR ? S RETURN IF K=7 LOOP ENDIF 思考3 若改成EXIT呢?

SCAN [<范围>][FOR <条件>]  <语句序列1> [LOOP] 三、表文件扫描循环 语句格式: SCAN [<范围>][FOR <条件>]  <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDSCAN 循环体 功能:在指定的范围内,扫描满足给定条件的记录,执行相应的语句。

例 用SCAN语句编程:在zgb.dbf中查找某人。 SET TALK OFF USE zgb ACCEPT “请输入要查找人的姓名: ” TO N SCAN FOR XM=N  DISP WAIT “按任意键继续,按ESC键退出” ENDSCAN USE ?“查找结束” SET TALK ON RETURN

对数据表扫描时三种循环的等价格式 表文件扫描循环: SCAN FOR …… …… ENDSCAN 计数循环: n=RECCOUNT() FOR i=1 TO n …… GO i ENDFOR 条件循环: DO WHILE .NOT. EOF() …… SKIP ENDDO

循环嵌套 循环体内又设置循环的情况称为多重循环,又称为循环嵌套。 内外循环的层次必须分明,不允许有交叉现象出现。 循环结构可以与分支结构嵌套,同样不允许有交叉现象出现。 以下交叉情形不允许出现:

例 已知S1=1,S2=1+2,S3=1+2+3,……, Sn=1+2+3+……+N,编程求S1+S2+……+S100的和。 Do while n<=100 i=1 sub=0 Do while i<=n sub = sub + i  i = i + 1 Enddo s = s + sub n =n + 1 ? “ S1+S2+……+S100= ”, s 

练 习 (1)求[1,30]之间所有偶数的乘积。 (2)已知S=1*2*3*…*N 当S>800时退出,求此时最小的S值 练 习 (1)求[1,30]之间所有偶数的乘积。 (2)已知S=1*2*3*…*N 当S>800时退出,求此时最小的S值 (3)求 s=1!+2!+……+n! (4)求 (5)求

9.5 程序的模块化 9.5.1 子程序、过程和函数 1.子程序 (1).子程序的结构 子程序与其他程序文件的惟一区别是其末尾或返回处必须有返回语句。 命令格式:RETURN.[TO.MASTER|TO.〈程序文件名〉|〈表达式〉]

(2).子程序的调用 子程序调用命令与主程序执行命令相同,其格式都是:DO〈程序文件名〉|〈过程名〉[WITH.〈参数表〉] (3).子程序的嵌套调用 主程序可以调用子程序,子程序还可以调用另外的子程序,这就是子程序的嵌套调用。实际上,子程序和主程序都是相对的,任何一个程序可以调用其他程序,也可以被其他程序调用。每个被调用程序的末尾或返回处都要加上RETURN命令。

2.自定义函数 (1).自定义函数的结构 [FUNCTION.〈函数名〉] [PARAMETERS.〈参数表〉] 〈命令组〉 RETURN.[〈表达式〉] (2).自定义函数的调用 调用格式是: 〈函数名〉(〈自变量表〉)

3.过程与过程文件 (1).过程的结构 过程的一般格式是: PROCEDURE〈过程名〉 [PARAMETERS〈参数表〉] 〈命令组〉 RETURN (2).过程文件 一个过程可以以文件形式单独存在,也可以将多个过程合并到一个文件中,这个文件称为过程文件。在过程文件中,每个过程仍然是独立的,可以单独调用。

(3).过程文件的打开与关闭 打开过程文件命令格式是: SET.PROCEDURE.TO.[〈过程文件名〉] 关闭过程文件命令格式是: SET.PROCEDURE.TO或者 CLOSE.PROCEDURE

9.5.2 内存变量的作用域 1.全局内存变量 定义全局变量的命令格式: 命令格式1: PUBLIC〈内存变量表〉|ALL|ALL LINK〈通配符〉|ALL EXCEPT〈通配符〉 命令格式2: PUBLIC.[ARRAY]〈数组名〉(〈下标上界1〉[,〈下标上界2〉])[,〈数组名〉(〈下标上界1〉[,〈下标上界2〉]),…] 功能:定义全局内存变量或数组。

2.局部内存变量 局部内存变量只能在定义它的程序及其下级程序中使用,一旦定义它的程序运行结束,它便自动被清除。也就是说,在某一级程序中定义的局部变量,不能进入其上级程序使用,但可以到其下级程序中使用,而且当在下级程序中改变了该变量的值时,在返回本级程序时被改变的值仍然保存,本级程序可以继续使用改变后的变量值。

3.隐藏内存变量 如果某级程序中使用的局部变量与上级程序中的局部变量或全局变量同名,就容易造成混淆。为了避免这种情况,可使用PRIVATE命令在该程序中将全局变量或上级程序定义的一些变量隐藏起来,这时就像这些内存变量不存在一样,可以再定义同名的内存变量。 命令格式 :PRIVATE.〈内存变量表〉|ALL|ALL.LIKE.〈通配符〉|ALL.EXCEPT.〈通配符〉

9.5.3 调用子程序时的数据传递 调用子程序时的数据传递可以通过两种方式来解决。 1.利用变量的作用域实现数据传递:合理地利用前面介绍的内存变量作用域特性,可以实现调用子程序时的数据传递。 2.利用参数实现数据传递 。 命令格式是: PARAMETERS.〈内存变量表〉 功能:该命令指定子程序中的局部变量名,并由这些局部变量接收上级程序中用DO…WITH传递来的参数。

9.6 程序调试 9.6.1 程序调试概述 程序调试就是确定程序出错的位置,然后加以改正,一直到满足预定的设计要求为止。程序调试往往是先分模块调试,当各模块都调试通过以后,再联合起来进行调试,通过联调后,便可试运行,试运行无误即可投入正常使用。 程序的错误有两类:语法错误和逻辑错误。

9.6.2调试器窗口 选择“工具”菜单中的“调试器”命令或在命令窗口输入DEBUG命令,系统打开调试器窗口。 1.跟踪窗口 2.监视窗口 3.局部窗口 4.调用堆栈窗口

9.6.3设置断点 在调试器窗口可以设置以下4种类型的断点: 类型1:在定位处中断。 类型2:如果表达式值为真则在定位处中断。 类型3:当表达式值为真时中断。 类型4:当表达式值改变时中断。 不同类型断点的设置方法大致相同,但也有一些区别。

9.6.4“调试”菜单项 在调试器窗口中的“调试”菜单项包含执行程序、选择执行方式、终止程序执行、修改程序以及调整程序执行速度等命令。 各命令的具体功能请参考教材。