• 沒有找到結果。

习题 3 参考解答

2.5 结构化程序设计

2.5.1 复习提要与学习指导 1.常用命令

*,&& 注释标记,*用来对整行进行注释,只能位于行的开始

? 换行显示(从新的一行开始显示后面的数据)

?? 从当前行开始显示数据 CLEAR 清除主窗口中的内容

RUN 在命令窗口执行 WINOWS 应用程序 run notepad.exe QUIT/RETURN/CANCEL 结束 Visual FoxPro 应用程序或返回调用处 SET BELL ON|OFF

SET CENTURY ON|OFF 世纪开关(是否采用四位的年份)

SET DATE TO YMD|MDY|DMY 设置日期格式 SET DEFAULT TO 设置默认工作路径

SET ESCAPE ON|OFF 设置是否由 ESC 键终止程序运行

SET SAFETY ON|OFF 设置安全开关(当要修改和替换文件时,是否有警告信息)

SET SECONDS ON|OFF

SET TALK ON|OFF 设置 打开和关闭显示用户命令的中间结果 SET DECI TO n 设置程序中数值数据的小数位数为 n 位 WAIT 提示字符串WINDOWS 用来返回程序结果的

2.掌握三种基本控制结构

(1)顺序结构。

最常见的最根本的程序结构,按程序代码依次执行。

(2)分支结构。

1)IF 语句(两分支,类似于 IIF(条件,表达式 1,表达式 2)函数)

IF 条件

[语句组 1] &&条件成立则执行 ELSE

[语句组 2] &&条件不成立则执行 ENDIF

2)CASE 结构(多分支) DO CASE

CASE 表达式 1 [语句组 1]

CASE 表达式 2 [语句组 2]

……

OTHERWISE &&表示其他情况 [语句组]

ENDCASE

注意

在 DO CASE 与第一个 CASE 之间不允许存在其他任何语句。一般情况 下,对于命令按钮组和选项按钮组的编程可以用 CASE 结构。

(3)循环结构。

1)DO WHILE … ENDDO:适用于循环次数未知的情况。

118 Visual FoxPro 程序设计实训与考试指导(第二版)

STORE "ABCD" TO C,CC P=SPACE(0)

DO WHILE LEN(C)>0 X=asc(left(c,1))

If x>127 && ASCII 的最大值为 01111111(127)

I=2 &&汉字处理 Else

I=1 &&字母处理 Endif

P=left(c,i)+p

C=substr(c,2*i-1) && c=right(c,len(c)-i)使条件不断向循环终止条件转化 Enddo nsum=nsum+nmul next i

?nsum

[循环执行的语句]

ENDSCAN

【例】统计教师表中性别为男的记录的条数。

ncount=0 use js

scan for xb="男"

ncount=ncount+1

&& skip 如果有此语句,则程序功能为统计顺序号为奇数的男教师人数 endscan

3.掌握创建用户自定义函数和过程的方法

(1)用户自定义函数(UDF)。

1)格式:

FUNCTION 函数名

parameter 参数列表 &&当该函数需要从外部接受值时,必须有该语句,形 式参数

[函数的执行语句部分] &&包括赋初值、处理

return 结果表达式 &&返回结果,UDF 必须包含该语句 ENDFUNC

注意 函数名不能作为函数体中的变量名 2)调用:

?函数名(参数列表) &&必须保证参数列表中数据的一一对应,实在参数 y=函数名(参数列表)

注意 实参和形参的一一对应包括:个数、次序、类型三个方面的对应

(2)过程 1)格式:

PROCEDURE 过程名

parameter 参数列表 &&当该过程需要从外部接受值时,必须有该语句 [过程的执行语句部分] &&包括赋初值、处理

?结果 &&显示结果,此处不能用 RETURN 返回值 ENDPROC

2)调用:DO 过程名 WITH 参数列表。

(3)过程和函数存储的 4 种形式。

1)放于主程序单元之后,与主程序位于同一个 PRG 文件。

2)每个函数或过程单独以一个 PRG 文件存放,一个函数或过程存放一个文件。

