4.3多模块程序模块是可以命名的一个程序段,可指主程序、子程序和自定义函数4.3.1子程序一、调用与返回两个具有调用关系的程序文件,称调用程序为主程序,被调用程序为子程序主程序遇到DO命令,转向子程序执行,称为调用程子程序。子程序执行到RETURN语句(或缺省该语句),返回到主程序中的DO命令的下一个语句执行,称为返回主程序[P138例4-13]主程序ymj=0@5,10say请输入半径:getbjdefault0readdojswithbj,ymj?ymj=,ymjreturn子程序,名为js.prgparametersr,ss=PI()*r*r&&PI()系统函数,s的值送给参变量ymjreturn二、带参数子程序的调用和返回主程序中,用DO命令带一个WITH子句来传递参数DO程序名1[WITH参数表][IN程序名2]相对应的在子程序中,用PARAMETERS来接收和回送参数。PARAMETERS参数表可以是表达方式,内存变量必须赋初值当程序名1是程序名2中的一个过程时,必须指明1、该语句应为子程序的第一条命令,2、PARAMETERS参数应与WITH参数一一对应三、子程序嵌套子程序还可以调用其它子程序(嵌套),因嵌套引出多两种返回方式RETURN[TOMASTER|TO程序名]任何时候要推出VFP,只要执行QUIT命令返回最外层主程序强制返回指定程序省略,返回外层调用程序ReturntomasterReturnsub1Returntosub14.3.2自定义函数一、自定义函数的建立[FUNCTION函数名][PATAMETERS参数表]语句序列[RETURN表达式]使用它表示该函数包含在调用程序中,缺省则函数为一个独立文件函数体用于返回表达式的函数值,省略则返回.T.自定义函数不能和系统函数、内存变量同名,使用方法与系统函数相同[P139例4-14]解法二*例4-14解法二clear@5,10say一次项系数:getadefault1@7,10say常数项:getbdefault0read?x:,root(a,b)functionrootparametersu,vreturniif(u=0,无解,-v/u)IIF系统函数,若u=0,值为“无解”;否则为-v/u二、数组参数的传递发送参数数组前加@,接收参数数组不需定义。*例4-14数组传送,P140cleardimensionfs(2)fs(1)=1fs(2)=0@5,10say一次项系数:getfs(1)@7,10say常数项:getfs(2)read?x:,root(@fs)&&树组前加@可传递数组functionrootparametersjs&&js(1)=fs(1),js(2)=fs(2)returniif(js(1)=0,无解,-js(2)/js(1))4.3.3过程VFP准许一个.PRG文件中设置多个程序模块,除主程序以外每个模块为一个过程过程的格式如下:PROCEDURE过程名[PARAMETERS参数表]命令序列[RETURN]过程部分往往位于程序文件的最后.[P141例4-15]setdecimalsto2&&设置小数点后保留两位ymj=0@5,10say请输入半径:getbjdefault0readdojswithbj,ymj?ymj=,ymjreturnprocedurejsparametersr,ss=pi()*r*rreturn过程在另一个程序文件中时,需使用带IN的DO命令来调用[P141例4-16]主程序文件ymj=0@5,10say请输入半径:getbjdefault0readdojswithbj,ymjinjs1&&调用过程文件js1中的过程js?ymj=,ymjreturn过程文件procedurejsparametersr,ss=pi()*r*rreturn4.3.4变量的作用域以变量的作用域来分,内存变量分为:公共变量、私有变量和本地变量一、公共变量公共变量是在一个程序中的任何模块都可以使用的变量,建立命令格式PUBLIC公共变量表需定义为公共变量的变量:下层模块建立的变量要供上层使用,某模块建立的变量要供并列模块使用VFP命令窗口定义的变量均为公共变量,公共变量必须用命令(RELEASE或CLEAR)来清除建立的同时,赋初值为.F.二、私有变量私有变量仅在定义它的模块及其下层模块中使用,定义它的模块运行结束自动清除私有变量准许与上层模块的变量同名,同名时屏蔽上层模块的变量.本模块运行结束再恢复上层模块变量私有变量类型声明格式如下:PRIVATE[内存变量表][ALL[LIKE|EXCEPT通配符]]私有变量不赋初值.注意:PARAMETERS声明的参变量也是私有变量[P142例4-17]parameterssjprivatemjmj=3.14*sj*sj?程序执行时的变量清单listmemolike?jreturn在命令窗口输入:mj=0bj=3doe4_17withbj观察输出情况,解释三、本地变量本地变量只能在建立它的模块使用,该模块运行结束自动清除命令格式:LOCAL内存变量表注意:LOCAL不可缩写例E4_bl内存变量表指定的变量为本地变量,并赋初值.F.信息对话框函数语法:MESSAGEBOX(提示信息[,对话框类型[,对话框标题]])如:MESSAGEBOX(请重新输入,64,信息)例4_244.3.5程序调试方法一.调试的概念程序调试的目的:检查并纠正程序中的错误,以保证程序的可靠运行程序调试的步骤:检查程序是否存在错误确定出错位置纠正错误1、程序中常见的错误(1)语法错误,例:数据类型不匹配(2)超出系统准许范围错误,例:文件太大(3)逻辑错误,例:计算逻辑错误2、查错技术查错技术一:静态检查,通过阅读程序,找出错误查错技术二:动态检查,通过执行程序考察程序是否有错(1)设置断点在断点处查看中间结果,考察程序是否有错(2)单步执行一次执行一个命令,相当于断点设在每条指令之后(3)跟踪在程序执行过程中,跟踪某些信息的变化,以确定程序序是否有错(4)设置错误陷阱通过错误陷阱捕捉可能发生的错误。可通过ONERROR语句设置陷阱4.3.6结构化程序设计[P147例4-19]结构化设计的三种方法(1)自顶向下,逐步求精从整体出发,逐层分解,使复杂的问题简单化(2)模块化将系统分解为若干功能相关而又相对独立的模块(3)层次化系统按层次结构布局,即以树型结构来组织系统的全部模块