Visual - FoxPro第7章学案 程序设计

更新时间:2024-07-06 01:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

六 程序设计基础 命令文件

1命令文件的格式A

2命令文件的建立与修改C

3命令文件的运行C 常用命令

1输入输出命令C

2常用的系统设置命令C

3其它命令C 程序文件

1结构化程序设计的三种基本结构:顺序,选择,循环D

2过程文件的建立及重要性C

3子程序与过程的调用B

4参数的传递与变量的作用域B

命令文件

VFP6支持过程化程序设计和面向对象程序设计两种程序设计与开发的类型。

程序可以分为三个部分:

第一部分是程序的说明部分,一般用于说明程序的功能、文件名等需要说明的有关信息。

第二部分是进行数据处理的部分,通常这部分程序常包括下列三个部分,依次为:环境设置、数据处理(输入 运算 输出)、环境恢复。

第三部分是程序的控制返回部分,它控制程序返回到调用该程序的调用处。

1命令文件的格式A

VFP的程序是由若干有序的命令行组成,且满足下列规则: (1)用于结束的语句

Cancel :其功能是结束程序的执行,返回命令窗口。

Return:结束本程序模块的执行,返回上一级调用处。如果是主程序最高级调用,返回命令窗口。

(2)每一行可以从任一列开始,为便于阅读,一般程序结构左对齐,而控制结构内的语句序列比控制结构的语句缩进若干格。每条命令以回车键结束。 (3)一个命令行内只能写一条命令,命令行以回车键结束。一条命令在一个物理行内写不下时,可以分成几行。换行的方法有两种:一种是在物理行的末尾加符号“;”,表示下一行输入的内容是本行的继续;另一种是系统自动换行,即输入程序时,只管逐条命令输入,无需考虑本条语句是否超过屏幕行宽的最大限度,当输入的语句超过屏幕的最大行宽时,系统自动换行。输入时只需在一行结束时按回车键,通知系统本命令行输入完毕。

(4)各命令动词、系统保留字、系统函数可以取前四个字母。各命令动词、系统保留字、选项之间至少有一个空格作为分隔符。

使用“命令”窗口

可以在“命令”窗口中键入 Visual FoxPro 命令并按 ENTER 键执行。若要重新执行该命令,还可以将光标移到此命令所在行并按 ENTER 键。

甚至可以在“命令”窗口中象执行独立程序一样执行多行代码。

“命令”窗口是 Visual FoxPro 的一种系统窗口。当选择菜单命令时,相应的 Visual FoxPro 语句自动反映在“命令”窗口中。

也可以直接在“命令”窗口中输入 Visual FoxPro 命令。在“命令”窗口中您可以:

? ? ? ?

在按 ENTER 键执行命令之前,按 ESC 键删除文本。

将光标移到以前命令行的任意位置按 ENTER 键重新执行此命令。 选择要重新处理的代码块,然后按 ENTER 键。

若要分割很长的命令,可以在所需位置的空格后接分号,然后按 ENTER

键。

可在“命令”窗口内或向其他编辑窗口中移动文本,选择需要的文本,并

将其拖动到需要的位置。

?

可在“命令”窗口内或向其他编辑窗口中复制文本,而不用使用“编辑”菜单的命令。选择需要的文本,按住 CTRL 键,将其拖动到需要的位置。

可在“命令”窗口中运行多行代码 1.选择代码行。

2.按 ENTER 或在快捷菜单中选择“运行所选区域”。

因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用 Visual FoxPro 提供的编辑工具。在“命令”窗口中可以编辑、插入、删除、剪切、复制和粘贴正文。

在“命令”窗口中执行命令的优点是:能够立即执行被键入的命令,不需要将其保存为文件并用程序方式执行。

2命令文件的建立与修改C 创建程序

Visual FoxPro 程序是包含一系列命令的文本文件。在 Visual FoxPro 中,可以通过以下途径创建程序:

若要创建程序

1.在“项目管理器”中,选定“代码”选项卡中的“程序”项。 2.选择“新建”命令。

在“文件”菜单中选择“新建”命令。 在“新建”对话框中选择“程序”。 选择“新建文件”按钮。

- 或者 -在“命令”窗口中,键入: MODIFY COMMAND

Visual FoxPro 打开了一个称为“程序1”的新窗口,这时就可以键入应用程序了。

若要创建新程序

1.在“命令”窗口中键入如下命令: 2. MODIFY COMMAND numonly 3.在打开的窗口上键入如下代码: FOR nCnt = 1 TO 14 ? SUBSTR(cTest, nCnt, 1) ENDFOR