3)所有的函数和过程存放于同一个 PRG 文件中,这个 PRG 文件称为过程文件。

如果是第三种存放形式,则在调用该函数或过程之前,必须执行命令:

120 Visual FoxPro 程序设计实训与考试指导(第二版)

SET PROCEDURE TO 过程文件名 &&指定过程所在的位置信息 4)函数和过程也可存放于数据库文件的存储过程中。

如果函数和过程位于数据库的存储过程,则调用之前,必须先打开该数据库。

(4)参数传递的两种形式。

值传递:在函数或过程中改变参数的值,在程序运行结束后,该参数的值仍旧为原来的值。

引用传递:将参数的地址传递到函数和过程中,程序运行结束后,对该参数的改变将保留。

默认:函数采用值传递来传递参数;过程采用引用传递来传递参数。

设置默认的参数传递方式:SET UDFPARMS TO REFERENCE|VALUE 强行指定参数传递方式:值传递——变量名前加@

引用传递——变量名加括号

(5)变量的作用范围。

LOCAL(局部变量)只能在定义它的程序单位中使用,在它的上级或下级程序单位中无效 PRIVATE(私有变量)子程序中的同名变量在运行结束后消失,不影响主调程序的同名 变量

PUBLIC(全局变量)在整个程序运行过程中,在每个程序单位中都有效 2.5.2 习题 5 及参考解答

一、选择题

1.Visul FoxPro 的程序文件可以由( )命令建立或修改。

A.MODIFY COMMAND B.EDIT COMMAND C.CHANGE COMMAND D.DO COMMAND 2.在项目管理器中,程序存放在( )页中。

A.数据 B.文档 C.类 D.代码 3.Visual FoxPro 程序的三种基本结构是( )。

A.顺序结构、选择结构和循环结构 B.顺序结构、选择结构和逻辑结构 C.模块结构、转移结构和循环结构 D.网状结构、选择结构和逻辑结构 4.能放在可执行命令末尾的注释命令是( )。

A.REM B.&& C.* D.//

5.下列不正确的赋值语句是( )。

A.x=12 B.store 12 to x C."x"=12 D.input "x" to x

6.假定 X=2,执行命令 ? X=X+1 后,结果是( )。

A.3 B.2 C..T. D..F.

7.下列语句中,不是输入命令的是( )。

A.? B.INPUT C.ACCEPT D.WAIT

8.在当前位置处输出结果不回车换行的命令是( )。

A.? B.?? C.OUTPUT D.PRINT 9.下列语句中,( )是分支语句。

A.IF…ENDIF B.FOR…ENDFOR C.DO WHILE…ENDDO D.SCAN…ENDSCAN 10.对 DO CASE…ENDCASE 语句,下列说法中正确的是( )。

A.执行第一个语句组 B.执行满足条件的第一个语句组 C.执行满足条件的所有语句组 D.执行 OTHERWISE 后面的语句组 11.对于 FOR I=1 TO 8 STEP 2 循环,正常退出循环后的 I 值为( )。

A.7 B.8 C.9 D.10

12.在 DO WHILE…ENDDO 循环中,若循环条件设置为.T.,则下列说法中正确的是

( )。

A.程序无法跳出循环 B.程序不会出现死循环 C.用 EXIT 可跳出循环 D.用 LOOP 可跳出循环 13.针对表的循环语句是( )。

A.FOR…ENDFOR B.DO WHILE…ENDDO C.SCAN…ENDSCAN D.DO CASE…ENDCASE 14.不能将 LOOP 作为有效命令使用的程序结构是( )。

A.IF…ENDIF B.SCAN…ENDSCAN C.FOR…ENDFOR D.DO WHILE…ENDDO 15.执行一列程序后,屏幕显示的结果为( )。

X=20 Y=10 N=0

DO WHILE Y<X X=X-1

Y=Y+2 N=N+1 ENDDO

?N RETURN

A.10 B.20 C.4 D.5 16.将数组的内容传送到表的命令是( )。

A.DIMENSION B.APPEND FROM ARRAY C.COPY TO ARRAY D.RELEASE

