VFP八章程序设计.docx
- 文档编号:17881141
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:31
- 大小:41.79KB
VFP八章程序设计.docx
《VFP八章程序设计.docx》由会员分享,可在线阅读,更多相关《VFP八章程序设计.docx(31页珍藏版)》请在冰点文库上搜索。
VFP八章程序设计
第八章程序设计基础
要点:
程序设计基本逻辑结构:
顺序、条件与循环,主程序与子程序、内存变量作用域。
VFP支持:
面向过程、面向对象的程序设计
1.程序文件的建立与运行(面向过程)
1)程序文件的建立
命令:
:
MODICOMM<文件名>
菜单:
文件/新建/程序/新建文件
项目:
代码/程序
说明:
(1)用于命令文件的建立与编辑,文件的扩展名系统默认.PRG。
(2)文件编辑时输完一行,回车。
“ESC”放弃。
“^W”存盘。
(3)插入新命令行,^N或回车。
2)程序文件的执行
命令窗口:
DO<程序文件名>
注意:
程序正常结束,才会出现命令窗口。
2.程序中的交互式语句
——程序执行语句时停下来,等待用户输入后在继续运行。
1)输入字符串语句
命令:
ACCEPT[<字符串表达式>]TO<内存变量>
说明:
(1)[<字符串表达式>]为屏幕提示信息。
(2)键盘输入的字符串给内存变量赋值,回车结束。
(3)键盘输入的字符不用定界符。
例:
modicommchaxun.prg
usestud
accept“请输入查询同学的姓名:
”toxm
locafor姓名=xm
disp
use
dochaxun结果:
请输入查询同学的姓名:
李红
2)输入表达式
命令:
INPUT[“提示信息”]TO[内存变量]
说明:
(1)键盘赋值给内存变量,数值型直接用,字符型用定界符,逻辑型用“..”。
(2)回车结束复制,程序继续运行。
例:
input“请输入半径:
”toR
s=3.14*R*R
?
”园面积为:
”,S
3)WAIT语句
命令:
WAIT[“提示信息”][TO<内存变量>]
说明:
(1)只能输入单字符给变量赋值,不须回车。
(2)全部可选项缺省,击任意键继续。
例:
前面程序,继续查询。
usestud
accept“请输入查询同学的姓名:
”toxm
locafor姓名=xm
disp
wait“是否继续查询(Y/N)?
”toy1
ifuppe(y1)=”N”
quit
endif(注:
学完循环后再运行)
3.程序的三种基本结构
--结构化程序设计语言所具有的三种结构:
顺序执行、选择(条件与分支)、循环。
1)顺序结构
——按语句的从上到下的前后顺序,逐条执行。
例:
给退休职工增加基本工资20元。
Clear
Usegz
Replall基本工资with基本工资+20foryear(DATE())-year(出生日期)>=60
List
语句:
Replall数学with数学+10for数学<60
Replall数学with数学+5for数学>=60
错在程序的顺序执行结构。
2)选择结构(判断分支)
——满足条件执行,不满足条件执行另外的语句。
(1)简单的选择语句
语句格式:
IF<条件表达式>
<语句序列>
ENDIF
说明:
(1)条件为真(T),执行语句序列。
(2)条件为假(F),执行ENDIF后面的语句。
(3)IF….ENDIF需成对出现。
例:
输入一同学姓名,是女同学数学加10分。
Usestud
Accept“输入加分同学姓名:
”toxm
Locafor姓名=xm
If性别=“女”
Repl数学with数学+10
Endif
(2)分支选择语句
语句格式:
IF<条件表达式>
<语句序列1>
ELSE
<语句序列2>
ENDIF
说明:
(1)条件为真(T),执行语句序列1。
(2)条件为假(F),执行语句序列2。
例:
上题,男同学加10分,女同学加20分。
Settalkoff
Usestud
Accept“输入加分同学姓名:
”toxm
Locafor姓名=xm
If性别=“女”
Repl数学with数学+20
else
Repl数学with数学+10
Endif
(3)IF选择语句的嵌套(多重判断)
——两个以上的条件才执行。
格式1:
格式2:
IF<条件1>IF<条件1>
<语句序列1>IF<条件2>
ELSE<语句序列21>
IF<条件2>ELSE
<语句序列2><语句序列22>
ELSEENDIF
<语句序列3>ELSE
ENDIFIF<条件3>
ENDIF<语句序列3>
ENDIF
ENDIF
说明:
(1)允许多层嵌套。
(2)嵌套时不允许交叉。
例:
键盘输入x,当x>=0或x<=1时,y=1。
当x>1或x<0时,y=0。
Settalkoff
Input“输入X的值:
”tox
Ifx>=0
Ifx<=1
y=1
else
y=0
endif
else
y=0
endif
?
”y=”,y
例:
存款利率:
年限NX<1年,利率LL=2%
年限NX>=1年或NX<3年,利率LL=3%
年限NX>=3年或NX<5年,利率LL=4%
年限NX>=5年,利率LL=5%
settalkoff
input“请输入存款年限:
”tonx
ifnx<1
ll=0.02
else
ifnx<3
ll=0.03
else
ifnx<5
ll=0.04
else
ll=0.05
endif
endif
endif
?
”存款利率是:
”,ll
(4)多分支结构(情况语句)
格式:
DOCASE
CASE<条件表达式1>
<语句序列1>
CASE<条件表达式2>
<语句序列2>
……………..
[OTHERWISE
<语句序列N>]
ENDCASE
说明:
(1)DOCASE与ENDCASE需成对出现。
(2)满足CASE条件,执行下面语句后,跳出ENDCASE.
(3)顺序判断,都不满足条件,执行OTHERWISE后的语句。
例:
对利率重新编程。
settalkoff
input“请输入存款年限:
”tonx
docase
casenx<1
ll=0.02
casenx<3
ll=0.03
casenx<5
ll=0.04
otherwise
ll=0.05
endcase
?
”存款利率是:
”,ll
注:
由于顺序判断,不必写:
casenx>=1.and.nx<3
注意:
DOCASE与DOCASE,与IF…ENDIF都可以嵌套。
3)循环结构
——程序中需反复执行的部分。
(每条记录的显示或打印,累加求和:
1+2+….100等)
基本格式:
DOWIILE<条件表达式>
<循环体>
ENDDO
说明:
(1)条件表达式为真,执行循环体语句。
为假,执行ENDDO后的语句
(2)DOWHILE…ENDDO成对出现。
(3)先判断条件,再执行循环。
(当型)
循环有以下几种基本的控制形式:
(1)文件记录的操作控制
格式:
DOWIILE.NOT.EOF()
<循环语句序列>
SKIP
ENDDO
说明:
(1)指针在记录中,EOF()为假,.NOT.EOF()为真,要操作。
在记录尾后,.NOT.EOF()为假,结束循环操作。
(2)操作一次,SKIP使指针指向下一条记录,无SKIP,死循环。
例:
数学及格加5分,不及格加10分。
Settalkoff
Usestud
Dowhile.not.eof()
If数学<60
Repl数学with数学+10
Else
Repl数学with数学+5
Endif
Skip
Enddo
List
思考题:
60分以下加20,60—80加10,90以上加5分。
(2)有限次循环的控制
设循环次数为N
格式1:
格式2:
K=0K=N
DOWHILEK<=NDOWHILEK>0
<语句序列><语句序列>
K=K+1K=K—1
ENDDOENDDO
例1:
求12+22+32…..+502
settalkoff
s=0
k=0
dowhilek<=50
s=s+k*k
k=k+1
enddo
?
s
(3)无限次循环控制
——用于人为控制循环次数和主菜单对子菜单的调用。
格式:
DOWIILE.T.
<循环语句序列>
[LOOP]
ENDDO
说明:
(1)该循环条件始终为真(.T.死循环)。
(2)必需在循环中嵌套IF语句使用EXIT,终止循环,执行ENDDO后面的语句。
(3)程序遇短路语句“LOOP”,不执行“LOOP”至ENDDO之间的语句,回到循环开头。
例:
查询次数的人为控制。
Settalkoff
Usestud
Dowhile.t.
Acce“请输入查询同学姓名:
”toxm
Locafor姓名=xm
Iffound()
Disp
Else
?
”未找到该同学!
”
endif
wait“是否继续查询(Y/N)?
”toyn
ifuppe(yn)=”Y”
loop
else
exit
endif
enddo
(5)多重循环
——循环可以和循环嵌套,循环也可以和IF、DOCASE嵌套。
例1:
九九表。
Settalkoff
A=1
DowhileA<=9
B=1
DowhileB<=9
?
A,”*”,B,”=”,A*B
B=B+1
Enddo
?
A=A+1
Enddo
例2:
计算100以内的素数之和(素数—是除了1和它本身之外不能被任何整数所整除的数,验证M是否素数,从2到M-1都除不尽。
)
settalkoffi=3s=2dowhilei<=50j=2dowhilej is=i+sendifi=i+1enddo? s (5)有限次循环用FOR引导: 格式: FOR<内存变量>=<初值>TO<终值>[STEP<步长>] <语句> ENDFOR 例: 1+2+3…..100 modicomm.X3.prg S=0 ForI=1to100step1 S=s+0 Endfor ? s 思考题: 上机编程序: 1)求1+2+3…..100. 2)求50! 之和。 3)用循环依次打开STUD1、STUD2…..STUD8文件,显示。 4)用1、2、3、4、5、6、7、8、9依次给数组xy(3,3)赋值(循环方式)。 5)用INPUT命令给数组x(5)赋值(数值型),求最大的变量元素及数值。 例: 程序设计应用举例(等级考试类型) 1、求数学最高分同学的姓名、数学。 Settalkoff Usestud Max=0 Dowhile.not.eof() If数学>max Max=数学 Xm=姓名 Endif Skip Enddo ? ”姓名: ”,xm,”数学成绩: ”,max 2、求哪个系人数最多的系名,人数。 (适应任意多个系,不能用COUNT) (modicommcstu1.prg) settalkoff usestud1(含系名,一人一条记录) indexon系别tostud11(排序了) max=0 dowhile.not.eof() xib=系别 n=0 dowhile系别=xib n=n+1 skip enddo ifn>max max=n maxxi=xib enddo ? ”人数最多的系是: ”,maxxi,max 4.格式输入/输出命令 命令: @<行号,列号>SAY<表达式>GET<变量>[PICTURE<格式符>][FUNCTION<功能符>][RANGE<表达式1>,<表达式2>][VALID<条件>] ….. READ 说明: (1)行号,列号不超过(0~24,0~79) (2)SAY<表达式>输出常量或赋值的变量 (3)GET<变量>可输入(赋值给)内存变量与字段变量。 内存变量须先赋值,字段变量须追加空白记录。 (4)RAED语句激活输入,无READ,只能输出。 (5)RANGE子句设置变量的最大与最小值(域) (6)VALID子句检验输入数据的有效性,若无效,光标不下移。 (7)格式符与功能符对输入和输出的数据格式进行控制。 常用的格式符: 9—字符型数据允许数字,数字型数据允许数字、正负号。 #—只允许数字、空格、正负号。 X—允许任何字符。 ! —小写字母转换成大写字母。 *—数据前的位用“*”代替。 $—数据前的位用“$”代替、。 例1: 格式输入一条又一条的记录。 Settalkoff Usestud Dowhile.t. clear Appeblank @5,10say“学号: ”get学号 @5,40say“姓名: ”get姓名 @6,10say“性别”get性别 @6,40say“出生日期: ”get出生日期 @7,10say“数学”get数学 @7,40say“语文”get语文 read ch=””&&(或yn=space (1)) @10,4say“继续输入新记录吗(Y/N)”getch read ifuppe(ch)=”N” exit endif enddo 例2: PICTURE使用。 X=17.652 @3,10sayxpicture‘9999.9’&&输出: 17.6 Pa=123.456 @4,10saypapicture‘***,***.**’&&输出: ****123.45 例3: RANGE使用。 @7,10say“月份: ”get月份range1,12&&(月份: 1—12) @7,10say“给X赋值”getXrange10,&&(X>10) @7,10say“给X赋值”getXrange,100&&(X<100) 注: “,“不可省略。 例4: VALID使用(上题)。 ch=”” @10,4say“继续输入吗(Y/N)”getchpict”! ”validch$”YN” read ifch#”Y”&&不用UPPE() exit endif ……. 5.程序中的辅助命令 1)注释命令(不执行语句) 格式1: NOTE/*(放在命令前) 格式2: &&(放在命令后) 2)中止程序运行命令 (1)命令: QUIT/CANCEL/RETURN (2)警告对话框: 取消/挂起/忽略 6.多模块程序设计 --大的应用要分成若干个小程序(模块化)。 1)主程序与子程序 子程序—被调用的程序段(程序文件.PRG)。 主程序—调用子程序的程序。 格式1: DO<子程序名>[WITH<参数>] 说明: (1)该命令放在主程序中。 可传递参数。 格式2: RETURN[MASTER] 说明: (1)该命令放在子程序中,RETURN返回上一层主程序,执行DO后面的语句。 (2)[MASTER]返回最高层主程序(子程序调用的多层嵌套)。 如图: 主程序ex.prg子程序ex1.prg子程序ex11.prg ………….….. doex1doex11..….. ……………… …… ……returnreturnmaster 例: 在同一目录建立两个程序: 主程序: ZU.PRG usegz dowhile.not.eof() dozi skip enddo 子程序: zi.prg if基本工资>=200.and.基本工资<300 repl基本工资with基本工资+20 else if基本工资<200 repl基本工资with基本工资+30 endif endif return&&必需return 2)过程文件与过程 问题: 主程序多次调用多个子程序,增加磁盘开销。 方案: 多个子程序放入过程文件(.prg)中,一次调入内存。 格式1: PROCEDURE<过程名> … RETURN 说明: 放在过程文件中。 格式2: SETPROCEDURETO<过程文件名> 说明: (1)放在主程序中,打开过程文件。 (2)主程序和过程文件是两个独立的文件. (3)SETPROCEDURETO关闭过程文件。 **与菜单一起举例。 7.菜单技术 ——是调用子程序的主程序。 简单菜单的格式: ? 、SAY设计 例1: 过程文件调用菜单(? 设计)。 主程序: main.prg settalkoff usestud setproctoguo dowhile.t. clear ? ”******学生信息管理系统*********” ? ”1—录入” ? ”2—查询” ? ”4—退出” ? ”*******************************” input“请选择数字”toxy docase casexy=1 dolu casexy=2 doca casexy=3 exit endcase enddo 过程文件: guo.prg proclu appe return procca acce“输入学生姓名: ”toxm locafor姓名=xm disp return 思考题: 用@…SAY命令把菜单放在屏幕中间。 上机内容: (1)把以上过程改成格式录入、输出、修改,并可反复录入查询,完善其功能。 (2)把每个过程变成独立的子程序文件(相同目录)来调用。 7.子程序调用时的内存变量、参数、自定义函数 1)内存变量的作用域 ——讨论主程序对子程序调用时内存变量的作用范围。 1)一般性质 1上一级程序生成的变量,调用的下级程序可用,反之下级生成的,上级不可用。 2返回上级程序时,保留下级程序重赋的变量值。 例1: modicommmain.prg settalkoff a1=11 a2=22 dispmemo&& (1)a1=11,a2=22 doz1 dispmemo&&(3)a1=11,a2=44 modicommz1.prg a2=44 a3=33 dispmemo&& (2)a1=11,a2=44,a3=33 retu 2)局域性内存变量 格式: PRIVATE〈内存变量名表〉 1在主程序定义,在子程序中宣布(PRIV)的变量在子程序中屏蔽(隔离),返回主程序(释放)恢复。 注: 未宣布的变量不屏蔽。 3)全局性内存变量 格式: PUBLIC〈内存变量名表〉 ①在任一程序定义的全局变量,其他程序可用。 ②保留程序重赋的值。 例2: modicommmain.prg settalkoff a1=11 a2=22 dispmemo&& (1)a1=11,a2=22 doz1 dispmemo&&(3)a1=11,a2=22,a4=55 modicommz1.prg priva2 publica4 a2=44 a3=33 a4=55 dispmemo&& (2)a1=11,a2=44,a3=33,a4=55 retu 注: a1、a2的区别。 3)子程序调用时的参数传递 主程序格式: DO<子程序>WITH<参数表1> 子程序格式: PARAMETERS<参数表2> 说明: (1)参数表1与参数表2的参数个数与类型应相同。 (2)参数表1是常量或已赋值的变量,参数表2是变量。 (3)按参数表顺序传递,与变量名无关。 (4)参数传递是双向的,子程序结束后反传回主程序。 例1: 求园面积 *主程序: EX.prg setproctoEX&&EX.prg同时是主程序和过程文件 s=0 doareawith2,S ? ”面积是”,S closeproc settalkon procarea paraM,N N=M*M*3.14259 return 4)自定义函数 ——用户以子程序的格式定义函数,结果以普通函数的格式在主程序中引用。 函数格式: FUNCTION ……………… RETURN<表达式> 说明: 1)函数变量可有参数的传递。 2)RETURN返回表达式 例: 求三次方的用户自定义函数。 *主程序一个: ZT.prg x=3 storetri(x)toa ? a functiontri paran returnn*n*n 习题 一、选择题 1.读程序 I=1 T=1 S=0 DOWHILEI<=5 T=T*I S=S+T I=I+2 ENDDO ? I,S (1)程序中循环的次数为()。 A.2B.3C.4D.5 (2)最后? I,S的值是()。 A.618B.719C.820D.15 2.读程序 A=4 B=2 C=1 DOWHILEC>0 A=A*B B=B+A IFA>50 A=A-5*c C=C-1 ? A,B ELSE B=B-5*C N=B ENDIF ENDDO ? ”N=”,N RETU (1)第一条? 命令显示的内容是()。 A.15951640B.401600 C.15951600D.16001640 (2)第二条? 命令显示的内容是()。 A.N=40B.N=8C.N=1600D.N=1640 3.读程序 CLEAR USESTUD N=1 XH=”99001” DOWHILEN<=120 APPEBLAN REPL学号WITHSTR(VAL(XH)+N,5) N=N+1 ENDDO USE (1)程序中的STUD.DBF表中,“学号”字段的类型是()。 A.C型B.N型C.L型D.D型 (2)该程序的功能是()。 A.替换第一条记录的学号B.增加新字段 C.追加多条新记录,并填上学号的值D.替换表中原记录的学号值 (3)循环结束后,N的值是()。 A.0B.1C.121D.120 (4)表中追加的学号是()。 A.”99001”、”99002”、…….”99120” B.”99002”、”99003”、…….”99121” C.全是”99001”D.全是”99002” 二、填空题 1.下面是计算100以内偶数偶数之和的程序,N是偶数个数,S是偶数之和。 CLEAA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP 章程 设计