创建程序之后便可运行。

修改程序

程序保存后可以修改。首先,按以下方式打开想要修改的程序: 若要打开程序

?

若程序包含在一项目中,则在“项目管理器”中选定它并选择“修改”命

令。

- 或者 –

在“文件”菜单中选择“打开”命令,这时弹出一个包含文件列表的对话

框。在“文件类型”列表框中选择“程序”,然后在文件列表中选定要修改的程序,按下“确定”按钮。

- 或者 -

? ?

在“命令”窗口中按如下方式键入要修改的程序名。 MODIFY COMMAND myprogrm

- 或者 -

?

在“命令”窗口中,键入:

?

MODIFY COMMAND

然后从文件列表中选择要修改的程序,选择“打开”。 打开文件之后便可进行修改,修改完毕后请注意保存。

保存程序

创建程序后,请注意保存。 若要保存程序

?

从“文件”菜单中选择“保存”命令。

若用户要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是保存还是放弃已做的修改。

若用户保存了一个由“项目管理器”创建的程序则该程序被加入项目中。 若用户保存一个尚未命名的程序,则会打开“另存为...”对话框,这样提示用户可以在其中为程序指定程序名。程序保存后,用户可以运行或修改它。

3命令文件的运行C

运行程序

程序创建之后便可运行。 若要运行程序

若程序包含在一个项目中,则在“项目管理器”中选定它并选择“运行”

命令。

?

- 或者 -

在“程序”菜单中选择“运行”菜单项。在程序列表中,选择想要运行的

程序,单击“运行”按钮。 查找程序文件,出现运行结果。

?

- 或者 -

? ?

在“命令”窗口中,按如下方式键入 DO 以及要运行的程序名: DO myprogram

clear p=3.1414926

inpu \请输入圆的半径:\ s=p* r^2 ?\圆的面积为 s=\

Retu

常用命令

1输入输出命令C 1键盘输入命令

格式:INPUT [<字符型提示信息>] to <内存变量>

功能:通过键盘输入,将字符型,数值型,逻辑型,日期型表达式的值赋给指定的内存变量。

说明:[<提示信息>]:提示信息,提示用户输入数据。

[<内存变量名>]:指定一个内存变量或数组元素,存储从键盘输入的数据。如果指定的内存变量或数组元素不存在,VFP将自动创建该内存变量或数组。

<内存变量名>的数据类型取决于输入数据的类型。可以为数字型、字符型、日期型和逻辑型。

例子:试编程完成下列功能。从键盘上随机输入一个正数,以此数为半径,求圆面积和球体积,并输出结果。

程序如下: *L504.PRG CLEAR

