版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章Visual FoxPro程序设计基础,本章主要内容,6.1 程序文件的建立与执行 6.2 顺序结构 6.3 选择结构 6.4 循环结构 6.5 过程与过程文件,第六章 程序设计基础 P175,VFP6支持过程化程序设计和面向对象程序设计两种程序设计与开发的类型。 Visual FoxPro的工作方式 : 1.命令方式、2.菜单方式、3.程序文件方式 6.1 程序文件的建立与执行 P175 一、程序设计概述 1、算法:解决问题的规则和步骤 (P290) 2、程序:算法的计算机上的体现。指令或语句的集合。,例:,建立程序文件的优点: (1)运行程序文件,会自动执行程序文件中的各条命令 (2
2、)程序文件中的命令可以长期保存,并且可以多次运行,1、自然语言描述法:通俗易懂但繁琐,2、伪码方法:介于自然语言和程序之间,3、图示法:,(2)算法结构图(N S 图),二、算法的表示方法,(1)算法流程图 简单易看但程序太大(多页)时不易观看,流程图基本图形符号 :,三、程序的建立与执行 P176,1、FoxPro 程序的基本构成 程序文件又称为命令文件,扩展名为. P R G 。 程序的基本组成规则: 1) 程序由若干程序行组成。 2) 每一程序行由一条语句或一条命令组成。 每一行以“E n t e r ”键结束。一行写不完一条命令,可在分行处加上续行符号“;”。 3) 程序末尾可加上结束
3、语句, 如C A N C E L 、R E T U R N 或Q U I T 等。 4) 在程序的适当位置可加上注释语句对整个程序和某个程序行做一说明,以增加程序的易读性。,2、程序文件的建立和编辑 P176,1) 命令方式 命令格式: MODIFY COMMAND 程序文件名 或 MODIFY FILE 程序文件名 功能:启动F o x P r o 提供的文本编辑器来建立或编辑程序文件。 2) 菜单方式 在【文件】菜单下的【新建】菜单项中,选择“程序”可选项 。,3、程序文件的执行 P179,1) 命令方式 命令格式: DO 2) 菜单方式 单击【程序】|【运行】菜单项,打开“运行”对话框;
4、 从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮,启动运行该程序文件,4、常用语句,(1) 清屏语句 格式:C L E A R 功能:清除屏幕上的所有显示内容。 (2) 注释语句 格式1 :NOTE 格式2 :* 格式3 : where 高考成绩=600 into array n ?入学成绩等于或大于600 分的学生人数为:,n(1) use cancel,在程序执行时,根据不同的条件,选择执行不同的程序语句执行。,条件语句,分支语句,选 择 结 构,单向条件语句,双向条件语句,6.3 选择结构(分支结构) P186,一:分支程序的基本形式,SET TALK OFF INPUT 请
5、输入x TO X,IF X=1 Y=LOG10(X) ENDIF,IF X1 Y=1-X ENDIF,例1:计算分段函数,?X=,X,Y=,Y SET TALK ON RETURN,1、单路选择 IF ENDIF,2、双路选择 IF ELSE ENDIF,SET TALK OFF INPUT 请输入x TO X,IF X=1 Y=LOG10(X) ELSE Y=1-X ENDIF,?X=,X,Y=,Y SET TALK ON RETURN,例2:计算分段函数,SET TALK OFF INPUT 请输入x TO X IF X=1 Y=LOG10(X) ELSE,ENDIF,IF X=-5.AN
6、D.X1 Y=1-X ELSE Y=SQRT(ABS(X) ENDIF,?X=,X,Y=,Y SET TALK ON RETURN -IF 嵌套-完全嵌套,3、多路选择,DO CASE CASE CASE . CASE OTHERWISE ENDCASE,执行过程:,例3:用DO CASE命令计算分段函数,SET TALK OFF INPUT 请输入x TO X,DO CASE CASE X=1 Y=LOG10(X) CASE X=-5.AND.X1 Y=1-X OTHERWISE Y=SQRT(ABS(X) ENDCASE,?X=,X,Y=,Y SET TALK ON RETURN,DO C
7、ASE CASE CASE . CASE OTHERWISE ENDCASE,1)IF ENDIF和DO CASE ENDCASE 必须成对使用。 2)条件表达式可以是各种表达式或函数的组合,其值必须是逻辑值。 3)语句序列可以由一条或多条命令组成。 4)DO CASE ENDCASE 命令,每次最多只能执行一个语句序列。在多个CASE项的条件表达式值为真时,只执行第一个条 件表达式值为真的语句序列,然后执行 ENDCASE的后面的第一条命令。,注 意,例1:用多种方式编程计算分段函数,实现方法: 1)单选 2)双选(嵌套) 3)多选(DO CASE),类似问题: 税收金问题 租金问题 运费问
8、题 分数段统计 人员级别判定,二:编写分支结构程序,单选 SET TALK OFF INPUT X=? TO X,IF X-1 Y=SQRT(ABS(X) ENDIF,IF X=-1 AND X=1 Y=X*X ENDIF,IF X1 AND X2 Y=EXP(2) ENDIF,IF X=2 Y=-X*X-0.5*X ENDIF,?X=,X,Y=,Y SET TALK ON RETURN,双选 SET TALK OFF INPUT X=? TO X,IF X-1 Y=SQRT(ABS(X) ELSE,IF X=-1 AND X=1 Y=X*X+X ELSE,IF X1 AND X2 Y=EXP
9、(2) ELSE,IF X=2 Y=-X*X-0.5*X ENDIF,?X=,X,Y=,Y SET TALK ON RETURN,ENDIF,ENDIF,ENDIF,多 选 SET TALK OFF INPUT X=? TO X,DO CASE CASE X-1 Y=SQRT(ABS(X),CASE X=-1 AND X=1 Y=X*X+X,CASE X1 AND X=2 Y=-X*X-0.5*X,?X=,X,Y=,Y SET TALK ON RETURN,ENDCASE,例2: 编程序按姓名在表teacher.DBF 中查教师记录(P187例6.9),SET TALK OFF USE TEA
10、CHER ACCEPT “请输入研究方向 TO yjfx,LOCATE FOR 研究方向= yjfx,IF .NOT.EOF() &或FOUND() DISPLAY 教师姓名,职称,研究方向 ELSE ?“没有该研究方向的教师! ENDIF USE SET TALK OFF RETURN,问题:若有此研究方向教师则输出他的职称类别(高级职称、中级职称、初级职称),DO CASE CASE “教授”$职称 ?“高级职称 CASE 职称=“讲师” ?“中级职称 OTHERWISE ?“初级职称 ENDCASE,注:1、IF 和 ENDIF,DO CASE 和 ENDCASE配对。 2、三种选择结构
11、自身可嵌套,相互间也和嵌套。,【例3】假设收入(P)与税率(R)的关系如下,编程求税金。 0 P800 R= 0.05 800 P2000 0.08 2000P5000 0.1 P5000,INPUT “请输入收入:” TO P,算法: 1、输入P 2、求R: (1)条件1:P800 结果:R0 (2)条件2: 800 P2000 结果:R0.05 (3)条件3: 2000P5000 结果:R=0.08 (4)条件4: P5000 结果:R=0.1 3、求税金并输出。 4、完善程序。,DO CASE CASE P800 R=0 CASE 800 P2000 R=0.05 CASE 2000P5
12、000 R=0.08 CASE P5000 R=0.1 ENDCASE,TAX=P*R ? ”税金为:”,TAX,SET TALK OFF CLEAR SET TALK ON RETURN,DO CASE CASE P800 R=0 CASE P2000 R=0.05 CASE P5000 R=0.08 OTHERWISE R=0.1 ENDCASE,【例4】求一元二次方程AX2+BX+C=0的根,SET TALK OFF CLEAR INPUT A=? TO A INPUT B=? TO B INPUT C=? TO C D=B*B-4*A*C,DO CASE CASE D0 &不同实根 X
13、1=(-B+SQRT(D)/(2*A) X2=(-B-SQRT(D)/(2*A) ?X1=,X1 ?X2=,X2 CASE D=0 &相同实根 X1=-B/(2*A) ?X1=X2=,X1 OTHERWISE &虚根 D=ABS(D) ?X1=,(-B)/(2*A), +,SQRT(D)/(2*A),I ?X2=,(-B)/(2*A),-,SQRT(D)/(2*A),I ENDCASE SET TALK ON RETURN,算法: 1、输入A,B,C 2、求:D=B*B-4*A*C 3、判断: (1)条件1:D0 结果:求两个不同的实根 (2)条件2:D=0 结果:求两个相同的实根 (3)条件
14、3:D0 结果:求一对共轭虚根 4、输出方程的根,有一部分程序被反复地执行。,循 环 结 构,当型循环:do while enddo 计数循环:for endfor 数据库扫描:scan endscan,不知道循环次数,己知循环次数,处理表中数据,6.4循环结构 P190,Fox有3种循环命令: DO WHILE循环、FOR 循环、SCAN 循环,格式: DO WHILE LOOP EXIT ENDDO,一、当型循环(条件循环)P191,功能:当条件为真时,执行循环体 (DO WHILE与ENDDO之间的命令序列)。,LOOP:将控制转移到循环结构的开始。 EXIT:将退出循环体,执行ENDD
15、O的下一条命令。,算法:开辟累加单元 S,再开辟记数单元 I。,1、将累加单元 S 清零,2、将记数单元 I 置1,3、输入一个数 N,4、如果 I 的值小于等于N执行下一步, 否则转到第8 步,5、将 I 加到 S 中,6、记数单元 I 的值增1,8、输出 S 的值,算法流程图:,例1. 计算S=1+2+3+4+.+N 的值 P191,7、转第4步,* 程序文件名:SQH.PRG * 程序文件功能:计算累加和 SET TALK OFF S=0 I=1 INPUT “N=?” TO N,DO WHILE I=N S=S+I I=I+1 ENDDO,?”S=”,S SET TALK ON RET
16、URN,-设N取100- i=1=100 s=s+i=0+1=1 i=1+1=2,i=2=100 s=s+i=1+2=3 i=2+1=3,i=3=100 s=s+i=3+3=6 i=3+1=4,i=101=100 .F. end,i=100 s=s+i=s+100 i=100+1=101,注意: 1、变量的设置及初始化 2、循环条件的设置 3、中间值的产生,S=1 I=1 INPUT N= TO N DO WHILE IN I=I+1 S=S+I ENDDO,计算S=1+2+3+4+.+N 的值,S=0 I=0 INPUT N= TO N DO WHILE IN I=I+1 S=S+I END
17、DO,S=0 INPUT N= TO N DO WHILE N0 S=S+N N=N-1 ENDDO,例2键盘输入一组不为0的数, 计算正数和负数的个数。,* 程序文件名:FZS.PRG SET TALK OFF STORE 0 TO X1,X2 &正数X1个,负数X2个,INPUT “X=” TO X DO CASE CASE X=0 EXIT CASE X0 X1=X1+1 CASE X0 X2=X2+1 ENDCASE,?”正数有”,X1, “个” ?”负数有”,X2, “个” RETURN,DO WHILE .T. 循环体 ENDDO,问题:1、找出其中的最大数(最小数) 2、的偶数,
18、例3:逐条输出1982年出生的学生记录(与P192例6.13类似),例4:P193例6.14 编写程序,显示“学生”表中的前8个记录的学生姓名,若有空记录,则不显示信息,例5:编程显示STUDENT表中除“李作宁”以外的所有记录。程序文件名为PROG22.PRG。(同P193【例6-14】类似) SET TALK OFF CLEAR OPEN DATABASE STUDENT USE STUD DO WHILE .NOT. EOF() IF 姓名=”李作宁” SKIP LOOP ENDIF DISPLAY SKIP ENDDO CLOSE DATABASE SET TALK ON RETURN
19、,P193 USE 表名 DO WHILE .NOT. .EOF( ) (对当前记录进行处理) SKIP ENDDO,例6:计算ex=1+X/1!+X2/2!+Xn/N! 设X=1,2,3,4,5分别输出ex值,要求精度Xn/N! 0.0001,CLEAR SET TALK OFF INPUT X= TO X T=1 EX=1 N=0,DO WHILE T=0.0001 N=N+1 T=T*X/N EX=EX+T ENDDO,?N=,N ?EX=,EX SET TALK ON RETURN,格式: FOR = TO STEP EXIT LOOP ENDFOR | NEXT,二、计数循环( FO
20、R-ENDFOR循环)P194,功能:执行该命令,在循环变量越过终值之前,重复执行循环体。 I=N1 DO WHILE I=N2 即判断I是否越过N2) I=I+N3 ENDDO,注意: 1、FOR 、ENDFOR|NEXT 成对出现 2、N3省略,隐含为1 3、循环体中可对n1,n2,n3修改,但不会影响循环次数。初值、终值、步长以 第一次执行FOR命令时的为准。 4、循环体中可对循环控制变量I修改,会影响循环次数。,例2 计算1+2+.+99+100的值(P195),*循环求和 XHQH.PRG SET TALK OFF S=0 INPUT “N=” TO N &n=100 FOR I=1
21、 TO N S=S+I ENDFOR ? “S=”,S SET TALK ON RETURN,例3. 求0100间奇数之和。,i=1=100 s=s+i=0+1=1 i=1+1=2,i=2=100 s=s+i=s+2 i=2+1=3,i=100=100 s=s+i=s+100 i=100+1=101,i=101=100 .F.,SET TALK OFF S=0 INPUT “N=” TO N FOR I=1 TO N STEP 2 S=S+I ENDFOR ? “0-100内奇数之和为:”,S SET TALK ON RETURN,问题:1、计算:,2、K1到K2间的偶数和。 3、K1到K2间
22、能被5整除的数之和 4、K1到K2间个位数+十位数百位数的数之和,计算S=1+2+3+4+.+N 的值,S=0 INPUT N= TO N FOR I=1 TO N S=S+I ENDFOR ?S,例4:按学号在STUDENT.DBF中查找,CLEAR SET TALK OFF USE STUDENT ACCEPT “请输入学号 TO BH T=0,FOR I=1 TO RECCOUNT() IF val(学号)=val(BH) DISP T=1 EXIT ENDIF SKIP ENDFOR IF T1 ?查无此人 ENDIF USE SET TALK ON RETURN,问题:如何显示最后的
23、5条记录?,格式: SCAN FOR WHILE LOOP EXIT ENDSCAN,三、数据库扫描循环 命令( SCAN-ENDSCAN循环) P195,功能:对当前表文件的指定记录,依次重复执行循环体。,例1 逐条显示STUDENT.DBF 表中全部记录,CLEAR SET TALK OFF USE STUDENT SCAN DISP *此处不能有 SKIP*否则只是rec1,3,5. ENDSCAN USE SET TALK OFF,例2 逐条显示STUDENT.DBF表中全部女学员记录,CLEAR SET TALK OFF USE STUDENT SCAN for 性别=女 DISP
24、*此处不能有 SKIP. ENDSCAN USE SET TALK OFF,例3. 任意条件的查询程序,CLEAR SET TALK OFF USE STUDENT ACCEPT “输入查询条件” TO P SCAN FOR &P DISP ENDSCAN USE RETURN,例4: 分类统计:统计TEACHER.DBF中,职称为“教授”、“副教授”、“讲师”和“助教”的教师人数. P196例6.17,CLEAR SET TALK OFF USE TEACHER STORE 0 TO j,fj,js,zj SCAN 对每一条记录分类统计 ENDSCAN CLOSE DATABASE,DO C
25、ASE CASE 职称= “教授” j=j+1 CASE 职称= “副教授” fj=fj+1 CASE 职称= “讲师” js=js+1 CASE 职称= “助教” zj=zj+1 ENDCASE,? “教授人数”,j, “副教授人数”,fj ? “讲师人数”,js, “助教人数”,zj SET TALK ON RETURN,补:多重循环及数组,多重循环指循环体内还有循环。 数组:一组相关数据或变量的集合。 如 A(10),B(2,3) ( 参见书P39 2.2.2) 数组使用前,必须定义。 DIMENSION 数组名(下标1 ,下标2) DECLARE 数组名(下标1 ,下标2),几个概念:
26、 数组名,数组定义符, 数组下标,数组维数,数组元素,下标的上界、下界 数组存放次序(排列的顺序):“按行排” ,也可按一维数组元素的顺序来存取数据。 例:如定义A(2,3) 则A(2,2) 也可表示为A(5) 同一数组的各元素的取值类型可不同且同一元素前后类型可变 可对整个数组赋同一值。如 A=5 数组初值为.F. 可重复定义,例1 计算1+2+. +N的值,*循环求和 XHQH.PRG SET TALK OFF H=0 INPUT “N=” TO N FOR I=1 TO N T=I H=H+T ENDFOR ? “H=”,H SET TALK ON RETURN,问题:,1、S=1!+2
27、!+N! 2、 S=1+(1+2)+(1+2+3)+(1+2+3+N) 3、计算Q=1+1/(1+1/2)+1/(1+1/2+1/3+1/N) 4、S=a+aa+aaa+aaaa (n个a) (n和a从键盘输入) 5、S=1!+(1!+2!)+(1!+2!+3!)+(1!+2!+N!),T=1 FOR J=1 TO I T=T*J ENDFOR,1、S=1!+2!+N!,例2:现有100名学生,每人6科成绩,计算每人的平均成绩。,SET TALK OFF CLEAR INPUT N= TO N FOR A=1 TO N 计算每人的平均分 打印输出结果 ENDFOR RETURN,用DO WHI
28、LE实现 SET TALK OFF CLEAR INPUT N= TO N *FOR A=1 TO N A=1 DO WHILE A=N H=0 *FOR B=1 TO 6 B=1 DO WHILE B=6 INPUT X= TO X,H=H+X B=B+1 *ENDFOR ENDDO ?H=+STR(H,3)+ ?P=+STR(H/6,3) A=A+1 *ENDFOR ENDDO RETURN,H=0 FOR B=1 TO 6 INPUT X= TO X H=H+X ENDFOR,?H=+STR(H,3)+ ?P=+STR(H/6,3),例3.向数组X输入N个数据,找出其中的最小数。,SET
29、 TALK OFF CLEAR INPUT “N=” TO N DIMENSION X(N) FOR I=1 TO N INPUT X= TO X(I) ENDFOR 找最小值 ?”MIN=”,MIN SET TALK ON RETURN,MIN=X(1) FOR I=2 TO N IF MINX(I) MIN=X(I) ENDIF ENDFOR,问题:1、找最大值,最小(大)值的个数 2、第2小(大)的数 3、找出矩阵A(3,5)的最大(小)元素,例4:向数组X输入N个数据,请完成从小到大的排列。,SET TALK OFF CLEAR INPUT N= TO N DIMENSION A(N)
30、 FOR I=1 TO N INPUT X= TO A(I) ENDFOR,FOR I=1 TO N-1 找第I小的数,并存入A(I)中 即:从A(I)A(N)中找最小的数 ?A(I) ENDFOR ?A(N) SET TALK ON RETURN,FOR J=I+1 TO N IF A(I)A(J) T=A(I) A(I)=A(J) A(J)=T ENDIF ENDFOR,相关问题: 1、随机产生100个101000之间的整数,将他们按有小到大次序 排序 2、随机产生100个101000之间的整数,将他们中的偶数按有小 到大次序排序 3、随机产生100个101000之间的整数,将其中互不相等
31、的数按 由小到大次序排序。 4、二维数组排序 RAND() 返回一个01间的实数 A(I)=INT(10+RAND()*(1000-10+1),例5、有一个数列,他的第一项为0,第二项为1,以后每一项都是其前两项之和,试把该数列的前30项存入到一维数组中,然后按逆序打印出来。,DIMENSION A(30) A(1)=0 A(2)=1,FOR I=3 TO 30 产生数列第I项 ENDFOR,A(I)=A(I-1)+A(I-2),FOR I=30 TO 1 STEP 1 ?A(+STR(I,2)+)=+STR(A(I),7) ENDFOR,问题1:如何将结果按每行3个数的方式输出?,K=0 &
32、记住每行已打印的个数 ? FOR I=30 TO 1 STEP -1 ? STR(A(I),7) K=K+1 IF MOD(K,3)=0 ? ENDIF ENDFOR,例6:判断某正整数数X(X=2)是否为素数,INPUT “X=” TO X IF X=2 ?YES ELSE FOR I=2 TO X-1 IF X/I=INT(X/I) ?NO CANCEL ENDIF ENDFOR ?YES ENDIF,判断X(X2)是否为素数?,FOR I=2 TO X-1 IF X/I=INT(X/I) ?NO CANCEL ENDIF ENDFOR ?YES,作业 求100以内的素数。,例7:找出10
33、0内的质数。,SET TALK OFF CLEAR ? 2 FOR I=3 TO 100 T=0 判断 I 是否为素数? IF T=0 ?STR(I,3) ENDIF ENDFOR SET TALK ON Return,FOR J=2 TO I-1 IF INT(I/J)=I/J T=1 EXIT ENDIF ENDFOR,IF JI-1 ? STR(I,3) ENDIF,问题: 1、找出100-1000间能被5和7整除的数 2、找出100-1000间个位数大于十位数加百位数之和的数 3、随机产生100个101000之间的整数,找出其中的素数,并按由小到大的次序打印( RAND() ) 4、找
34、矩阵的鞍点。(行最大,列最小),例8:在100个10,1000内的整数中,找出素数,SET TALK OFF CLEAR DIMENSION A(100),FOR I=1 TO 100 A(I)=INT(10+RAND()*(1000-10+1) NEXT,FOR I=1TO 100 T=0 FOR J=2 TO A(I)-1 IF INT(A(I)/J)=A(I)/J T=1 EXIT ENDIF ENDFOR IF T=0 ?STR(A(I),4) ENDIF ENDFOR,判断A(I)是否为素数 如果A(I)是素数则显示,T=0 FOR J=2 TO A(I)-1 IF INT(A(I)
35、/J)=A(I)/J T=1 EXIT ENDIF ENDFOR IF T=0 ?STR(A(I),4) ENDIF,例9:100个10,1000内的整数,找出素数,按由小到大序输出,SET TALK OFF &生成整数 CLEAR DIMENSION A(100),B(100) FOR I=1 TO 100 A(I)=INT(10+RAND()*(1000-10+1) NEXT,K=0 B(k)=A(I) ENDFOR,T=0 FOR J=2 TO A(I)-1 IF INT(A(I)/J)=A(I)/J T=1 EXIT ENDIF ENDFOR IF T=0 ?STR(A(I),4) K
36、=K+1 B(K)=A(I) ENDIF,& B(1)B(k) 排序,? FOR I=1 TO K-1 FOR J=I+1 TO K IF B(I)B(J) T=B(I) B(I)=B(J) B(J)=T ENDIF ENDFOR ?STR(B(I),4) ENDFOR,?STR(B(I),4) SET TALK ON RETURN,例10:找出A(2,3)的每行的最大值,*A数组赋初值 DIMENSION A(2,3) FOR I=1 TO 2 FOR J=1 TO 3 A(I,J)=100*RAND() ?STR(A(I,J),7,3) NEXT ? NEXT,FOR I=1 TO 2 G
37、=0 FOR J=1 TO 3 IF A(I,J)G G=A(I,J) ENDIF ENDFOR ?*,I,G ENDFOR,找出第I行的最大值,G=0 FOR J=1 TO 3 IF A(I,J)G G=A(I,J) ENDIF ENDFOR ?*,I,G,6.5 过程及过程调用 P196,6.5.1子程序(外部过程 ),引例:任意给定正整数A,B,C,计算:S=A!+(3/5)B!+(C!/2),*如何计算阶乘。 *JC.PRG T=1 FOR I=1 TO X T=T*I ENDFOR RETURN,T=1 INPUT A= TO X 计算A!存入变量T中 A1=T INPUT B= T
38、O X 计算B!存入变量T中 B1=T INPUT C= TO X 计算C!存入变量T中 C1=T ?S=,A1+(3/5)*B1+(C1/2) RETURN,DO JC,DO JC,DO JC,调用子程序,返回,子程序(外部过程):相对独立的程序段。 指能被其他程序段调用的程序段。 主程序:不能被其他程序段调用的程序段。,一、子程序的调用和返回,调用语句格式: DO WITH 功能:将控制转到被调用子程序执行 返回语句格式: RETURN TO | TO MASTER 功能:将控制转到调用程序或指定的程序或主程序中调用命令(DO命令)的下一条命令执行 。,例:编程,选择在屏幕上显示图形:正三
39、角、倒三角、长方形或四边形。,*L12-1.PRG CLEAR TEXT 1.正三角 2.倒三角 3.长方形 4.四边形 ENDTEXT ACCEPT “请选择 (1,2,3,4)”TO TU,DO CASE CASE TU=1 DO SUB1.PRG CASE TU=2 DO SUB2.PRG CASE TU=3 DO SUB3.PRG CASE TU=4 DO SUB4.PRG ENDCASE,CLEAR,控制行的打印 如:I=1 TO N,控制列的打印 如:J=1 TO M,打印一般图形的程序结构,CLEAR FOR I=1 TO 3 行 ?SPACE(10-I) FOR J=1 TO
40、2*I-1 ? * 具体行 ENDFOR ENDFOR RETURN,CLEAR FOR I=1 TO 3 FOR J=10-(I-1) TO 10+(I-1) I,J SAY * ENDFOR ENDFOR RETURN,* * *,打印正三角,?REPLICATE(* , 2*I-1),CLEAR FOR I=1 TO 3 ?SPACE(8+I) FOR J=1 TO 2*(4-I)-1 ?* ENDFOR ENDFOR RETURN,CLEAR FOR I=1 TO 3 FOR J=9+I TO 15-I I,J SAY * ENDFOR ENDFOR RETURN,* * *,打印倒三
41、角,?REPLICATE(* , 2*(4-I)-1),打印长方形,Y=1 FOR I=1 TO 3 ROW()+1,Y SAY REPLICATE(*,9) NEXT RETURN,* * *,FOR I=1 TO 3 ?REPLICATE(*,9) NEXT RETURN,打印四边形,Y=10 FOR I=1 TO 3 ROW()+1,Y SAY REPLICATE(*,9) Y=Y-1 NEXT RETURN,* * *,FOR I=1 TO 3 ?SPACE(10-I)+ REPLICATE(*,9) NEXT RETURN,6.5.2 内部过程 P197,一、内部过程的引入 子程序作
42、一个磁盘文件单独存放: 文件数目多、占空间,增加查找时间 每调用一子程序,就访盘一次,增加运行时间 FoxPro允许同时打开的磁盘文件数有限。,二、过程 过程:为完成一定功能而设计的一组命令序列。过程名长度=8 过程的存放: 与主程序同一文件(放在主程序之后) 独立的过程文件(过程文件需打开和关闭),过程的结构,PROCEDURE RETURN TO MASTER | TO ,PROCEDURE RETURN TO MASTER | TO PROCEDURE RETURN TO MASTER | TO PROCEDURE RETURN TO MASTER | TO ,过程文件的结构,P197,
43、PROCEDURE RETURN ENDPROC,三、过程调用的有关问题,1、过程的调用: DO 2、过程文件的调用-过程文件的打开 SET PROCEDURE TO 3、过程文件的关闭 SET PROCEDURE TO | CLOSE PROCEDURE,例1:计算:S=A!+(3/5)B!+(C!/2),INPUT A= TO X T=1 &必须先定义变量T,否则在后面的T未定义 DO JCP A1=T INPUT B= TO X DO JCP B1=T INPUT C= TO X DO JCP C1=T ?S=,A1+(3/5)*B1+(C1/2),PROCEDURE JCP *如何计算
44、阶乘。 T=1 FOR I=1 TO X T=T*I ENDFOR Return,例2:计算:S=A!+(3/5)B!+(C!/2)(建立过程文件),set procedure to JCFILE T=1 INPUT A= TO X DO JCP A1=T INPUT B= TO X DO JCP B1=T INPUT C= TO X DO JCP C1=T ?S=,A1+(3/5)*B1+(C1/2) set procedure to,PROCEDURE JCP *如何计算阶乘。 *JCFILE.PRG T=1 FOR I=1 TO X T=T*I ENDFOR RETURN,例3:过程调用
45、形式示例(类似P199例6.19),读程序,写出运行结果: X=0 DO PG1 ?X X=X+PG1() ?”X=“,X PROCEDURE PG1 X=1 RETURN 4 ENDPRC,1 X= 5,例4:用过程文件实现对教务管理数据库的STUDENT表进行查询、删除和插入操作。,主程序如下: *PROG32 SET TALK OFF CLEAR OPEN DATABASE 教务管理 SET PROCEDURE TO PROCE USE STUDENT INDEX ON 姓名 TO XM,DO WHILE .T. CLEAR 显示菜单 A查询、B删除 C插入、D退出 输入用户的选择项CH
46、OISE DO CASE 根据CHOISE调用过程 ENDCASE ENDDO,SET PROCEDURE TO CLOSE DATABASE SET TALK ON,显示菜单, 2,20 SAY “学籍管理系统” 4,20 SAY “A:按姓名查询” 6,20 SAY “B:按记录号删除” 8,20 SAY “C:插入新的记录” 10,20 SAY “D:退出”,CHOISE=” ” 12,20 SAY ”请选择A、B、C、D:” GET CHOISE READ,输入用户的选择项 CHOISE,根据CHOISE调用过程,DO CASE CASE CHOISE=”A” DO PROCE1 CA
47、SE CHOISE=”B” DO PROCE2 CASE CHOISE=”C” DO PROCE3 CASE CHOISE=”D” EXIT ENDCASE,过程文件:PROCE.PRG,PROCEDURE PROCE1 查询过程 RETURN PROCEDURE PROCE2 删除记录过程 RETURN PROCEDURE PROCE3 插入新的记录过程 RETURN,查询过程:PROCE1,PROCEDURE PROCE1 CLEAR ACCEPT ”请输入姓名:” TO NAME SEEK NAME IF FOUND() DISPLAY ELSE ? ”查无此人” ENDIF WAIT
48、RETURN,删除记录过程:PROCE2,PROCEDURE PROCE2 CLEAR INPUT ”请输入要删除的记录号:” TO N GO N DELETE WAIT ”物理删除吗Y/N:” TO FLAG IF FLAG=”Y” .OR. FLAG=”y” PACK ENDIF RETURN,插入新的记录过程:PROCE3,PROCEDURE PROCE3 CLEAR APPEND RETURN,例 用程序文件实现,6.5.3 自定义函数 UDF P202,1、自定义函数的命令格式 FUNCTION PARAMETERS RETURN ,说明: 1)以一个独立文件存储,可省略 FUNCT
49、ION,文件名即为函数名。 2)可与调用程序在同一文件中(放在它的后面),也可放在过程文件中(需打开和关闭) 3)函数名长度=8,不能与系统函数名或内存变量名重名。,2、函数的调用 函数名(参数表),例1: 计算:,*JC.PRG 求X! *MODI COMM JC para x T=1 FOR I=1 TO X T=T*I ENDDO RETURN T,*主程序MAIN *MAIN.prg SET TALK OFF CLEAR INPUT M= TO M INPUT N= TO N CMN=JC(M)/JC(N)/JC(M-N) ?CMN RETURN,单独文件出现时可省略FUNCTION命
50、令,一个文件定义一个函数且文件名就是函数名,独立自定义函数,例1-1: 计算,*主程序MAIN *MAIN1.prg SET TALK OFF CLEAR INPUT M= TO M INPUT N= TO N CMN=JC(M)/JC(N)/JC(M-N) ?CMN RETURN,FUNCTION JC para x T=1 FOR I=1 TO X T=T*I ENDDO RETURN T,可以定义多个函数,但这些函数的调用符号只有在该程序中出现才有意义。,依附自定义函数,6.5.4 变量的作用域 P203,根据内存变量的作用范围,内存变量分为: 公共变量(其他书一般称全局变量Public
51、) 私有变量(其他书一般称“局部变量”) 隐藏变量 (变量的隐藏Private) 局部变量(区域型内存变量书P203 Local),变量的作用域,命令窗口、任何嵌套级的程序。程序执行完后仍存在。,1)命令窗口建立 2)程序中:PUBLIC ,建立:,作用范围:,一、公共变量(全局变量),公共变量(全局变量),在退出FoxPro系统之前,仍然存在,仍可被引用。,使用规定,例,例,PUBLIC B INPUT A= TO A INPUT B= TO B S=A*B ?S,私有变量,公共变量,全局变量使用规定,在程序运行结束后仍然存在,在退出FoxPro系统之前仍可被其它程序调用。,公共(全局)变量
52、示例:求A!+(3/5)B!,*主程序 PUBLIC T *T=1 INPUT A= TO X DO 1_1 A1=T INPUT B= TO X DO 1_1 C1=T ?S=,A1+(3/5)*B1,PROCEDURE 1_1 *计算阶乘X!。 T=1 FOR I=1 TO X T=T*I ENDFOR RETURN,公共变量,二、私有变量,程序中未加任何说明定义的内存变量。,生成它的程序中; 调用的下级子程序中。 程序执行完毕,被清除。,建立:,作用范围:,私有变量示例,PROCEDURE 1_1 *如何计算阶乘X! T=1 FOR I=1 TO X T=T*I ENDFOR RETUR
53、N,*主程序 T=1 INPUT A= TO X DO 1_1 A1=T INPUT B= TO X DO 1_1 C1=T ?S=,A1+(3/5)*B1,作用范围: 调用的下级子程序中,私有变量T (主程序中定义),6.3.5 全局变量与局部变量,PRIVATE 或 PRIVATE ALL LIKE/EXCEPT ,三、隐藏变量(隐蔽型-变量的隐蔽)P204,【功能】定义隐蔽(藏)型内存变量。在包含此命令的程序模块中将命令中所说明的与上级程序模块中定义的同名内存变量隐藏或隐蔽起来,直到包含此命令的程序模块执行结束才恢复。,公共变量与私有变量示例1,CLEAR CLEAR MEMO SET
54、PROC TO SUB a=A=1 b=B=2 ?MAIN:,a,b DO sub1 ?MAIN:,a,b SET PROC TO,PROC sub1 PRIVATE b a=A=10 b=B=20 ?SUB1:,a,b DO sub2 ?SUB1:,a,b RETURN,PROC sub2 PRIVATE a a=A=100 b=B=200 ?SUB2:,a,b RETURN,MAIN: A=1 B=2 SUB1: A=10 B=20 SUB2: A=100 B=200 SUB1: A=10 B=200 MAIN: A=10 B=2,运行结果,在程序中,可将原来的某变量隐藏,以便建立自己的同
55、名变量,待本程序运行结束后,再将其恢复。,注,主程序,过程文件,示例2,*例S6-2.PRG *MAIN A1=1 DO S6-2-1 ?A1=,A1,A2=,A2 RETURN,*S6-2-1 PUBLIC A2 A1=3 A2=4 ? “S6-2-1 A1=,A1,A2=,A2 RETURN,*S6-2-2.PRG ?A2=,A2 RETURN,DO 6-2,S6-2-1 A1=3 A2=4,DO S6-2-3 ?A2=,A2,*S6-2-3 PRIVATE A2 A2=9 ?A2=,A2 RETURN,DO S6-2,DO S6-2-2,A2=4,A1=3 A2=4,S6-2-1A1=3
56、 A2=4 A2=9 A2=4 A1=3 A2=4,在程序中,可将原来的某公共变量设为隐藏,使之在此模块中无效,四、局部变量(区域型内存变量)P203,【格式】LOCAL 【功能】将中的变量定义为区域型内存变量,并赋初值为逻辑假.F.。 区域型内存变量只能在定义它的程序模块中使用,当控制离开定义它的模块时将被撤消。,例:区域型内存变量应用举例,A=1 &主程序 ?*MAIN A=,A DO SUB1 ?*MAIN A=,A RETURN,PROCEDURE SUB1 LOCAL A,B ?*SUB1 A=,A, *SUB1 B=,B A=10 B=20 ?*SUB1 A=,A,*SUB1 B=
57、,B DO SUB2 RETURN,PROCEDURE SUB2 ?SUB2 A=,A *?SUB2 B=,B RETURN,程序后屏幕显示: *MAIN A= 1 *SUB1 A= .F. *SUB1 B= .F. *SUB1 A= 10 *SUB1 B= 20 SUB2 A= 1 *MAIN A= 1,6.5.5 主程序与子程序间的参数传递 P199,一、主程序与子程序(或过程)之间的参数传递,方式:1、主程序中建立的公共(全局)或私有变量在子程序(或过程)中使用。 2、利用参数传递数据(形参、实参之间的结合,虚实结合等),主程序 DO 子程序名/过程名 WITH 发送参数表,子程序/过程 PARAMETERS 接收参数表,参数传递说明,1、功能: DO 子程序名/过程名 WITH 发送参数表 PARAMETERS 接收参数表,依次 发送接收
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 技改安全教育
- 结婚彩礼协议合同
- 2026年高考数学考前20天冲刺讲义(五)(原卷版)
- 青岛市辅警招聘考试题及答案
- 北师大版二年级数学上册第九单元:《农家小院》教案:借助生活情境帮助学生综合运用乘除法解决问题落实运算应用训练培养问题解决与表达素养
- 宁波市护士招聘考试题及答案
- 大数据分析技术探讨与展望
- 基于多期超额收益模型的数据资产价值评估
- 互联网行业就业指南
- 染化料配制操作工岗前基础晋升考核试卷含答案
- 2025年物业经营管理真题及专家押题试卷附答案
- 《生物制药导论》 课件 第七章 生物制药设备与车间设计
- 【T8联考】2026届高三4月阶段练习(湖北版)物理+答案
- 第13课+资本主义世界殖民体系的建立与亚非拉民族独立运动+2025-2026学年中职高一下学期高教版(2023)世界历史全一册
- 初中数学七年级下册一元一次不等式组参数取值范围分层进阶教案(人教版)
- 行政事业单位差旅费培训
- 高中生急救知识
- HSK1级课件教学课件
- 2025年中医类别助理全科医生培训结业试题及答案
- 2026年中国化工经济技术发展中心招聘备考题库含答案详解
- (2025版)国家基层高血压防治管理指南2025版解读课件
评论
0/150
提交评论