第七章程序设计基础_第1页
第七章程序设计基础_第2页
第七章程序设计基础_第3页
第七章程序设计基础_第4页
第七章程序设计基础_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、任务六 学用Visual FoxPro的编程功能【学习目标】通过本章学习,应熟练掌握程序的建立、修改和运行方法;掌握基本的输入和输出命令,掌握程序的三种基本结构;理解和掌握主程序、子程序和过程的概念和编写;理解和掌握内存变量作用域的定义命令。【重点难点】重点:程序的三种基本结构;多模块结构难点:循环结构的使用;多模块结构中参数传递的两种方式;变量作用域本章主要介绍程序设计及其相关的一些内容,包括程序设计时使用的程序控制语句、程序的基本结构、程序设计调试等方面的内容。该章是开发基于VFP应用系统的基础,掌握学习时,要充分上机操作练习。第十一讲 程序与程序的基本结构子任务一 学习程序的概念程序是能

2、够完成一定任务的命令的有序集合。采用程序方式有如下好处:l 可以利用编辑器,方便地输入、修改和保存程序。l 可以用多种方式、多次运行程序。l 可以在一个程序中调用另一个程序。例2.1 假定学号的前两位为入学年份(如01代表2001年),第3、4位为专业代码。编写命令文件test1.prg,分别统计所有学生和2001年入学,专业代码为03的学生选修课程号为101课程的平均成绩。编写其程序如下:set talk offclear open database xsxk use 选课 in 0 select avg(成绩) from 选课 where 课程号=101 into array m1sele

3、ct avg(成绩) from 选课 where 课程号=101 and ;left(学号,2)=01 and substr(学号,3,2)=03 into array m2? 所有学生的平均分:,m1(1,1)? 指定学生的平均分:,m2(1,1)use 选课close database set talk onreturn子任务二 建立与执行程序文件1.程序文件的建立程序文件的建立需要调用系统内置的文本编辑器来进行。有三种方法: 用“新建”对话框建立:程序文件的默认扩展名是.prg。 用命令modify command 文件名来建立 用“项目管理器”来建立2.执行程序文件 打开程序文件后使用

4、菜单命令或单击工具栏上的运行按钮。 用命令运行:do 文件名 使用“项目管理器”运行在执行程序的过程中,执行以下命令之一可中止程序的运行:cancel;do 命令;return;quit当用DO命令执行程序文件时,如果没有指定扩展名,系统将按下列顺序寻找该程序文件的源代码或某种目标代码文件执行:exe-app-fxp-prg。故如果要运行指定文件时扩展名不能省略。子任务三 学用简单的输入输出命令1.input命令格式:input 提示信息 to 内存变量名功能:等待从键盘输入表达式赋值给变量。说明:该命令可以输入任意类型的数据。在输入字符串时须加定界符,输入逻辑型常量时要用圆点定界,输入日期及

5、日期时间型数据时要作大括号。不允许不输入任何内容直接按回车键。例2.2 编写命令文件test2.prg,查找指定日期以后出生的学生。CLEAROPEN DATABASE XSXKUSE 学生INPUT 请输入日期: TO MRQSELECT 学号,姓名,出生日期 FROM 学生 WHERE 出生日期MRQ CLOSE DATABASE2.accept命令格式:accept 提示信息 to 内存变量名功能:等待从键盘输入字符串赋值给变量。说明:该命令只接受字符串,用户在输入字符串时不需要加定界符。如果不输入任何内容直接按回车,系统会把空串赋给指定的内存变量。例2.3 检索通过键盘输入的学生的各门

6、课程的成绩。OPEN DATABASE XSXKCLEARaccept 请输入姓名: TO xmSELECT 学生.学号,姓名,课程名,成绩 FROM 学生,选课,课程;WHERE 学生.学号=选课.学号 and 课程.课程号=选课.课程号 and 姓名=xmCLOSE DATABASE3.wait格式:wait 提示信息 to 内存变量名 window at 行,列nowait clear | noclear timeout 秒数例2.4 wait 命令使用示例。 wait 输入无效,请重新输入 windows timeout 5程序结构:是指程序中命令或语句执行的流程结构。有三种基本结构:

