Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

170
Visual FoxPro 6.0 应应应应应应应应应应应应应应应 应应应应应应应应应应应应应应应 应应应 () 应应应 ()

description

Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇). P 179. 第十章 程序设计基础. 程序就是将预先编好的 若干条命令 , 存放在一个文件中 , 然后调用执行。 例如: 求园面积 . prg. Visual FoxPro 系统提供有三种工作方式 : 1 、命令方式 2 、菜单方式 3 、程序文件方式. 10.1 Visual FoxPro 的工作方式. P179. 在 命令窗口中 , 输入一条命令,按回车,完成一个操作的工作方式。. 1. 命令方式. P 179. - PowerPoint PPT Presentation

Transcript of Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

Page 1: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

Visual FoxPro 6.0 应用基础与面向对象程序应用基础与面向对象程序设计教程 (下篇)设计教程 (下篇)

Page 2: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

第十章 程序设计基础

P P 179179

Page 3: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序就是将预先编好的若干条命令若干条命令,

存放在一个文件中存放在一个文件中,然后调用执行。然后调用执行。

例如: 求园面积 例如: 求园面积 . prg. prg

Page 4: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.1 Visual FoxPro10.1 Visual FoxPro 的工作方式的工作方式

Visual FoxPro 系统提供有三种工作方式:

11 、命令方式、命令方式

22 、菜单方式、菜单方式

33 、程序文件方式、程序文件方式

P17P1799

Page 5: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1. 1. 命令方式命令方式

在命令窗口中命令窗口中,输入一条命令,按回车,输入一条命令,按回车,

完成一个操作的工作方式。完成一个操作的工作方式。

P P 179179

Page 6: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如: 在命令窗口输入例如: 在命令窗口输入

CLRAE

R = 10

S = 3.14159 * R^2

? “ 园面积 = ” , S

Page 7: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

菜单方式——通过打开不同的菜单,完成不同的操作。

通过菜单对数据库资源进行操作管理和对系统环境通过菜单对数据库资源进行操作管理和对系统环境

进行设置;并通过菜单建立命令文件及运行命令文件。进行设置;并通过菜单建立命令文件及运行命令文件。

2.2. 菜单方式菜单方式 P P 179179

Page 8: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序文件方式是:

将相关多条命令输入在一个文件中( 扩展名为 扩展名为

. . PRGPRG ),然后再运行该文件。

程序文件程序文件也叫做也叫做命令文件命令文件。

3. 3. 程序文件方式程序文件方式P P 180180

Page 9: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、先建立程序: MODIFY COMMAND 求园面积求园面积 . Prg. Prg

CLRAE

R = 10

S = 3.14159 * R^2

? “ 园面积 = ” , S

2 、然后运行程序:

DO 求园面积求园面积 . prg. prg

程序文件方式程序文件方式

Page 10: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.2 10.2 程序文件的建立与编辑程序文件的建立与编辑

1. 1. 命令方式 命令方式 建立

在命令窗口命令窗口中输入:

MODIFY COMMAND 〈程序文件名〉

P P 181181

Page 11: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例例 11 :: 建立求园面积的程序1 、在命令窗口命令窗口中输入: MODIFY COMMAND MODIFY COMMAND 求园面积 求园面积 . prg. prg

2 、在编辑窗口编辑窗口中输入:

CLRAE

R = 10

S = 3.14159 * R^2

? “ 园面积 = ” , S

3 、关闭编辑窗口编辑窗口——即保存 .

Page 12: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序编辑窗口与命令窗口不同之处:

11 、 程序编辑窗口与命令窗口不同的是,输、 程序编辑窗口与命令窗口不同的是,输

入完一条命令按回车键后,不直接执行该命令。入完一条命令按回车键后,不直接执行该命令。

22 、输入完所有命令并将命令序列保存为一、输入完所有命令并将命令序列保存为一

个程序文件后,执行该程序文件时才被执行。个程序文件后,执行该程序文件时才被执行。

Page 13: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

注意: 程序文件的保存注意: 程序文件的保存

程序输入完毕后,则必须保存文件:程序输入完毕后,则必须保存文件:

方法一: 按程序编辑框上的 关闭按钮 : “ × × ” ,

然后按提示操作。

方法二:在 “ 文件 ” 菜单中 , 选定 “ 保存 ” 。

Page 14: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序文件保存时,其扩展名为 程序文件保存时,其扩展名为 . PRG. PRG

如上述生成的程序文件为如上述生成的程序文件为

求园面积求园面积 . . PRGPRG

主文件名 扩展名

Page 15: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

《演示实验》

程序文件的建立

上一页下一页退 出

要 点

开始实验单击右面按钮开始演示实验

目 录

Page 16: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序与交互操作相比,具有程序与交互操作相比,具有 44 个特点个特点:

程序可被修改并重新运行;

程序可从菜单、表单和工具栏下启动;

一个程序可调用其它程序;

程序文件一旦编成,则可以多次运行。

Page 17: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

程序文件的修改程序文件的修改

要重新调出 编辑 编辑 已有的程序文件

可在命令窗口命令窗口中输入:

MODI COMM 〈程序文件名〉例: MODIFY COMMAND MODIFY COMMAND 求园面积 求园面积 . . prgprg

Page 18: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

同样会在编辑窗口编辑窗口中显示出来:

CLRAE

R = 10

S = 3.14159 * R^2

? “ 园面积 = ” , S

( 这时可以进行修改 )

Page 19: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

2.2. 菜单方式 菜单方式 建立 (略)

打开“文件”菜单,选择“新建”;在“新

建”窗口,选择“程序程序”,再选择“新建文

件”;在“程序文件”编辑窗口,输入程序文件,

并保存。

3.3. 利用设计工具设计工具建立 (略)

Page 20: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.310.3 程序文件的调用程序文件的调用

调用程序文件,即运行程序文件。

1.1. 命令方式命令方式 在命令窗口输入:

DO DO 〈程序文件名〉〈程序文件名〉

例如: 例如: DO DO 求园面积 求园面积 . prg. prg

Page 21: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

以菜单方式调用程序文件,操作方法如下:

(1 )在系统主菜单下,打开 “程序” 菜单,选择 “运行”。

( 2 )在“运行”窗口,输入被调用的程序文件名即可。

10.3.2 10.3.2 菜单方式调用菜单方式调用

Page 22: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

《演示实验》

程序文件的调用

上一页下一页退 出

要 点

开始实验单击右面按钮开始演示实验

目 录

Page 23: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.410.4 程序的基本结构程序的基本结构

VFP 程序有两种控制模式:

一、程序控制流模式,由顺序、分支、循环三种

基本结构构成。

二、面向对象可视化的结构程序模块。

Page 24: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.410.4 程序的基本结构程序的基本结构

一、常见的程序控制结构如下:

11 .顺序结构.顺序结构

22 .分支结构.分支结构

33 .循环结构.循环结构

44 .过程结构.过程结构

Page 25: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

11 .顺序结构.顺序结构

顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。

VFP 系统的大多数命令都可以作为顺序结构中的语句。

Page 26: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

顺序结构示意图顺序结构示意图

要 点 第 1 条命令

第 2 条命令

第 3 条命令

·············

Page 27: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

22 .分支结构.分支结构

分支结构是在程序执行时,根据不同的条件,

选择执行不同的程序语句。

用来解决有选择、有转移的诸多问题。

Page 28: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

双向分支结构双向分支结构 要 点

满足条件吗?

方案一 方案二

下一步操作

Page 29: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

循环结构是能够使某些语句或程序段重复执行

若干次。

如果某些语句或程序段需要在一个固定的位置

上重复操作,使用循环是最好的选择。

33 .循环结构.循环结构

Page 30: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

要 点

循环结构示意图循环结构示意图

循环条件

命令语序

.F.

.T.

Page 31: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

在程序中,有某一程序段需要反复执行多次,但又不便用循环来组织,可将其与原程序分开,形成独立的程序序列(子程序),待使用时再调入程序运行,以实现不同位置上的重复操作。

子程序 ——被其它程序调用的程序称为子程序——被其它程序调用的程序称为子程序(又称过程)。(又称过程)。

主程序 ——调用子程序的称为主程序。——调用子程序的称为主程序。

44 .过程结构.过程结构

Page 32: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.510.5 常用的交互输入语句常用的交互输入语句

11 .. Input Input 语句语句

格式 : INPUT INPUT [<[< 提示符提示符 >]>] TO TO << 内存变量表内存变量表 >>

功能 : 暂停程序执行,等待用户从键盘输入数据,

赋给内存变量表中的变量。

输入的数据可以是输入的数据可以是 NN 型、型、 CC 型、型、 DD 型、型、 LL 型。型。

Page 33: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例例 10.610.6

Input Input [[ 〈〈提示提示〉〉 ]] TOTO 〈内存变量〉〈内存变量〉

Input Input “ “ 请输入半径请输入半径 :: ” ” TO TO RR

或 或 Input Input “ “ R =R = ” ” TO TO R R

Page 34: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例例 11 :: 建立求任意园面积的程序

CLRAE

INPUT “ R= ” TO R

S = 3.14159 * R^2

? “ 园面积 = ” , S

Page 35: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

输入的内容 注意注意:

输入数值型常量,可直接输入。

输入字符型常量,需加双引号;

输入逻辑型常量,两侧需加小圆点

输入日期型常量,两端需加大括号

( 这叫做 这叫做 类型匹配类型匹配 问题 问题)

Page 36: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 例 10.610.6

CLEARCLEAR

USE Rcda ExclUSE Rcda Excl

INPUT “INPUT “ 请输入日期请输入日期 : ” TO: ” TO 查找日期查找日期

DISPLAY FOR DISPLAY FOR 出生日期 出生日期 == 查找日期查找日期

USEUSE

Page 37: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 例 10.610.6

CLEARCLEAR

USE Rcda ExclUSE Rcda Excl

INPUT “ INPUT “ 请输入职称请输入职称 :: ” TO ” TO ZCZC

DISPLAY DISPLAY ALL ALL FOR FOR 职称职称 = = ZCZC

USEUSE

注意注意 :: INPUT INPUT 输入输入 CC 型数据时,要用双引号括起来。型数据时,要用双引号括起来。

Page 38: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

22 .. ACCEPT ACCEPT 命令命令 —— 字符串输入命令字符串输入命令

命令语句:

ACCEPT ACCEPT [[ << 提示提示 >> ] ] TO <TO < 内存变量内存变量 >>

功能:显示显示 << 提示提示 >> 内容,等待用户输入,并 将输内容,等待用户输入,并 将输入入

信息以字符串的形式存储在指定 信息以字符串的形式存储在指定 << 内内存变量存变量 >>

中。中。

Page 39: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 例 10.610.6

CLEARCLEAR

USE Rcda ExclUSE Rcda Excl

INPUT “ INPUT “ 请输入职称请输入职称 :: ” TO ” TO ZCZC

DISPLAY DISPLAY ALL ALL FOR FOR 职称 职称 = = ZCZC

USEUSE

注意注意 :: INPUT INPUT 输入输入 CC 型数据时,要用双引号括起来。型数据时,要用双引号括起来。

Page 40: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

CLEARCLEAR

USE Rcda ExclUSE Rcda Excl

ACCEPT ″″ 请输入姓名:″请输入姓名:″ TO Name BROWSE ALL FOR 姓名 = NAME

注意注意 :: ACCEPT 输入输入 CC 型数据时,型数据时,不用不用双引号括起来。双引号括起来。

Page 41: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

3. 3. WAIT WAIT 命令命令—单个字符输入命令单个字符输入命令

语法:

WAIT WAIT [[ << 提示语句提示语句 >> ] [] [ TO <TO < 内存变量内存变量 >>

] ]

[[ WINDOWSWINDOWS ]]

功能:等待用户输入,只要用户从键盘按下任一键或功能:等待用户输入,只要用户从键盘按下任一键或按下鼠标的左键或右键即执行下一条命令按下鼠标的左键或右键即执行下一条命令。

Page 42: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

WAIT

WAIT 〃是否打印( Y/N )?〃

WAIT 〃是否打印( Y/N )?〃 TO M

WAIT 〃是否打印( Y/N )?〃 TO M WINDOWS

说明 : 如果加选项 如果加选项 WINDOWSWINDOWS ,将在屏幕右上角出现,将在屏幕右上角出现 一个窗口,在其中显示提示信息。一个窗口,在其中显示提示信息。

Page 43: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

WAIT ″ 谢谢使用 谢谢使用 !! ″ WINDOWS

该命令的功能是在屏幕上弹出一个窗口,显该命令的功能是在屏幕上弹出一个窗口,显示 “示 “ 谢谢使用!谢谢使用!”,按任意键后窗口消失。”,按任意键后窗口消失。

Page 44: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

补充补充: 程序设计的一些程序设计的一些常用命令常用命令

一、 基本输出命令 “ ? ”

格式 ::

? ? [ “注释说明”][ “注释说明”] , <, < 表达式表达式 >>

功能:输出表达式的值。功能:输出表达式的值。

Page 45: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

二、 格式输出命令二、 格式输出命令

@ 定位输出命令:

命令语法:

@ @ < < 行号行号 ,, 列号列号 > SAY <> SAY < 输出内容输出内容 >>

功能:在指定的行列位置处显示数据。

Page 46: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

@ @ 5 , 10 SAY “ 5 , 10 SAY “ 工资工资 = ”= ”

@ @ 5 , 17 SAY 2000 5 , 17 SAY 2000

Page 47: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

三、 格式输入命令三、 格式输入命令

@ 输入命令:

@ <@ < 行号行号 ,, 列号列号 > SAY <> SAY < 提示提示 > >

GET <GET < 内存变量内存变量 >/<>/< 字段名字段名 >>

READREAD

