VFP程序设计基础.docx

上传人:b****4 文档编号:11934401 上传时间:2023-04-16 格式:DOCX 页数:24 大小:22.69KB
下载 相关 举报
VFP程序设计基础.docx_第1页
第1页 / 共24页
VFP程序设计基础.docx_第2页
第2页 / 共24页
VFP程序设计基础.docx_第3页
第3页 / 共24页
VFP程序设计基础.docx_第4页
第4页 / 共24页
VFP程序设计基础.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

VFP程序设计基础.docx

《VFP程序设计基础.docx》由会员分享,可在线阅读,更多相关《VFP程序设计基础.docx(24页珍藏版)》请在冰豆网上搜索。

VFP程序设计基础.docx

VFP程序设计基础

第三章程序设计基础

一、知识点:

1、VFP命令的两种执行方式:

交互方式和程序方式。

2、程序与程序文件

1)程序:

完成某项指定的任务而须执行的命令序列。

2)程序文件:

以文件的形式存储在磁盘上的命令序列。

3、结构化程序设计的三种基本结构.

1)顺序结构:

简单的输入语句(如INPUT、ACCEPT、WAIT)。

赋值语句(=、STORE、REPLACE、SCATER、GATHER)。

简单的输出语句(?

、?

)。

辅助语句(CLEAR、SUSPEND、CONTINUE、CANCEL、NOTE|*、&&)。

环境设置语句(如:

、SETTALKON/OFF等)

2)选择结构(IF~ENDIF、IF~ELSE~ENDIF、DOCASE~ENDCASE)

3)循环结构(DOWHILE~[loop]~[exit]~ENDDO、SCAN~ENDSCAN、FOR~ENDFOR)

4、多种结构嵌套的原则:

只能包含,不能交叉。

5、子程序:

相对与主程序而言的一个独立的程序文件,其建立方法与建立程序文件的法相同。

子程序的调用与返回:

调用:

DO<文件名>[WITH<参数列表>]

返回:

RETURN[TOMASTER][<表达式>]

6、过程与过程文件

1)过程:

以PROCEDURE<过程名>开头,以ENDPROC结尾的子程序段。

2)过程文件:

由若干个过程或自定义函数组成,以文件形式保存在外存的.prg文件;使用时要打开该文件,然后选择其中的过程或函数调用,不用时要关闭。

3)过程文件的打开:

SETPROCEDURETO<过程文件名>

4)过程文件的关闭:

SETPROCEDURETO或CLOSEPROCEDURE

7、参数的传递及作用域

1)利用内存变量的属性传递参数

内存变量的属性小结

类型

特点

PUBLIC

PRIVATE

(包括自然变量)

LOCAL

作用域(可见性)

从定义处起有效

从定义处起及下级子程序

只在定义块中可见

传递方向

双向(向上、向下)

单向(由主到子程序)

不传递

生存期

整个应用系统

(VFP环境中)

从定义处起及下级子程序中

随定义块执行结束而释放

特殊作用

用于参数传递或结果传递

屏蔽上级程序中的同名变量

屏蔽上级程序中的同名变量

说明

子程序中定义的全局变量,返回主程序时可见

子程序中定义的自然变量,返回主程序时不可见

只在本块中可见,上下级中均不可见

2)利用DO<文件名>WITH<参数表达式列表>传递参数

传递参数命令格式:

DO<文件名>WITH<参数表达式列表>

接收参数命令格式:

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<参数表达式列表>传递参数与自定义函数中的参数传送有何不同。

前者传递参数是在主程序与子程序之间进行调用和传递,可分为传值和引用两种方式:

引用:

WITH后的<参数表达式列表>是内存变量列表时,每个内存变量的值传给PARAMETERS中对应变量,调用程序中的变量被隐藏。

当被调用的程序中形参的值发生改变时,调用程序中的变量也跟着发生相应的变化。

传值:

WITH后的<参数表达式列表>是内存变量表达式或用括号将单个变量括起来时,每个内存变量表达式的值传给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)<循环开始>:

此时需定义一个循环变量,一般采用I或J,同时大多采用FOR……ENDFOR语句来完成。

(3)T=T*A

(4)<循环结束>

(5)<输出累乘积值>

3、字符串的粘合:

通常采用下列步骤

(1)S=””或S=SPACE(0)

(2)<循环开始>:

此时需定义一个循环变量,一般采用I或J,同时大多采用FOR……ENDFOR语句来完成。

(3)S=S+A或S=A+S

前者采用字符串的顺序粘合,后者采用字符串的倒序粘合。

(4)<循环结束>

(5)<输出字符串S>

4、自定义函数:

通常采用下列步骤

(1)PARAMETER<形参数列表>

(2)程序语句

(3)RETURN<参数>:

<参数>省略表示不带参数返回。

三、程序阅读题。

阅读下列程序,写出运行结果。

1、SETTALKOFF

M=3

DOWHILEM<10

N=2

DOWHILEN

IFINT(M/N)=M/N

EXIT

