正学文登专升本
VF程序设计复习
程序设计基础知识
程序是为了完成一项任务而编写的指令的集合,在某种程度上VFP中的程序设计同传统的程序设计有很大的不同。在VFP中可以同时应用面向过程和面向对象两种编程方法,面向对象的程序设计是其主要特色。一般来说,对于制作简单、较小的应用程序,使用过程编程方式比较容易,同时这也是面向对象编程方式的基础。本章主要介绍的是面向过程的编程方法。
一. 程序设计概念
1.程序设计与算法简介
程序设计从某种意义上来说, 是根据算法步骤把命令、函数、变量、常量、表达式等以逻辑的方式组合成程序文件或系统。确定算法和编写程序是两个重要步骤。
算法是指为解决一个问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
而采取的方法和步骤,或者说解决步骤的精确描述。算法分为数值运算算法和非数值运算算法。数值运算算法的目的是计算数值解,如求方程的根,求函数的定积分等。非数值运算算法,包括的范围很广,常见的办公室自动化系统、管理领域、商业领域及医学应用等等,主要是描述其解决应用问题的逻辑步骤。
描述实现算法的逻辑步骤,一般采用流程图方式,流程图分传统流程图;N--S流程图等。传统流程图是用一些图框,流程线以及文字说明来描述操作过程,这样的表示算法,直观,形象,容易理解。如图4.1和图4.2:
.“起止框”用来表示算法的开始和结束。
“处理框”用来表示一般的数据处理。
“输入/出框”表示输入,输出操作。
“流程线”表示流程的方向(执行方向)。
“连接点”用于将画在不同地方的线连接起来。
“判断框”用来根据给定条件是否满足,决定执行两条路径中的某一路径。
图4.1
拿到一个问题后,首先拟定并写出算法,画出结构流程图,然后再根据算法书写程序,是一个良好的习惯。这样做不仅可提高所写程序的正确性,也容易修改程序,提高整个程序设计的效率
2.源程序实例
例:显示”student.dbf”表中“总成绩 “小于360的所有学生的学号,姓名,总成绩.
分析问题:逐一判断每条记录的总成绩字段的值是否大于360,如果大于就显示,否则不显示.根据分析结果画出结构流程图,如:图4.2,然后写出源程序如下:
SET TALK OFF
CLEAR
OPEN DATABASE STUDENTS
USE STUDENT1
DO WHILE !EOF()
IF 总成绩>=360
? 学号,姓名,总成绩
SKIP
ELSE
SKIP
ENDIF
ENDDO
CLOSE DATABASE
RETURN
3 . 程序的创建、编辑和运行
VFP6.0 源程序文件的扩展名是.PRG, 程序运行时,系统自动编译产生扩展名为.FXP 的文件, 其文件主名与.PRG为扩展名的文件主名相同, 在VFP下若修改了.PRG 为扩展名的文件,系统也会自动重新编译.
4.程序文件的创建
创建VFP6.0 源程序文件,可使用任何文本编辑器建立;本系统中使用自身编辑器创建,编辑源程序文件。VFP提供了以下三种方法。
图4-2新建 文件
方法一 可以在VFP主窗口的 “文件“ 菜单中选择“新建“或工具栏中的“新建” 按钮,选择“程序“ 如图 4-2所示。然后单击“新建文件”,这时系统将打开一个编辑窗口,可以往里输入程序,如图4-3所示。
源程序输完后, 利用文件菜单进行保存。 也可立即利用 【程序】|【运行】菜单
和【程序】|【编译】菜单,进行编译和运行程序。程序执行结果显示在主窗口中。
方法二 在命令窗口中执行命令: MODIFY COMMAND <文件名>
这时,系统将打开一个如图4-3的编辑窗口,可以往里输入程序代码。编辑完毕,使用CTRL+W键,则存盘退出。
方法三 在“
项目管理
工程项目管理制度介绍工程项目管理课程设计政府投资项目管理意见建设工程项目管理合同工程项目管理培训总结
器”中选择“代码”选项卡中的程序选项,选择“新建”命令。系统将打开编辑窗口,可以创建一个程序,如图4-4所示。
5. 程序的保存
程序输入完毕后,可以选择“文件”菜单中的“保存”项保存程序文件。
若用户要关闭一个没有保存的程序,则会弹出相应的对话框,提示用户是保存还是放弃已作的修改,如图4-5所示。
若用户保存了一个由“项目管理器”创建的程序,则该程序被加入项目中。若用户保存了一个尚未命名的程序,则会打开“另存为。。。。”对话框,用户应该从中选择或输入正确的盘符、路径、文件名。程序保存后,用户可以在其后任一时刻运行或修改程序。
6.程序的修改
程序的修改即对源程序文件打开进行编辑。有以下方法:
方法一 若程序包含在某一个项目中,则可以在“项目管理器“中选定它,并选择“修改”
方法二 在“文件”菜单中选择“打开”命令,这时将出现一个包含文件列表的“文件类型”对话框。从中选择“程序”,然后找到要编辑修改的程序,选定后单击“确定”按钮,如图4-6所示。
方法三 在“命令”窗口中键入如下命令:
MODIFY COMMAND <程序文件名>
然后将出现程序文件编辑窗口,如图 4-3 所示。接下来可对显示在编辑窗口中的程序进行修改。
7. 程序的运行
程序创建或修改完毕,最终需要运行。运行程序有如下几种方法。
方法一 在“程序”菜单中选择“运行”菜单项,然后选择一个程序文件,如图4-6
方法二 在命令窗口中运行命令:DO <程序文件名>
方法三 若程序包含在一个项目中,则可以在“项目管理器”中选定它并选择“运行”命
令,如图4-4 所示。
2常用命令和语句
VFP的一个特点,是大量使用系统环境设置命令以及其他一些控制命令,以帮助用户进行数据处理、安全管理、程序调试、结果输出等方面的工作。本节主要介绍一些常用的命令和语句。
一.2.1基本输入、输出语句
程序最基本的操作就是输入、输出。输入是从键盘或鼠标等设备中接收数据。输出是指将计算机所做的运算结果输出到屏幕或打印机。
1.输入命令
1)字符型键盘输入命令 ACCEPT
格式:ACCEPT [<提示>] TO <内存变量>
功能: 建立内存变量,并用键盘输入的方式将字符型数据赋值给内存变量。
说明:①<提示>表示需输入内容的提示信息,是命令执行时显示的内容。<提示>一般为字符型常量,字符型变量或字符型表达式。
② <内存变量>表示存储字符数据的字符变量或数组元素。
③ 输入的数据作为字符型数据处理,不需要定界符括起来。若使用定界符,则定界符成为输入字符的一部分。输入回车健则按空字符处理。
例11-2 输入班级编号和姓名,并打印出来。
ACCEPT “请输入班级编号:”TO number
ACCEPT “请输入姓名:”TO name
?“班级编号:”,number,“姓名:”,name
2)任意类型键盘输入命令INPUT
格式:INPUT [<提示>] TO <内存变量>
功能: 建立内存变量,并用键盘输入的方式将数值型,字符型,逻辑型或日期型数据赋值给内存变量。
说明:① <提示>是命令执行时显示的提示内容。可是一个字符型表达式。
② <内存变量>可为数组元素。内存变量不必事先定义。
③ 从键盘输入的数据可以是命令允许的四种类型表达式。执行该命令时计算键盘输入的表达式的值,将其赋给内存变量。
④ 字符型常量必须有定界符,且不能单用回车输入。
3)程序暂停,等待接收单字符命令WAIT
格式:WAIT [<提示>] TO <内存变量> [WINDOW[ AT <行坐标,列坐标>]]
[TIMEOUT <等待秒数>]
功能: 显示提示并暂停程序运行,直到按下任意一键或鼠标按键程序才继续执行。
说明:① <提示>表示要显示提示的内容,省略提示,系统给出“按任意键继续。。。。。。。”。
② TO<内存变量>]表示键盘的输入以字符形式存入指定的内存变量。内存变量类型为字符型,宽度为1。
③ [WINDOW]表示在Visual FoxPro主窗口右上角出现的系统消息窗口的位置中显示消息。WAIT WINDOW 支持多行消息。
④ [AT<行坐标,列坐标>]指Visual FoxPro主窗口中消息窗口的位置。
⑤ [NOWAIT]表示在消息被显示后不移去消息窗口,立即继续执行程序。省略时,程序暂停直到按下一个键或鼠标按钮,并将消息窗口从主窗口中移走。
2.格式输出命令
格式:@ <行,列>SAY <表达式>[PICTURE<模式符>][FUNCTION<功能符>]
功能:在指定坐标位置按格式输出表达式的值。
例11-5 在程序编辑窗口输入如下内容
*ex1.PRG
Vb1=49562.89
Vb2=--0.5
@3,10 SAY Vb1 FUNCTION”B”
@5,10 SAY Vb1 FUNCTION”C”
@7,10 SAY Vb2 FUNCTION”X”
运行ex1.PRG 结果显示
49562.89
49562.89CR
_0.5DB
3.格式输入命令
格式:@< 行,列>SAY<提示信息>GET<变量> [FUNCTION<功能符>]
[PICTURE<模式符> [RANGE<数值表达式1>,<数值表达式2>
[VALID<逻辑表达>]
READ[SAVE]
功能:在指定行、列首先显示<提示信息>,接着按规定的格式反显GET后变量的值;当执行命令READ时,子命令GET被激活,其变量值处于编辑状态。一个READ语句可以激活多个在它前面的GET子命令。
说明:① 命令中的功能符和模式符代码及其含义如下表11-1和表11-2
② 命令的执行过程是,系统先在指定的行列显示SAY后的提示信息,在提示信息后显示GET变量的值,此前GET 后的变量必须赋值,且变量值反显,当顺序执行READ语句后,反显的变量值被激活,此时,可编辑变量的值,按回车键可结束此过程。
③ 一个READ命令可激活多个GET的编辑区,因此,只要GET 语句是在READ 语句前,当第一个GET 激活变量值编辑后光标可自动跳到下一个 编辑区,依次执行。
④RANGE中数值表达式1和2,表示数据编辑和显示的下限和上限。
⑤ VALID<逻辑表达式>表示数据编辑和显示的条件范围。
表4-1 PICTURE模式符代码表
代码 含义 代码 含义
A 只允许字母 L 只允许逻辑型数据
N 只允许字母或数字 X 允许任何字符
Y 只允许逻辑数据且小写换大写 G 只允许数字
# 允许数字,空格和正负号 ! 小写转换成大写
¥ 数值前显示货币符号 ( 指定小数点位置
, 分隔多位数 ( 数值前显示星号
表4-2 FUNCTION功能符代码表
代码 含义 代码 含义
A 只允许字符字母 B 数值数据在显示区左对齐
C 在正数之后显示CR表示贷款 D 使用当前的SetDate日期格式
E 使用欧洲日期格式Dd/mm/yy L 数值显示时显示前导0,而不是空格
X 在负数后面显示DB表示借贷 T 去掉表达式首尾空格
S(n) 限制字符显示的宽度为n个字符 Z 数值为0时刻用空格显示
C 将负数括在括号内 ! 将小写字母转化成大写字母
* 用科学计数法显示 ¥ 用Set CURRENCY指定货币格式显示
例4-6 指定坐标位置的格式输出例1。
**exp.prg
va1=47612.78
va2=-0.6
@4,10 say va1 function “B”
@8,10 say va1 function “c”
@10,10 say va2 function “x”
将以上程序存盘,并运行。
结果显示:
47612.78
47612.78CR
-0.6DB
例4-7 格式输出例2。
**exp.prg
vbr1=space(20)
vbr2=0
vbr3=date()
var4=.F.
clear
@4,15 say “编辑字符:” get vbr1 function “s14!”
@5,15 say “编辑数字:” get vbr2 picture “999999.99”RANGE 1000,40000
@6,15 say “编辑日期:” get vbr3 VLALID vbr3
或 NOTE <注释内容>
2) 行末注释
格式 <执行语句> && <注释内容>
例:
* 这是一个示例程序
* 1999.9.9
SET STATU ON && 显示状态栏
NAME=“张三”
* ACCEPT “姓名:” TO NAME
?NAME
CANCEL
2. 续行标志
VFP 允许一个语句行最多可又254 个字符长,这一长度足以满足绝大多数语句格式的要求,但是,为了使程序便于阅读,往往需要将一行程序分作几行来写。将一行分作几行来写时,要使用续行标志“;”,表示本语句尚未结束。
例如:
REPLACE 应发工资 WITH 基本工资*1.15+职务津贴+奖金;
扣款 WITH 房租水电+医药费+应发工资*所得税率;
是发工资 WITH 应发工资-扣款
3. 指定缺省驱动器和目录
由于数据库应用通常包括大量的文件,为了应用程序的顺利进行,应当将这些文件集中在一个专属目录中。然后将此专属目录指定为缺省驱动器和目录,这样既可大大地方便程序开发工作,又能保证应用程序的顺利进行。
将一专属目录指定为缺省驱动器和目录,有两种方式:
(1) 在程序或命令窗口中使用SET DEFAULT 命令,命令格式为
SET DEFAULT TO [<路径>]
例如:指定C:\mysystem\gzl 为缺省 目录;
SET DEFAULT TO C:\MYSYSTEM\GZL
若执行不带路径的 SET DEFAULT 命令,则恢复系统缺省设置。
(2) 修改系统缺省设置。在缺省系统配置文件 CONFIG.FPW或专属系统配置文件(如:MYCONFIG.FPW)中,假如下面一行:
DEFAULT=C:\MYSYSTEM\GZL
二、常见的程序设计方法
1、 结构化程序设计(模块化)
结构化程序设计是一个面向过程的概念。把一个实际问题分为两部分,即数据和过程。通过动态的程序执行过程来对静态的数据进行处理,得出正确的结果。由VFP命令和程序设计命令的组合,需编制和调试;
2、 面向对象的程序设计
3、结构化程序设计
它是面向过程程序设计的另一种描述,面向过程程序设计有如下特点:
①整个程序分为若干个模块,模块之间相衔接,且相对独立。
②第个模块只有一个入口和一个出口。
③第个模块都能单独执行,且在有限时间内执行完。
④采用自顶向下、逐步求精的方法。
三、程序三大基本结构
1、顺序结构:执行是按命令出现的先后顺序执行。
2、分支结构:按给定的条件成立与否来决定程序起向,分单向选择分支、双向选择分支和多路分支。有以下两种
IF 语句
DO CASE
ENDIF
ENDCASE
3、循环结构:程序的执行发生了自下而上的往复,某一程序段将重复执行。 有以下三种
Do While
For
SCAN
ENDDO
ENDFOR
ENDSCAN
四、算法和流程图
算法:解决某一问题的方法与步骤。见
教材
民兵爆破地雷教材pdf初中剪纸校本课程教材衍纸校本课程教材排球校本教材中国舞蹈家协会第四版四级教材
例。
流程图:算法的描述,除用自然语言描述外,计算机领域常用流程图(ANSI图和N-S图)描述。见教材例。
例如:乐山到成都怎么去?
1、 解一元二次方程的算法。Ax2+bx+c=0, 求x
2、 求出1-100之间的质数。 X / => 2 到 SQRT(X )
2程序的建立和执行
一、程序的扩展名:PRG
实质:文本文件(ASCII编码)执行时,会产生编译文件FXP后让计算机执行。
二、程序文件的建立和编辑
1、命令方式:
MODI COMM 程序名.PRG (.PRG可省)
2、菜单方式;
文件 => 新建 => 程序
3、项目管理器中建立的方法:
建立项目管理器 => 新建程序
4、其他方法:
其它可编辑文本的软件: 记事本\写字板\WORD\其它程序编辑器
注意: 希望编写程序之前事先设置好默认目录(set defa to ……)然后我们编写的程序就会自动存储在那个目录中。
例如:set defa to d:\ks
modi comm Test (相当于是:modi comm D:\ks\test.prg)
三、 程序的执行
1、命令方式
命令格式:DO [盘符][路径]程序名
2、菜单方式:
“程序”菜单->“运行”命令
在“运行”窗口中输入被运行的程序文件名,即可运行程序。
四、VFP程序的分类:数学类程序、涉及到表操作的程序
如果本程序是涉及到表操作的程序,那么:
1、在程序开始部分可以先加语句CLEAR 和 CLOSE ALL
2、程序最后可以使用命令CLOSE ALL
3、然后使用RETURN或CANCEL或QUIT
例:找出并显示所有三好生
CLEAR
CLOSE ALL
USE 学生
LOCATE FOR 三好生
DO WHILE NOT EOF()
DISP
CONTINUE
ENDDO
CLOSE ALL
RETUREN
3顺序程序设计与常用语句
一、程序设计中的常用语句
1、输入命令
(1)赋值命令
命令一:
STORE <表达式> TO <内存变量>
命令二:
<内存变量>= <表达式>
(2)交互式输入命令(注意:输入数据是在程序执行的时候 )
INPUT [提示信息] TO <内存变量>
ACCEPT [提示信息] TO <内存变量>
WAIT [提示信息] [TO <内存变量>] [TIMEOUT <等待时间>
说明: ①提示信息是C型, 它会在屏幕上原样输出 .
②WAIT命令的功能:暂停程序执行,显示提示信息等待用户按键。 Wait命令中 输入的只能是一个字符(C型)。
③ Input 适用于全部类型内存变量,输入时需要加定界符
④ Accept只适用于C型,并且C型不加定界符
注意:Input和accept在编写程序时语句都一样,只是执行程序(do)时,主屏幕上要求输入的类型和格式不同。
例1:输入a、b、c的值,对2ax+b=c 求 x的值。
Clear
Input “现在计算2ax+b=c,请输入a的值:” to a
Input “请输入b的值:” to b
Input “请输入c的值:” to c
x=(c-b)/(2*a)
?’x的值为:’,x &&比较使用? ’x的值为:’+str(x,3)有何区别
return
例2、查找学生.dbf中的指定记录
clear
close all
use 学生
list
accept “请输入您想查找的姓名: ” to xm
Locate for 姓名=XM &&或命令 SEEK XM
if found()
DISP
else
?’对不起,没有找到此人’
endif
list
close all
Return
思考:如果accept换成input,输入的时候该怎么输入?
例3、删除学生.dbf中的指定记录
clear
close all
use 学生
list
input “请输入您想删除的记录号: ” to x
dele reco x
wait “你想彻底删除这条记录吗?(y/n)” to ask
if ask=’Y’ or ask=’y’
pack
endif
list
close all
注意区分交换方式和程序方式:有的命令可以在两种状态下执行(例如:刚才的输入命令),但有些命令只能在程序方式下执行(例如:循环语句和分支语句)
(3)格式输入命令
格式一:
@行,列 say 提示信息
格式二:
@行,列 say 提示信息 get 变量
……
READ
格式三:
@行,列 say 提示信息 get 变量 default常量
功能:在屏幕指定的坐标位置上显示提示信息,然后通过READ命令激活GET子句的变量值。
说明:①GET后的变量可以是内存变量或当前打开的数据文件中的字段变量,若是内存变量,应在执行该命令前对内存变量赋值,否则就必须使用default参数赋初值。
②输入的值类型应该与初值类型相同。
③READ命令与GET命令必须配合使用。多个GET命令可以只用一个READ命令配合。如果没有read则表示只显示内容,不输入值。
例1:编写程序完成在学生.DBF中追加记录
CLEAR
USE 学生
APPEND BLANK
@5,20 SAY “学号” GET 学号
@5,40 SAY “姓名” GET 姓名
@7,20 SAY “性别” GET 性别
@7,40 SAY “出生年月” GET 出生年月
@9,20 SAY “入校总分” GET 入校总分
@9,40 SAY “三好生” GET 三好生
READ
CLEAR
LIST
CLOSE ALL
RETURN
例2:编程求长方形的面积。
CLEAR
X=0 &&X为内存变量,赋初值
Y=0
@1,5 SAY “计算长方形的面积”
@2,5 SAY “输入长方形的长:” GET X &&第2行5列显示提示信息并等待输入
@3,5 SAY “输入长方形的宽:” GET Y &&第3行5列显示提示信息并等待输入
READ &&从键盘输入X,Y的值
S=X*Y &&计算长方形的面积
? “长方形的面积:”,S &&显示长方形的面积
CANCEL
思考题1:如将上述例1程序改为按照指定学号来修改记录应该怎样做?(答案见
课件
超市陈列培训课件免费下载搭石ppt课件免费下载公安保密教育课件下载病媒生物防治课件 可下载高中数学必修四课件打包下载
后)
3、输出命令
⑴:非格式输出命令
?和??
⑵:格式化输出命令
@行,列 say 表达式
说明:行和列都可以是表达式,常常可以使用函数ROW( ) 和 COL( )
ROW( )表示返回当前行的行号 COL( )表示返回当前列的列号
例1:
N=1
CH=“VF程序设计”
@N,26 SAY SPACE(60)
@N+1,26 SAY CH
例2:循环输入值
clear
dime xh(10)
store 0 to xh
@10,10 say '请输入数字:' get xh(1)
i=2
do while i<=10
@row()+1,10 say '请输入数字:' get xh(i)
i=i+1
enddo
read
list memo like xh
4、其他程序运行命令
(1)终止程序执行命令
CANCEL 、QUIT 和 RETURN
QUIT: 退出程序运行并且退出 Visual Foxpro
CANCEL : 退出程序运行
RETURN: 返回上级程序调用点,如果是主程序就表示退出程序。主程序可缺省此命令返回(结束),即默认使用了return
注意:上述命令执行完后都会自动clear memory。但是如果有数据库和表打开不会自动关闭,所以使用数据库和表后在程序结束时我们常常需要加命令: close all
(2)清屏命令
CLEAR
(3)注释命令( NOTE 、* 和 &&)
注释的含义:程序员对程序语句功能的说明,执行程序的时候不执行注释中的内容,注释只起到一个对语句说明的目的。一般复杂程序中应有30%以上的注释。
(4)TEXT语句:原样输出(参考书143例4.15)
(5)系统设置命令
set … on/off 或者是 set … to
1、设置会话状态
SET TALK ON/OFF
2、设置跟踪状态
SET ECHO ON/OFF
3、设置打印状态
SET PRINTER ON/OFF
4、设置定向输出状态
SET DEVICE TO SCREEN
5、设置精确比较状态
SET EXACT TO ON/OFF
6、设置日期格式
SET DATE ANSI
7、色绘制系统提供的保护状态
SET SAFETY ON/OFF
8、设置删除记录标记状态(掌握)
SET DELETED ON/OFF
功能:屏蔽或处理有删除标记的记录
说明:在命令格式中选择ON时,各命令当不对有删除标记的记录进行操作,但索引除外。系统默认值为OFF
思考题1答案:
CLEAR
USE 学生
ACCEPT "请输入需修改记录的学号:" TO NUM
LOCATE FOR 学号=NUM
@5,20 SAY "学号" GET 学号
@5,40 SAY "姓名" GET 姓名
@7,20 SAY "性别" GET 性别
@7,40 SAY "出生年月" GET 出生年月
@9,20 SAY "入校总分" GET 入校总分
@9,40 SAY "三好生" GET 三好生
READ
CLEAR
LIST
CLOSE ALL
RETURN
4顺序结构和分支结构
一、顺序结构
例1:求圆的面积(
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
S=ΠR2)
CLEAR
INPUT “请输入半径R的值:” TO R
S=3.1416*R*R
?”圆面积为:” ,S
CANCEL
二、分支结构(选择结构)
1、IF语句
(1)单向选择:
双向选择:
IF 条件
IF 条件
执行语句 执行语句
ENDIF
ELSE
执行语句
ENDIF
(2)单向选择分支
例如:求任意一个数值的绝对值
CLEAR
SET TALK OFF
INPUT “请输入数值:” TO N
IF N<0
N= - N
ENDIF
?”|N|的绝对值为:”,N
CANCEL
(3)双向选择分支
例1:用户输入数据表文件名,判断它存在否,如果存在则打开数据表文件并显示表中的全部记录
clear
accept '请输入数据库文件名:' to heng &&想想为什么不用input
if file(heng+‘.dbf’) &&了解file()的使用方法
use &heng &&想想这儿为什么要用&代换
list
else
?'sorry,文件不存在:( '
endif
close all &&关闭所有打开的表,如果不涉及多工作区,可以只使用use
例2:判断输入的整数为奇数还是偶数。
CLEAR
INPUT “请输入整数:” TO N
IF N%2=0 &&该表达式还可用 MOD(N,2)=0来表示
?STR(N,4)+”是偶数”
ELSE
?STR(N,4)+”是奇数”
ENDIF
CANCEL
(4) IF语句的嵌套
例如:将用户输入的小写英文字母转化成大写
CLEAR
ACCEPT “请输入1个字母:” TO STR1
IF STR1>=’a’ AND STR1<=’z’
STR1=UPPER(STR1)
?SPACE(40)+STR1
ELSE
IF STR1>=’A’ AND STR1<=’Z’
?SPACE(40)+STR1
ELSE
?’您输入的不是英文字母’
ENDIF
ENDIF
2、多向选择
DO CASE
CASE
<条件表达式1>
<命令序列1>
CASE <条件表达式2>
<命令序列2>
……
OTHERWISE &&其它情况
<命令序列>
ENDCASE
说明:OTHERWISE 可以没有.
例1:比较A、B的大小
CLEAR
INPUT “请输入A的值:” TO A
INPUT “请输入B的值:” TO B
DO CASE
CASE A>B
?”A 大于B”
CASE A50 AND X<=100
Y=10
CASE X>100 AND X<=200
Y=20
CASE X>200 AND X<=500
Y=40
OTHERWISE
Y=50
ENDCASE
?’对不起, 您需要付款: ’,Y,’元人民币’
5循环程序设计
1、条件循环
格式一:DO WHILE 条件
命令序列
ENDDO
格式二: DO WHILE 条件
语句序列
[LOOP]
语句序列
[EXIT]
语句序列
ENDDO
要退出循环,需要条件为假的时候(条件=.F.时)
说明:(1) LOOP和EXIT 命令一般放在IF条件中,也可以出现在循环体内的任何位置。若执行循环体时遇到LOOP命令,则直接返回执行DO命令,测试条件以决定是否继续循环。若遇到EXIT命令,则不执行下面的命令序列,直接跳出循环,执行ENDDO后面的命令。
(2)条件表达式的值确定了循环是否继续,当条件表达式的值始终为真(即永真循环),则应使用EXIT命令来控制循环结束
例1:将字符“欢迎进入乐山师范学院”从屏幕的顶部移至底部
CLEAR
CH=“欢迎进入乐山师范学院”
N=1
DO WHILE N<=23
@N,26 SAY SPACE(60)
@N+1,26 SAY CH
T=INKEY(0.2)
&&等待0.2秒
N=N+1
ENDDO
RETURN
注:INKEY ([<数值表达式>])
功能:等待用户按键或鼠标输入,等待时间由数值表达式确定(单位为秒)返回由按键而产生的一个整数值.
例2:实现显示出全部的男生
CLEAR
CLOSE ALL
USE 学生
DO WHILE NOT EOF()
IF 性别=’男’
DISP
ENDIF
SKIP
ENDDO
CLOSE ALL
LOOP循环实例
例1:
I=0
DO WHILE I<10
I=I+1
IF INT(I/2)=I/2
LOOP
ENDIF
?”*”
ENDDO
例2:
CLOSE ALL
CLEAR
USE 学生
DO WHILE NOT EOF()
DISP
WAIT ‘你想修改本记录吗?(Y/N)’ TO X
IF X=’N’ OR X=‘n’
SKIP
LOOP
ENDIF
EDIT
SKIP
ENDDO
CLOSE ALL
程序执行到WAIT语句后,如果用户输入的是’N’或’n’,那么就LOOP
(也就跳过本次循环,不执行后面的EDIT)
永真循环
DO WHILE .T. DO WHILE .T.
IF Y>0 IF Y>0
EXIT QUIT
ENDIF ENDIF
ENDDO ENDDO
如果Y>0,则退出本循环 如果Y>0,则退出程序,退出VF
DO WHILE .T. DO WHILE .T.
IF Y>0 IF Y>0
RETURN CANCEL
ENDIF ENDIF
ENDDO ENDDO
如果Y>0,则退出程序返回上层 如果Y>0,则退出程序,回到VF中
上述语句LOOP、EXIT、QUIT、RETURN、CANCEL等也可以在后面讲的其它循环语句中使用。
例1:通过键盘输入三角形的边长,若边长正确,立即在屏幕上显示三角形的面积,若边长不正确,重新输入边长,若输入的边长中任意一边为0则程序立即结束。
CLEAR
?”现在计算三角型的面积,如果想退出程序请输入0。”
DO WHILE .T.
INPUT “请输入边长a:” TO A
INPUT “请输入边长b:” TO B
INPUT “请输入边长c:” TO C
IF A=0 OR B=0 OR C=0
?’结束’
RETURN
ENDIF
IF A+B<=C OR A+C<=B OR B+C<=A
?’错误的三角型,请重新输入!’
LOOP
ENDIF
S=(A+B+C)/2
AREA=SQRT(S*(S-A)*(S-B)*(S-C))
?’该三角型的面积是:’,area
ENDDO
例2:有下列表:book(书名 C(20),作者 C(8),出版日期 D,内容简介 M)编写程序:查询关于 foxpro 的图书.
USE BOOK
LOCATE FOR ‘foxpro’ $ 书名
IF ! FOUND()
?’没有关于foxpro的图书’
ELSE
`
DO WHILE ! EOF()
CLEAR
?书名,作者,出版日期
?内容介绍
WAIT “是否继续查找?(Y/N)” TO M
IF M$’nN’
EXIT
ENDIF
CONTINUE
ENDDO
?”全部显示完成”
ENDIF
2、计数循环
FOR 循环变量=初值 TO 终值 [STEP 步长]
语句序列
ENDFOR
说明: (1)当省略步长值时,系统默认步长值为1.当初值小于终止值时,步长值为正值,当初值大于终值时,步长值为负值.步长值不能为0,否则会造成死循环.
(2)可在循环体内嵌入[LOOP]和[EXIT]命令,功能和用法与条件循环中该命令的用法相同.
例1:求1~100的和
SUM=0
FOR n=1 TO 100
SUM=SUM+n
ENDFOR
?’1~100的总和为:’,SUM
使用DO WHILE 实现:
SUM=0
n=1
DO WHILE n<=100
SUM=SUM+n
n=n+1
ENDDO
?’1~100的总和为:’,SUM
FOR和IF语句嵌套
例2:求1到N之间能被3整除的数的和
CLEAR
M=0
INPUT “请输入N的值:” TO N
FOR X=1 TO N
IF MOD(X,3)=0
M=M+X
ENDIF
ENFOR
?”M的值为:”,M
RETURN
例3: 找出2-100之间所有的质数
算法研究:
FOR I=1 TO 100
如果此数是质数
显示这个数
ENDFOR
判断一个数是不是质数,应该看它是否能被其它数整除.
当一个数I , 从I从2到 SQRT(X) 都没有数能被整除,那么它就是
FOR J=2 TO INT(SQRT(I))
IF I MOD J=0
EXIT
ENDIF
ENDFOR
IF J> INT(SQRT(I))
?I,’是质数’
ENDIF
特别: 2是个质数.
综上所叙述:
完成程序为:
CLEAR
?’2是质数’
FOR I=3 TO 10
FOR J=2 TO INT(SQRT(I))
IF MOD(I,J)=0
EXIT
ENDIF
ENDFOR
IF J> INT(SQRT(I))
?I,’是质数’
ENDIF
ENDFOR
3、库文件扫描循环
SCAN 范围 FOR/WHILE 条件
语句序列
ENDSCAN
例1:查询所有入校总分在570以上的人.
CLEAR
CLOSE ALL
USE 学生
SCAN FOR 入校总分>570
DISP
ENDSCAN
CLOSE ALL
例2:用户可以循环输入并查找入校总分,直到输入的是负数就退出.
CLEAR
CLOSE ALL
USE 学生
INPUT “请输入你要查找的入校总分,输入负数则退出: ” TO X
DO WHILE X>=0
SCAN FOR 入校总分=X
DISP
ENDSCAN
INPUT “请输入你要查找的入校总分: ” TO X
ENDDO
例3:编写程序,对于学生.dbf能够在程序末尾循环插入新记录 (掌握)
CLEAR
CLOSE ALL
USE 学生
DO WHILE .T.
APPE BLANK
@5,20 SAY '学号' GET 学号
@5,40 SAY '姓名' GET 姓名
@7,20 SAY '性别' GET 性别
@7,30 SAY '出生年月' GET 出生年月
@9,20 SAY '入校总分' GET 入校总分
READ
WAIT '你想继续插入新记录吗?(Y/N) : ' TO X
IF X='N' OR X='n'
EXIT
ENDIF
CLEAR
ENDDO
CLEAR
LIST
CLOSE ALL
例4:编写程序,该程序能够顺序修改表学生.DBF中的所有数据。(掌握)
(要求:必须使用 @行,列 say ... get .. 进行数据修改)
CLEAR
CLOSE ALL
USE 学生
DO WHILE .T.
if eof()
exit
endif
@5,20 SAY '学号' GET 学号
@5,40 SAY '姓名' GET 姓名
@7,20 SAY '性别' GET 性别
@7,30 SAY '出生年月' GET 出生年月
@9,20 SAY '入校总分' GET 入校总分
READ
WAIT '你想继续修改记录吗?(Y/N) : ' TO X
IF X='N' OR X='n'
EXIT
ENDIF
CLEAR
SKIP
ENDDO
CLEAR
LIST
CLOSE ALL
4、多重循环
例1:输入n的值,求1+1/2!+1/3!+1/4!+….+1/n! ( 阶乘 n!=1*2*3*4....*(n-1)*n )
CLEAR
SUM=0
MUL=1
INPUT "请输入n的值: " TO N
FOR i=1 TO N
FOR j=1 TO i
MUL=MUL*J
ENDFOR
SUM= SUM+1/MUL
ENDFOR
?'求得的总和为: ',SUM
例2:打印九九表
方法一:CLEAR
FOR A=1 T0 9
FOR B=1 TO A
T=A*B
??STR(B,1)+“*”+STR(A,1)+“=”+STR(T,2)+“ ”
ENDFOR
? ” “
ENDFOR
RETURN
方法二:CLEAR
@1,1 say "*"
for a=1 to 9
@a+1,1say str(a,1)
next
for b=1 to 9
@1,b*3 say str(b,1)
for c=1 to b
p=c*b
@b+1,c*3 say str(p,2)
next
next
cancel
例3:图形打印
CLEAR
for a=1 to 5
for c=1 to a
??“*"
next
?
next
Cancel
说明:打印图形时,一般外循环控制打印行数,内循环控制每一行打印图形个数。
6数组的应用
一、 数组的定义
DIMENTION 数组名(数值表达式1,[数组表达式2...])
定义后单元默认值为.F.
二、一维数组
1、定义一个一维数组:
dime a(10) ---定义一个10数组,且所有单元默认值为.F.
2、赋值:
例如:
a=''
a(1)=20
a(3)={^2002/09/23}
a(7)=.T.
....
循环赋值:
dime a(10)
i=1
do while i<=10
input '请输入数:' to a(i)
i=i+1
enddo
或者是:
for i=1 to 10
input '请输入数:' to a(i)
Endfor
3、显示值:
for i=1 to 10
?a(i)
endfor
使用do while大家思考
方法2:list memo like a
二、二维数组
例如:dime s(5,4)
1、赋值:
例如: s=0
s(3,4)=.t.
s(12)=‘AYA' && 相当于S(3,4)=‘AYA'
2、循环赋值
for i=1 to 5
for j=1 to 4
input '输入值:' to a(i,j)
endfor
endfor
3、显示值:
for i=1 to 5
for j=1 to 4
??a(i,j)+space(2)
endfor
endfor
三、举例
输入10 个数,将它们按照从大到小的顺序排列
算法研究:
方法1:连续的两两比较
方法2:将每个数和最后一个数比较
程序
clear
dime a(10)
?'输入10个数: '
for i=1 to 10
input "请输入: " to a(i)
endfor
for i=1 to 9
for j=1 to i
if a(j)>a(i+1)
t=a(i+1)
a(i+1)=a(j)
a(j)=t
endif
endfor
endfor
list memo like a
例2:将1、2、3、…10顺序输入一维数组,实现顺序输出和逆序输出。
DIME A(10)
FOR I=1 TO 10
A(I)=I
ENDFOR
FOR I=1 TO 10
?A(I)
ENDFOR
FOR J=10 TO 1 STEP –1
?A(J)
ENDFOR
例3:排序问题 (要求:不一定能编写,但是重点地方能填空,基本方法要能理解)
输入5 个数,将它们按照从大到小的顺序排列
算法: (软件技术支持 第263页)
稳定的算法:
插入法排序(将一个数据插入到已经排列好的序列中)
冒泡排序(比较每次产生最大数)
归并排序(两两合并 [ ] [ ] [ ] [ ] )
不稳定的算法:(相同数据位置可能交换)
选择排序(通过交换位置,最小的放在第一,次小的第二……)
实现算法:
冒泡排序
(1) n个数要比较n-1趟
(2)
(3) 每趟要比较的次数为 : n-趟数
(3)每次比较:
如果当前数 a(j)大于后一个数 a(j+1) 那么就交换,否则不交换
clear dime a(5)
?'输入5个数: '
for i=1 to 5
input "请输入: " to a(i)
endfor
for i=1 to 4
&& 外循环是行(趟数), 内循环是列(比较次数)
for j=1 to 5-I
if a(j)>a(j+1)
t=a(j+1)
a(j+1)=a(j)
a(j)=t
endif
endfor
endfor
FOR I=1 TO 5
?A(I)
ENDFOR
对N个数排序(从小到大)
clear
input "请问你想对多少个数进行排序? " to n
dime a(n)
?'请输入',n,'个数: '
for i=1 to n
input "请输入: " to a(i)
endfor
for i=1 to n-1
for j=1 to n-i
if a(j)>a(j+1)
t=a(j+1)
a(j+1)=a(j)
a(j)=t
endif
endfor
endfor
算法二:每次比较将当前数和最后一个数据比
clear
input “请问你想对多少个数进行排序? ” to n
dime a(n)
?'请输入',n,'个数: '
for i=1 to n
input "请输入: " to a(i)
endfor
for i