VFP程序设计基础Word下载.docx
《VFP程序设计基础Word下载.docx》由会员分享,可在线阅读,更多相关《VFP程序设计基础Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
(包括自然变量)
LOCAL
作用域(可见性)
从定义处起有效
从定义处起及下级子程序
只在定义块中可见
传递方向
双向(向上、向下)
单向(由主到子程序)
不传递
生存期
整个应用系统
(VFP环境中)
从定义处起及下级子程序中
随定义块执行结束而释放
特殊作用
用于参数传递或结果传递
屏蔽上级程序中的同名变量
说明
子程序中定义的全局变量,返回主程序时可见
子程序中定义的自然变量,返回主程序时不可见
只在本块中可见,上下级中均不可见
2)利用DO<
WITH<
参数表达式列表>
传递参数
传递参数命令格式:
DO<
接收参数命令格式:
PARAMETER<
变量列表>
参数传递与接收的规则:
(1)接收参数的命令必须出现在被调用程序(子程序)中的第一行;
(2)当WITH<
中是简单内存变量列表时,称为传址或引用。
这时,主调程序中的内存变量被隐含起来,其值随PARAMETER中对应变量的值的变化而变化;
(3)当WITH<
中是内存变量表达式列表或当个内存变量用圆括号括起来(即为明表达式)时,称为传值。
这时,主调程序中的内存变量不被隐含,其值也不随PARAMETER中对应变量的值的变化而变化;
(4)对过程而言,传址或传值不受SETUDFPARAMSTOVALUE/CONFERENCE的影响。
因为它是针对自定义函数的。
8、自定义函数
1)定义
自定义函数可以是一个独立的命令文件(.PRG),也可以放在一个过程文件中。
2)建立
FUNCTION<
自定义函数名>
[PARAMETER<
形式参数列表>
[语句序列]
ENDFUNC
与过程不同的是必须用RETURN<
返回一个值。
3)自定义函数的调用与参数传递
调用形式:
自定义函数名([〈参数表达式列表〉])
参数传送:
既可以用传值方式,也可以用引用方式。
具体规则如下:
(1)如果变量在〈参数表达式列表〉中是以表达式的形式出现,那么是传值方式;
(2)如果变量在〈参数表达式列表〉中是以单变量的形式出现,那么取决于
SETUDFPARAMSTOVALUE/CONFERENCE的设置(缺省为传值方式);
(3)无论SETUDFPARAMSTO可以在单变量前冠以@,以强制传址。
如:
S(@A,B,C)
二、要点与难点
1、INPUT、ACCEPT与WAIT这三个与输入有关的命令有何不同?
INPUT命令可接受数值型、字符型、日期型等数据类型的输入,在输入时应根据数据类型加相应的定界符。
ACCEPT命令只能接受字符串的输入,在输入时不必加定界符。
WAIT命令只能接受单字符的输入,常用于表示程序是否继续、是否中断或是否结束的语句。
2、RETURN、RETRY、CANCEL和QUIT这四个命令有何不同?
RETURN命令:
指的是返回到调用行的下一行。
RETRY命令:
返回到调用行本身,可实现程序的重复调用。
CANCEL命令:
中断、异常结束。
并返回到系统命令窗口。
QUIT命令:
返回到操作系统。
3、SCATTER[FIELDS<
字段名列表>
]TO<
数组名>
4、GATHERFROM<
5、常见的环境设置语句:
SETDEFAULTTO<
文件路径>
:
将<
设置为系统缺省的路径。
SETCONSOLEON/OFF:
激活或废止从程序中向VFP主窗口或活动的用户自定义窗口的输出。
SETDELETEON/OFF:
决定是否忽略表中已做过删除标记的记录。
SETEXACTON/OFF:
决定字符串比较运算符“=”两边内容是否必须完全匹配,缺省是不必完全匹配。
SETTALKOFF/ON:
关闭或打开系统交互对话显示方式。
缺省为打开显示。
SETFILTERTO<
条件>
指定访问当前表中记录时必须满足的条件。
6、FORI=XTOYSCAN
语句系列与语句系列有何不同?
ENDFORENDSCAN
前者主要处理普通内存变量循环有关的程序;
后者主要处理表中满足条件的记录循环有关的程序。
7、内存变量的属性有那几种?
它们间有何不同?
参见上表。
8、利用DO<
传递参数与自定义函数中的参数传送有何不同。
前者传递参数是在主程序与子程序之间进行调用和传递,可分为传值和引用两种方式:
引用:
WITH后的<
是内存变量列表时,每个内存变量的值传给PARAMETERS中对应变量,调用程序中的变量被隐藏。
当被调用的程序中形参的值发生改变时,调用程序中的变量也跟着发生相应的变化。
传值:
是内存变量表达式或用括号将单个变量括起来时,每个内存变量表达式的值传给PARAMETERS中对应变量,调用程序中的变量不被隐藏。
当被调用的程序中形参的值发生改变时,调用程序中的变量不会跟着发生相应的变化。
后者是在函数内部实行变量间的参数传送,也有传值和引用两种方式。
它调用方式为:
自定义函数名([<
])
若<
中以表达式出现,则是以传值方式传送;
中以内存变量的形式出现,则缺省采用传值方式,若要采用引用方式,需在参数变量前加@。
9、程序设计中常用的函数有:
(1)数值函数
INT(X/Y)、MOD(X,Y)、X%Y、X-INT(X/Y)*Y
(2)字符串函数
SUBSTR(S,N1,N2)、LEN(S)
(3)日期与时间函数:
DATE()、DTOC(D)、YEAR(D)、MONTH(D)、DAY(D)、DOW(D)、CDOW(D)。
(4)转换函数
UPPER(C)、LOWER(C)、CTOD(S)、DTOC(D)、ASC(C)、CHR(N)、STR(N,N1,N2)、VAL(S)
(5)数据库函数:
FCOUNT()字段个数函数、FIELD()字段名函数、BOF()、EOF()、DELETED()、RECCOUNT()、RECSIZE()、RECNO()、
(6)IIF(条件表达式,满足条件时所取的值、不满足条件时所取的值)
(7)测试函数:
FOUND()测试是否找到相应的记录。
10、程序设计的常用算法:
总原则:
变量必须采用“先定义后使用”的原则,程序语句必须有输入和输出语句;
函数采用有“先入口后出口”的原则。
条件或循环语句必须配套使用,即IF…ENDIF、FOR…ENDFOR。
1、累加:
通常采用下列步骤
(1)S=<
初值>
(2)<
循环开始>
此时需定义一个循环变量,一般采用I或J,同时大多采用FOR……ENDFOR语句来完成。
(3)S=S+A
(4)<
循环结束>
(5)<
输出累加合计值>
2、累乘:
(1)T=<
(2)<
(3)T=T*A
(4)<
(5)<
输出累乘积值>
3、字符串的粘合:
(1)S=””或S=SPACE(0)
(3)S=S+A或S=A+S
前者采用字符串的顺序粘合,后者采用字符串的倒序粘合。
输出字符串S>
4、自定义函数:
(1)PARAMETER<
形参数列表>
(2)程序语句
(3)RETURN<
参数>
<
省略表示不带参数返回。
三、程序阅读题。
阅读下列程序,写出运行结果。
1、SETTALKOFF
M=3
DOWHILEM<
10
N=2
DOWHILEN<
M
IFINT(M/N)=M/N
EXIT
ENDIF
N=N+1
ENDDO
IFN=M
?
ENDIF
M=M+1
ENDDO
SETTALKON
2、设N、P的输入值分别为6,3。
注:
字符”A”的ASCII码为65。
SETTALKOFF
CLEAR
INPUT"
N="
TON
P="
TOP
FORI=1TON
?
SPACE(NI+1)
IFI<
=P
FORJ=1TO2*I1
?
?
CHR(ASC("
A"
)+J1)
ENDFOR
ELSE
FORJ=1TO(2*I1)(IP)
ENDFOR
3、注:
C="
一二三四五六七八九十"
B="
ABCD"
R=0
L=LEN(B)
FORI=1TOL
W=SUBSTR(B,I,1)
D=ASC(W)+R-65
S="
"
IFD<
S=SUBSTR(C,2*D+1,2)
ELSE
S=SUBSTR(C,2*MOD(D,10)+1,2)
ENDIF
W+"
----->
+S
R=R+11
4、设M的值分别为:
12345,205354,105075,123450
S=0
DOWHILE.T.
CLEAR
INPUT"
M="
TOM
N=M
DOWHILE.T.
R=N-INT(N/10)*10
IFR=0
S=S+1
N=INT(N/10)
IFN=0
IFS>
1
EXIT
S
5、SETTALKOFF
A="
ABCDEFGHIJKLMNOPQRSTUVWXYZ"
B=LEN(A)
X="
X-"
Y="
Y-"
I=1
DOWHILEI<
=B
J=I
X=X+SUBSTR(A,I,1)
IFI/2=INT(I/2)
Y=Y+SUBSTR(A,I,1)
I=I+1
LOOP
I=I+J
X
Y
6、设M的值为:
=M
IFZS(I)
IFI*2<
STR(I*2,5)
ELSE
I=I+1
+STR(S,3)
****ZS.PRG****
PARAX
J=2
DOWHILEJ<
IFINT(X/J)=X/J
EXIT
ENDIF
J=J+1
ENDDO
IFJ=X
RETURN.T.
RETURN.F.
7、设N,M的值分别为6,8。
X=MAX(N,M)
FORI=XTOM*N
IFMOD(I,M)=0ANDMOD(I,N)=0
Y1=I
Y1="
+ALLTRIM(STR(Y1,19))+"
Y2="
+ALLTRIM(STR(M*N/Y1,19))
8、N值为4,字符”A”的ASCII码为65。
FORJ=1TO2*I1
ENDFOR
FORP=N-1TO1STEP1
SPACE(N-P+1)
FORK=1TO2*P1
)+K1)
9、设A的值为:
ABCDEF
ACCEPT"
TOA
L=LEN(A)
P=SPACE(0)
L
P=P+SUBSTR(A,LI,2)
I=I+2
A+"
------>
+P
四、程序填空:
四、程序填空
说明:
阅读下列程序说明和程序,将程序代码缺少的内容填入中。
1、已知某系统的口令PASSWORD(存在内存变量文件PASS.MEM中)含多个非空格字符,判断口令是否正确只需比较其长度及第3个到第6个字符是否完全相等,允许操作者录入三次(口令录入时要求关屏),如果口令正确正常返回,否则给出提示信息。
RESTORE
(1)
L=
(2)
TIME=1
DOWHILETIME<
=3
MPASS=SPACE(L)
ACCEPT“请输入口令:
”
(3)
ACCEPTTOMPASS
SETCONSOLEON
IF(4)
TIME=TIME+1
IF(5)
”口令错误!
你无权使用本系统!
”欢迎进入本系统!
2、完成下列删除表文件的程序:
ACCEPT”请输入要删除的表文件名(扩展名略):
”TOFILENAME
FILENAME=TRIM(LTRIM(FILENAME))+”.DBF”
(1)
ACCEPT“该文件不存在!
继续吗?
(Y/N)”TOYN
IF
(2)=”N”
(3)
LIST
WAIT“是这个文件吗?
IFLOWER(YN)=”y”
USE
(4)
WAIT”继续吗?
IFLOWER(Y/N)=”n”
USE
EXIT
ENDIF
(5)
3、给定程序的功能是:
根据输入的数据,判断给定的数是否偶数,可以循环输入。
YN="
Y"
DOWHILEUPPER(YN)="
(1)"
请输入自然数:
IF
(2)
"
不是偶数!
是偶数!
WAIT“是否还要输入其他自然数”TOYN
再见!
RETURN
4、给定程序的功能是:
根据输入的数据,计算不大于该数的奇数累加和。
请输入两位以内的正整数:
STORE0TOX,Y
Z="
0"
DOWHILE
(1)
X=X+1
IF
(2)
LOOP
Z=Z+"
+"
+STR(X,2)
Y=Y+X
Z="
+STR(Y,4)
WAIT"
继续计算?
(Y/N)"
TO(3)
5、求表达式(M!
+N!
)/(MN)!
的值(注:
M>
N,计算结果输出宽度10位,小数2位)。
*****MN.PRG*****
SET
(1)
INPUT“M=”TOM
INPUT“N=”TON
STORE0TOSM,SN
DOJC2WITHM,SM&
计算M!
DOJC2WITHN,SN&
计算N!
DOMC2WITH
(2)
“表达式结果为S=”+(3)
SETPROCTO
PROCJC2
PARAX,Y
T=1
=X
T=T*I
(4)
PROCMC2
(5)
T=T*Y
X=T
6、下面程序可以形成一个主对角线上元素为1,其它元素为0的6*6方阵。
SETTLAKOFF
(1)
FORI=1TO6
FORJ=1TO6
A(I,J)=0
(3)
7、下列程序完成一个自定义函数,其功能为:
对任意一个正数值型数据(该数可有小数若干位,整数部分不超过12位)自动进行小数部分四舍五入取2位,并将其转换为中文大写金额,如10230.4567转换后为壹万零千贰佰叁拾零元肆角陆分。
*****ZH.PRG*****
Y=
(2)
Y=Y100
(3)
DOWHILEY>
P=MOD(Y,10)
D=S1(P)+S2(I)+D
Y=(4)
RETURND
PROCS1
PARAA
C1=”零壹贰叁肆伍陆柒捌玖”
RETURNSUBSTR(C1,2A+1,2)
PROCS2
PARAB
C2=”分角元拾佰仟亿拾佰仟”
RETURN(6)
8、给定程序的功能是:
在表STD.DBF中,按姓名查询记录。
USESTD
DOWHILEANS
ACCEPT"
请输入姓名:
TOXM
(2)
IF.NOT.FOUND()
查无此人!
CLEAR
学号:
学号
姓名:
姓名
数学成绩:
数学
英语成绩:
英语
政治成绩:
政治
总分:
总分
是否继续查询(Y/N)"
TOJX
IF(3)
ANS=.F.
USE
9、下面程序完成输出下列图形:
1
222
33333
4444444
555555555
33333
1
N=5
P=2*N1
FORI=1TOP
IF
(1)
SPAC(NI+1)
FORJ=1TO
(2)
STR(I,1)
ENDFOR
FORK=1TO2*(2*NI)1
STR(4)
10、下面程序完成从键盘输入20个数,去掉20个数中的最大值和最小值,然后求平均值。
N=1
DOWHILEN<
=20
INPUT"
TOB
S=
(2)
IFMAX<
B
MAX=B
IFMIN>
N=N+1
AVERAGE="
+(4)