7、顺序结构、选择结构、循环结构。子任务四 学用选择结构有条件语句和分支语句两种。1.条件语句格式:if 条件 语句序列1else 语句序列2endif条件语句序列1语句序列2endif后面的语句假真条件语句序列endif后面的语句假真功能:说明: if和endif必须成对出现。 if语句可以嵌套。例2.5 某地至北京的邮路里程为1043 km,通过邮政局向北京城区寄交“特快专递”邮件,应在24小时到达,计费标准每克为0.05元,但超过100克后,超出数每克为0.02元,试编写程序test4.prg计算邮费。方法一:INPUT 请输入邮件重量: TO WIF W100 F=100*0.05+(W-

8、100)*0.02ENDIF? 邮费为:,F例2.6 编写命令文件test5.prg,请用户输入待查学生的姓名,显示该学生的基本情况。CLEAROPEN DATABASE XSXKACCEPT 请输入待查学生姓名: TO NAMELOCATE FOR 姓名=NAMEIF .NOT. EOF() ? 姓名:+姓名 ? 性别:+IIF(性别,男,女) ? 出生日期:+DTOC(出生日期,1)ELSE ? 查无此人!ENDIFCLOSE DATABASE2.分支语句格式:do case case 条件1 语句序列1 case 条件2 语句序列2 case 条件n 语句序列n otherwise 语句

9、序列n+1 endcase功能:依次判断CASE后的条件是否成立,当发现某个CASE后面的条件成立时,就执行该CASE和下一个CASE之间的命令序列,然后执行ENDCASE后面的命令。如果所的有条件都不成立,则执行OTHERWISE与ENDCASE之间的命令序列,然后转向ENDCASE后面的语句。说明:不管有几个CASE条件成立,只有最先成立的那个CASE条件对应的命令序列被执行;如果所有的CASE条件都不成立,且没有OTHERWISE子句,则直接跳出本结构;DO CASE和ENDCASE必须成对出现。例2.6 将学生成绩分为 “不及格”、“及格”、“良好”和“优秀”等次。clearinput

10、 输入学生成绩: to scoredo casecase score=0 and score=60 and score=70 and score=85 and score=100?优秀otherwise?不合法的数据!endcase子任务五 学用循环结构循环结构也称重复结构,是指程序在执行过程中,其中的某段代码被重复执行若干次。被重复执行的代码段,通常称之为循环体。VFP支持循环结构的语句有三种:l do while enddol for - endfor 语句l scan-endscan1.do while - enddo语句格式:do while 条件循环体enddo后面的语句假真条件循环

11、体enddo后面的语句假真loopexit enddo功能:执行该语句时,首先判断DO WHILE处的循环条件是否成立,如果条件成立,则执行DO WHILE和ENDDO之间的命令序列。当执行到ENDDO时,返回到DO WHILE,再次判断循环条件是否成立,以确定是否再次执行循环体。若条件为假,则结束该循环语句,执行ENDDO后面的语句。循环语句执行过程如上图所示。说明:l 如果第一次判断条件即为假,则循环体一次都不执行。l 如果循环体中包含LOOP命令,则遇到LOOP时,就结束循环体的本次执行,不再执行其后的语句,而是转回到DO WHILE重新判断条件。l 如果循环体中包含EXIT命令,则遇到

12、EXIT时,就结束该语句的执行,转去执行ENDDO后面的语句。l 通常LOOP和EXIT出现在循环体内嵌套的选择语句中,根据条件决定是LOOP回去,还是EXIT出去。例2.7 编写程序,计算S=1+2+100。S=0I=1DO WHILE I=100 S=S+I I=I+1ENDDO?S=,S例2.8 求前100个自然数中的偶数和。s=0i=1do while i=100if mod(I,2)=0s=s+ii=i+1elsei=i+1loopendifenddo?前100个自然数中的偶数和为:,sreturn2.for - endfor 语句格式:for 循环变量=初值 to 终值 step