功能:用语句激活后,向指定的内存变量 或字段输入数据。

Page 48: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

No = ″04030227 ″

@ 2,15 SAY No

@ 3,10 SAY ″ 学号 : ″ GET No

READ

Page 49: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例如:

USE RCDA

@ 2,15 SAY 编号

@ 3,10 SAY ″ 编号 : ″ GET 编号

READ

Page 50: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

顺序结构顺序结构

顺序结构——是按用户输入命令语句的顺序,逐条执行。

要 点

Page 51: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

顺序结构示意图顺序结构示意图

要 点

第 1 条命令

第 2 条命令

第 3 条命令

·············

Page 52: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

顺序结构 例题

按命令排列顺序依次执行。按命令排列顺序依次执行。

每条命令执行完后自动开始下一条命令的执行。每条命令执行完后自动开始下一条命令的执行。

【例 5.2】 求一元二次方程的根

Page 53: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR

INPUT 〃 a = 〃 TO a INPUT 〃 b = 〃 TO b INPUT 〃 C = 〃 TO C

X1=(-b+sqrt(b*b-4*a*c))/(2*a) X2=(-b-sqrt(b*b-4*a*c))/(2*a) ? 〃 X1= 〃 , X1

? 〃 X2= 〃 , X2

Page 54: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.4 程序的基本控制结构 ( P 183 )

程序的基本控制结构包括:

① 顺序顺序结构

② 分支分支结构

③ 循环循环结构

Page 55: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1. 顺序结构

按命令排列顺序依次执行。按命令排列顺序依次执行。

每条命令执行完后自动开始下一条命令的执行。每条命令执行完后自动开始下一条命令的执行。

【例】 求一元二次方程的根

Page 56: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR

INPUT 〃 a = 〃 TO a INPUT 〃 b = 〃 TO b INPUT 〃 C = 〃 TO C

X1=(-b+sqrt(b*b-4*a*c))/(2*a) X2=(-b-sqrt(b*b-4*a*c))/(2*a) ? 〃 X1= 〃 , X1

? 〃 X2= 〃 , X2

Page 57: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

顺序结构

问题:设计一个程序,能够查找表 rcda.dbf 中给定出生日期的记录。

• 程序:

CLEAR

USE rcda

INPUT “ 请输入出生日期 : ” TO RQ

DISPLAY FOR 出生日期 = RQ

S3S3

S4S4

入口入口

出口出口

S1S1

S2S2

Page 58: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

10.6 10.6 分支结构 分支结构 ( P187 )( P187 )

分支结构用于控制程序中命令组的执行与否,分支结构用于控制程序中命令组的执行与否,它根据指定的条件执行不同的操作。它根据指定的条件执行不同的操作。

分支语句有三种分支语句有三种 ::

1 1 、单向分支、单向分支 22 、双向分支、双向分支 33 、多向分支、多向分支

Page 59: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 . 单向分支语句……决定某一操作是否执行决定某一操作是否执行

IF <IF < 条件条件 >> ······················

          ··········· ···········        && && < < 命令行 命令行 >>          ······················

ENDIFENDIF

若条件为真,则执行 IF 与 ENDIF 之间的命令,

否则不执行任何操作。

Page 60: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.9 :修改 zytc.dbf 表中的数据,把编号为“ gz05002” 的职称由“教授”该为“副教授”。

• 程序:程序:

CLEARCLEAR

USE USE zytczytc

LOCATE ALL LOCATE ALL FOR FOR 编号 编号 = "gz05002"= "gz05002"

IF IF 职称 职称 = "= " 教授教授 ""

REPLACE REPLACE 职称 职称 WITH "WITH "副副教授教授 ""

ENDIFENDIF

USEUSE

Page 61: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

举例:修改“学生”表中的数据,把学号为“ 0103002”的出生日期由 日期由 {^1983/07/20} {^1983/07/20} 改为改为 {^1982/07/20}{^1982/07/20}

程序编写如下程序编写如下 : :

CLEAR

USE 学生LOCATE ALL FOR 学号 = 〃 0103002 〃

IF IF 出生日期出生日期 = {^1983/07/20}= {^1983/07/20}

REPLACE REPLACE 出生日期 出生日期 WITH {^1982/07/20}WITH {^1982/07/20}

ENDIFENDIF

USE

Page 62: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

举例:输入任意两个数 , 求出较大数 , 并显示出来。

程序编写如下 :

CLEARCLEAR INPUT ″INPUT ″ 请输入第请输入第 11 个数:个数:″ ″ TO num1TO num1

INPUT ″INPUT ″ 请输入第请输入第 22 个数:个数:″ ″ TO num2TO num2

IF num1 > = num2IF num1 > = num2 ? ″? ″ 较大数为较大数为 :: ″ , num1 ″ , num1

ENDIFENDIF

IF num2 > num1IF num2 > num1 ? ″? ″ 较大数为较大数为 :: ″ , num2 ″ , num2

ENDIFENDIF

Page 63: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

2. 双向分支语句……选择两个语句组之一执行

IF IF << 条件条件 >>        ··········· ···········         && && < < 语句组语句组 1 >1 >         ······················

ELSEELSE          ··········· ···········         && && << 语句组语句组 2 >2 >          ······················

ENDIFENDIF

若若 IFIF 语句中的条件为真,则执行语句中的条件为真,则执行 IFIF 与与 ELSEELSE之间的之间的语句组语句组 1 1 ,否,否

则执行则执行 ELSEELSE 与与 ENDIFENDIF之间的之间的语句组语句组 22 。。

Page 64: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

举例:输入任意两个数 , 求出较大数 , 并显示出来。

方法二 :

CLEARCLEAR INPUT ″INPUT ″ 请输入第请输入第 11 个数个数 : ″ TO num1: ″ TO num1

INPUT ″INPUT ″ 请输入第请输入第 22 个数个数 : ″ TO num2: ″ TO num2

IF num1 > = num2IF num1 > = num2 ? ″? ″较大数为较大数为 : ″ , num1 : ″ , num1

ELSEELSE ? ″? ″较大数为较大数为 : ″ , num2: ″ , num2

ENDIFENDIF

Page 65: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

改进:输入任意两个数 , 求出较大数 , 并显示出来。

方法三 :

CLEARCLEAR INPUT INPUT “ “ 请输入第请输入第 11 个数个数 : : ”” TO num1 TO num1

INPUT INPUT “ “ 请输入第请输入第 22 个数个数 : : ”” TO num2 TO num2

IF num1 > = num2IF num1 > = num2 maxmax = num1 = num1

ELSEELSE maxmax = num2 = num2

ENDIFENDIF

? ″? ″ 较大数为较大数为 : ″, : ″, maxmax

Page 66: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

举例:输入任意三个数 , 求出最大数。

CLEARCLEAR

INPUT ″INPUT ″ 请输入第请输入第 11 个数个数 : ″ TO m1: ″ TO m1

INPUT ″INPUT ″ 请输入第请输入第 22 个数个数 : ″ TO m2: ″ TO m2