ENDIF

N=N+1

ENDDO

IFN=M

?

M

ENDIF

M=M+1

ENDDO

SETTALKON

2、设N、P的输入值分别为6,3。

注:

字符”A”的ASCII码为65。

SETTALKOFF

CLEAR

INPUT"N="TON

INPUT"P="TOP

FORI=1TON

?

SPACE(NI+1)

IFI<=P

FORJ=1TO2*I1

?

?

CHR(ASC("A")+J1)

ENDFOR

ELSE

FORJ=1TO(2*I1)(IP)

?

?

CHR(ASC("A")+J1)

ENDFOR

ENDIF

ENDFOR

SETTALKON

3、注:

字符”A”的ASCII码为65。

SETTALKOFF

CLEAR

C="一二三四五六七八九十"

B="ABCD"

R=0

L=LEN(B)

FORI=1TOL

W=SUBSTR(B,I,1)

D=ASC(W)+R-65

S=""

IFD<10

S=SUBSTR(C,2*D+1,2)

ELSE

S=SUBSTR(C,2*MOD(D,10)+1,2)

ENDIF

?

W+"----->"+S

R=R+11

ENDFOR

SETTALKON

4、设M的值分别为:

12345,205354,105075,123450

SETTALKOFF

S=0

DOWHILE.T.

CLEAR

INPUT"M="TOM

N=M

DOWHILE.T.

R=N-INT(N/10)*10

IFR=0

S=S+1

ENDIF

N=INT(N/10)

IFN=0

EXIT

ENDIF

ENDDO

IFS>1

EXIT

ENDIF

ENDDO

?

S

SETTALKON

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

ENDIF

I=I+J

ENDDO

?

X

?

Y

6、设M的值为:

10

SETTALKON

CLEAR

INPUT"M="TOM

I=1

S=0

?

DOWHILEI<=M

IFZS(I)

IFI*2<=M

?

?

STR(I*2,5)

S=S+1

ELSE

EXIT

ENDIF

ENDIF

I=I+1

ENDDO

?

"S="+STR(S,3)

SETTALKON

****ZS.PRG****

PARAX

J=2

DOWHILEJ

IFINT(X/J)=X/J

EXIT

ENDIF

J=J+1

ENDDO

IFJ=X

RETURN.T.

ELSE

RETURN.F.

ENDIF

7、设N,M的值分别为6,8。

SETTALKOFF

CLEAR

INPUT"N="TON

INPUT"M="TOM

X=MAX(N,M)

FORI=XTOM*N

IFMOD(I,M)=0ANDMOD(I,N)=0

Y1=I

EXIT

ENDIF

ENDFOR

?

"Y1="+ALLTRIM(STR(Y1,19))+",Y2="+ALLTRIM(STR(M*N/Y1,19))

SETTALKON

8、N值为4,字符”A”的ASCII码为65。

SETTALKOFF

CLEAR

INPUT"N="TON

FORI=1TON

?

SPACE(NI+1)

FORJ=1TO2*I1

?

?

CHR(ASC("A")+J1)

ENDFOR

ENDFOR

FORP=N-1TO1STEP1

?

SPACE(N-P+1)

FORK=1TO2*P1

?

?

CHR(ASC("A")+K1)

ENDFOR

ENDFOR

SETTALKON

9、设A的值为:

ABCDEF

SETTALKOFF

CLEAR

ACCEPT"A="TOA

L=LEN(A)

P=SPACE(0)

I=1

DOWHILEI

P=P+SUBSTR(A,LI,2)

I=I+2

ENDDO

?

A+"------>"+P

SETTALKON

四、程序填空:

四、程序填空

说明:

阅读下列程序说明和程序,将程序代码缺少的内容填入中。

1、已知某系统的口令PASSWORD(存在内存变量文件PASS.MEM中)含多个非空格字符,判断口令是否正确只需比较其长度及第3个到第6个字符是否完全相等,允许操作者录入三次(口令录入时要求关屏),如果口令正确正常返回,否则给出提示信息。

SETTALKOFF

CLEAR

RESTORE

(1)

L=

(2)

TIME=1

DOWHILETIME<=3

MPASS=SPACE(L)

ACCEPT“请输入口令:

(3)

ACCEPTTOMPASS

SETCONSOLEON

IF(4)

EXIT

ENDIF

TIME=TIME+1

ENDDO

IF(5)

?

”口令错误!

你无权使用本系统!

ELSE

?

”欢迎进入本系统!

ENDIF

SETTALKON

2、完成下列删除表文件的程序:

SETTALKOFF

CLEAR

DOWHILE.T.

ACCEPT”请输入要删除的表文件名(扩展名略):

”TOFILENAME

FILENAME=TRIM(LTRIM(FILENAME))+”.DBF”

(1)

ACCEPT“该文件不存在!

继续吗?

(Y/N)”TOYN

IF

(2)=”N”

EXIT

ENDIF

ELSE

(3)

LIST

WAIT“是这个文件吗?