13、步长 循环体 endfor | next功能:执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否大于(步长大于0时)或小于(步长小于0时)循环变量终值,若结果为真,则退出循环;否则,执行循环后,循环变量自动按步长增加或减少。说明:该语句用循环计数器来控制循环体的执行次数。常用于实现循环次数已知情况下的结构。例2.9 编写程序test9.prg,找出100999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(153=13+53+33)CLEARFOR I=100 TO 999 A=INT(I/100) B=INT(I-A*100)/10) C=I

14、-A*100-B*10 IF I=A3+B3+C3 ? I ENDIFENDFORRETURN3.scan- endscan语句格式:scan 范围 for 条件 循环体 endscan功能:执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。说明: 范围的默认值是all。 exit和loop命令同样可以出现在该循环语句的循环体内。例2.10 统计专业代码(学号的第3、4位)为03的男、女生人数。OPEN DATABASE XSXKUSE 学生STORE 0 TO M,WSCAN FOR SUBS(学号,3,2)=03 IF 性别=.T.

15、 M=M+1 ELSE W=W+1 ENDIFENDSCANCLEAR?男生人数:,M?女生人数:,WCLOSE DATABASE编程举例例2.11 计算T=1!+2!+10!cleart=0p=1for i=1 to 10 p=p*i t=t+pendfor? t=,t例2.12 编制一个查询学生情况的程序。要根据给定的学号找出并显示该学生的姓名及各门功课的成绩。open database xsxkdo while .t. clear accept 请输入学号: to mxh select 学生.学号,姓名,课程名,成绩 from 学生,选课,课程;where 学生.学号=选课.学号 and

16、 课程.课程号=选课.课程号;and 学生.学号=mxh wait 继续查询?(y/n) to p if upper(p)Y use exit endifenddoclose database第十二讲 多模块程序子任务一 认识模块及其定义和调用模块可以是程序文件(命令文件),也可以是过程。过程的建立仍使用MODIFY COMMAND命令,文件的默认扩展名是PRG。过程定义的语法格式如下:PROCEDURE|FUNCTION RETURN ENDPROC|ENDFUNCPROCEDURE|FUNCTION命令表示一个过程的开始,并命名过程名.过程名必须以字母或下划线开头,可以包含字母、数字和下划

17、线。ENDPROC|ENDFUNC命令表示一个过程的结束,如果缺省,过程结束于下一条PROCEDURE|FUNCTION命令或文件结尾处。当过程执行到RETURN命令时,控制将转回到调用程序(或命令窗口)并返回表达式的值。如果缺省RETURN命令,则在过程结束处自动执行一条隐含的RETURN命令。若RETURN语句不带,则回逻辑真.T.。过程可以包含在程序文件中放在程序文件代码的后面,也可以放在称为过程文件的单独文件里。过程文件里只包含过程,这些过程能被任何其它程序所调用。但在调用过程文件中的过程之前首先要打开过程文件。打开过程文件的命令格式为:SET PROCEDURE TO ,ADDITI

18、VE可以打开一个或多个过程文件.一旦一个过程文件被打开,那么该过程文件中的所有过程都可以被调用.如果选用ADDITIVE,那么在打开过程文件时,并不关闭原先打开的过程文件。当使用不带任何文件名的SET PROCEDURE TO命令,将关闭所有打开的过程文件。如果不想一并关闭所有过程文件,而要关闭个别过程文件,可以用下面命令:RELEASE PROCEDURE过程文件1,过程文件2,存放在命令文件里的过程主要被命令文件中的代码所调用,但也可以被其它程序所调用.当命令文件处于执行状态时,包含在其中的过程就可以被直接调用,如果命令文件不处于打开状态,那么要调用其中的过程,就要用SET PROCEDU