17.清除所有内存变量的命令是( )。

A.CLEAR B.PUBLIC C.DIMENSION D.RELEASE ALL 18.过程的引导语句是( )。

A.PROCEDURE B.PROGRAM

122 Visual FoxPro 程序设计实训与考试指导(第二版)

C.PARAMETERS D.FUNCTION 19.函数的返回值跟在( )之后 。

A.RETURN B.LPARAMETERS C.PARAMETERS D.FUNCTION 20.下列关于参数传递不正确的说法是( )。

A.传值的方式是“单向”的,即只能由实参传递给虚参,而虚参不能返回给实参 B.传址的方式是“双向”的,即实参变量和虚参变量被分配为同一存储单元 C.将实参变量用括号括起来为传值方式,在实参变量前加“@”符号则为传址方式 D.在默认的情况下,Visul FoxPro 在调用子程序时采用传址方式

21.定义全局变量的命令为( )。

A.PUBLIC B.LOCAL C.DIMENSION D.PRIVATE 22.关于变量不正确的说法是( )。

A.全局变量在所有程序中都有效,都可以使用 B.局部变量只能在创建它们的过程内部使用和修改

C.私有变量在定义它的程序以及它所调用的子程序范围内有效,即本层及下层有效 D.系统默认定义的变量都属于全局变量

23.在 Visual FoxPro 中,关于过程调用的叙述正确的是( )。 A.当实参的个数少于形参的个数时,多余的形参取逻辑假 B.当实参的个数多于形参的个数时,多余的实形参被忽略 C.实参必须与形参的个数相等

D.实参必须与形参的个数相等且类型一一对应 24.只能关闭过程文件的命令是( )。

A.CLOSE PROCEDURE C.CLOSE DATABASES C.SET INDEX TO D.USE

25.调用子程序传递实参时,通过( )语句。

A.PARAMETERS B.WITH

C.TO D.LINK

二、阅读下列程序,根据要求写出结果

【程序 1】

SET TALK OFF X=5

DO CASE CASE X>10

Y=X+5 CASE X>0

Y=X*3 OTHERWISE

Y=X**2+10

ENDCASE

?Y

SET TALK ON

运行结果:________

【程序 2】

SET TALK OFF S=0

P=5

DO WHILE P<=10 P=P+1

S=S+P*2 ENDDO

? S RETURN

运行结果:________

【程序 3】

SET TALK OFF STORE 1 TO X,Y DO WHILE .T.

X=X+1 Y=Y+X IF X>=5 EXIT ENDIF ENDDO

?X,Y RETURN

则程序运行后 x 为________,y 为________。

【程序 4】

SET TALK OFF CLEAR

DIMENSION B(5) B=5

I=1 S=0

DO WHILE I<5 S=S+B(I) I=I+2 ENDDO

? "S,I=",S,I RETURN

运行结果:________

【程序 5】

SET TALK OFF CLEAR

124 Visual FoxPro 程序设计实训与考试指导(第二版)

STORE 0 TO X,Y,S1,S2,S3 DO WHILE X<10

X=X+1

X="同学们"

Y="你们好!"

? "主程序中 X=",X

? "主程序中 Y=",Y DO SUBPRO

? "返回主程序后 X=",X

? "返回主程序后 Y=",Y

? "返回主程序后 Z=",Z Z=300

? "子程序中 X=",X

? "子程序中 Y=",Y

? "子程序中 Z=",Z RETURN

**过程 SUBPRO**

PROCEDURE subpro PRIVATE X PUBLIC Z X=100 Y=2 Z=5 ENDPROC

运行结果:________

【程序 9】

*MAIN.PRG SET TALK OFF A=3

B=5

DO PP WITH 2*A,B SET TALK ON RETURN

PROCEDURE pp PARAMETERS X,Y CLEAR

S=X*Y

? "X="+STR(S,3) ENDPROC

运行结果:________

【程序 10】

*MAIN PROGRAM SET TALK OFF STORE 3 TO L,H AREA=0

DO SUB WITH L,H,AREA