INPUT ″INPUT ″ 请输入第请输入第 33 个数个数 : ″ TO m3: ″ TO m3

Page 67: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

IF m1 > = m2IF m1 > = m2

Max = m1Max = m1

ELSEELSE

Max = m2 Max = m2

ENDIFENDIF

IF m3 > = MIF m3 > = M

Max = m3Max = m3

ENDIFENDIF

? ″? ″ 最大数为最大数为 : ″,: ″, Max Max

Page 68: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.10 :在学生表中,查找姓名为 “王国民” 的记录。如果找到把该记录加上删除标记,若没有找到则在第 2 行 第 30 列处显示 “ 查无此人!” 。

程序编写如下 : CLEARCLEAR

USE RCDAUSE RCDA

LOCATE ALL FOR LOCATE ALL FOR 姓名 姓名 = "= " 王国民 ""

IF . NOT. EOF()IF . NOT. EOF()

DELETE DELETE

ELSEELSE

@ 2 , 30 SAY "@ 2 , 30 SAY " 查无此人!查无此人! ""

ENDIFENDIF

USEUSE

Page 69: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

如何判断是否查找到对象?如何判断是否查找到对象?

11 、没有找到,则指针指向文件末尾,文件结束。、没有找到,则指针指向文件末尾,文件结束。

用:用: EOFEOF( )( )———— 为真,为真,文件结束,表文件结束,表示未找到。示未找到。

22 、已经找到,指针不到文件尾,文件没有结束。、已经找到,指针不到文件尾,文件没有结束。

用: 用: . NOT.. NOT. EOF() —— EOF() —— 非文件结束,非文件结束,表示找到了。表示找到了。

Page 70: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

   举例举例 : : 22 、某地“特快专递” 的计费标准是:邮件重量、某地“特快专递” 的计费标准是:邮件重量100100 克以内, 每克为克以内, 每克为 0.050.05 元;超出元;超出 100100 克后,超出数每克后,超出数每克为克为 0.020.02元。试编写程序计算邮费。元。试编写程序计算邮费。

CLEARCLEAR

input “ input “ 请输入邮件重量请输入邮件重量 :: ” ” TO TO XX

IF IF XX < = 100 < = 100

Y Y == 0.05 * X0.05 * X

ELSEELSE

Y Y == 100 * 0.05 + 0.02 * 100 * 0.05 + 0.02 * (( X X - - 100100 ))

ENDIFENDIF

?? ““ 邮费=”,邮费=”, YY

Page 71: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

条件 1

条件 2

条件 n

条件 n+1

···················

语句组 1

语句组 2

语句组 n

Y

Y

Y

N

N

N

N

33 .多向分支.多向分支

Page 72: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

DO   CASE

CASE < 条件 1>

··········· ···········      && && < < 语句组语句组 1 >1 >

CASE < 条件 2 >

··········· ···········      && && < < 语句组语句组 2 >2 >

……

CASE < 条件 n >

··········· ···········         && && < < 语句组语句组 n >n >

OTHERWiSE

··········· ···········         && && < < 语句组语句组 n+1 >n+1 >

ENDCASE

33 .多向分支格式.多向分支格式

Page 73: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

多向分支语句常用格式

DO CASE

CASE < 条件 1>

··········· ··········· && && < < 语句组语句组 1 >1 >

CASE < 条件 2 >

··········· ··········· && && < < 语句组语句组 2 >2 >

CASE < 条件 3 >

··········· ···········     && && < < 语句组语句组 3 >3 >

……

ENDCASE

Page 74: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.11 :已知有三个数据表,分别是 rcda.dbf 、 zytc.dbf 和 xscj.dbf ,编写一个程序在选择 1 、 2 、 3 时,分别使用不同表。

条件 1

条件 2

条件 n

条件 n+1

……

语句组 1

语句组 2

语句组 n

Y

Y

Y

N

N

N

CLEARCLEAR

ACCEPT “ACCEPT “ 请输入您的选择:请输入您的选择: (1-3) ” TO (1-3) ” TO YY

DO CASEDO CASE

CASE CASE Y = " 1 "Y = " 1 "

USE rcda

LISTLIST

CASECASE Y = " 2 "Y = " 2 "

USE zytc

LISTLIST

CASECASE Y = " 3 "Y = " 3 "

USE xscj

LISTLIST

ENDCASEENDCASE

Page 75: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

44 .使用分支语句应注意的几点.使用分支语句应注意的几点

( 1 ) IF… … ENDIF 和 DO CASE… … ENDCASE 必须配对使用, DO CASE 与第一个 CASE 〈条件表达式〉之间不应有任何命令。

( 2 )〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值。

( 3 )〈命令行序列〉可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。

( 4 ) DO CASE… … ENDCASE 命令,每次最多只能执行一个〈命令行序列〉。在多个 CASE 项的〈条件表达式〉值为真时,只执行第一个〈条件表达式〉值为真的〈命令行序列〉,然后执行 ENDCASE 的后面的第一条命令。

Page 76: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

5.3.3 循环结构 ( P ( P 190190 ) )

循环结构用于控制部分命令的反复执行,有下面三种形式。

1 当循环当循环 do while … enddo

2 计数循环计数循环 for ... endfor

3 数据表内循环数据表内循环 scan ... endscan

Page 77: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 .“当当” 循环控制 循环控制 ( P191 )( P191 )

语法

do while <条件 >

< 命令语句组 >

enddo

循环条件

命令语序

.F.

.T.

循环结构之一

Page 78: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 . do while...enddo

功能

  通过 < 条件 > 的值来控制循环。执行该语句时,

反复判断 < 条件表过式 > 的值,当 < 条件表过式 > 的值为“真”时,执行 < 命令行序列 > ;否则,结束循

环并执行 enddo 后面的第一个命令。

Page 79: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 : 求 S = 1 + 2 + 3 + … + 100

clear

s=0

i =1

do while i<=100

s = s+i

i = i+1i = i+1

enddo

? “s=” , s

i < =100 ?

S=S+i

i=i+1

.F.

.T.

Page 80: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求累加和的式子

ss = ss + i

S 现在的值

S 原有的值

i 的值

+

Page 81: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求连乘积的式子

PP = PP * i

P 现在的值

P 原有的值

i 的值*

Page 82: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 : 求 S = 1 + 3 + 5 + ······ + N

clear

Input “ 请输入一个正整数 :” to n

s=0

i=1i=1

do while i<=n

s = s + i

i = i + i = i + 22

enddo

? “ s= ” , s

i < =N ?

S=S+i

i=i+2

.F.

.T.

Page 83: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.12 :统计 rcda.dbf 数据表中工资超过 3000 元的人数。

文件结束吗?

命令语句组

.F.

.T.

USE rcdaUSE rcda

N = 0N = 0

DO WHILE .NOT. EOF()DO WHILE .NOT. EOF()

IF IF 工资现状 工资现状 > 3000> 3000

N = N + 1N = N + 1