19、RE命令先打开此命令文件。这与打开过程文件的道理是一样的。总而言之,模块是指过程和命令文件里的代码。而过程的调用需要它所在的文件处于打开状态。模块调用的格式有两种:格式1:DO |格式2:|()在上面两种格式里,如果模块是程序文件的代码,用文件名;否则用。格式2既可以作为命令使用(反回值被忽略),也可作为函数出现在表达式里。这里的文件名不包括扩展名。例2.13 模块定义和调用的程序示例。Cleara=0do p1&调用过程P1do p2&调用过程P2do p3&调用过程P3?a=,aproc p1&过程P1a=a+1proc p2&过程P2a=a*aproc p3&过程P3do p1a=a*a

20、+1return运行结果是:a= 5子任务二 使用参数传递来编程模块程序可以接收调用程序传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理,从而提高模块程序功能设计的灵活性。1.接受参数的命令接收参数的命有如下两种格式:格式1:PARAMETERS 形参变量1,形参变量2,格式2:LPARAMETERS ,,功能:PARAMETERS命令声明的形参变量被看作是模块程序中建立的私有变量,LPARAMETERS命令声明的形参变量被看作是模块程序中建立的局部变量。说明:不管是PARAMETERS命令还是LPARAMETERS命令,都应是模块程序的第一条可执行命令。2.调用模块程

21、序的命令格式1:DO文件名|过程名WITH实参1,实参2,格式2:文件名|过程名(实参1,实参2,)功能:实参可以是常量、变量,也可以是一般形式的表达式。调用模块程序时,系统会自动把实参传递给对应的形参变量。说明:形参的数目不能少于实参的数目,否则系统会产生运行时错误;如果形参的数目多于实参的数目,那么多余的形参取初值逻辑假(.f.)。3.参数传递方式l 按值传递:单向传递采用格式1调用模块程序时,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值给相应的形参变量。这种情形称为按值传递。l 按引用传递,也称地址传递如果实参是变量,那么传递的将不是变量的值,而是变量的地址。这时

22、形参和实参实际上是同一个变量(尽管它们的名字可能不同),在模块程序中对形参变量的改变,同样是对实参的改变。这种情形称为按引用传递。l 设置参数传递方式的命令采用格式2调用模块程序时,默认情况是按值传递参数。如果实参是变量可以通过调用命令SET UDFPARMS命令重新设置参数传递的方式。该命令的格式如下:SET UDFPARAMS TO VALUE|REFERENCETO VALUE:按值传递。形参变量值的改变不会影响实参变量的取值。TO REFERENCE:按引用传递。形参变量值改变时,实参变量也随之改变。例2.14 按值传递和按引用传递示例。CLEARSTORE 100 TO X1,X2S