? L,H,AREA

DO SUB WITH L,H,AREA

126 Visual FoxPro 程序设计实训与考试指导(第二版)

? L,H,AREA RETURN

PROCEDURE SUB

PARAMETERS A,B,C C=A*B

A=A*2 B=B*2 ENDPROC

运行结果:________

三、在横线处填上适当的内容,使程序完整

1.下面程序是求 1~500 内被 3 整除的数的个数以及最后一个不能被 3 整除的数。

SET TALK OFF N=0

I=1

DO WHILE I<500 IF ________

N=N+1 ELSE ________

ENDIF I=I+1 ENDDO

? N,P

SET TALK ON

2.以下程序的功能是判断自然数 n 是否为素数的程序。

set talk off cleaR input "n=" to n for I=2 to n-1 if i%n=0 ________

endif next if ________

?n, "是素数"

else

?n, "不是素数"

endif set talk on return

3.在表 SSS.DBF 中查询某专业的学生, SSS.DBF 中有“专业”字段名。

SET TALK OFF USE SSS

ACCEPT "请输入专业名称:" GET ZY LOCATE FOR 专业=ZY

IF ________

? "没有符合条件的记录,按任意键结束!"

WAIT CLEAR RETURN ENDIF

* 逐条显示该专业所有学生的记录 DO WHILE .NOT.EOF()

DISPLAY ________

ENDDO WAIT RETURN

4.在表 ABC.DBF 中查询“姓名”为李燕的记录。

SET TALK OFF USE ABC ________

SEEK "李燕"

IF FOUND() DISPLAY ELSE

?"库中没有李燕的记录!"

ENDIF USE RETURN

5.本程序是根据输入的表,在表中查找指定“姓名”的记录,如果找到则删除此记录。

SET TALK OFF

ACCEPT "输入数据库名:" TO KNAME USE ________

ACCEPT "姓名:" TO NAME LOCATE ________

IF .NOT. ________

________

ELSE

? "查无此人"

ENDIF USE

SET TALK ON RETURN

6.设学生的数学、物理、英语这三门课程的期末考试成绩存放在表 CJ.DBF 中。如果 某一学生三门课程的成绩均达到 85 分以上(包括 85 分在内),应在该学生记录的“等级”

这一字段中填入“优秀”。

SET TALK OFF

128 Visual FoxPro 程序设计实训与考试指导(第二版)

CASE________

XF=2 CASE________

XF=1 OTHERWISE XF=0 ENDCASE ?"学号:",XF USE

RETURN

9.下列程序是用来求长方形面积,请将它写完整。

X=3 Y=5

S=AREA(X,Y)

? "S=",S RETURN

FUNCTION AREA ________

S1=X*Y RETURN ________

ENDFUNC

10.学生成绩表 score.dbf(学号(C/3),姓名(C/6),成绩(N/5/1),名次(n/2/0))的 记录如下:

学号 姓名 成绩 名次

001 A 56

002 B 78

003 C 90

004 D 60

程序的功能是替换填写名次字段,要求成绩相同的同学的名次相同(已知:已建立了按 成绩降序的单索引文件 sc.idx)。

Set talk off Use score index sc Sc=成绩

Mc=1

Do while .not.eof()

Replace 名次 with mc while 成绩=sc ________

if Sc<>成绩 mc=mc+1 endif ________

Enddo Use Set talk on return

130 Visual FoxPro 程序设计实训与考试指导(第二版)

四、编程题

1.从键盘输入两个数 a、b,如果两数相等,则显示 a=b(如 5=5),如果两数不等,如 3 和 5,则显示 3<5 或 5>3。

2.求 1 1 1 1 1

1− + −2 3 4"+99−100之值。分别用 FOR 循环、DO WHILE 循环编程。

3.编写一个过程,计算下面表达式的值:

n

i 1

s 1

i(i 1)

=

=

+ 在主程序中分别输出 n=10、100、1000 时 s 的值。

4.用 FUNCTION 语句定义以下函数:

4.用 FUNCTION 语句定义以下函数:

相關文件