CTALK=SET(\SET TALK OFF

INPUT \半径=\S=PI()*R*R V=4/3*PI()*R**3 ? \圆面积=\? \球体积=\SET TALK ON RETURN

use 基本表

input \请输入姓名:\loca for 姓名=xm disp cont disp cancel

(2)字符接收语句

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

功能:将从键盘上接收的字符串数据存入指定的内存变量中。提供此命令是为了向后兼容,在VFP中可以用文本框控制命令代替。

说明:

[<提示信息>]:指定提示信息字符串。

[<内存变量名>]:指定存储字符数据的内存变量或数组元素。如果没有定义此内存变量,ACCEPT将自动创建。如果没有输入数据就按Enter键,内存变量或数组元素则为空字符串。

在VFP6的可视编程中可用文本框代替ACCEPT命令。该命令允许直接向内存变量或数组元素输入字符数据,输入时不需要用字符串的定界符。

执行此语句时,先在屏幕上显示<提示信息>,光标紧随其后,然后暂停程序运行,等待用户从键盘上输入信息。输入的信息可以是任何可显示的ASCII码字符串,并以回车键结束。系统将此字符串信息存入指定的内存变量中,然后,继续运行暂停的程序。

例子:编程完成下述功能:从键盘随机输入某个表的文件名,要求打开并显示此表的内容。

在命令窗口输入下列命令:

use 基本表

ACCEPT \请输入姓名:\loca for 姓名=xm disp cont disp cancel

(3)输入一个字符语句

格式:WAIT[<提示信息>][TO <内存变量名>]

功能:暂停正在运行的程序,直到输入一个字符为止。

此语句与ACCEPT语句的功能部分相似。若选择TO <内存变量名>子句,则将输入的单个字符存入指定的内存变量。若直接输入回车键,则内存变量中存入空字符串。内存变量的类型为字符型。若选择<提示信息>子句,执行此命令时,屏幕上将显示提示信息,否则,屏幕上将显示“按任意键继续?”

WAIT语句主要用于下列两种情况。

■暂停程序的运行,以便观察程序的运行情况,检查程序运行的中间结果。 ■根据实际情况输入某个字符,以控制程序的执行流程。比如,在某应用程序的“Y/N”选择中,常用此命令暂停程序的执行,等待用户回答“Y”或“N”,由于这时只需输入单个字符,也不用按回车键,操作简便,响应迅速。

INPUT语句与ACCEPT语句的区别是:ACCEPT命令只能接收字符串,而INPUT语句可以接收任意类型的VFP表达式;如果输入的是字符串,ACCEPT语句不要使用字符型定界符,而INPUT语句必须用定界符括起来。

输出命令 1 ?命令

格式:?[<表达式1>],[<表达式2>]

功能:输出一个或多个表达式的值,输出时先回车换车,再输出 ?132

2 ??命令

格式:??[<表达式1>],[<表达式2>] 功能:在当前光标处输出表达式的值 ??132 例子:

记录输出

格式:Display [范围][fields <字段列表>] use 基本表

ACCEPT \请输入姓名:\loca for 姓名=xm disp cont disp cancel

set talk off clea use 数学

input \input \

*brow for 平时>=xx.and.平时<=sx field 学号,姓名,平时

Display field 学号,姓名,平时 use

set talk on retu

2常用的系统设置命令C

l.注释命令 非执行语句,用于提高程序的可读性。 NOTE、*(行首注释)、&&(行尾注释) 2. 环境设置命令 set 命令。 3. 清除命令:CLEAR(清屏)

CLEAR ALL(关闭所有文件、清除所有内存变量) 4. 关闭文件命令: CLOAE ALL (关闭所有文件)

CLOSE <文件类型> (关闭指定类型的文件) 5. 运行中断和结束命令

? Cancel 终止程序运行,返回命令窗口。

? RETURN 结束当前程序的执行,返回到调用它的上级程序。 ? QUIT 关闭所有文件,退出 VFP 系统,返回操作系统环境。

Set talk on/off

Set printer on |off

Set device to screen|to printer Set delete on/off

3其它命令C (1)、中止程序运行

■在程序运行过程中,按Esc键可以中止程序的运行,系统会显示警告对话框让用户选择:

【取消】 中止程序运行,这是缺省选择; 【挂起】 暂停程序运行,返回命令窗口。 【忽略】 忽略所给的Esc,继续程序的执行。 格式 一:CANCEL

功能:结束程序的运行,返回命令窗口,同时关闭所有打开的文件。

(2)、清屏命令 格式:clear

功能:清除屏幕,光标回到屏幕左上角 3重试命令 格式 retry

4返回调用 return

格式:Return [<表达式>||<过程名>]

功能:终止程序,返回被调用处, <表达式>是自定义函数的返回值,将程序返回到最高层命令文件,<过程名>返回到指定的过程.

5注释命令

格式一:NOTE/ * <注释字符串> 格式二:&& <注释字符串>

说明:上述命令不作任何操作,只是注释标记,用于说明程序或命令的功能等。注释内容不需要用定界符定界,执行时也不显示。注释信息如果在一行内没有写完,换行时也必须再写注释命令。NOTE或*是用于整行注释的,因此,它必须写在每一个注释行的开头;而&&命令是用于注释一行的部分内容的,因此,它可以写在行中(命令的尾部、注释信息的头部),这是程序中唯一可以在一个

逻辑行写二个语句的命令。

NOTE或*是用于整行注, 须写在每一个注释行的开头 &&命令是用于注释一行的部分

USE STUDENT &&打开STUDENT表 不影响执行 Note USE STUDENT命令不执行

6text?.endtext 格式: Text

[文本信息]

Endtext

功能:在屏幕上显示text?.endtext之间 的文本信息.

程序文件

1结构化程序设计的三种基本结构:顺序,选择,循环D 程序设计的过程

程序:为完成某一特定任务的一系列指令(语句)的集合.程序设计就是编写程序的过程.

程序设计的基本步骤包括:

? ? ? ? ? ?

对问题进行说明。 分解问题。 编制各模块。 测试并完善各模块。 组装全部模块。 整体测试。

程序设计的过程

掌握了一些基本概念后,程序设计就变成了一个不断重复的过程。您需要多次重复某些步骤,并在这个过程中不断对代码进行优化。从编写第一行程序开始,便不断进行测试,完成每个“试验 — 查错”的过程。对语言越熟悉,则编程速度越快,而且更多的初步测试工作将在头脑中进行。 程序设计的基本步骤包括:

? ? ? ? ? ?

对问题进行说明。 分解问题。 编制各模块。 测试并完善各模块。 组装全部模块。 整体测试。

开始程序设计之前,请注意以下几个问题:

?

在解决问题之前,必须把问题说明清楚,否则会不断进行修改,丢弃已编好的代码并从头再来,而且最终也不可能得到满意的结果。

将问题分解成可单独处理的几个步骤,而不是一下子解决全部问题。 在开发过程中不断测试和调试已编好的代码。通过测试检查代码是否能实现所需的功能;调试是找出代码在哪里出错并纠正这些错误。

精炼数据和数据存储方式,便于程序对其进行处理。这需要正确构造表格的结构。

? ?

?

本节以下部分将详细介绍建立一个小型 Visual FoxPro 程序的各个步骤。 对问题进行说明

开始解决问题以前,需要将其说明清楚。有时调整问题的说明方式会有助于问题的解决。

假设从不同的数据源获得一批数据,其中大部分是数值型数据,但有些数据,除包含数字外,也夹杂着一些虚线和空格。现在需要从字段中清除这些空格和虚线,并将所得到的数值型数据加以保存。

可以按如下方式说明这个程序要达到的目标,而不是简单地立即着手从原始数据中除去空格和虚线。

目标 用新值替换字段中的原始值,新值包含原始值中除空格和虚线外的所有内容。

这种说明方式的优点在于可以避免在处理可变长度字符串时遇到问题。 分解问题

因为最终是以操作、命令和函数的方式将具体的指令提供给 Visual FoxPro,所以需要将问题分解为多个独立的步骤。在问题中,最容易分离出来的任务是在字符串中逐个扫描字符,只有将单个字符分离出来才能决定是否应该保存它。 在扫描字符的时候,将检查它是否为虚线或空格。到了这一步也许您想要更详细地说明这个问题,括号之后的数据应该如何提取,货币符号、逗号和句号该如何消除等一系列问题将出现在脑海中。代码越通用,为将来节省的工作量就越多,问题就在于如何做到事半功倍。下面给出了一个比从前适用范围更广的问题说明方式。

精炼后的目标 用原始数据中的数值型字符更新字段值。

这便是在字符的层次上重新说明问题。如果字符是数字则保留,否则将指针移向下一个字符。当用原始字符串中的数字重新构成一个只含有数字元素的新串时,将这个新串替换掉原来的字符串。如此循环,直到将所有记录中的数据全部更新。 概括起来,全部问题可以分解成以下一些模块: 1. 逐个检查字符。

2. 判断该字符是否为数字。 3. 若是数字,则将其复制到新串。

4. 检查完字符串中的全部字符后,用只含数字的新串替换原串。 5. 重复上述步骤,直到表中全部记录都被更新。 编制模块

明确了要达到的目标以后,便可以开始使用 Visual FoxPro 的命令、函数和操作符来构造各模块。

因为命令和函数是用来处理数据的,所以需要一些数据来测试其功能。这些用于测试的数据应与实际数据尽量相近。

例如,在“命令”窗口中键入如下命令,将一个测试字符串赋值给变量: cTest = \逐个检查字符

首先,需要在字符串中检查单个字符。有关可用于操作字符串的函数列表,请参阅“帮助”中的“字符函数”。

您将发现三个用以返回字符串特定部分的函数:LEFT( )、RIGHT( ) 和 SUBSTR( ),其中 SUBSTR( ) 可以返回字符串中的任意子串。

SUBSTR( ) 需要三个参数:字符串、起始字符的位置和需返回的字符数。若要了解 SUBSTR( ) 是否可完成所需工作,请在“命令”窗口中键入以下命令: ? SUBSTR(cTest, 1, 1) ? SUBSTR(cTest, 3, 1) ? SUBSTR(cTest, 8, 1) 输出 1 3 -

用于测试的字符串中的第一个、第三个和第八个字符将显示在 Visual FoxPro 的主窗口中。

可以使用循环结构多次重复执行相同操作。因为用于测试的字符串有固定的字符数 (14),所以能够使用 FOR 循环语句。每执行一遍,FOR 循环的计数器增加 1,因此可在 SUBSTR( ) 函数中使用该计数器。因为在“命令”窗口中不能测试循环结构,所以我们编写一个示例程序。 若要创建新程序

1. 在“命令”窗口中键入如下命令: 2. MODIFY COMMAND numonly

3. 在打开的窗口上键入如下代码: 4. FOR nCnt = 1 TO 14

5. ? SUBSTR(cTest, nCnt, 1) 6. ENDFOR

创建程序之后便可运行。 若要运行程序

1. 在打开的程序窗口中,按下 CTRL+E 键。 2. 若“保存”对话框出现,选择“是”按钮。

运行此程序时,各个结果将在 Visual FoxPro 主窗口中分行显示。

(1)VFP的程序结构可以分为三种:顺序结构、分支结构、循环结构。 顺序结构:执行程序顺序与书写顺序一致;

分支结构: 执行程序顺序是根据条件是否成立来选择一条路径; 循环结构:。执行程序顺序是条件成立时,反复执行某一组语句. 1.顺序结构:按程序中语句的书写顺序逐条执行。

2.分支结构(选择结构):根据逻辑条件的结果执行不同的命令序列。 (1)双分支结构:IF...ELSE...ENDIF (2)多分支结构:DO CASE...ENDCASE

3. 循环结构:按规定的条件重复执行一段命令序列。 (1)DO WHILE...ENDDO (2)FOR ... ENDFOR (3)SCAN ?ENDSCAN 对数据表的循环操作。

说明:分支结构或循环结构可以嵌套,但分支与分支之间或循环与循环之间不能交叉。

(2)结构化程序的特点

每一个基本结构只有一个唯一的入口; 每一个基本结构只有一个唯一的出口;无死语句(永远执行不到)无死循环(永远执行不完)

程序设计的方法:模块化设计,自顶向下设计,逐步细化设计的方法. 1、顺序结构程序设计

顺序结构程序设计是结构化程序设计的基础,即是按完成任务所需步骤的先后顺序逐条命令的编写。

clear p=3.1414926

input \请输入圆的半径:\ s=p*r^2 ?\圆的面积为s=\

Retu

set talk off clea use 数学

input \input \

brow for 平时>=xx.and.平时<=sx field 学号,姓名,平时 use

set talk on retu

do while .T. use 基本表 clear

acce \输入要查找的姓名\locate for 姓名=xm

do while .not.eof()

display

cont enddo

wait \是否继续\

if upper(yn)<>\

exit

endif

enddo use return

2、分支结构程序设计

分支结构就是根据条件的计算结果执行不同的操作。条件分支结构逻辑流程图如图5-6所示,VFP6中有两条命令实现条件分支:

条件分支根据条件的测试结果执行不同的操作。Visual FoxPro 中有两条命令实现条件分支:

? ?

IF ... ELSE ... ENDIF DO CASE ... ENDCASE

只有逻辑条件值为“真”(.T.) 时,才会执行在初始语句和 ENDIF 或 ENDCASE 语句之间的程序。

(1)条件分支

Y 条件 N 语句列1 语句列2 ENDIF后面语句 格式:IF <条件表达式> <语句序列1>

[ELSE <语句序列2>] ENDIF

参数描述:

<条件表达式>:指定要计算的逻辑表达式。如果<条件表达式>的值为

“真”,则执行IF语句之后的<语句序列1>;如果<条件表达式>的值为“假”,而且包含ELSE语句和<语句序列2>,则执行<语句序列2>;如果<条件表达式>的值为“假”,而且不包含ELSE语句和<语句序列2>,则程序忽略IF语句和ENDIF语句之间的所有语句,程序从ENDIF语句后的第一条命令开始继续往下执行其它程序。

说明:一个IF?ENDIF语句块中可以嵌套另一个IF?ENDIF语句块。 【例5-5】假设某单位有很多员工,并且要给月工资高于或等于1000元的员工增加5%的工资,给月工资低于1000元的员工增加10%的工资。

下面的示例程序将完成这一任务。此示例程序假定已在当前工作区打开了员工工资表,表中有一个名为“月工资”的数值型字段。

SET TALK OFF SCAN

IF 月工资>=1000

REPLACE 月工资 WITH 月工资*1.05

ELSE

REPLACE 月工资 WITH 月工资*1.1

ENDIF ENDSCAN SET TALK on RETURN

USE XSCJ01 ACCE\LOCA FOR 学号=BB IF .not.eof()

disp

ELSE

?\

ENDIF USE RETU *P176 5 clea s=1 n=0

for n=1 to 100 if s>=8848

exit

endif

s=0.000005*2^n ?\endfo

?\retu

(2)多条件选择语句 格式:DO CASE

CASE <条件表达式1>

<语句序列1>

[CASE <条件表达式2>

<语句序列2> ?

CASE <条件表达式N>

<语句序列N>]

[OTHERWISE

<语句序列N+1>]

ENDCASE

条件1 Y 语句列1 语句列2 语句列n N 条件2 N 条件n N OTHERWISE 有 其它语句列 无 ENDCASE后面语句 参数描述:

CASE <条件表达式1> <语句序列1> ? :VFP在执行这条多条件选择命令时,按命令行中写出的条件表达式的顺序逐条检查<条件表达式>,当遇到第一个结果为“真”的<条件表达式>时,就执行它后面的语句序列。语句序列中的命令逐条被执行,直到遇到下一个CASE或OTHER-WISE或ENDCASE,然后,

再从ENDCASE语句后的第一条命令开始继续执行其它命令。

如果一个CASE <条件表达式>的<条件表达式>为“假”,就忽略它后面的语句序列。

例子; clea

set talk off use 英语

input \输入记录号\go n

zp=平时*0.3+期中*0.3+期末*0.4 do case

case zp>85

?\优秀\

REPLACE 学期总评 WITH zp disp

case zp>75

?\良好\

REPLACE 学期总评 WITH zp disp

case zp>60

?\合格\

REPLACE 学期总评 WITH zp disp

otherwise

?\不合格\

REPLACE 学期总评 WITH zp

disp

endcase use

set talk on retu clea

USE 职工工资表

ACCE\输入职工号\LOCA FOR 职工号=zzh IF .not.eof()

do case

case 总收入<=1000

REPLACE 所得税 WITH 0

case 总收入>1000 .and.总收入<1500

REPLACE 所得税 WITH (总收入-1000)*0.05

case 总收入<2000

REPLACE 所得税 WITH (总收入-1500)*0.1

otherwise

REPLACE 所得税 WITH (总收入-2000)*0.15

endcase

ELSE

WAIT \不存在该职工号的职工\ ENDIF disp use RETU

05年高考 四、编程题(10分)

?1000  x?50?10?x?50?2x?3  已知y??2

  10?x?0?x?x x?0?试编程计算y的值(要求:x的值由键盘输入)。

set talk off clear

input “请输入X的值:” to x do case

case x>=50 y=1000

case x>10 y=2*x+3 case x>=0 y=x^2 otherwise y=x endcase ? “y=”,y return

09高考2.设有学生成绩表xscj.dbf,结构如下表所示。要求根据学生的成绩确定等级,具体规定如下:成绩在85分以上的等级为“优秀”(含85分);成绩在70——84分之间的等级为“良好”;成绩在60——69分之间的等级为“及格”;60分以下的等级为“不及格”。请编程实现上述功能。(8分) 字段名称 数据类型 字段宽度 姓名 字符型 8 成绩 数值型 3 等级 字符型 8

10年高考 四、编程题(共15分,第1题7分,第2题8分)

1 现有某学校的职工工资表gz.dbf,其表结构中含有姓名、性别、职称、基本工资、奖金等字段。请编程实现:若职称字段值为“教授”,则将基本工资改为3000,奖金增加2000;若职称字段值为“副教授”,则将基本工资改为2000,奖金增加1500;其余职工的基本工资都改为1800,奖金增加1000。(7分) 1参考程序: use gz

do while not eof() do case

case 职称=”教授”

repl 基本工资 with 3000,奖金 with 奖金+2000 case职称=”副教授”

repl 基本工资 with 2000,奖金 with 奖金+1500 otherwise

repl 基本工资 with 1800,奖金 with 奖金+1000

endcase skip enddo use

2、循环语句

程序设计中的循环,是指在程序中从某处开始,有规律地反复执行某一个程序块的现象。VFP的循环命令有三类:基于条件的循环、基于计数的循环和基于表的循环。

循环

循环结构可以按照需要多次重复执行一行或多行代码。在 Visual FoxPro 中有三种循环语句:

? ? ?

基于表的循环命令: SCAN ... ENDSCAN 基于计数的循环命令:FOR ... ENDFOR 基于条件的循环命令:DO WHILE ... ENDDO

若对表中全部记录执行某一操作,可以使用 SCAN。随着记录指针的移动,SCAN 循环允许对每条记录执行相同的代码块。

若事先知道循环次数,则可以使用 FOR 循环。例如,已知表中的字段数(字段数可以用函数 FCOUNT( ) 得到),那么就可以用一个 FOR 循环打印表中的全部字段名。

FOR nCnt = 1 TO FCOUNT( ) ? FIELD(nCnt) ENDFOR

想要在某一条件满足时结束循环,可以使用 DO WHILE 语句。使用 DO WHILE 结构,事先可以并不清楚循环的次数,但需要知道什么时候结束循环。

(1)基于条件的循环:DO WHILE命令 格式:DO WHILE <条件表达式>

[<语句序列>]

[LOOP]

[<语句序列>]

[EXIT]

[<语句序列>]

ENDDO

<内存变量>:指定作为计数器的内存变量或数组元素。在执行FOR?ENDFOR语句之前,此内存变量或数组元素不一定存在。

<初始值> TO <终值>:<初始值>是计数器的初始值,而<终值>是计数器的终止值。

[STEP <步长>]:是计数器递增或递减的步长。如果<步长>是负值,则计数器递减;如果省略STEP子句,计数器每次递增1。

<语句序列>:指定要执行的VFP命令,它可以包含任意数量的命令。 [EXIT]:将控制权交给紧接在ENDFOR后面的命令。可以在FOR与ENDFOR之间的任何地方放置EXIT。

[LOOP]:将控制权直接交给FOR子句,不再执行LOOP与ENDFOR之间的语句。计数器正常递增或递减,就像执行到ENDFOR子句一样。可以在FOR与ENDFOR之间的任何地方放置LOOP。

说明:

可以用内存变量或数组元素作为计数器,指定FOR?ENDFOR循环中VFP命令的执行次数。在遇到ENDFOR或NEXT之前,始终执行FOR后面的VFP命令。执行过程中,每循环一次,计数器都会产生一次计数,计数增量由<步长>值控制,然后把计数器的值与<终值>进行比较,决定是否进行下一次循环。

【例5-9】求1到100中偶数的和 AA=0

FOR II=2 TO 100 STEP 2

AA=AA+II

ENDFOR ? AA

初始条件 终止条件 改变循环变量

step 步长0.5

For N=0.1 to 10 <语句组1> Loop <语句组2> Exit

endfor

clear k=0

for i=1 to 6 if i=5

loop

endif

k=k+1

endfor ?k retu clea s=1

for n=1 to 9 s=2*(s+1) endfo ?s retu

clea &&ASCII字母表 for i=2 to 255 ??i,chr(I) if I=0 ? endif endfor

(3)基于表的循环命令

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

[<语句序列>]

[LOOP] [EXIT]

ENDSCAN

参数描述:

[<范围>]:指定对当前表中记录扫描的范围。只有在范围之内的记录才有可能扫描到。SCAN命令的默认范围为ALL。

[FOR <条件>]:只有条件表达式的计算结果为“真”的记录,才能对其执行命令。包含FOR子句可以筛选出不想扫描的记录。

[WHILE <条件>]:指定一个逻辑表达式作为执行命令的条件,只要逻辑表达式计算为“真”,就对记录执行命令,直到遇到使表达式不为“真”的记录为止。

[<语句序列>]:指定要执行的VFP命令集。

[LOOP]:把控制权直接交给SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之间的任何地方。

[EXIT]:把控制权力从SCAN?ENDSCAN循环语句交给ENDSCAN下面的命令。EXIT子句可以放在SCAN和ENDSCAN之间的任何地方。

ENDSCAN:标志SCAN过程的结束。

说明:SCAN命令自动将记录指针移到下一条满足条件的记录,并执行相应的命令块。

【例5-10】逐条显示STUDENT表中男生的情况。 USE STUDENT

SCAN FOR 性别=”男”

DISP WAIT

ENDSCAN USE

use 基本表

acce \输入要查找的姓名\scan for <查询条件> disp <语句组1> [ Loop ]

<语句组2> [ Exit ] <语句组3> endscan clear use 基本表 *input \输入要查找的出生日期,分数\acce \请输入姓名 \scan for 姓名=xm

display fields 姓名,出生日期

endscan use

set talk on return

三种循环命令比较

Do while /enddo用于不确定的循环,可用于数值变量和记录查找; Scan /endscan 只用于记录查找;

For/endfor用于确定的循环,用于数值变量;

多重循环

For N=1 to 10 aa cc endfor CLEAR Text

For m=1 to 100 bb endfor

99[文本信息]

Endtext ?

for i=1 to 9

for j=1 to i

??str(j,1),\

endfor ?

endfor cancel

*阿基米德和国王下棋,阿基米德胜利,国王许诺奖励。阿基米德要求64格棋盘装满,第一格装1粒,第二格装2粒,

*第三格装4粒,第四格装8粒,。。。棋盘装满。现50000粒米重1千克,一火车厢装60吨,1秒发出一列火车,共要多少年运完?

clea s=0

for n=1 to 64

s=s+2^(n-1)

endfo ?s

nian=s/50000/1000/60/365/24/60/60 ?nian Retu

Clear &&换零钱 for x=1 to 100

for y=1 to 20

for z=1 to 10

if x+20*y+10*z=100

?x,y,z

endif

endfor

endfor

endfor return

*30人吃饭男人用3元,妇女用2元,小孩用1元,用50元,问各多少人 SET TALK OFF CLEA

FOR X=1 TO 17 ? ENDFOR RETU

**36个人搬砖,一次36块,男人一人搬走4块,女人一人搬走3块,小孩两人搬走1块

*问男,女,小孩各多少人? clear for x=1 to 9

for y=1 to 12

for z=1 to 36

if 4*x+3*y+z/2=36 and x+y+z=36

?x,y,z

FOR Y=1 TO 25

FOR Z=1 TO 50

IF 3*X+2*Y+Z=50 AND X+Y+Z=30

??\男\女\小孩\

ENDIF

ENDFOR

ENDFOR

endif

endfor

endfor

endfor return

*用100元买100只鸡,公鸡5元,母鸡3元,小鸡1元买3只 SET TALK OFF CLEA

FOR X= 1 TO 20

FOR Y= 1 TO 33

FOR Z=1 TO 100

IF 5*X+3*Y+Z/3=100 AND X+Y+Z=100

??\公鸡\母鸡\小鸡\

ENDIF

ENDFOR

ENDFOR ?

ENDFOR RETU

*猴子吃枣;一堆枣,一群猴子,第一天吃了一半,不过瘾,又吃了一个, *第二天吃了剩下的一半,不过瘾,又吃了一个,到第十天一看只有一个了。问有多少枣?

clea s=1

for n=1 to 9 s=2*(s+1) endfo ?s

?\

m=10

do while m>=1 ?m,s,s/2+1 if s>1

s=s/2-1 ??s

endif m=m-1 enddo retu N=1

初始条件 <终止条件>

初始条件 <终止条件>

Do while n<=100

m=1

Do while m<=100

IF 5*X+3*Y+Z/3=100 AND X+Y+Z=100

??\公鸡\母鸡\小鸡\

ENDIF

改变循环变量

m=m+1 enddo

N=n+1 enddo

改变循环变量

SET TALK OFF clea r=1 c=10

DO WHILE R<=4 S=1

do while s<=2*r-1

@r,c say \

c=c+1 s=s+1

enddo

c=10-r r=r+1 enddo retu

2过程文件的建立及重要性C Visual FoxPro 的过程如下所示: PROCEDURE myproc

*本行是注释,但也可为可执行代码。 ENDPROC

习惯上,过程是为完成某个操作而编写的代码,函数用来计算并返回一个值。在 Visual FoxPro 中,这二者区别不大。

子程序与过程的区别

相同点:都可以被主程序或上级程序调用。DO < >

不同点:子程序以.prg文件形式存在,过程和主程序一起存放,放在主程序后面,以proc 开头标记。

FUNCTION myfunc

* 本行为注释,但也可作为可执行代码 ENDFUNC

可以将过程和函数保存在单独的程序文件中,也可放在一般程序的结尾。不能把可执行的主程序代码放在过程或函数之后。

若将过程或函数放在单独的程序文件中,可以在应用程序中使用 SET PROCEDURE TO 命令访问它们。例如,保存过程或函数的文件名为 FUNPROC.PRG,可在“命令”窗口中使用下面的命令调用它们: SET PROCEDURE TO funproc.prg 调用过程或函数

在程序中有两种调用过程或函数的方式:

使用 DO 命令,例如: ? DO myproc

?

- 或者 -

在函数名后加上一对小括号,例如: ? myfunc( )

?

如果向过程或函数发送值或接收它们的返回值,则两种方式都可以加以扩展。 向过程或函数发送值

若要向过程或函数传递值,可以使用参数。例如,下面的过程接收一个参数: PROCEDURE myproc( cString ) * 下行显示一条信息

MESSAGEBOX (\ENDPROC

注释 在过程或函数定义行的括号中包含参数,表明该参数的作用域仅为该过程或函数,例如 PROCEDURE myproc (cString)。也可以使用 LPARAMETERS,让函数或过程来接收局部作用域的参数。

在函数中,参数以同样方式工作。要向函数或过程传递参数值,可以使用字符串或包含字符串的变量,如下表所示。

可以向过程或函数传递多个参数,参数之间用逗号分开。例如,下面的过程有三个参数:日期、字符串和数字。

PROCEDURE myproc( dDate, cString, nTimesToPrint ) FOR nCnt = 1 to nTimesToPrint

? DTOC(dDate) + \ ENDFOR ENDPROC

下面的代码将调用这个过程:

DO myproc WITH DATE(), \

过程的定义 Proc <过程名> <语句序列> Endproc

本文来源:https://www.bwwdw.com/article/tv4.html

Top