第6章程序设计基础6.1程序与程序文件交互工作方式,要求用户必须比较熟悉数据库知识,了解数据组织结构,如果要同时对数据表格多次进行某些操作,就必须反复拟行相关命令,这些命令不被保存,当退出VisualFoxPro系统环镜或计算机断电后,就荡然无存了,对于使用大量数据的最终用户来说,直接使用交互方式管理数据是不现实的。因此,要建立真正的管理信息系统必须编制程序。6.1.1程序的建立与编辑创建程序:(1)在“文件”菜单中选择“新建”命令(或工具栏中“新建”按钮),然后在“新建”对话框中选择“程序”单选按钮,再单击“新建文件”按钮。(2)命令窗口中,键入命令:MODIFYCOMMAND[文件名[扩展名]]保存程序(1)从“文件”菜单中选取“保存”命令(2)按“CTRL+W”组合键。编辑程序(1)在“文件”菜单中选择“打开”命令(2)命令窗口中:MODIFYCOMMAND程序文件名程序的书写规则(1)注释语句格式:①NOTE注释内容②*注释内容③&&注释内容对话开关语句格式:SETTALKOFF|ON输出语句格式:?[表达式列表]格式:??[表达式列表]命令的分行每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,并在分行处加上续行符“;”。6.1.2程序文件的运行单击“程序”菜单中的“运行”命令,在打开的运行对话框中找到要执行的程序文件,单击“运行”按钮。单击常用工具栏上的“运行”按钮。在命令窗口中键入命令:DO程序文件名程序文件名前可以使用路径,否则指系统默认目录。若运行的是.PRG程序则扩展名可以省略。若运行其他的程序则扩展名不能省;6.1.3基本输入与输出语句1.ACCEPT命令格式:ACCEPT[提示信息]TO内存变量INPUT命令格式:INPUT[提示信息]TO内存变量WAIT命令格式:WAIT[提示信息][TO内存变量][WINDOW[AT行,列]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT数值表达式]三条输入命令的异同ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键;INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据6.2程序的基本结构求解的基本逻辑:VFP程序多数用于数据处理,解决问题的基本逻辑是:输入数据→处理数据→输出数据。程序的通用性:程序的通用性指程序对多种场合的适应性,通用性好的程序的应用范围较广。6.2.1顺序结构顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。例题:将学生表中学号为20050008,其姓名一栏由万华改为万强。CLEARSETTALKOFFOPENDATABASE学生学籍USE学生ACCEPT“请输入要修改记录的学号:”toxhLOCATEFOR学号=xhREPLACE姓名WITH“万强”USECLOSEDATABASESETTALKONRETURN6.2.2选择结构单向选择单向选择语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。(1)语句格式:IF〈条件表达式〉〈语句序列〉ENDIF(2)单向条件转向语句的流程图条件式达式真语句序列假ENDIF之后语句双向选择双向选择语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。(1)语句格式:IF〈条件表达式〉〈语句序列1〉ELSE〈语句序列2〉ENDIF(2)双向条件转向语句的流程图如图多向选择多向选择语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行。(1)语句格式:DOCASECASE〈条件表达式1〉命令行序列1CASE〈条件表达式2命令行序列2……CASE〈条件表达式N命令行序列N〉[OTHERWISE命令行序列N+1]ENDCASE真条件式2语句序列1ENDCASE后面语句条件式n-1Otherwise条件式1真语句序列2真语句序列n-1有语句序列n无IIF()判断选择函数VFP中有一个函数,它能够先进行条件判断,然后决定返回其值。它的使用效果比分支语句更快捷。格式:IIF(<条件表达式>,<表达式1>,<表达式2>使用分支语句应注意的几点①IF……ENDIF和DOCASE……ENDCASE必须配对使用,DOCASE与第一个CASE〈条件表达式〉之间不应有任何命令。②条件表达式可以是各种表达式或函数的组合,其值必须是逻辑值。③命令行序列可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。6.2.3循环结构1.DOWHILE循环语句格式:DOWHILE条件表达式语句序列ENDDOENDDO后面的语句条件表达式式真循环体假【例6-9】编程求2+4+6+……+100之和。SETTALKOFFCLEARS=0I=2DOWHILEI=100S=S+II=I+2ENDDO?“2+4+6+……+100=”,SSETTALKONRETURN【例6-11】显示学生表中在1985年以后出生的学生记录。SETTALKOFFCLEAROPENDATABASE学生学籍USE学生DOWHILE.NOT.EOF()IF出生日期=CTOD(“1985-01-01”)DISPLAYENDIFSKIPENDDOUSECLOSEDATABASERETURN【例6-12】将前N个自然数中的完全平方数进行累加,当累加之和超过100时停止累加。要求程序显示每次的累加和。SETTALKOFFCLEARSTORE0TOI,MDOWHILE.T.IFM100EXITELSEM=M+I^2ENDIF?”完全平方数累加和:”+STR(M,6)I=I+1ENDDOSETTALKON2.FOR循环语句语句格式:FOR循环变量=初值TO终值[STEP步长]循环体ENDFOR|NEXT使用FOR循环语句的有关说明:(1)省略STEP步长,则〈步长〉为默认值1;(2)〈初值〉、〈终值〉和〈步长〉都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数;(3)可以在循环体内改变循环变量的值,但会改变循环执行次数;(4)EXIT和LOOP命令可以出现在循环体内【例6-13】求1000之内所有偶数之和。SETTALKOFFCLEARS=0FORI=0TO1000STEP2S=S+INEXT?“1000之内所有偶数之和为”,SSETTALKONRETURN【例6-14】从键盘输入10个数,编程找出其中的最大值和最小值。SETTALKOFFCLEARINPUT“请从键盘输入一个数:”TOASTOREATOMAX,MINFORI=2TO10INPUT“请从键盘输入一个数:”TOAIFMAXAMAX=AENDIFIFMINAMIN=AENDIFENDFOR?“最大值为:”,MAX?“最小值为:”,MINSETTALKONRETURN3.“指针”型循环控制语句(1)语句格式:SCAN[范围][FOR条件表达式1][WHILE条件表达式2]命令行序列ENDSCAN(2)语句功能:该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式1〉或〈条件表达式2〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。【例6-17】显示“学生”表中入学成绩在600分以上的学生名单。SETTALKOFFCLEAROPENDATABASE学生学籍USE学生SCANFOR入学成绩600DISPLAY学号,姓名,入学成绩ENDSCANUSECLOSEDATABASESETTALKONRETURN6.3多模块程序6.3.1主程序与子程序这些可独立存在并可整体调用的命令语句组合称为子程序。一个应用程序通常都是由一个主程序和若干个子程序组成。子程序的建立方法与程序文件的建立方法相同,扩展名为.PRG。调用子程序语句,即执行已有的子程序语句格式:DO〈文件名〉WITH参数表语句功能:执行以〈文件名〉为名的子程序。子程序返回语句,即返回子程序的调用处。语句格式:RETURN[TOMASTER|TO〈表达式〉语句功能:将控制返回到调用程序中调用命令的下一语句【例6-18】输入一个半径R值,求出圆的面积。*****MAIN.PRG********主程序*****YMJ=0INPUT“请输入圆的半径”TOBJDOZGCWITHBJ,YMJ?“圆的面积=”,YMJRETURN***子程序***ZGC.PRG***PARAMETERSR,SS=PI()*R*RRETURN6.3.2过程与过程文件过程文件把一个子程序作为一个“过程”放入过程文件中。一个过程文件中可以包含一个或多个“过程”,一旦打开过程文件,主程序便可以随心所欲地调用其中的若干“过程。1.过程文件的建立VisualFoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。其格式为:PROCEDURE过程名命令序列[RETURN[表达式]]2.过程文件的调用调用过程文件之前必须要打开过程文件。调用结束后要关闭过程文件。过程文件的打开:SETPROCEDURETO过程文件名过程文件的关闭:SETPROCEDURETO或CLOSEPROCEDURE【例6-19】用过程编写一个求和与乘积的程序。SETTALKOFFS=1P=1DOBB?”S=”,SSETTALKONRETURNPROCEDUREBBM=3N=5S=M+NP=S*N?”P=”,PENDPROCEDURE6.3.3参数传递程序之间的参数传递可以通过两种途径进行:一是通过带参数的程序调用来实现,二是通过内存变量来实现。传递参数命令格式:DO文件名WITH参数表达式列表接收参数命令格式:PARAMETERS变量列表【例6-20】用带参数的过程计算圆面积。SETTALKOFFMJ=0INPUT“请输入半径”TOBJDOSUB1WITHBJ,YMJ?“圆的面积=”,YMJRETURNPROCEDURESUB1PARAMETERSR,SS=PI()*R*RENDPROC6.3.4自定义函数用户自己创建的函数称为自定义函数。自定义函数和过程一样,可以以独立的程序文件形式单独存储在磁盘上,也可以放在过程文件或直接放在程序文件中自定义函数具有如下语法结构:FUNCTION函数名PARAMETER参数表函数体命令序列RETURN表达式【例6-21】计算圆面积SETTALKOFFCLEARINPUT“请输入圆的半径:”TOR?“圆的面积为:”,AREA®SETTALKONFUNCTIONAREAPARAMETERXRETURN(3.1416*X**2)6.4程序调试程序调试工具的操作步骤如下:在主菜单下,打开“工具”菜单,选择“调试器”,进入“调试器”窗口。在“调试器”窗口,打开“工具”菜单,在选择“断点”,进入“断点”对话框。在“调试器”窗口,打开“窗口”菜单,选择“监视”,进入“监视”对话框,可以监视程序执行时的内存变量、表达式、记录指针或监控变量的值。在“调试器”窗口,选择“跟踪”,进入“跟踪”对话框,可以监视程序的运行过程。