ENDIFENDIF

SKIPSKIP

ENDDOENDDO

? “? “ 30003000 元以上的人数元以上的人数 = ” = ” ;; NN

USEUSE

Page 84: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

循环结构之二

““ 计数”型循环语句计数”型循环语句

FOR FOR << 循变循变 > = <> = < 初值初值 >> TO TO << 终值终值 >> [ [ Step Step << 步长步长 > > ]] ·············· ······· ······· << 命令行命令行 >> ··············

ENDFORENDFOR

( 注:注: StepStep 1 1 时,可以省略。)时,可以省略。)

Page 85: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 :使用 FOR 循环 求 S=1+2+3+…+100

clear

s=0

For i=1 to 100

s = s+i

endfor

? “s=” , s

i < =100 ?

S=S+i

.F.

.T.

Page 86: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 : 求 S = 1 + 3 + 5 + ······ + N

clear

Input “ 请输入一个正整数 : ” to n

s=0

for i=1 to n step 2

s = s+i

endfor

? “s=” , s

i < =N ?

S=S+i

.F.

.T.

Page 87: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.13 :统计 rcda 数据表中工资大于等于 3000 元的人数。

USE rcdaUSE rcda

COUNT TO XCOUNT TO X

GO TOPGO TOP

N = 0N = 0

FOR i = 1 TO X FOR i = 1 TO X

IF IF 工资现状 工资现状 >= 3000>= 3000

N = N + 1N = N + 1

ENDIFENDIF

SKIPSKIP

ENDFORENDFOR

? “工资? “工资 30003000 元以上的人数: ” ,元以上的人数: ” ,NN

USEUSE

i > N ?

N

Y

执行命令序列

SKIP

Page 88: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

循环结构之三

“ 指针”型循环语句

SCAN SCAN

[ FOR < 条件 > ]

< 命令行序列 >

ENDSCANENDSCAN

Page 89: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:用控制“指针”移动的循环语句,逐一移动指针,逐一移动指针, 显示 rcda.dbf 中每条记录的编号、姓名。

CLEARCLEAR

USE rcdaUSE rcda

SCAN SCAN

? 编号 ,姓名? 编号 ,姓名ENDSCANENDSCAN

USEUSE

Page 90: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.14 :用“指针”型循环控制语句,统计 rcda.dbf

数据表中工资大于或等于 3000 元的人数。

CLEARCLEAR

USE rcdaUSE rcda

N = 0N = 0

SCAN SCAN

IF IF 工资现状 工资现状 >= 3000>= 3000

N = N + 1N = N + 1

ENDIFENDIF

ENDSCANENDSCAN

? “工资在? “工资在 30003000 元以上的人数: ”,元以上的人数: ”,NN

USEUSE

Page 91: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

循环中两个特殊命令语句

11 、退出语句:、退出语句:

EXITEXIT

22 、重新循环语句:、重新循环语句:

LOOPLOOP

注意:这两个命令必须嵌入在循环体内,可以改变注意:这两个命令必须嵌入在循环体内,可以改变循环,但不能单独使用。循环,但不能单独使用。

Page 92: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

循环中使用 EXITEXIT 命令

例 : 求 S=1+2+3 + ······ 当 S>1000 即停止。

s=0

For n =1 to 100

s = s + n

if if S >1000 S >1000

EXITEXIT ENDifENDif

endfor

? “n =” , n

Page 93: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

使用循环应注意的几个问题

• do while 和 enddo , for 和 endfor , scan

和 endscan 必须配对使用;

• <命令行序列 >可以是任何命令和语句,即可以是简单命令、条件语句或循环语句;

• <循环变量 >应是数值型的内存变量或数组元素;

Page 94: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 1: 使用 scan 循环 显示学生表中的内容(方法一)

clearuse D:\XSCJ && 打开表

scanscan

? 学号 ,姓名 && 使用表

EndscanEndscan

USE USE && 关闭表

Page 95: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 1: 使用 scan 循环 显示学生表中的内容(方法二)

clearuse D:\XSCJ i=10ScanScan @ i+2,10 Say 学号

@ i+2,30 Say 姓名

i=i+1

ENDScanENDScan USEUSE

Page 96: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 2: 显示并能修改学生表中的内容 ( ( 补充 补充 ))

clearuse D:\XSCJi=10ScanScan

@@ i+2,10 Say “ i+2,10 Say “ 学号学号 :″ get :″ get 学号学号 @ @ i+2,30 Say “i+2,30 Say “ 姓名姓名 :″ get :″ get 姓名姓名 READREAD

i=i+1i=i+1ENDScanENDScan USEUSE

Page 97: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

一、什么叫过程 ?一、什么叫过程 ? 程序设计时常以不同的参数参与某一程序运行。如果在一个程序中重复写入这些相同的程序段,不仅会使程序变得很长,而且是一种时间和空间的浪费。因此,可以将上述重复出现的或能单独使用的程序写成可供其它程序调用的子程序子程序,又称为过程过程。

10.8 过程过程 与 过程文件 ( P194 )( P194 )

Page 98: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR

······· S=0 DO P1DO P1 ······· S=0 DO P2DO P2 ······· S=0DO P3DO P3 ······· ·······

CLEAR R=10 S=3.14159*R*R ? “S=”,S RETURNRETURN

主程序子程序

CLEAR R=8 S=R*R ? “S=”,S RETURNRETURN

CLEAR R=3 V= R*R*R ? “V=”, V RETURNRETURN

P1.prgP1.prg

P2.prgP2.prg

P3.prgP3.prg

MAIN.prgMAIN.prg

Page 99: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、主程序 — 程序执行过程中,调用其他程序的称为主程序。

2 、子程序 — 被主程序调用的程序称为子程序又称为过程。

3 、主程序和子程序 相同点:相同点: — 都是程序,建立方法相同。

主程序、子程序(过程)的概念

Page 100: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

一、子程序设计 ———— 即用主程序调即用主程序调

用子程序用子程序

  主程序与子程序是不同的文件。

二、“过程”设计

—— —— 即用主程序调即用主程序调用“过程”用“过程”

1 、“过程”与主程序是在同一个文件中。

2 、“过程”与主程序各自在不同的文件中。

程序调用的三种结构

Page 101: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、子程序开头有一句为接收参数语句。

[ Parameters < 参数 1,参数 2,… > ]

其中参数必须与调用语句中参数对应。

2 、子程序结束要有一条返回语句。

Return [to master] 功能:子程序运行结束,返回调用它的程序。

加上 to master 表示返回最高层。

一、 子程序的基本结构

Page 102: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、调用子程序前,要给定的参数初值。

2 、调用子程序要有一条 DO 命令:

DODO <子程序名 > [ WITH < 参数 1,参数 2,…

>]

 功能:转去执行子程序。

其中参数包括传入参数、返回参数。

3 、往往主程序后面也加上 Return

二、 主程序中的结构

Page 103: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:求 例:求 P =P = 1 1 ** 2 2 ** 3 3 ** …… …… * N* N

