1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,数据库及其应用,第,6,章 结构化程序设计,第,6,章 结构化程序设计,学习目标与要求,通过本章学习,应达到以下要求:,1,、理解程序的概念,了解,VFP,程序的建立、编辑与运行,掌握程序调试的基本方法;,2,、理解程序的基本结构,了解结构化程序设计含义及基本方法,掌握三种结构化程序的编制方法和步骤;,3,、理解过程、自定义函数、全局变量、参数以及参数传递的概念和作用,掌握过程的调用方法及过程调用过程中的参数传递;,4,、能够将数据库操作与程序设计结合,在程序中实现简单的数据库操作。,什么是程序设计?,程序
2、是,一种把程序设计语言提供的具有各种功能的命令语句,根据算法的需要和一定的语法规则组织起来的,语句集合,,计算机执行这个语句集合就能得到预期的结果。,所以,程序设计就是把语句组织成集合的过程,简称编程。,与在命令窗口逐条输入命令相比,采用程序方式有如下好处:,1,、可以利用编辑器,方便地输入、修改和保存程序。,2,、可以用多种方式、多次运行程序。,3,、可以在一个程序中调用另一个程序。,引例:编写程序,查询某个学生的的专业。,程序如下:,*该程序用来查询湖北学生王远雄是哪个专业的学生。,set talk off,SET DEFAULT TO E:,学生管理,open database,学生管理
3、,select,姓名,专业名称,籍贯,from,专业,JOIN,学生,ON,专业,.,专业编号,=,学生,.,专业编号,where,籍贯,=“,湖北省”,AND,姓名,=“,王远雄”,&SQL,查询语句,close database,set talk on,&,恢复系统设置,SET DEFAULT TO,return,关闭对话开关,“,*,”,为该段程序说明。,“,&,”,为命令行说明。,设置默认路径。,结束当前程序运行,从引例中可看到,,VFP,的程序是由设置运行环境、打开及关闭数据库和数据表、具体操作几部分组成。,其中具体操作可用,SQL,语句,也可用,VFP,语句,视具体情况而定。,6.
4、1,程序文件的建立与执行,1,、程序文件的建立与修改,通过系统内置的文本编辑器来进行,打开编辑器的方法:,(1),命令方式:,modify command,(2,)项目管理器,关闭编辑器则保存程序内容,系统自动给程序文件加上扩展名,.PRG,。,6.1,程序文件的建立与执行,2,、程序文件的执行,(1),命令方式:,DOWITH,当程序文件被执行时,文件中包含的命令被依次执行,直到所有命令被执行完毕。,(2),使用项目管理器:,6.2,顺序结构程序设计,程序基本结构,:,输入原始数据 处理 输出结果,程序执行过程:,按照语句的书写顺序,逐行连续执行命令。,为阅读程序的需要,可在程序中加入注释。
5、,注释语句:单独行,NOTE|*,附在语句后面,&,程序结束语句,:,CANCAL,:,终止程序运行,清除所有私有变量,返回主窗口。,RETURN,:,结束当前程序的执行,返回调用它的上级程序。,QUIT,:,退出,VFP,系统,返回操作系统。,顺序结构程序的主要命令,设置环境命令,SET,清屏幕语句,:,CLEAR,输出语句,:,?,|,?输出项,(,教材,p149),对话框函数:,MESSAGEBOX,输入语句,:,INPUT/ACCEPT/WAIT,赋值语句,:,STORE,表达式,TO,变量表,数据库操作命令。,输入语句(接收语句),输入语句用来随机接收用户输入的信息。,1,、接收,C
6、,型数据命令,格式:,ACCEPT TO,2,、接收,N,D,型数据命令,格式:,INPUT TO,3,、等待命令,格式:,WAIT TO,三条交互命令共同点:暂停程序运行,接收信息,存入变量中,然后继续运行中断的程序。,区别:,ACCEPT,只接受,C,型数据,且不用加定界符;,INPUT,用来接收,D,型和,N,型数据;,WAIT,只接收单个字符,且不用回车。,例,1,:编写程序,在“学生”表表尾添加一条新记录,程序如下:,OPEN DATABASE E:,学生管理,学生管理,USE,学生,APPEND BLANK,CLEAR,ACCEPT“,请输入学号:”,TO,XH,ACCEPT“,请
7、输入姓名:”,TO,XM,INPUT “,请输入出生日期:”,TO,NL,WAIT,还继续吗?,Y/N,REPLACE,学号,WITH,XH,姓名,WITH,XM,生日,WITH,NL,CLOSE DATABASE,RETURN,例,2,:查询学生的平均成绩,要求输出学生学号、姓名、专业和平均成绩,并按平均成绩的降序排序。,多表连接的方法:,SET DEFAULT TO E:学生管理,OPEN DATABASE 学生管理,SELECT,学生.学号,姓名,专业,AVG(成绩)AS 平均成绩,;,FROM,专业,JOIN,学生,ON,专业.专业编号=学生.专业编号;,JOIN,成绩,ON,学生.学
8、号=成绩.学号;,GROUP BY,学生.学号,姓名,专业,;,ORDER BY,平均成绩 DESC,CLOSE DATABASE,RETURN,视图的方法:,SET DEFAULT TO E:,学生管理,OPEN DATABASE,学生管理,SELECT,学号,姓名,平均成绩,;,FROM,PJF;,ORDER BY,平均成绩,CLOSE DATABASE,RETURN,如果建立了视图,PJF,,包含本题所需要的信息,所以可以直接使用这个视图完成这个查询。,课堂练习,编写通用程序。根据籍贯和姓名查询某个学生是哪个专业的学生。,set talk off,SET DEFAULT TO E:,学生
9、管理,open database,学生管理,select,姓名,专业名称,籍贯,from,专业,JOIN,学生,ON,专业,.,专业编号,=,学生,.,专业编号,;,where,籍贯,=AND,姓名,=,close database,set talk on,SET DEFAULT TO,return,ACCEPT,请输入姓名,TO XM,ACCEPT,请输入籍贯,TO JG,JG,XM,思考,:,能否用,INPUT,语句接收输入信息,?,6.3,分支结构程序设计,程序的流程需要根据条件的结果确定。,条件,语句块,1,语句块,2,T,F,IF,语句,IF ,语句块,1,ELSE,语句块,2 ,E
10、NDIF,例,1:,查询某学生入学成绩是否在,600,分以上,SET DEFAULT TO E:,学生管理,open database,学生管理,USE,学生,CJ=,入学成绩低于,600,分,ACCEPT“,请输入学号,:TO XH,LOCATE FOR,学号,=XH,IF,入学成绩,=600,CJ=,入学成绩,600,分以上,ENDIF,?CJ,USE,Close database,return,用选择分支语句,重新编写上例程序。,USE,学生,ACCEPT,学号,:TO XH,LOCATE FOR,学号,=XH,IF,入学成绩,=600,ELSE,ENDIF,USE,?“,该学生入学成绩
11、,600,分以上,?“,该学生入学成绩低于,600,分,例,2,:键盘输入教师姓名,查询教师信息以及所在学院的名称。,*,检索教师信息程序,CLEAR,SET DEFAULT TO E:,学生管理,OPEN DATABASE,学生管理,SELECT 0,USE,教师,ACCEPT“,输入教师姓名,:”TO XM,LOCATE FOR,姓名,=XM,&,查找等于变量,XM,的记录,IF FOUND(),&,输入的姓名查到了,SELECT,教师,.*,学院名,FROM,教师,JOIN,学院,ON,学院,.,学院编号,=,教师,.,学院编号,WHER,姓名,=XM,ELSE,WAIT“,输入的姓名不
12、存在。”,WINDOWS at 10,20,ENDIF,CLOSE DATABASE,RETURN,例,3,:商场为一次购买金额在,200,元以上的商品打九折,低于,200,元的不打折。试编制收费程序。,分析,:,首先求出其应交款,然后根据金额的大小确定实交金额,*,收费程序,1,CLEAR,ACCEPT“,输入商品编号,:TO MC,INPUT,输入商品单价,:TO DJ,INPUT,输入购买数量,:TO SL,JE=DJ*SL,IF JE=200,JE=JE*0.9,ENDIF,=messagebox(,应交金额,=+STR(je,6,2)+,元,0+48),RETURN,例,4,:商场根
13、据顾客一次购买金额的不同提供不同的优惠。,1000,元以上打,7,折,,500,元以上到,1000,元打,8,折,,200,元以上到,500,元打,9,折,其余都打,9.5,折。编制收费程序。,*,收费程序,2,CLEAR,ACCEPT“,输入商品名称,:”TO MC,INPUT“,输入商品单价,:”TO DJ,INPUT“,输入购买数量,:”TO SL,JE=DJ*SL,IF JE1000,JE=JE*0.7,ELSE,IF JE500,JE=JE*0.8,ELSE,IF JE200,JE=JE*0.9,ELSE,JE=JE*0.95,ENDIF,ENDIF,ENDIF,?”,应交金额,=”
14、+STR(je,6,3)+,元,CANCEL,多分支条件语句,DO CASE,CASE ,CASE ,OTHERWISE,ENDCASE,逻辑表达式,1,逻辑表达式,2,语句序列,1,语句序列,2,逻辑表达式,N,语句序列,N,语句序列,N+1,.,是,是,是,是,否,否,否,否,在处理多分支的问题时,最好使用多重分支语句,使程序结构层次清晰、简明,减少编写的错误,增加程序的可读性。,例,5:,用条件语句改写例,4,程序。,CLEAR,ACCEPT,输入商品名称,:TO MC,INPUT,输入商品单价,:TO DJ,INPUT,输入购买数量,:TO SL,DO CASE,CASE JE1000
15、,JE=JE*0.7,CASE JE500,JE=JE*0.8,CASE JE200,JE=JE*0.9,JE=JE*0.95,ENDCASE,=messagebox(,应交金额,=+STR(je,6,3)+,元,0+48),RETURN,OTHERWISE,JE=DJ*SL,多分支条件语句,例,6,:计算个人所得税。,假设个人所得税的收缴标准如下:,收入少于等于,800,元不收税;收入超过,800,元的部分,按,5%,收税;收入超过,2000,元的部分,按,10%,收税;收入超过,5000,元的部分,按,20%,收税;收入超过,10000,元的部分,按,30%,收税;收入超过,100000,
16、元的部分,按,40%,收税。,800,0,2000,5000,10000,100000,5%,10%,20%,30%,40%,CLEAR,Input“,输入月收入:”,to income,Do case,case income=800,raw=0,case income=2000,raw=(income-800)*0.05,case income=5000,raw=1200*0.05+(income-2000)*0.1,case income=10000,raw=1200*0.05+3000*0.1+(income-5000)*0.2,case income=100000,raw=1200*0
17、.05+3000*0.1+5000*0.2+(income-10000)*0.3,otherwise,raw=1200*0.05+3000*0.1+5000*0.2+9000*0.3+(income-100000)*0.4,Endcase,=messagebox(,应交个人所得税,:=+STR(RAW,6,3)+,元,0+48),RETURN,程序如下:,800,0,2000,5000,10000,100000,5%,10%,20%,30%,40%,6.4,循环结构程序设计,条件循环:,DO WHILE,LOOP,EXIT,ENDDO,逻辑表达式的值,=,?,循环体,LOOP,EXIT,END
18、DO,ENDDO,后面的语句,.T.,.F.,强制跳出循环,循环短路,该结构的循环体中必须有改变循环条件的语句或跳出循环的语句。,例,1,:编制可以对购买任意种商品的顾客求其应交款的程序。,*,收费程序,3,CLEAR,JE=0,&,作累计的变量先清零,DO WHILE.T.,&,无条件进入循环,ACCEPT“,输入商品编号,:”TO MC,IF EMPTY(MC),&,名称处直接回车作为退出循环的标志,EXIT,ENDIF,INPUT“,输入商品单价,:”TO DJ,INPUT“,输入购买数量,:”TO SL,JE=JE+DJ*SL,&,累计销售金额,ENDDO,=messagebox(,应
19、交金额,=+STR(je,8,3)+,元,0+48),RETURN,例,2,:统计“成绩”表中成绩超过,90,分的人次。,CLEAR,SET DEFAULT TO E:,学生管理,OPEN DATABASE,学生管理,SELECT 0,USE,成绩,S=0,DO WHILE.NOT.EOF(),IF,成绩,=90,S=S+1,ENDIF,SKIP,ENDDO,=messagebox(90,分以上的人次,:”,+STR(S,3)+,人,0+48),USE,RETURN,CLEAR,SET DEFAULT TO e:,学生管理,OPEN DATABASE,学生管理,SELECT,成绩,;,FROM
20、,学生,JOIN,成绩,ON,学生,.,学号,=,成绩,.,学号,;,WHERE,成绩,=90;,INTO CURSOR RC,?90,分以上的人次:,+STR(RECCOUNT(),3)+,人,RETURN,例,2,思考,:,查询成绩超过,90,分的学生信息。,SELECT,学生,.,学号,姓名,专业名称,课程名,成绩,;,FROM,专业,JOIN,学生,on,专业,.,专业编号,=,学生,.,专业编号,;,JOIN,成绩,ON,学生,.,学号,=,成绩,.,学号,;,join,课程,on,课程,.,课程编号,=,成绩,.,课程编号,;,WHERE,成绩,=90,RETURN,CLEAR,S
21、ET DEFAULT TO e:,学生管理,OPEN DATABASE,学生管理,6.4,循环结构程序设计,表扫描循环,SCAN FOR|WHILE,LOOP,EXIT,ENDSCAN,逻辑表达式的值,=,?,循环体,LOOP,EXIT,ENDSCAN,ENDSCAN,后面的语句,.T.,.F.,例,3,:统计“成绩”表中成绩超过,90,分的人次。,CLEAR,SET DEFAULT TO E:,学生管,OPEN DATABASE,学生管理,CLOSE TABLES,SELECT 0,USE,成绩,S=0,DO WHILE.NOT.EOF(),IF,成绩,=90,S=S+1,ENDIF,END
22、DO,?90,分以上的人次,:“,S,USE,RETURN,CLEAR,SET DEFAULT TO E:,学生管,OPEN DATABASE,学生管理,CLOSE TABLES,SELECT 0,USE,成绩,S=0,SCAN FOR,成绩,=90,S=S+1,ENDSCAN,?90,分以上的人次,:“,S,USE,RETURN,SKIP,计数循环,(FOR,循环,),FOR I=C TO Z STEP B,LOOP,EXIT,ENDFOR,C,:初始值,Z,:终值,B,:步长值,I,:计数变量,6.4,循环结构程序设计,例,4:,计算,1+2+3+100,的和。,S=0,N=1,FOR I
23、=1 TO 100,S=S+N,N=N+1,endfor,?1+2+3+100=,S,6.4,循环结构程序设计,三种循环的比较:,1,、若事先知道循环次数,可以使用,FOR,循环。,2,、若事先不知道循环次数,只知道在某一条件满足时结束循环,可以使用,DO WHERE,循环。,3,、,FOR,和,SCAN,循环都可以用,DO WHERE,循环实现。,4,、,DO WHER,循环和,FOR,循环可以用于对表的循环处理,也可以用于其他循环处理,而,SCAN,循环只能用于对表的处理。,数据库程序设计的复杂性,1,、数据表打开后,其字段变量就是一个多值变量,它随着记录指针的变化而变化其值,为了取得某一
24、个字段的值,必须移动指针到该记录处;,2,、数据表的记录数在数据表打开之前是不能确定的,所以,在表文件打开后,可以用一个求记录数的函数,RECCOUNT(),来求出,才能控制循环次数。也可以用,EOF(),和,BOF(),来控制循环次数;,数据库程序设计的复杂性,3,、控制循环次数命令与移动记录指针命令是两个独立的命令,它们之间没有必然的联系,必须根据实际情况使它们相互配合,才能达到数据处理的目的,;,4,、记录指针从首记录移动到尾记录之后,不能自动恢复到首记录,必须用,GO TOP,命令把它移动到首记录,以便下一次处理。,课堂练习,:,下面是按学号查询学生情况的程序,并能多次查询,clear
25、,open database E:,学生管理,学生管理,use,学生,do while.t.,accept,请输入学生学号:,locate for,学号,=xh,IF EMPTY(XH),=messagebox(,查询结束!,0+48),EXIT,ENDIF,if found(),display,?,没有该学生!,endif,wait,还继续检索吗,(Y/N),?,to yn window,if lower(yn)=n,=messagebox(,谢谢使用本系统!,0+48),endif,ENDDO,close database,set talk on,return,to xh,else,exi
26、t,6.5,数组及其应用,概念,:,用一个名称来代表若干个内存变量,变量的引用通过在这组数中的位置序号实现,;,数组使用前需先定义,:,DIMENSION,数组名,(,下标,下标,2),数组定义时的每一个数组元素的初值为,.F.;,数组的引用,:,数组名,(,下标序号,),数组可以整体赋值,:=,此外,只能通过数组元素,(,下标变量,),来使用,.,数组与表之间的数据交换,1.,将表中当前记录的字段值赋予一个数组或者同名的内存变量,格式:,SCATTER FIELDS TO|MEMvar,例,1,:比较下面命令结果。,USE,学生,SCATTER memvar,USE,学生,SCATTER t
27、o,aa,建立内存变量,数组与表之间的数据交换,2,、将与表中字段同名的内存变量或者一个数组的值传送给当前记录,格式:,GATHER FROM|MEMvar FIELDS,例,2:,观察执行结果。,DIMENSION bb(3),bb(1)=0611010006,bb(2)=,刘一,bb(3)=,男“,GO 2,GATHER FROM BB,数组与表之间的数据交换,数组与表之间进行数据传递时,要注意以下问题:,1,、两者之间的传送顺序,2,、关于数据类型的规定,3,、两者之间个数不匹配时,按系统的有关规定。,4,、两者之间的传送是针对当前记录进行操作的。,数组与表之间的数据交换,例题:用,SC
28、ATTER,命令和,GATHER,命令实现“学生”表中首记录与尾记录之间的互换,(,表中有,6,个字段,),。,Dimension t1(6),Dimension t2(6),Open database,教学管理,Use,学生,Scatter to t1,&,将首记录各字段值传送至数组,t1,中,Go bottom,&,记录指针移到尾记录,Scatter to t2,&,将尾记录各字段值传送至数组,t2,中,Gather from t1,&,将首记录各字段值传送至尾记录中,Go top,&,记录指针移到首记录,Gather from t2,&,将尾记录各字段值传送至首记录中,List,Clos
29、e database,6.6,模块化程序设计,程序需要划分为不同的功能模块、或者需要重复使用的程序段,可以使用子程序。,子程序包括:过程和自定义函数。,两者在结构上有很多相同之处,区别在调用方法和编制目的上。,6.6.2,过程与自定义函数的用法,1,、,过程与过程文件,过程的存放位置:三种。,1.,单独放在一个,.PRG,文件中,(,外部过程,),;,2.,与主程序,(,调用程序,),放在一个文件中;,3.,若干个子程序放在一个过程文件中,(,内部过程,),。,第,1,种方式:过程的建立与命令文件相同,,第,2,、,3,种方式:,语句格式为:,PROCEDURE,过程名,RETURN,过程文件
30、的建立与命令文件类似,在过程文件中,多个过程放在一起。,调用过程文件中的过程时,需先打开过程文件。同一时刻最多只能打开一个过程文件。,打开过程文件:,SET PROCEDURE TO ,过程调用:,DO WITH ,关闭过程文件:,SET PROCEDURE TO,6.6.2,过程与自定义函数的用法,6.6.2,过程与自定义函数的用法,2,、自定义函数,与过程类似,区别有二:,1.,作用:函数是返回一个值,;,过程不返回值;,2.,调用方式,:,函数调用时实参放在括号中;过程调用时实参放在,WITH,子句中。,自定义函数的格式,:,FUNCTION,函数名,PARAMETERS,形式参数表,R
31、ETURN ,6.6.2,过程与自定义函数的用法,3,、,过程调用中的参数传递,过程,(,子程序,),仍是一段程序,也是由三种基本结构组成。但它有自己的特点,,主要体现在主程序与过程之间的数据交换方面。,以工厂加工产品为例:,工厂,(,主程序,),买进,原料,(,原始数据,),放入原料库,(,原始数据存储区,),命令,第,1,车间,(,过程,1),取来加工成半成品,(,中间数据,),存入,半成品库,(,中间数据存储区,),命令,第,n,车间,(,过程,n),取来加工成成品,(,结果数据存储区,),出售,(,结果数据输出,),带参数的调用语句,:,DO With ,参数语句,:,PARAMETE
32、RS,以上两条语句必须配合使用,前一条放在主程序中,后一条放在被调用的过程中。,参数传递方式:值传递,(,传值方式,),和引用传递,(,传址方式,),。,3,、过程调用中的参数传递,主程序调用本过程时传送给本过程的变量名或数组名。,传送给子过程的变量、常量、表达式、数组。,3,、过程调用中的参数传递,值传递,(,传值方式,),:,指调用程序将实际参数的备份传给形参,传递完毕,实参与形参就没有关系了。,引用传递,(,传址方式,),:,指调用程序将实际参数在内存中的地址传给被调用的过程,由形式参数接收,而形参也使用该地址。,在实参为变量时,可以是引用传递;且为缺省传递方式;其它方式的实参为值传递。
33、,*,过程:,YMJ.prg,PARAMETERS R,S,S=3.1416*R*R,RETURN,*,主程序,:,Y=0,INPUT,半径,=,TO X,DO YMJ WITH,Y,?,园面积,=,+str(Y,5,2),3,、过程调用中的参数传递,输入,5,,结果:,园面积,=78.54,例,1:,输入半径,计算圆面积。,引用传递过程,(,传址方式,):,在调用过程时,将,DO,语句中的实参数值传递给,PARAMETERS,语句中的形参,;,调用终止时,返回对应参数的计算值。,3,、过程调用中的参数传递,例,2,:给出程序执行结果。,*,MAIN.PRG,SET TALK OFF,A=5,
34、B=10,DO SUB WITH 2*A,B,?“A=”,A,“B=”,B,SET TALK ON,RETURN,*SUB.PRG,PARAMETRS X,Y,Y=X*Y,?“Y=”+STR(Y,3),RETURN,结果为,:,传值方式,传址方式,Y=100,A=5,B=100,3,、过程调用中的参数传递,例,3,:给出程序执行结果。,*,MAIN.PRG,SET TALK OFF,X=10,Y=5,SET PROC TO PROC1,DO P1 WITH,X,Y,?X,Y,X=10,Y=5,DO P2 WITH,X,Y,?X,Y,X=10,Y=5,DO P1 WITH,X+5,Y,?X,Y,
35、SET PROC TO,RETURN,*PROC1.PRG,PROCEDURE P1,PARAMETRS,S1,S2,S1=S1*5,S2=S2+5,RETURN,PROCEDURE P2,PARAMETRS,X,Y,X=5,Y=X+20,RETURN,结果为,:,50 10,5 25,15 10,6.6.2,过程与自定义函数的用法,过程的嵌套,VFP,中允许执行一个过程时,调用第二个过程,;,执行第二个过程时,调用第三个过程。这样一个接一个地调用下去,称为过程嵌套调用。系统允许这种嵌套最多,126,层。,主程序 过程,1,过程,2,.,.,.,DO,过程,1,DO,过程,2,DO,过程,3,
36、.,.,.,.,.,.,.,.,.,RETURN RETURN RETURN,课堂练习:写出下面程序执行结果。,*MAIN.PRG,X1=1,X2=3,DO P1 WITH X1,X2,?”X1=“+STR(X1,1),”X2=“+STR(X2,1),X1=2,X2=4,DO P1 WITH X1,X1+X2,?”X1=“+STR(X1,1),”X2=“+STR(X2,1),RETURN,*P1.PRG,PARAMETRS W1,W2,W1=W1*2,W2=W2*2,RETURN,6.6.3,内存变量的作用域,全局变量,在所有程序模块中都可以使用的变量。,在命令窗口中建立或用,PUBLIC,语
37、句定义;,私有变量,在建立它的过程及所调用的下层模块中有效,不能被更高层的程序模块访问。当他们所属的程序模块停止运行时,定义的变量将被释放。,语句格式:,PRIVATE,局部变量,(,本地变量,),只能在创建它们的程序模块中使用。当他们所属的程序模块停止运行时,定义的变量将被释放。,语句格式:,LOCAL,例,1,:写出程序执行结果,*,主程序,X=1,Y=2,Z=0,SET PROCEDURE TO E:,程序,GC,DO SUB1,M=X+Y+Z,SET PROCEDURE TO,?M,*,过程文件,(GC.PRG),PROCEDURE SUB1,PRIVATE X,Y,M,X=10,Y=
38、20,Z=30,M=X+Y+Z,?M,RETURN,执行结果:,60 33,打开过程文件,例,2,:写出程序执行结果,主程序,:,例,1.prg,set talk off,store 5 to a,b,c,do E:,学生管理,程序,SUB1,?a,b,c,?l,m,n,set talk on,return,过程:,SUB1.prg,private x,y,z,public l,m,store 2 to x,y,z,store 6 to l,m,n,l=x+y,x=y+z,y=m+n,?x,y,z,return,思考:该语句放在主程序中,运行结果是什么?,运行结果:,4 12 2,5 5 5,
39、4 6,例,3,:写出程序执行结果,主程序:例,2.prg,set talk off,public a,a=2,b=8,c=5,set procedure to d:,程序,sub2,do pro1,do pro2,?,返回主程序:,a,b,c=,a,b,c,set procedure to,Return,过程文件:,sub2.prg,procedure pro1,private c,a=a+1,b=2,c=3,?,“,PRO1,中:,a,b,c=,a,b,c,return,procedure pro2,private b,a=a+1,b=5,c=c+3,?,“,PRO2,中:,a,b,c=,
40、a,b,c,return,思考:若将,do pro2,语句放在此处,执行结果是什么,?,执行结果:,PRO1,中:,a,b,c=3 2 3,PRO2,中:,a,b,c=4 5 8,返回主程序:,a,b,c=4 2 8,课堂练习:写出下面程序执行结果。,*,主程序,(MAIN.PRG),clear,set talk off,public i,j,i=1,set procedure to d:,程序,sub,do proc1,?i=+str(i,2),j=1,k=1,do proc2,?j=+str(j,2),?k=+str(k,2),set procedure to,return,*,过程文件,(SUB.PRG),procedure proc1,i=i*2+1,return,procedure proc2,private j,j=i*2+1,k=k*2+1,do proc3,return,procedure proc3,k=k*k,return,结果为:,i=3,J=1,K=9,