(Y/N)”TOYN

IFLOWER(YN)=”y”

USE

(4)

EXIT

ELSE

WAIT”继续吗?

(Y/N)”TOYN

IFLOWER(Y/N)=”n”

USE

EXIT

ENDIF

ENDIF

(5)

ENDDO

SETTALKON

3、给定程序的功能是:

根据输入的数据,判断给定的数是否偶数,可以循环输入。

SETTALKOFF

CLEAR

YN="Y"

DOWHILEUPPER(YN)="Y"

(1)"请输入自然数:

"TON

IF

(2)

?

"不是偶数!

"

ELSE

?

"是偶数!

"

ENDIF

WAIT“是否还要输入其他自然数”TOYN

ENDDO

?

"再见!

"

SETTALKON

RETURN

4、给定程序的功能是:

根据输入的数据,计算不大于该数的奇数累加和。

SETTALKOFF

CLEAR

YN="Y"

DOWHILEUPPER(YN)="Y"

INPUT"请输入两位以内的正整数:

"TON

STORE0TOX,Y

Z="0"

DOWHILE

(1)

X=X+1

IF

(2)

LOOP

ELSE

Z=Z+"+"+STR(X,2)

Y=Y+X

ENDIF

ENDDO

?

"&Z="+STR(Y,4)

WAIT"继续计算?

(Y/N)"TO(3)

ENDDO

?

"再见!

"

SETTALKON

5、求表达式(M!

+N!

)/(MN)!

的值(注:

M>N,计算结果输出宽度10位,小数2位)。

*****MN.PRG*****

SETTALKOFF

CLEAR

SET

(1)

INPUT“M=”TOM

INPUT“N=”TON

STORE0TOSM,SN

DOJC2WITHM,SM&&计算M!

DOJC2WITHN,SN&&计算N!

DOMC2WITH

(2)

?

“表达式结果为S=”+(3)

SETPROCTO

SETTALKON

PROCJC2

PARAX,Y

I=1

T=1

DOWHILEI<=X

T=T*I

I=I+1

ENDDO

(4)

RETURN

PROCMC2

(5)

I=1

T=1

DOWHILEI<=X

T=T*Y

I=I+1

ENDDO

X=T

RETURN

6、下面程序可以形成一个主对角线上元素为1,其它元素为0的6*6方阵。

SETTLAKOFF

CLEAR

(1)

FORI=1TO6

FORJ=1TO6

IF

(2)

A(I,J)=0

ELSE

(3)

ENDIF

ENDFOR

ENDFOR

SETTALKON

7、下列程序完成一个自定义函数,其功能为:

对任意一个正数值型数据(该数可有小数若干位,整数部分不超过12位)自动进行小数部分四舍五入取2位,并将其转换为中文大写金额,如10230.4567转换后为壹万零千贰佰叁拾零元肆角陆分。

*****ZH.PRG*****

PARAX

SET

(1)

SETTALKOFF

Y=

(2)

Y=Y100

(3)

I=1

DOWHILEY>0

P=MOD(Y,10)

D=S1(P)+S2(I)+D

I=I+1

Y=(4)

ENDDO

(5)

RETURND

PROCS1

PARAA

C1=”零壹贰叁肆伍陆柒捌玖”

RETURNSUBSTR(C1,2A+1,2)

PROCS2

PARAB

C2=”分角元拾佰仟亿拾佰仟”

RETURN(6)

8、给定程序的功能是:

在表STD.DBF中,按姓名查询记录。

SETTALKOFF

USESTD

CLEAR

(1)

DOWHILEANS

CLEAR

ACCEPT"请输入姓名:

"TOXM

(2)

IF.NOT.FOUND()

?

"查无此人!

"

ELSE

CLEAR

?

"学号:

",学号

?

"姓名:

",姓名

?

"数学成绩:

",数学

?

"英语成绩:

",英语

?

"政治成绩:

",政治

?

"总分:

",总分

ENDIF

WAIT"是否继续查询(Y/N)"TOJX

IF(3)

ANS=.F.

ENDIF

ENDDO

USE

SETTALKON

9、下面程序完成输出下列图形:

1

222

33333

4444444

555555555

4444444

33333

222

1

SETTALKOFF

CLEAR

N=5

P=2*N1

FORI=1TOP

IF

(1)

?

SPAC(NI+1)

FORJ=1TO

(2)

?

?

STR(I,1)

ENDFOR

ELSE

?

(3)

FORK=1TO2*(2*NI)1

?

?

STR(4)

ENDFOR

ENDIF

ENDFOR

SETTALKON

10、下面程序完成从键盘输入20个数,去掉20个数中的最大值和最小值,然后求平均值。

SETTALKOFF

CLEAR

S=0

N=1

(1)

DOWHILEN<=20

INPUT"B="TOB

S=

(2)

IFMAX

MAX=B

ENDIF

IFMIN>B

(3)

ENDIF

N=N+1

ENDDO

?

"AVERAGE="+(4)

SETTALKON

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1