建立程序: 建立程序: Modi CommModi Comm main_1.prg main_1.prg

clearclearP=1P=1input “input “ 请输入正整数请输入正整数 NN 的值的值 :" to N:" to Nfor i=1 to Nfor i=1 to N P=P*iP=P*iendforendfor? “? “ 结果为结果为 :” :” , , PPReturnReturn

1. 不采用过程的顺序结构程序

Page 104: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:求 例:求 P =P = 1 1 ** 2 2 ** 3 3 ** …… …… * N* N

建立主程序: 建立主程序: Modi CommModi Comm main_2.prgmain_2.prg

clearclear

P=1P=1

input "input "请输入正整数请输入正整数 NN的值:的值: " to N" to N

do do subsub with N , P with N , P ? “? “ 结果为结果为 :” :” , , PP

Return Return

2. 主程序调用子程序

主程序部分

Page 105: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

建立子程序: 建立子程序: MODI COMM MODI COMM subsub.prg.prg

Parameters N , PParameters N , PP=1P=1

for i=1 to Nfor i=1 to N

PP = = PP*i*iendforendfor

ReturnReturn

子程序部分

Page 106: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、过程第一个语句:过程标识语句。

Procedure <过程名 >

2 、过程中第二个接收参数语句。

[ Parameters < 参数 1,参数 2,… > ]

其中参数必须与调用语句中参数对应。

3 、过程结束要有一条返回语句。

Return  功能:过程运行结束,返回调用它的程序。

一、 过程的基本结构

Page 107: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、调用过程前,要给定的参数初值。

2 、调用过程要有一条 DO 命令:

