计算机二级VF第六章 程序设计基础.docx
《计算机二级VF第六章 程序设计基础.docx》由会员分享,可在线阅读,更多相关《计算机二级VF第六章 程序设计基础.docx(18页珍藏版)》请在冰豆网上搜索。
计算机二级VF第六章程序设计基础
第六章程序设计基础
第一节程序和程序文件
一、程序的概念
VFP的程序指将若干条VFP的命令语句,保存在一个扩展名为PRG的文本文件中,当用户在命令窗口或其它方式下执行这一文件时,就相当于一次执行的多条VFP命令语句。
这些命令语句在程序中称为程序代码,一行程序代码又称为语句行。
(1)命令注释
在程序中以“*”或“NOTE”开头的语句行,将不会被系统执行,被当作文字说明来对待。
(2)SETTALKON|OFF命令
打开/关闭命令执行时的“回显”状态,默认为ON
(3)SETSAFEON|OFF命令
打开/关闭系统的安全提示,默认为ON
(4)RETURN
结束当前程序的执行,返回程序调用处。
当程序文件中再无语句行时,系统会默认有一个RETURN
二、程序文件的建立和执行
1.建立和修改
(1)菜单法/工具栏法
建立:
新建程序新建文件
修改:
打开程序选取要修改的程序文件确定
(2)命令
格式1:
MODIFYCOMMAND<程序文件名>
格式2:
MODIFYFILE<程序文件名.PRG>
2.执行程序文件
格式:
DO<程序文件名>
例:
编写程序SX1.PRG,完成如下操作
在屏幕中显示[今天是:
XXXX年XX月XX日,星期X]
1.在命令窗口输入创建程序文件SX1.PRG的命令
MODICOMMSX1
2.在程序编辑界面输入如下代码:
SETTALKOFF
CLEAR
*以上为程序运行的环境设置
RQ=DTOC(DATE(),1)
YY=LEFT(RQ,4)
MM=SUBSTR(RQ,5,2)
DD=RIGHT(RQ,2)
XQ="日一二三四五六"
XQ=SUBS(XQ,DOW(DATE())*2-1,2)
*以上是得到年月日星期的字符数据
?
"今天是:
"+YY+"年"+MM+"月"+DD+"日,星期"+XQ
*以上为程序主体部分
SETTALKON
RETURN
3.保存文件并关闭程序编辑界面(Ctrl+W)
4.在命令窗口输入运行程序的命令:
DOSX1
例:
编写程序SX2.PRG完成如下操作:
打开表DJKS,显示所有性别为男且成绩合格的记录,将结果保存在表文件NAN.DBF中,关闭所有表文件
*SX2.PRG
SETTALKOFF
CLOSEDATAALL&&程序中有表文件打开
SETSAFEOFF
CLEAR
*以上是环境设置
USEDJKS
DISPFOR性别="男"ANDMIN(笔试,上机)>=60
COPYTONANFOR性别="男"ANDMIN(笔试,上机)>=60
*以上是程序主体
SETTALKON
CLOSDATAALL
SETSAFEON
RETURN
例:
上机模拟题第五十套第三题
*PROGZH.PRG
SETTALKOFF
CLOSEDATAALL
SELECOUNT(DISTDHDW)FROMGNHTINTOARRAYDH
SELECOUNT(DISTGHDW)FROMGNHTINTOARRAYGH
SELESUM(JHSL)FROMGNHTINTOARRAYJH
UPDAJIEGUOSETNUM=DHWHERENAME="订货单位数"
UPDAJIEGUOSETNUM=GHWHERENAME="供货单位数"
UPDAJIEGUOSETNUM=JHWHERENAME="订货总数"
CLOSDATAALL
SETTALKON
RETURN
例:
上机模拟题第九套第三题
要点:
SETTALKOFF
SETSAFEOFF
CLOSEDATAALL
UPDATESCORE1SET总成绩=考试成绩+IIF(三好生,20,IIF(优秀干部,10,IIF(少数民族,5,0)))
SELE学号,总成绩FROMSCORE1ORDERBY2,1INTOTABLEZCJ
CLOSEDATAALL
SETTALKON
SETSAFEON
RETURN
例:
上机模拟题第一套第三题
要点:
SETTALKOFF
SETSAFEOFF
UPDASCORESET学分=IIF(物理>=60,2,0)+IIF(高数>=60,3,0)+IIF(英语>=60,4,0)
SELE学号,学分FROMSCOREORDERBY2,1DESCINTOTABLEXF
CLOSEDATAALL
SETSAFEON
SETTALKON
RETURN
三、简单的输入命令
1.INPUT命令
格式:
INPUT[字符表达式]TO<内存变量>
功能:
当系统执行到本命令时,会等待用户从键盘输入数据,用户可以输入任意合法的表达式。
当用户以回车结束输入时,系统将表达式的值存入指定的内存变量。
2.ACCEPT命令
格式:
ACCEPT[字符表达式]TO<内存变量>
功能:
与INPUT基本相同,但会将用户输入的一切内容都当作字符型常量保存在指定的内存变量中。
3.WAIT命令
格式:
WAIT[字符表达式][TO<内存变量>][WINDOW[AT<行>,<列>]][TIMEOUT]
功能:
与ACCEPT命令相似,保存字符型数据的输入,但只能接受一位字符的输入。
说明:
(1)如果<字符表达式>为空串,则不显示任何提示。
如果此项省略则显示系统的默认提示“按任意键继续…”
(2)<内存变量>如果省略,则本命令相当于暂停命令
(3)WINDOW选项如果存在,则提示信息会显示在指定窗口
(4)TIMEOUT可以指定系统的等待时间
例:
编写程序SX3.PRG,要求由用户输入圆半径,计算机返回该圆的面积
*SX3.PRG
SETTALKOFF
CLEAR
INPUT[请输入圆半径:
]TOR
?
PI()*R^2
SETTALKON
RETURN
例:
编写程序SX4.PRG,由用户输入表名称,计算机查询该表的全部信息
*SX4.PRG
SETTALKOFF
CLEAR
ACCEPT[请输入要查询的表名称:
]TOBM
SELE*FROM&BM
SETTLAKON
CLOSDATAALL
RETURN
例:
编写程序SX5.PRG,由用户输入考生姓名,计算机在DJKS.DBF表中查询考生的信息进行显示
*SX5.PRG
SETTALKOFF
CLEAR
ACCEPT'请输入考生的姓名:
'TOXM
SELE*FROMDJKSWHERE姓名=XM
CLOSDATAALL
SETTALKON
RETURN
例:
编写程序SX6.PRG,由用户输入结论信息,计算机在DJKS.DBF表中查询符合的信息进行显示,并将结果保存在以结论命名的表中(如:
优秀.DBF)
*SX6.PRG
SETTALKOFF
CLEAR
ACCEPT'请输入结论:
'TOJL
SELE*FROMDJKSWHERE结论=JL
SELE*FROMDJKSWHERE结论=JLINTOTABLE&JL
CLOSDATAALL
SETTALKON
RETURN
第二节程序的基本结构
在标准化程序设计中,程序一般分为三种基本结构:
顺序结构、选择结构和循环结构。
一、顺序结构的程序设计
顺序结构是最简单的程序结构,它按命令在程序文件中的先后次序依次执行。
二、分支选择结构程序设计
1.IF…ELSE…ENDIF分支
格式:
IF<条件>
<语句序列1>
[ELSE
<语句序列2>]
ENDIF
功能:
当条件成立时,计算机将执行<语句序列1>,当条件不成立,将判断是否有ELSE选项存在,如存在,则执行<语句序列2>,反之,什么都不执行。
例:
编写程序FZ1.PRG,由用户输入考生姓名,计算机返回该考生的相关信息
*FZ1.PRG
SETTALKOFF
CLOSDATAALL
CLEAR
USEDJKS
ACCEPT"请输入要查询的考生姓名:
"TOXM
LOCAFOR姓名=XM
IFFOUND()
DISPFOR姓名=XM
ELSE
?
"查无此人!
"
ENDIF
USE
SETTALKON
RETURN
2.DOCASE…ENDCASE分支
格式:
DOCASE
CASE<条件1>
<语句序列1>
CASE<条件2>
<语句序列2>
…
CASE<条件n>
<语句序列n>
[OTHERWISE
<语句序列>]
ENDCASE
功能:
当系统执行到DOCASE语句时,会顺序对各个CASE后的条件做出判断,并执行第一个满足条件的CASE后的语句序列。
如果所有的CASE后条件均不满足,则判断是否有OTHERWISE选项存在,如存在,则执行OTHERWISE后的语句序列,反之,什么都不执行。
例:
编写程序FZ2.PRG,根据用户输入的存款年限返回存款的利率.1年以内为0.03,3年以内0.05,5年以内0.07,5年以上0.09
*FZ2.PRG
SETTALKOFF
CLEAR
INPUT"请输入存款年限:
"TONX
DOCASE
CASENX<1ORINT(NX)<>NX
?
"输入有误,只能输入不小于1的整数!
"
CASENX=1
?
"0.03"
CASENX<=3
?
"0.05"
CASENX<=5
?
"0.07"
OTHER
?
"0.09"
ENDCASE
SETTALKON
RETURN
例:
编写程序FZ3.PRG,根据用户输入的身高(CM),体重(KG)来判断体形
*FZ3.PRG
ACCEPT"请输入姓名:
"TOXM
ACCEPT"请输入性别:
"TOXB
INPUT"请输入身高(CM):
"TOSG
INPUT"请输入体重(KG):
"TOTZ
CH=IIF(XB="男","先生","女士")
DOCASE
CASESG-115>TZ
TX="有些偏瘦!
"
ZG="加强营养!
"
CASESG-105TX="有些偏胖!
"
ZG="加强锻炼!
"
OTHER
TX="完全正常!
"
ZG="继续保持!
"
ENDCASE
?
XM+CH+"您的体形"+TX+"请"+ZG
SETTALKON
RETURN
三、循环结构程序设计
1.DOWHILE…ENDDO循环
格式:
DOWHILE<条件>
<语句序列>
[LOOP]
[EXIT]
[RETURN]
ENDDO
功能:
当条件成立时,系统会执行DOWHILE与ENDDO之间的循环体;当遇到ENDDO语句,系统会回到DOWHILE处对条件再次进行判断,直到条件不成立,系统才会执行ENDDO后的语句。
说明:
LOOP:
回到本层循环开始处,重新判断条件
EXIT:
跳出本层循环
例:
编写程序XH1.PRG,计算从1累加至100的结果
*XH1.PRG
SETTALKOFF
CLEAR
S=1
N=100
DOWHILEN<=100
S=S+N
N=N+1
ENDDO
?
S
SETTALKON
RETURN
例:
编写程序XH2.PRG,逐条显示DJKS表中的所有记录
*XH2.PRG
CLOSDATAALL
USEDJKS
DOWHILE!
EOF()
CLEAR
DISP
WAITTIME3
SKIP
ENDDO
CLOSDATAALL
例:
编写程序XH3.PRG,逐条显示DJKS表中所有成绩合格的考生信息
*XH3.PRG
CLOSDATAALL
USEDJKS
LOCAFORMIN(笔试,上机)>=60
DOWHILFOUND()
CLEAR
DISP
WAITTIME3
CONTINUE
ENDDO
CLOSDATAALL
例:
上机模拟题第五十六套第三题
要点:
*PROG1.PRG
SETTALKOFF
SETSAFEOFF
CLOSEDATAALL
USETABLE3
ZAP
USECHENGJI
INDEXON学号TAGSY
SELE0
USEXUESHENG
SETRELATIONTO学号INTOCHENGJI
GOTOP
DOWHILE!
EOF()
IFA.数学<60
INSERTINTOTABLE3VALUES(B.学号,B.姓名,"数学",A.数学)
ENDIF
IFA.英语<60
INSERTINTOTABLE3VALUES(B.学号,B.姓名,"英语",A.英语)
ENDIF
IFA.信息技术<60
INSERTINTOTABLE3VALUES(B.学号,B.姓名,"信息技术",A.信息技术)
ENDIF
SKIP
ENDDO
SELE*FROMTABLE3ORDERBY分数,学号DESCINTOTABLELSH
SELETABLE3
ZAP
APPEFROMLSH
CLOSEDATAALL
SETTALKON
SETSAFEON
RETURN
*注意:
表文件TABLE3.DBF要事先建立
2.FOR…ENDFOR循环
格式:
FOR<循环变量>=<初值>TO<终值>[STEP<步长>]
<循环体>
ENDFOR|NEXT
功能:
用于指定次数的循环。
执行该语句时,首先将初值赋给循环变量,然后判断循环条件是否成立(若步长为正值,循环条件为<循环变量><=<终值>;若步长为负值,循环条件为<循环变量>>=<终值>)。
若循环条件成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件是否成立。
说明:
<步长>的默认值为1。
例:
编写程序XH4.PRG,显示100到999之间的"水仙花数"
水仙花数是指各位数的立方和等于这个数本身
*XH4.PRG
SETTALKOFF
CLEAR
FORN=100TO999
A=INT(N/100)
B=INT(N/10)%10
C=N%10
*A,B,C分别为N的百位数字,十位数字和个位数字
IFA^3+B^3+C^3=N
?
?
N
ENDIF
ENDFOR
3.SCAN…ENDSCAN循环
格式:
SCAN[范围][条件]
<循环体>
ENDSCAN
功能:
用于处理表中的记录。
执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。
例:
编写程序XH5.PRG,逐条显示DJKS中所有性别为男且成绩合格的考生信息
*XH5.PRG
SETTALKOFF
CLEAR
CLOSDATAALL
USEDJKS
SCANFOR性别="男"ANDMIN(笔试,上机)>=60
CLEAR
DISP
WAITTIME3
ENDSCAN
CLOSEDATAALL
SETTALKON
RETURN
例:
上机模拟题第三套第三题
要点:
SETTALKOFF
SETSAFEOFF
CLOSEDATAALL
USESCORE_FS
SCAN
XK=0
IF物理#-1
REPL平均分WITH平均分+物理
XK=XK+1
ENDIF
IF高数#-1
REPL平均分WITH平均分+高数
XK=XK+1
ENDIF
IF英语#-1
REPL平均分WITH平均分+英语
XK=XK+1
ENDIF
REPL平均分WITH平均分/XK
ENDSCAN
SELE学号,平均分FROMSCORE_FSORDERBY平均分DESC,学号INTOTABLEPJF
CLOSEDATAALL
SETTALKON
SETSAFEON
RETURN
第三节多模块程序
一、过程的定义和调用
1.定义过程:
格式:
PROCEDURE|FUNCTION<过程名>
<语句序列>
[RETURN[表达式]]
ENDPROC|ENDFUNC
2.调用模块:
1)打开过程文件
格式:
SETPROCEDURETO[<过程文件名列表>[ADDITIVE]]
2)使用过程
格式1:
DO<程序文件名>|<过程名>
2:
<程序文件名>|<过程名>(…)
例:
编写程序LX1.PRG
*LX1.PRG
SETTALKOFF
CLOSDATAALL
DOWHIL.T.
CLEAR
INPUT[请选择:
1.姓名查询2.结论查询3.考场查询4.退出]TOXZ
DOCASE
CASEXZ=1
DOSUB1
CASEXZ=2
DOSUB2
CASEXZ=3
DOSUB3
OTHER
CLEAR
WAIT"谢谢使用,再见!
"TIME3
CLEAR
SETTALKON
RETURN
ENDCASE
ENDDO
*以上为主模块,以下为各子模块过程
PROCSUB1
ACCEPT[请输入姓名:
]TOXM
SELE*FROMDJKSWHERE姓名=XM
ENDPROC
PROCSUB2
ACCEPT[请输入结论:
]TOJL
SELE*FROMDJKSWHERE结论=JL
ENDPROC
PROCSUB3
ACCEPT[请输入考场:
]TOKC
SELE*FROMDJKSWHERE考场=KC
ENDPROC
二、参数传递
1.接受参数的命令
格式:
PARAMETERS形参变量名列表(私有)
LPARAMETERS形参变量名列表(局部)
2.传递参数的命令
格式1:
DO<程序文件名>|<过程名>WITH实参变量名列表
格式2:
<程序文件名>|<过程名>(实参变量名列表)
注意:
1.实参可以是常量、变量,也可以是一般形式的表达式。
调用模块程序时,系统会自动把实参传递给对应的形参(因此,形参个数必需不少于实参,多出的形参取初值.F.)
2.如果实参是变量,则本次传递为按引用传递,此时,实参与形参其实是同一个变量,如果形参的值发生变化,则实参也同时改变
3.如果实参是表达式,则为按值传递。
例:
编写程序LX2.PRG,通过参数传递计算最大公约数
*LX2.PRG
SETTALKOFF
CLEAR
INPUT"请输入第1个自然数:
"TON1
INPUT"请输入第2个自然数:
"TON2
DOSUBWITHMAX(N1,N2),MIN(N1,N2)
SETTALKON
RETURN
PROCSUB
PARAA,B
FORN=BTO1STEP–1
IFA%N=0ANDB%N=0
?
"最大公约数为:
"+ALLT(STR(N))
EXIT
ENDIF
ENDFOR
ENDPROC
例:
编写自定义函数"CDATE(D)"
*CDATE.PRG
PARARQ
IFVARTYPE(RQ)<>"D"&&D必须是大写
RQ=DATE()
ENDIF
XRQ=DTOC(RQ,1)
YY=LEFT(XRQ,4)
MM=SUBS(XRQ,5,2)
DD=RIGHT(XRQ,2)
XQ="日一二三四五六"
XQ=SUBS(XQ,DOW(RQ)*2-1,2)
FHZ=YY+"年"+MM+"月"+DD+"日,星期"+XQ
RETURNFHZ
注:
保存完毕后,在命令窗口输入
?
CDATE(),CDATE({^2008-8-8})
三、变量的作用域
1.公共变量(在任何模块中都可以使用的变量,要先建立后使用)
格式:
PUBLIC<内存变量名列表>
2.私有变量(在程序中直接使用,不用事先定义,可用于本模块以及其下属的各层模块,建立该变量的模块执行结束后,变量会自动清除)
3.局部变量(只能在建立它的模块中使用,要先建立后使用)
格式:
LOCAL<内存变量名列表>
4.屏蔽上层模块中可能出现的变量
格式:
PRIVATE<内存变量名列表>
PRIVATE[LIKE<通配符>]|[EXCEPT<通配符>]