23、ET UDFPARMS TO VALUE & 设置按值传递DO P4 WITH X1,(X2) & x1按引用传递,(x2)按值传递? 第一次:,X1,X2STORE 100 TO X1,X2P4(X1,(X2) & x1、(x2)都按值传递? 第二次:,X1,X2SET UDFPARMS TO REFERENCE & 设置按引用传递DO P4 WITH X1,(X2) & x1按引用传递,(x2)按值传递? 第三次:,X1,X2STORE 100 TO X1,X2P4(X1,(X2) & x1按引用传递,(x2)按值传递? 第四次:, X1, X2PROCEDURE P4&过程P4PARAM

24、ETERS X1,X2STORE X1+1 TO X1STORE X2+2 TO X2ENDPROC运行结果为:第一次: 101 100第二次: 100 100第三次: 101 100第四次: 101 100(x2)用一对圆括号将一个变量括起来使其变成一般形式的表达式,所以不管什么情况,总是按值传递。从运行结果看,用格式1调用模块程序时的参数传递方式并不受UDFPARRMS值的设置影响。子任务三 理解变量的作用域变量的作用域是指变量在什么范围内是有效的或能够被访问的。在VFP里,若以变量的作用域来分,内存变量可分为公共变量、私有变量和局部变量三类。1公共变量在任何模块中都可使用的变量称为公共变

25、量。公共变量要先建立后使用,公共变量可用PUBLIC命令建立:PUBLIC 该命令的功能是建立公共的内存变量,并为它们赋初值逻辑假。例如,命令PUBLIC X,Y,S(10)建立了三个公共内存变量:简单内存变量X和Y以及一个含水量10个元素的数组S,它们的初值都是.F.。公共变量一旦建立就一直有效,即使程序运行结束返回到命令窗口也不会消失。只有当执行CLEAR MEMORY、RELEASE、QUIT等后,公共内存变量才被释放。在命令窗口中直接使用而由系统自动隐含建立的变量也是公共变量。2私有变量在程序中使用(没有通过PUBLIC和LOCAL命令事先声明)而由系统自动隐含建立的变量都是私有变量。

26、私有变量的作用域是建立它的模块及其下属各层模块。一旦建立它的模块程序运行结束,这些私有变量将自动清除。3局部变量局部变量只能在建立它的模块中使用,不能在上层或下层模块中使用。当建立它的模块程序运行结束时,局部变量自动释放。局部变量用LOCAL命令建立:LOCAL 该命令建立指定的局部变量,并为它们赋初值逻辑假.F.。由于LOCAL与LOCATE前四个字母相同,所以这条命令的命令动词不能缩写。局部变量先建立后使用。例2.15 公共变量、私有变量、局部变量及其作用域示例。PUBLIC X1LOCAL X2STORE F TO X3DO P6 ?主程序中.?X1=,X1?X2=,X2?X3=,X3R

27、ETURN*过程P6PROCEDURE P6? 子程序中? X1=,X1? X3=,X3RETURN开发应用程序时,主程序与子程序不一定由同一个人开发,这样就可能出现以下情形:子程序中变量可能已经在主程序中建立(即与主程序中的变量同名),子程序的运行可能会更改主程序中变量的值。为解决这一问题,可以在子程序中使用PRIVATE命令隐藏主程序中的同名变量,使得这些变量在子程序中暂时无效。PRIVATE命令的语法格式为:PRIVATE PRIVATE ALLLIKE|EXCEPT该命令的功能是:隐藏上层模块中的同名变量,使得这些变量在当前模块中暂时无效。这样,这些变量名就可以用来命名在当前模块或其下

28、属模块中的私有变量或局部变量,并且不会改变上层模块中的同名变量的取值。一旦当前模块程序运行结束返回上层模块时,那些被隐藏的内存变量就自动恢复有效性,并保持原有的取值。例2.16 变量的隐藏示例。SET TALK OFFVAL1=10VAL2=15DO P7? VAL1,VAL2*过程P7PROCEDURE P7PRIVATE VAL1VAL1=50VAL2=100? VAL1,VAL2RETURN运行结果为:5010010100实际上,LOCAL命令在建立局部变量时,也具有隐藏在上层模块中建立的同名变量的作用。但与PRIVATE不同,LOCAL命令只能在它所在的模块内隐藏些同名变量,一旦到了下

29、层模块,这些同名变量就会重新出现。例2.17 LOCAL和PRIVATE命令的比较示例。PUBLIC X,YX=10Y=100DO P8? X,Y*过程P8PROCEDURE P8PRIVATE XX=50LOCAL YDO P9? X,Y*过程P9PROCEDURE P9X=AAAY=BBBRETURN运行结果为:AAA.F.10BBB实训二 程序设计一、实训目的1. 掌握程序中常用的输入输出语句的使用;2. 学会程序文件的创建、修改与运行;3. 理解程序的三种基本结构:顺序结构、选择结构和循环结构。二、实训内容1编一名为guess.prg的程序,实现如下功能:自己心想一个自然数(1-102

30、4),让计算机猜。程序运行时计算机只问用户10个问题便知用户心想之数,并输出。 2用循环结构编一名为“统计.prg”的程序,实现如下功能:统计表文件“学生.dbf”中的男女生人数,统计表文件“学生.dbf”中各系人数并输出。三、实训步骤1编写guess.prg猜数程序: 在命令窗口键入MODIFY COMMAND guess,进入程序录入窗口界面。 在程序录入窗口中输入如下代码:?请您心想一自然数(1-1024),我来猜!low=1 &设low表示范围下限upp=1024 &设upp表示范围上限FOR k=1 TO 10 mid=INT(low+upp)/2) &设mid表示范围前一半的最后一

31、数 WAIT您心想的数是否大于+STR(mid,4)+(Y/N?) TO ans IF UPPER(ans)=Y low=mid+1 &原范围后一半作为新范围 ELSE upp=mid &原范围前一半作为新范围 ENDIFENDFOR?我猜你心想之数一定是:,low &low和upp相等,范围缩小到一个数 按Ctrl+S存盘。 在命令窗口中输入命令DO guess.prg回车后进入运行界面。用户根据自己心想的数依次回答程序运行时屏幕出现的十个问题,每一个问题要求用户键入y、Y或n、N从而将范围缩小一半,用户所猜数的范围在low和upp之间,当十个问题回答完毕时low和upp相等,也即为用户心想

32、之数。2编写“统计.prg”程序: 在命令窗口键入MODIFY COMMAND 统计,进入程序录入窗口界面。 在程序录入窗口中输入如下代码:CLOSE TABLE ALLUSE 学生STORE 0 TO na,nv,jsj,jjgl,glxSCAN IF 性别=男 na=na+1 ELSE nv=nv+1 ENDIF DO CASE CASE 系名=计算机系 jsj=jsj+1 CASE 系名=经济管理系 jjgl=jjgl+1 CASE 系名=公路系 glx=glx+1 ENDCASEENDSCANUSE?计算机系人数为,jsj,经济管理系人数为,jjgl,公路系人数为,glx?男生人数为,

33、na,女生人数为,nv 按Ctrl+S存盘。 在命令窗口中输入命令DO 统计.prg,回车后就可在主屏幕看到如下的运行结果:计算机系人数为 2 经济管理系人数为 3 公路系人数为 3男生人数为 5 女生人数为 3 若将程序最后一行改为以下语句:?男生人数为+ALLTRIM(STR(na),女生人数为+ALLTRIM(STR(nv)则程序运行结果为:(从中体会STR、ALLTRIM函数的作用)计算机系人数为 2 经济管理系人数为 3 公路系人数为 3男生人数为5 女生人数为3实训三 多模块程序及参数传递一、 实训目的1.解多模块程序中内存变量的作用域,具体地说就是理解公共变量、私有变量、局部变量

34、、学会隐藏主程序中的同名变量;2.进一步掌握程序调用中的参数传递。二、 实训内容1通过实例验证如下关于内存变量作用域的结论。 子程序中出现的内存变量若未经定义,则有2种可能: 主程序中没有同名变量,那么返回主程序时,该变量被释放失效。 主程序中有同名变量,那么这2个同名变量实质上是一个变量,返回主程序时,其值被带回主程序。 若在过程中出现的内存变量被定义为公共变量,则该变量在程序执行期间和终止后始终有效。 在过程中用PRIVATE命令声名的内存变量为私有变量,它与主程序中的同名变量毫无关系。过程执行期间,主程序中的同名变量被隐匿起来,以便不受影响。返回主程序时,过程中的变量被释放失效。而主程序中的同名变量保持调用过程之前的值不变。 若在过程中出现的内存变量被定义为局部变量,那么它与上层主程序及其下属子程序中的同名变量毫无关系。过程执行期间,主程序中的同

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论