DODO <过程名 > [ WITH < 参数 1,参数 2,… >

 功能:转去执行过程。

其中参数包括传入参数、返回参数。

3 、往往主程序后面也加上 Return

二、 主程序中的结构

Page 108: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR SET PROC to F1

S=0 DO P1DO P1 ······· S=0 DO P2DO P2 ······· S=0DO P3DO P3 ······· ·······CLOSE PROCRETURNRETURN

Procedure P1.prgProcedure P1.prg R=5 S=3.14159*R*R ? “S=”,S RETURNRETURN

主程序过程文件

Procedure P2.prgProcedure P2.prg R=5 S=R*R ? “S=”,S RETURNRETURN

Procedure P3.prgProcedure P3.prg R=5 V= R*R*R ? “V=”, V RETURNRETURN

MAIN.prgMAIN.prg

F1.prgF1.prg

Page 109: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR input “R=” to R S=0 DO P1 with R , SDO P1 with R , S ? “S=”,S RETURNRETURN

Procedure Procedure P1P1..prgprg Parameters R , SParameters R , S S=0 S=3.14159*R*R RETURNRETURN

建立程序:建立程序: MODI COMM Main-3.prgMODI COMM Main-3.prg

主主程程序序和和过过程程在在同同一一文文件件中中

Page 110: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:求 例:求 P =P = 1 1 * * 2 2 * * 3 3 * …… * N* …… * N

建立程序: 建立程序: Modi CommModi Comm main_3.prgmain_3.prg

clearclear P=1P=1input “input “ 请输入正整数请输入正整数 NN 的值:的值: " to N" to Ndo do subsub with N,P with N,P && && 调用过程调用过程

? “P=” , P? “P=” , PReturn Return && && 主程序结束主程序结束&& && 转下页转下页

1. 在同一个文件中调用过程

程序主调用部分

Page 111: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

&& && 在上述同一文件中输入如下内容:在上述同一文件中输入如下内容:

Procedure subsub && && 过程开始标记过程开始标记

   Parameters N,S N,S && && 过程接收参数过程接收参数

P=1P=1 for i=1 to Nfor i=1 to N P = P*iP = P*i endforendforReturn && && 过程结束过程结束

程序被调用部分

Page 112: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

把多个过程放在同一个文件中,这个文件就叫过程文件

一、过程文件建立:与建立程序一样。

MODI COMM <过程名 >

二、过程文件使用:

1 、打开: Set Procedure TO <过程名 >

2 、关闭: Close Procedure

什么叫过程文件?

Page 113: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR SET PROC to F1

S=0 DO P1DO P1 ······· S=0 DO P2DO P2 ······· S=0DO P3DO P3 ······· ·······CLOSE PROC RETURNRETURN

Procedure P1.prgProcedure P1.prg R=5 S=3.14159*R*R ? “S=”,S RETURNRETURN

主程序过程文件

Procedure P2.prgProcedure P2.prg R=5 S=R*R ? “S=”,S RETURNRETURN

Procedure P3.prgProcedure P3.prg R=5 V= R*R*R ? “V=”, V RETURNRETURN

MAIN.prgMAIN.prg

F1.prgF1.prg

关闭过程文件

打开过程文件

Page 114: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、第一个语句:过程标识语句

Procedure <过程名 >

2 、第二个语句:接收参数语句

[ Parameters < 参数 1,参数 2,… > ]

其中参数必须与调用语句中参数对应。

3 、最后一条语句:返回语句

Return  功能:过程运行结束,返回调用它的程序。

三、过程文件的每一个过程

Page 115: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR SET PROC to F1F1

input “x=” to x input “y=” to y input “z=” to z P=1 DO Sun with X, PDO Sun with X, P S1=P P=1 DO Sun with Y, PDO Sun with Y, P S2=P P=1 DO Sun with Z, PDO Sun with Z, P S3=P S=s1+s2+s3 ? “x!+y!+z!=” , SCLOSE PROCRETURNRETURN

Procedure Procedure SunSun.prg.prg Parameters N, P P=1 For i =1 to N P= P * i EndForRETURNRETURN

主程序

过程文件

MAINMAIN . prg. prg

F1F1.prg.prg

Page 116: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、调用前,打开过程文件: Set Procedure TO <过程名 >

2 、给定的参数初值。

3 、调用: DO 命令

DODO <过程名 > [ WITH < 参数 1,参数 2,…>]

4 、结束前,关闭过程文件: Close Procedure

5 、主程序后面也加上 Return

四、调用过程文件的主程序

Page 117: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR SET PROC to F1

S=0 DO P1DO P1 ······· S=0 DO P2DO P2 ······· S=0DO P3DO P3 ······· ·······CLOSE PROC RETURNRETURN

Procedure P1.prgProcedure P1.prg R=5 S=3.14159*R*R ? “S=”,S RETURNRETURN

主程序过程文件

Procedure P2.prgProcedure P2.prg R=5 S=R*R ? “S=”,S RETURNRETURN

Procedure P3.prgProcedure P3.prg R=5 V= R*R*R ? “V=”, V RETURNRETURN

MAIN.prgMAIN.prg

F1.prgF1.prg

关闭过程文件

打开过程文件

Page 118: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:求 例:求 P =P = 1 1 ** 2 2 ** 3 3 ** …… …… * N* N

建立主程序: 建立主程序: Modi CommModi Comm main_4.prgmain_4.prgSet Procedure Set Procedure TOTO F1.prg F1.prg && && 打开过程文件打开过程文件

input “input “ 请输入正整数请输入正整数 NN 的值的值 :” to N:” to N P=1P=1

dodo subsub with N , P with N , P && && 调用其中过程调用其中过程

? “P=” , P? “P=” , PClose Procedure Close Procedure && && 关闭过程文件关闭过程文件

ReturnReturn

主程序调用过程文件中的过程

11 、、

Page 119: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

建立过程文件:建立过程文件: Modi CommModi Comm F1.prg F1.prg

Procedure subsub && && subsub 为过程名为过程名

   Parameters N,P N,P && && 过程接收参数过程接收参数

P=1P=1 for i=1 to Nfor i=1 to N P = P*iP = P*i endforendforReturn && && 过程结束过程结束

程序被调用部分

22 、、

Page 120: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

注意问题

1.注意在调用子程序或过程时的参数传递方式;

2.注意过程与过程文件的区别,过程可以包含在主文件中;而过程文件不能包含在另一个文件中,而是自成一个文件;

3.在主程序调用子程序时,参数的传递与过程中的参数传递一样,但子程序与主程序是独立的;

4.过程根据具体情况的不同,可以没有参数。

Page 121: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

   在 FoxPro 中,函数与过程相似,但函数除

了执行一组操作进行计算外,还返回一个值。函

数有两大类:内部函数和用户自定义函数。内部

函数已在第 2章讲解,这里将介绍如何自己编写

一些所需要的函数并调用它们。

补充: 用户自定义函数

Page 122: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

与过程语法差不多与过程语法差不多

Function < 函数名 >

Parameters [ < 参数 1,参数 2,… >]

<语句序列 >

Return [ < 参数 >]

一、 用户自定义函数

Page 123: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

与过程语法差不多,不同点:与过程语法差不多,不同点:

1 、命令动词不同:

过程: Procedure

函数: Function

2 、调用语句不同,使用参数形式不同。

2、返回语句不同:函数带返回参数

Return [ <[ < 参数参数 >>]]

用户自定义函数与过程比较

Page 124: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

语法

变量 = 自定义函数名( < 参数 1,参数 2,… >) 例: P = fac(N)

&& && 调用自定义函数:调用自定义函数: fac(N)

二、调用自定义函数的方法

Page 125: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:求 例:求 P =P = 1*2*3*……1*2*3*…… * N* N 程序如下:

clear P=1 input “请输入 N= " to N P=fac(N) && && 调用自定义函数调用自定义函数 ? “ P= ” , P return && && 主程序结束语句主程序结束语句

&& && 转下页转下页

三、 用户自定义函数实例

Page 126: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

&& && 在上述同一文件中输入如下内容:在上述同一文件中输入如下内容:

Function fac && && 自定义函数名自定义函数名 parameters N && && 接收参数 接收参数 N N 值值 P=1 for i=1 to N P = P *i endforReturn P && && 送回参数 送回参数 S S 的值的值 && && 结束语句结束语句

Page 127: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

1 、主程序调用子程序(过程)  主程序与子程序是不同的文件。

2 、在同一个文件中调用过程  过程与主程序是在同一个文件中。

3 、主程序调用过程文件中的过程    过程文件与主程序是不同的文件。

总结:一、过程的使用形式

Page 128: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

二、解题的多种方法

1.不使用过程和函数

2.主程序调用子程序

3.在同一个文件中调用过程

4.主程序调用过程文件中的过程

5.使用函数    

Page 129: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

第十章 10.9

编写程序实例

Page 130: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 :使用结构化编程,求 S=1+2+3+…+100

clear

s=0

For i=1 to 100 step 1

s = s+i

endfor

? ″s= ″ , s

Page 131: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求和: S=1+2+3+…+100 过程中的重要式子

S = 0 —— 求和初值 应为零 。

S = S + i —— 每次在 S 中加一个 i 。

i = i + 1 —— 每次在 i 中加一个 1 。

Page 132: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求累加和的式子

ss = ss + i

S 现在的值

S 原有的值

i 的值

+

Page 133: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求积:求积: P = 1P = 1*22*……*100 100 过程中的过程中的重要式子式子

P = 1 —— 求积时初值 应为 1 。

P = P * i —— 每次在 P 中乘一个 i 。

i = i + 1 —— 每次在 i 中加一个 1 。

Page 134: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求连乘积的式子

PP = PP * i

P 现在的值

P 原有的值

i 的值*

Page 135: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例求 S = Sin(1) + Sin(2) + …… + Sin(100)

clear

s=0

For i=1 to 100 step 1

S = S + Sin(i) endfor

? ″S= ″ , S

Page 136: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.15 :输入任意 5 个数要放在数组X 中 , 求出最大数。

解题分三个步骤: 1 、输入数放在 X 数组中。 2 、求出最大数。 3 、显示出来。

Page 137: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 1 :输入数据放在 X数组中。

clear

DIMENSION X( 5 )

For i = 1 to 10

INPUT ″X(i)= ″ TO X(i)

endfor

Page 138: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 2 :求出最大数。

For i = 2 to 5

if X(1)< X(i)

X(1) = X(i) && 使 A(1)保存大的数 endif

Endfor

Page 139: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

这样,使 A(1)保存大的数

X(1) X(2) X(3) X(4) X(5)

3 15 12 16 23

23 15 12 16 23

4次比较

结果:

Page 140: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 2 :求出最大数。 ( 第二种方法 )

For i = 2 to 5

if X(1)< X(i) T = X(1) X(1) = X(i) && X(i)和 X(1) 交换

X(i)= T endif

Endfor

Page 141: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

交换后,使 A(1)保存大的数

X(1) X(2) X(3) X(4) X(5)

3 15 12 16 23

15 3 12 16 23

4次比较

结果:

Page 142: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 3 :显示最大数。

? ″ 10 个数中最大数是:″, X(1)

Page 143: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 2 :用双重循环显示如下数字矩阵:

1 1 1 1 1

2 2 2 2 2

3 3 3 3 3

4 4 4 4 4

Page 144: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

解:

For i = 1 to 4 && 外循环控制打印 4 行

For j = 1 to 5 && 内循环控制打印 5 个数 ? ? i && 双问号表示不换行

Endfor

? && 没有显示项表示换行

Endfor

Page 145: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 3 :用双重循环打印 大 “九九表” :

1×1=1 1×2=2 1×3= 3 ······ 1×9= 9

2×1=2 2×2=4 2×3= 6 ······ 2×9=18

3×1=3 3×2=6 3×3= 9 ······ 3×9=27

4×1=4 4×2=8 4×3=12 ······ 4×9=36

·········· ·········· ·········· ······ ··········

·········· ·········· ·········· ······ ··········

9×1=9 9×2=18 9×3=27 ······ 9×9=81

Page 146: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

解:For i = 1 to 9 && 外循环控制打印 9 行

For j = 1 to 9 && 内循环控制打 9 个式子 ?? STR(i,1)+ “×” +STR(j,1)+“=”+STR(i*j,2)+“ ”

Endfor

? && 单问号表示换行

Endfor

Page 147: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 4 :用双重循环打印 小“九九表” :

1×1=1

2×1=2 2×2=4

3×1=3 3×2=6 3×3= 9 4×1=4 4×2=8 4×3=12 ····· ·········· ··········

·········· ······ ·····

9×1=9 9×2=18 9×3=27 ······ 9×9=81

Page 148: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

解:For i = 1 to 9 && 外循环控制打印 9 行

For j = 1 to i ?? STR(i,1)+ “×” +STR(j,1)+“=”+STR(i*j,2)+“ ”

Endfor

? && 单问号表示换行

Endfor

Page 149: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.16 :输入任意 5 个数要放在 X 数组中 , 并按从大到小顺序输出。

解题分三个步骤: 1 、输入数放在 X 数组中。 2 、将 X 数组由大到小排序。 3 、显示出来。

Page 150: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 1 :输入数据放在 X数组中。

clear

DIMENSION X( 5 )

For i = 1 to 5

INPUT ″ 请输入 X(i) : ″ TO X(i)

Endfor

Page 151: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 2 :由大到小排序For i = 1 to 4

For j = i + 1 to 5

if X(i)< X(j) T = X(i) X(i) = X(j) && X(i)和 X(j) 交换 X(j)= T endif

Endfor

Endfor

* 使用选择排序法

Page 152: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

比较交换后,使 A(1)保存最大的数

X(1) X(2) X(3) X(4) X(5)

3 15 12 16 23

23 3 12 15 16

第一次比较

结果:

Page 153: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

比较交换,使 A(2)保存第 2大的数

X(1) X(2) X(3) X(4) X(5)

3 12 15 16

23 16 3 12 15

第二次比较

结果:

23

Page 154: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

比较交换,使 A(3)保存第 3大的数

X(1) X(2) X(3) X(4) X(5)

3 12 15

23 16 15 3 12

第三次比较

结果:

1623

Page 155: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

比较交换,使 A(4)保存第 4大的数

X(1) X(2) X(3) X(4) X(5)

3 12

23 16 15 12 3

第四次比较

结果:

1623 15

Page 156: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 3 :按排序后顺序显示。

For i = 1 to 5

? X(i)Endfor

Page 157: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例:输入任意 10 个数要放在 X 数组中然后由大到小排序并显示出来。

* 使用冒泡排序法

分三个步骤:

1 、输入数放在 X 数组中。 2 、将 X 数组由大到小排序。 3 、显示出来。

Page 158: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 1 、输入数据放在 X数组中。

clear

DIMENSION X(10)

For i = 1 to 10

INPUT ″ 请输入 X(i) : ″ TO X(i)

Endfor

Page 159: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 2 、由大到小排序For i = 1 to 9

For j = 10 to i -1

if X(j-1)< X(j) T = X(j) X(j) = X(j-1) && X(j)和 X(j-1) 交换 X(j-1)= T endif

Endfor

Endfor

* 使用冒泡排序法

Page 160: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

步骤 3 、按排序后顺序显示。

For i = 1 to 10

? X(i)Endfor

Page 161: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

求 S = Sin(1) + Sin(2) + …… + Sin(100)

s=0

i=1

Do While i<= 100

S = S + Sin(i)

i = i + 1enddo

? ″S= ″ , S

Page 162: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 : 对学生 .DBF, 输入 10 条新记录 ( ( 补充 补充 ))

use D:\教学管理 \ 学生

i=1 Do While i<= 10

APPEND BLANK

@ 5,10 Say ″学号 :″ get 学号 @ 7,10 Say ″ 姓名 :″ get 姓名 @ 9,10 Say ″专业 :″ get 专业 @ 11,10 Say ″ 入学成绩 :″ get 入学成绩 READREADEndDo

USEUSE

Page 163: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.17 编写一个程序,创建表 xscj.dbf ,它的结构可以按下表定义: 1 、输入 10 名学生的 3 门课程的成绩,显示表的内容; 2 、计算平均分,显示表的内容; 3 、计算名次,显示表的内容。

字段名 字段类型 字段宽度 小数点

语文 数值型 6 2

数学 数值型 6 2

英语 数值型 6 2

平均分 数值型 6 2

名次 整型 1 2

Page 164: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

CLEAR

CREATE TABLE xscj( 语文 N(6,2), 数学 N(6,2),

英语 N(6,2), 平均分 N(6,2) , 名次 I )

FOR i = 1 TO 10

APPEND BLANK

@ i+2,10 SAY “ 语文 :” GET 语文

@ i+2,30 SAY “ 数学 :” GET 数学

@ i+2,50 SAY “ 英语 :” GET 英语

READ

ENDFOR

BROWSE

Page 165: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

REPLACE ALL 平均分 WITH ( 语文 + 数学 + 英语 ) / 3

BROWSE

FOR i =1 TO 10

GO i

pj = 平均分

mc=1

GO TOP

Page 166: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

DO WHILE .not.eof()

IF 平均分 >= pj

mc = mc + 1

ENDIF

SKIP

ENDDO

GO i

REPLACE 名次 WITH mc

ENDFOR

Browse

USE

Page 167: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 10.18有 4 个

具独立功能的过程,分别是 Sub1 、 Sub2 、Sub3 、 Sub4 ,编写一个程序,可以在不同选择下调用这些过程。

SET PROCEDURE TO AA.prg

DO WHILE .T.

INOUT “ 请输入您的选择 (1-5) : ” TO N

DO CASE

CASE N= 1

DO Sub1

CASE N = 2

DO Sub2

CASE N = 3

DO Sub3

CASE N = 4

DO Sub5

OTHERWISE

RETURN

ENDCASE

ENDDO

CLOSE PROCEDURE

提示:先编写过程程序文件再编写主程序文件

Page 168: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 1: 打印 100 以内的能被 7 整除的奇数

FOR n =1 TO 100 STEP 2

IF n % 7 = 0

? ? n , Space(1)

ENDIF

ENDFOR

说明: ??输出在当前行当前位置上,未到行尾不会换行;

? 输出表达式结果后换行,如用?输出多项,各 项表达式间用 “,”分隔;

Page 169: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

例 2: 请打开 D:\DJKS\VBCP\3000005 文件夹下的 MAIN.

PRG, 按要求完成以下程序 : 编程序实现从键盘上输入 20 个字符串,输出这 20 个字符串中最长的那个字符串。( 10.0 分)(试题 F42 )

Page 170: Visual FoxPro 6.0 应用基础与面向对象程序设计教程 (下篇)

ACCEPT “ 请输入一个字符串 :” TO M

S=Len(M)

For k=1 to 19

ACCEPT “ 输入一串字符 :” TO X

if LEN(X)>S

S = LEN(X)

M=X

endif

ENDDO

? “ 最长的字符串为 : ” , M