m程序设计 第7讲子程序、过程、自定义函数 桑角染 FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 1 FoxPro程序设计 第7讲 子程序、过程、自定义函数
ah程序设计 学生管理系统程序 学生管理系统 主程序 子程序 数据录入 数据维护 数据查询 打印报表 子程序 按学号查询 按姓名查询 按组合条件查询 子程序 主程序调用子程程序,子程又调子程,嵌套最多3层 FoxproForWindowshttp://cc.synu.edu.cn 2
FoxPro For Windows http://cc.synu.edu.cn 2 FoxPro程序设计 学生管理系统程序 数据录入 数据维护 按学号查询 按姓名查询 按组合条件查询 数据查询 打印报表 学生管理系统 主程序 子程序 子程序 主程序调用子程程序,子程又调子程,嵌套最多32层。 子程序
m程序设计 子程序 子程序的建立: 主程序 MoD|coMM(*·prg) 子程序1 子程序2 子程序返回主程序的命令: RETURN ITO MASTERI 子程序3 子程序调用 DoWTH] FoxproForWindowshttp://cc.synu.edu.cn 3
FoxPro For Windows http://cc.synu.edu.cn 3 FoxPro程序设计 子程序 子程序的建立: MODI COMM (*.prg) 子程序返回主程序的命令: RETURN [TO MASTER] 子程序调用: DO [WITH] 主程序 子程序1 子程序3 子程序2
m程序设计 【例】现有一个主程序MAN和二个子程序SUB1PRG和SUB2PRG *MAIN PRG *SUB1.PRG ?####1 ?$$$$1 ####1 DO SUB1 RETURN ###2 ?####2 $$$$2 DO SUB2 SUB2.PRG ####3 ?####3 ?"$$$$2 RETURN RETURN 复杂的信息管理系统,通常由主程序调用若干子程序完成。 子程序都是以文件方式独立存盘的,调用时读入內存,因此影 响运行速度。有没有更好的办法呢? FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 4 FoxPro程序设计 【例】现有一个主程序MAIN和二个子程序SUB1.PRG和SUB2.PRG. *MAIN.PRG ? '# # # #1' DO SUB1 ? '# # # #2' DO SUB2 ? '# # # #3' RETURN 复杂的信息管理系统,通常由主程序调用若干子程序完成。 子程序都是以文件方式独立存盘的,调用时读入内存,因此影 响运行速度。有没有更好的办法呢? *SUB1.PRG ? '$ $ $ $1‘ RETURN *SUB2.PRG ? '$ $ $ $2‘ RETURN # # # #1 $ $ $ $1 # # # #2 $ $ $ $2 # # # #3
m程序设计 过程与过程文件 过程文件:把一个个分散的子程序组合成一个大的文件。 执行时,用打开过程文件命令一次调入内存 过程:过程文件中的每一个子程序叫做一个过程。 1.过程的定义 PROCEDURE [ PARAMETERS RETURN 说明: 过程与子程序的区别就在于过程是以 PROCEDURE命令开头。 过程名字母、下划线,<=10字符。 过程文件由一个或多个过程组成,并放于扩展名prg的磁盘文件中 过程文件中各个过程的排列顺序任意。 FoxproForWindowshttp://cc.synu.edu.cn 5
FoxPro For Windows http://cc.synu.edu.cn 5 FoxPro程序设计 过程文件: 把一个个分散的子程序组合成一个大的文件。 执行时,用打开过程文件命令一次调入内存。 过 程: 过程文件中的每一个子程序叫做一个过程。 过程与过程文件 1.过程的定义 PROCEDURE [PARAMETERS ] RETURN 说明: •过程与子程序的区别就在于过程是以PROCEDURE命令开头。 •过程名字母、下划线,<=10字符。 •过程文件由一个或多个过程组成,并放于扩展名.prg的磁盘文件中。 •过程文件中各个过程的排列顺序任意
m程序设计 2.过程调用 必须先打开过程文件,才可以调用过程文件中的过程。 打开过程文件: SET PROCDURE TO【过程文件名>] 调用过程 Do[TH &&实际参数 关闭过程文件:主程结束前必须关闭过程文件 SET PROCDURE TO CLOSE PROCEDURE FoxproForWindowshttp://cc.synu.edu.cn 6
FoxPro For Windows http://cc.synu.edu.cn 6 FoxPro程序设计 2.过程调用 必须先打开过程文件,才可以调用过程文件中的过程。 打开过程文件: SET PROCDURE TO [] 调 用 过 程: DO [WITH ] &&实际参数 关闭过程文件:主程结束前必须关闭过程文件 SET PROCDURE TO CLOSE PROCEDURE
m程序设计 【例531】调用过程文件 *主程序Main,prg 过程文件[ gcW. prg set talk off proc gc1 clear ?这是过程1,过程名为gc1 ?‘这是主程序! retu set proc to gci do gc1 proc gc2 do gc2 ?这是过程2,过程名为gc2 close proc retu retu 程序执行后的显示结果:这是主程序! 这是过程1,过程名为gc1 这是过程2,过程名为gc2 FoxproForWindowshttp://cc.synu.edu.cn 7
FoxPro For Windows http://cc.synu.edu.cn 7 FoxPro程序设计 【例5.31】调用过程文件 *主程序Main.prg *过程文件[gcwj.prg] set talk off proc gc1 clear ? '这是过程1,过程名为gc1' ? ‘这是主程序!’ retu set proc to gcwj do gc1 proc gc2 do gc2 ? '这是过程2,过程名为gc2' close proc retu retu 这是主程序! 这是过程1,过程名为gc1 这是过程2,过程名为gc2 程序执行后的显示结果:
m程序设计 3.参数传递 只有定义过程时先定义参数,过程调用时才可向被调用过程传递参数 参数定义: PARAMETERS] 说明: PARAMETERS语句必须是 PROCEDURE语句后第一个可执行语句。 参数表中可以包括1至24个参数,各参数间用逗号隔开 带参调用的命令: DoTH] 说明: PARA后的参数叫形式参数(形参); DOWⅥTH中的参数叫实际参数(实参) ·形参和实参按顺序一一对应,类型相同,可以是常量、变量,表达式 传递时是将计算后的实参值传递给形参。 FoxproForWindowshttp://cc.synu.edu.cn
FoxPro For Windows http://cc.synu.edu.cn 8 FoxPro程序设计 3.参数传递 只有定义过程时先定义参数,过程调用时才可向被调用过程传递参数。 说明: • PARA后的参数叫形式参数(形参); • DO…WITH中的参数叫实际参数(实参)。 • 形参和实参按顺序一 一对应,类型相同,可以是常量、变量,表达式。 • 传递时是将计算后的实参值传递给形参。 参数定义: [PARAMETERS ] 带参调用的命令: DO [WITH ] 说明: •PARAMETERS 语句必须是PROCEDURE语句后第一个可执行语句。 •参数表中可以包括1至24个参数,各参数间用逗号隔开
m程序设计 【例5.32】编写把输入的汉字串按每字一行的形式输出的程序。 *主程序 MAIN.PRG SET TALK OFF SET PROC TO PROTEST &&打开过程文件 ACCEPT'请输入一个汉字串:" TO str DO Vertica WITH str &&带参Str调用过程 vertica SET PROC TO &关闭过程文件 SET TALK ON RETURN *过程文件 PROTESTPRG PROC Vertica 8&定义过程: vertica PARAS &&定义形参s start=1 slen=LENs DO WHILE Start slen SUBS(S, start, 2) start=start+2 ENDDO RETURN &&返回到调用程序 FoxproForWindowshttp://cc.synu.edu.cn 9
FoxPro For Windows http://cc.synu.edu.cn 9 FoxPro程序设计 【例5.32】 编写把输入的汉字串按每字一行的形式输出的程序。 ***主程序MAIN.PRG SET TALK OFF SET PROC TO PROTEST &&打开过程文件 ACCEPT "请输入一个汉字串:" TO str DO Vertica WITH str &&带参Str调用过程vertica SET PROC TO &&关闭过程文件 SET TALK ON RETURN ***过程文件PROTEST.PRG PROC Vertica &&定义过程:vertica PARA s &&定义形参 s start=1 slen=LEN(s) DO WHILE start < slen ? SUBS(s,start,2) start=start+2 ENDDO RETURN &&返回到调用程序
m程序设计 【例5.33】调用过程文件,计算圆的面积并输出 主程序 MJ. PRG SET TALK OFF SET PROC TO YMJ s=0 INPUT"请输入圆的半径:Tor DO S1 WITHSr &&带参s,r调用过程S1 DO S2 SET PROC TO SET TALK ON RETURN *过程文件 YMJ PRG &过程文件名: YMJ. PRG PROC S1 8&过程名:S1 PARAMETERS Xr x=3.14159*rr 定义形一x RETURN PROC S2 8&过程名:S2 RETURN FoxproForWindowshttp://cc.synu.edu.cn 10
FoxPro For Windows http://cc.synu.edu.cn 10 FoxPro程序设计 【例5.33】调用过程文件,计算圆的面积并输出。 *主程序MJ.PRG SET TALK OFF SET PROC TO YMJ s=0 INPUT "请输入圆的半径:" TO r DO S1 WITH s,r &&带参 s,r 调用过程S1 DO S2 SET PROC TO SET TALK ON RETURN **过程文件YMJ.PRG &&过程文件名:YMJ.PRG PROC S1 &&过程名:S1 PARAMETERS x,r &&定义形参 s x x=3.14159*r*r r r RETURN PROC S2 &&过程名:S2 ? s RETURN