资源预览内容
第1页 / 共81页
第2页 / 共81页
第3页 / 共81页
第4页 / 共81页
第5页 / 共81页
第6页 / 共81页
第7页 / 共81页
第8页 / 共81页
第9页 / 共81页
第10页 / 共81页
亲,该文档总共81页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
前页 后页 首页第第6 6章章 结构化程序设计结构化程序设计q 6.1 6.1 程序文件程序文件q 6.2 6.2 程序控制结构程序控制结构q 6.3 6.3 过程与过程调用过程与过程调用q 6.4 6.4 程序的调试程序的调试提示:单击各个标题前的动画符号“ ” ,链接到相应的章节。-1-Visual FoxPro 6.0 程序设计.课件前页 后页 首页q在程序设计的方法中,结构化程序设计是程序设在程序设计的方法中,结构化程序设计是程序设计的基本方法。结构化程序设计的基本思想是逐计的基本方法。结构化程序设计的基本思想是逐步求精、模块化和自顶向下,将一个复杂的程序步求精、模块化和自顶向下,将一个复杂的程序系统的设计任务分成多个易于控制和处理的子任系统的设计任务分成多个易于控制和处理的子任务,每个子任务都是可独立编程的子程序、过程务,每个子任务都是可独立编程的子程序、过程或函数模块。其程序控制结构有顺序结构、分支或函数模块。其程序控制结构有顺序结构、分支结构和循环结构三种。结构和循环结构三种。 2Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.1 6.1 程序文件程序文件q 6.1.1 6.1.1 程序文件建立程序文件建立q 6.1.2 6.1.2 简单的交互方式输入输出命令简单的交互方式输入输出命令q 6.1.3 6.1.3 应用程序的调试与执行应用程序的调试与执行-3-Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.1 程序文件q前面已经介绍了前面已经介绍了Visual FoxProVisual FoxPro的交互式操作方式:菜单的交互式操作方式:菜单操作方式和命令操作方式。这两种方式对于需要大量重操作方式和命令操作方式。这两种方式对于需要大量重复操作的数据库管理工作来说,效率低下;而且这两种复操作的数据库管理工作来说,效率低下;而且这两种方式都要求用户熟练掌握方式都要求用户熟练掌握Visual FoxProVisual FoxPro中的各种数据操中的各种数据操作,这在实际应用环境中并不现实。因此,作,这在实际应用环境中并不现实。因此,Visual Visual FoxProFoxPro提供了程序文件方式来管理数据库,即通过程序提供了程序文件方式来管理数据库,即通过程序文件编辑工具,将数据库操作的命令、函数等编制成一文件编辑工具,将数据库操作的命令、函数等编制成一个有序序列存放在程序文件中,然后通过菜单操作方式个有序序列存放在程序文件中,然后通过菜单操作方式或命令操作方式运行该程序文件,即可完成相应的一系或命令操作方式运行该程序文件,即可完成相应的一系列操作,程序文件的扩展名为列操作,程序文件的扩展名为.PRG.PRG。4Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.1.1 程序文件的建立qVisual FoxProVisual FoxPro中编写的代码都存放在纯文本格式的文件中,中编写的代码都存放在纯文本格式的文件中,因此任何可以建立、编辑文本文件的工具都可以创建和编辑因此任何可以建立、编辑文本文件的工具都可以创建和编辑Visual FoxProVisual FoxPro程序文件,通常使用的是程序文件,通常使用的是Visual FoxProVisual FoxPro提供的提供的内部编辑器。程序文件建立的方法有多种,常用的有下列内部编辑器。程序文件建立的方法有多种,常用的有下列3 3种种方法。方法。1.1.菜单方式菜单方式q单击单击“文件文件”|“|“新建新建”命令,在弹出的命令,在弹出的“新建新建”对话框中,对话框中,选择文件类型为选择文件类型为“程序程序”,然后单击,然后单击“新建文件新建文件”按钮,即可按钮,即可打开如图所示的程序编辑窗口。打开如图所示的程序编辑窗口。q在编辑窗口中可以逐条输入命令,程序文件建立好后,可以单在编辑窗口中可以逐条输入命令,程序文件建立好后,可以单击击“文件文件”“保存保存”命令来保存该程序文件。命令来保存该程序文件。5Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.项目管理器方式项目管理器方式(1)(1)单击单击“文件文件”|“|“新建新建”命令,在弹出的命令,在弹出的“新建新建”对话框中,对话框中,选择文件类型为选择文件类型为“项目项目”,然后单击,然后单击“新建文件新建文件”按钮,在打按钮,在打开的开的“创建创建”对话框中输入项目文件名后,单击对话框中输入项目文件名后,单击“保存保存”按钮,按钮,即可打开即可打开“项目管理器项目管理器”对话框。对话框。(2)(2)在在“项目管理器项目管理器”对话框的对话框的“全部全部”选项卡中,单击选项卡中,单击“代码代码”前的前的“+”+”号展开号展开“代码代码”文件夹,选择文件夹,选择“程序程序”选项,然选项,然后单击后单击“新建新建”按钮,如图所示,也可打开程序编辑窗口。按钮,如图所示,也可打开程序编辑窗口。6Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.3.命令方式命令方式q命令格式如下:命令格式如下: MODIFY COMMAND MODIFY COMMAND q在命令窗口中输入该命令后,也会打开程序编辑窗口。在命令窗口中输入该命令后,也会打开程序编辑窗口。q其中各参数的说明如下:其中各参数的说明如下:q如果命令中给出如果命令中给出 ,若该文件不存在,则打开,若该文件不存在,则打开以该文件名为标题的程序编辑窗口;若该文件已存在,以该文件名为标题的程序编辑窗口;若该文件已存在,则在程序编辑窗口中打开该文件,可以重新进行编辑修则在程序编辑窗口中打开该文件,可以重新进行编辑修改。改。q如果命令中缺省如果命令中缺省 ,则会打开默认以,则会打开默认以“程序程序1”1”、“程序程序2”2”为标题的程序编辑窗口,在保存时,用为标题的程序编辑窗口,在保存时,用户应重新为程序文件命名。户应重新为程序文件命名。q若若 中未给出包含盘符和路径的绝对路径,默中未给出包含盘符和路径的绝对路径,默认保存在当前文件中;认保存在当前文件中; 中可以缺省程序文中可以缺省程序文件的扩展名,系统会自动加上扩展名件的扩展名,系统会自动加上扩展名.PRG.PRG。7Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.1.2 简单的交互方式输入输出命令 在程序的执行过程中,经常需要从键盘输入数据,或将运行在程序的执行过程中,经常需要从键盘输入数据,或将运行结果在屏幕上显示出来,这就需要在程序设计中使用到交互式结果在屏幕上显示出来,这就需要在程序设计中使用到交互式的输入输出命令。的输入输出命令。1.1.输入单字符命令输入单字符命令q输入单字符命令的格式如下:输入单字符命令的格式如下: WAIT WAIT TO TO q其中各参数的说明如下:其中各参数的说明如下:表示在等待用户输入时,在屏幕上显示的提示表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。若省略该项,屏幕为定界符括起来,也可以是字符串变量。若省略该项,屏幕上显示的是系统默认的提示信息上显示的是系统默认的提示信息“按任意键继续按任意键继续”。TO TO 表示将输入的单个字符赋给内存变量。输表示将输入的单个字符赋给内存变量。输入字符时,不需输入字符的定界符,否则内存变量得到的是入字符时,不需输入字符的定界符,否则内存变量得到的是第一个定界符;若未输入字符就按回车键或单击鼠标,则内第一个定界符;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。存变量得到空值。若省略该项,则输入的字符不能保留。q注意:该命令一般只是为了显示提示信息,等待用户按任意键注意:该命令一般只是为了显示提示信息,等待用户按任意键后继续执行。后继续执行。8Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.输入字符串命令输入字符串命令q输入字符串命令的格式如下:输入字符串命令的格式如下:ACCEPT ACCEPT TO TO q其中各参数的说明如下:其中各参数的说明如下:表示在等待用户输入时,在屏幕上显示的提表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。号作为定界符括起来,也可以是字符串变量。TO TO 表示将输入的字符串赋给内存变量。输入字表示将输入的字符串赋给内存变量。输入字符串时,不需输入字符串的定界符,否则定界符也会作为符串时,不需输入字符串的定界符,否则定界符也会作为字符串的一部分被赋给内存变量;若未输入字符就按回车字符串的一部分被赋给内存变量;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。入的字符不能保留。 【例例6-16-1】编写程序文件编写程序文件prog.prgprog.prg,要求根据键盘输入的学生,要求根据键盘输入的学生姓名,显示该学生的学生信息。姓名,显示该学生的学生信息。q分析:要在表中查询满足条件的记录,首先应打开该表,根据分析:要在表中查询满足条件的记录,首先应打开该表,根据题目要求,本题应先打开的是学生信息表题目要求,本题应先打开的是学生信息表studentstudent,再用,再用ACCEPTACCEPT命令将所输入的学生姓名存放到内存变量中,再根据该命令将所输入的学生姓名存放到内存变量中,再根据该值在表中进行查询并显示,所有操作结束后应关闭该表。值在表中进行查询并显示,所有操作结束后应关闭该表。9Visual FoxPro 6.0 程序设计.课件前页 后页 首页q 程序编辑窗口的输入如图程序编辑窗口的输入如图6-36-3所示,运行时在屏幕中输所示,运行时在屏幕中输入入“王燕燕王燕燕”,结果如图,结果如图6-46-4所示。所示。图6-3 程序编辑窗口的输入图6-4 结果显示10Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.3.输入任意数据命令输入任意数据命令q输入任意数据命令的格式如下:输入任意数据命令的格式如下:INPUT INPUT TO TO q其中各参数的说明如下:其中各参数的说明如下:表示在等待用户输入时,在屏幕上显示表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。号或方括号作为定界符括起来,也可以是字符串变量。TO TO 表示将输入的数据赋给内存变量。表示将输入的数据赋给内存变量。INPUTINPUT命令可以接受字符型、数值型、逻辑型、日期型命令可以接受字符型、数值型、逻辑型、日期型和日期时间型数据,可以接受常量、变量或一般表达和日期时间型数据,可以接受常量、变量或一般表达式。数值型常量可直接输入,字符型常量必须加定界式。数值型常量可直接输入,字符型常量必须加定界符,逻辑型常量必须加圆点定界符(如符,逻辑型常量必须加圆点定界符(如.T.T.或或.F.F.),),日期型和日期时间型常量既可按严格格式输入,也可日期型和日期时间型常量既可按严格格式输入,也可利用相应的转换函数输入(如利用相应的转换函数输入(如2008/5/272008/5/27、2008-2008-5-27 11:14:20a5-27 11:14:20a、CTOD(05-27-08)CTOD(05-27-08)、CTOT(05-27-CTOT(05-27-08 11:14:20a)08 11:14:20a))。若未输入直接按回车键,屏幕会)。若未输入直接按回车键,屏幕会继续显示提示信息等待输入。继续显示提示信息等待输入。11Visual FoxPro 6.0 程序设计.课件前页 后页 首页4.4.非格式输出命令非格式输出命令q该命令的格式如下:该命令的格式如下: ?|? ?|? q该命令的功能是在该命令的功能是在Visual FoxProVisual FoxPro的主窗口中换行或不换的主窗口中换行或不换行输出行输出 中各个表达式的值,其中,中各个表达式的值,其中,? ?表示换表示换行输出,即行输出,即 中各个表达式的值在当前主窗中各个表达式的值在当前主窗口中最后一次输出位置的下一行输出;口中最后一次输出位置的下一行输出;?表示不换行输表示不换行输出,即出,即 中各个表达式的值在当前主窗口中中各个表达式的值在当前主窗口中最后一次输出位置后直接输出,并不换行。最后一次输出位置后直接输出,并不换行。12Visual FoxPro 6.0 程序设计.课件前页 后页 首页5.5.格式输入输出命令格式输入输出命令q该命令格式如下:该命令格式如下: SAY SAY GET GET READREADq其中各参数的说明如下:其中各参数的说明如下: :表示在:表示在Visual FoxProVisual FoxPro的主窗口中指定的位置的主窗口中指定的位置输入输出。起始行列号均为输入输出。起始行列号均为0 0,行和列可以是常量值,行和列可以是常量值,也可以是数值型表达式。也可以是数值型表达式。SAY SAY GET GET :如果后面没有:如果后面没有READREAD选选项,将在指定的位置输出表达式和变量的值;如果后项,将在指定的位置输出表达式和变量的值;如果后面有面有READREAD选项,则对变量的原有值进行编辑修改,并选项,则对变量的原有值进行编辑修改,并将结果保存在变量中。其中的变量可以是已赋值的内将结果保存在变量中。其中的变量可以是已赋值的内存变量,也可以是字段变量,类型可以是数值型、字存变量,也可以是字段变量,类型可以是数值型、字符型、逻辑型、日期型、日期时间型、备注型、通用符型、逻辑型、日期型、日期时间型、备注型、通用型等。型等。13Visual FoxPro 6.0 程序设计.课件前页 后页 首页图6-5 程序编辑窗口的输入图6-6 结果显示【例例6-2】编写程序编写程序prog2.prg,使用格式输入输出命令,修改学生信息,使用格式输入输出命令,修改学生信息表表student中指定学号的学生记录的字段值。中指定学号的学生记录的字段值。 程序编辑窗口的输入如图程序编辑窗口的输入如图6-5,运行时在屏幕中输入,运行时在屏幕中输入“王燕燕王燕燕”,运行,运行结果如图结果如图6-6。 14Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.6.其他辅助命令其他辅助命令(1)(1)清屏命令清屏命令q清屏命令主要用于清除清屏命令主要用于清除VFPVFP主窗口中的内容,清除完后光主窗口中的内容,清除完后光标回到窗口的左上角,该命令格式如下:标回到窗口的左上角,该命令格式如下:CLEARCLEAR(2)(2)终止程序命令终止程序命令q该命令的功能是终止程序的运行,返回该命令的功能是终止程序的运行,返回VFPVFP的主窗口,同的主窗口,同时释放所有私有变量,其格式如下:时释放所有私有变量,其格式如下:CANCELCANCEL(3)(3)退出系统命令退出系统命令q该命令的功能是退出该命令的功能是退出VFPVFP系统,回到操作系统,退出前将系统,回到操作系统,退出前将关闭所有文件,清除所有变量,其格式如下:关闭所有文件,清除所有变量,其格式如下:QUITQUIT(4)(4)设置会话状态命令设置会话状态命令q该命令的格式如下:该命令的格式如下:SER TALK ON|OFFSER TALK ON|OFFq该命令用于设置是否显示命令执行过程中的状态信息,默该命令用于设置是否显示命令执行过程中的状态信息,默认时为认时为SET TALK ONSET TALK ON,即打开会话状态。通常在执行单命,即打开会话状态。通常在执行单命令或调试程序时,设置为令或调试程序时,设置为ONON状态;而在程序执行时设置状态;而在程序执行时设置为为OFFOFF状态。状态。15Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.1.3 应用程序的执行q运行程序文件的方法有多种,常用的方法主要有以下运行程序文件的方法有多种,常用的方法主要有以下3 3种:种:单击单击“程序程序”|“|“运行运行”命令,在打开的命令,在打开的“运行运行”对话对话框中选择要运行的程序文件,然后单击框中选择要运行的程序文件,然后单击“运行运行”按钮按钮即可运行该程序文件。即可运行该程序文件。在在“项目管理器项目管理器”对话框的对话框的“全部全部”选项卡中,先选选项卡中,先选中要运行的程序,然后单击中要运行的程序,然后单击“运行运行”按钮,即可执行按钮,即可执行该程序。该程序。在命令窗口中输入命令:在命令窗口中输入命令:DO DO ,也可以执,也可以执行相应的程序文件。行相应的程序文件。q事实上,在程序输入完毕后,不关闭程序编辑窗口,直接事实上,在程序输入完毕后,不关闭程序编辑窗口,直接单击工具栏的单击工具栏的“运行运行”按钮可以直接运行程序,若程序按钮可以直接运行程序,若程序无语法错误,可以得到运行结果,若程序中存在语法错无语法错误,可以得到运行结果,若程序中存在语法错误,则会弹出误,则会弹出“程序错误程序错误”对话框,给出错误的提示信对话框,给出错误的提示信息,此时,可以单击息,此时,可以单击“取消取消”按钮,或按按钮,或按【EscEsc】键终止键终止程序的运行,再根据错误提示修改程序。程序的运行,再根据错误提示修改程序。 16Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.2 6.2 程序控制结构程序控制结构q 6.2.1 6.2.1 顺序结构程序设计顺序结构程序设计q 6.2.2 6.2.2 分支结构程序设计分支结构程序设计q 6.2.3 6.2.3 循环结构程序设计循环结构程序设计-17-Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.2程序控制结构q程序的控制结构包括顺序结构、分支结构和循环程序的控制结构包括顺序结构、分支结构和循环结构结构3 3种,每一种控制结构可以包含一个或多个种,每一种控制结构可以包含一个或多个语句,任何程序都是由这语句,任何程序都是由这3 3种基本控制结构构成种基本控制结构构成的。的。18Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.2.1 顺序结构q顺序结构是程序设计中最简单、顺序结构是程序设计中最简单、最常用的基本结构,在该结构中,最常用的基本结构,在该结构中,程序按照命令语句书写的先后顺程序按照命令语句书写的先后顺序依次执行,该结构的流程图如序依次执行,该结构的流程图如图图6-76-7所示。顺序结构是任何程所示。顺序结构是任何程序的主体基本结构,在分支结构序的主体基本结构,在分支结构和循环结构内部,也常以顺序结和循环结构内部,也常以顺序结构作为其子结构,前面介绍的例构作为其子结构,前面介绍的例子使用的都是顺序结构。子使用的都是顺序结构。q顺序结构的基本组成语句是数据顺序结构的基本组成语句是数据的输入输出、赋值语句等,数据的输入输出、赋值语句等,数据的输入和输出已在上一节介绍,的输入和输出已在上一节介绍,下面介绍顺序结构中常用的赋值下面介绍顺序结构中常用的赋值语句和语句的续行与注释功能。语句和语句的续行与注释功能。19Visual FoxPro 6.0 程序设计.课件前页 后页 首页1.1.赋值语句赋值语句q程序设计中经常要使用变量,变量在使用之前需要设定一程序设计中经常要使用变量,变量在使用之前需要设定一个初始值,使用过程中也可能要重新赋值,因此可以使个初始值,使用过程中也可能要重新赋值,因此可以使用赋值语句将指定的值赋给变量或对象的某个属性,赋用赋值语句将指定的值赋给变量或对象的某个属性,赋值语句主要有如下两种格式:值语句主要有如下两种格式:(1)(1)使用赋值符号使用赋值符号“=”=”q该语句的格式如下:该语句的格式如下: = q该语句的意思是将表达式的值计算出来后赋给变量名所代该语句的意思是将表达式的值计算出来后赋给变量名所代表的存储单元。表的存储单元。(2)(2)使用使用STORETOSTORETO命令命令q该命令的格式如下:该命令的格式如下:STORE STORE TO TO q该命令是将表达式的值计算出来后赋值变量名表中的每个该命令是将表达式的值计算出来后赋值变量名表中的每个变量。如:变量。如:STORE 3*5 TO STORE 3*5 TO a,b,c,da,b,c,d 是将变量是将变量a,b,c,da,b,c,d同同时赋值为时赋值为151520Visual FoxPro 6.0 程序设计.课件前页 后页 首页q在使用赋值语句时需要注意以下几点:在使用赋值语句时需要注意以下几点:应注意区分赋值符号与数学中的等号。应注意区分赋值符号与数学中的等号。a=3a=3应读作应读作“将将数值数值3 3赋给变量赋给变量a”a”,a=a+1a=a+1表示将原来表示将原来a a的值加上的值加上1 1后再后再放到原来放到原来a a的存储单元中,即将原来的存储单元中,即将原来a a的值加上的值加上1 1后再赋后再赋给给a a。因此,下面两个语句的意思是不同的:。因此,下面两个语句的意思是不同的:X=y X=y & &表示将表示将y y的值赋给的值赋给x xy=x y=x & &表示将表示将x x的值赋给的值赋给y y若要对日期型或日期时间型内存变量赋值,如果表达若要对日期型或日期时间型内存变量赋值,如果表达式是同样类型的常量,必须用花括号式是同样类型的常量,必须用花括号“ ” ”括起来并括起来并在前面加一个在前面加一个“”符号,如果表达式是字符串,则应符号,如果表达式是字符串,则应用转换函数将其转换为相应的类型。用转换函数将其转换为相应的类型。例如:例如:t1=2008/5/27t1=2008/5/27 t2=2008-5-27 11:14:20a t2=2008-5-27 11:14:20a t3=CTOD(05-27-08) t3=CTOD(05-27-08) t4=CTOT(05-27-08 11:14:20a) t4=CTOT(05-27-08 11:14:20a)赋值符号的左边只能是变量,不能是表达式,如赋值符号的左边只能是变量,不能是表达式,如x+yx+y=z=z是错误的赋值语句。是错误的赋值语句。21Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.语句的续行语句的续行q当一条语句很长时,在程序编辑窗口中书写或阅读都不方当一条语句很长时,在程序编辑窗口中书写或阅读都不方便,例如:便,例如: select top 50 percent select top 50 percent 学号学号, ,姓名姓名, ,身高身高,year(,year(出生日期出生日期) ) 出生年份出生年份from student order by from student order by 出生年份出生年份 descdesc, ,身身高高q这时,为了便于书写和理解,可以使用语句的续行功能,这时,为了便于书写和理解,可以使用语句的续行功能,用用分号分号“;”;”将较长的语句分为两行或多行。因此上述语将较长的语句分为两行或多行。因此上述语句可以改写为:句可以改写为: select top 50 percent select top 50 percent 学号学号, ,姓名姓名, ,身高身高,year(,year(出生日期出生日期) ) 出生年份出生年份; ; from student; from student; order by order by 出生年份出生年份 descdesc, ,身高身高q注意:作为续行符的分号只能出现在行尾。注意:作为续行符的分号只能出现在行尾。22Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.3.语句的注释语句的注释 为了提高程序的可读性,通常在程序的适当位置加上相应为了提高程序的可读性,通常在程序的适当位置加上相应的注释,的注释,Visual FoxProVisual FoxPro中提供了两种注释语句。中提供了两种注释语句。(1)(1)程序注释程序注释q该语句的格式如下:该语句的格式如下:NOTE|* NOTE|* q该语句通常单独放置一行,用于对程序进行注释,程序运该语句通常单独放置一行,用于对程序进行注释,程序运行时,不执行以行时,不执行以NOTENOTE或或* *开头的行。开头的行。(2)(2)行注释行注释q语句格式如下:语句格式如下:& & q该语句通常放在某行命令之后,用于对该行命令进行注释。该语句通常放在某行命令之后,用于对该行命令进行注释。q注意:不能在命令语句行的续行分号后面加入注释。注意:不能在命令语句行的续行分号后面加入注释。23Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.2.2 分支结构 分支结构也称为选择结构,是在程序执行时,根据不同的分支结构也称为选择结构,是在程序执行时,根据不同的条件,选择执行不同的语句。条件,选择执行不同的语句。Visual FoxProVisual FoxPro中提供了两中提供了两种分支结构语句,分别是种分支结构语句,分别是IFIF语句和语句和DO CASEDO CASE语句。语句。1.IF1.IF语句语句IFIF语句主要有两种形式:单分支形式和双分支形式。语句主要有两种形式:单分支形式和双分支形式。(1)(1)单分支形式单分支形式q单分支形式的格式如下:单分支形式的格式如下: IF IF ENDIFENDIFq注意:注意:IFIF和和ENDIFENDIF必须成对使用,并分两行书写。必须成对使用,并分两行书写。24Visual FoxPro 6.0 程序设计.课件前页 后页 首页q其中条件表达式是关系表达式或逻辑表达式,语句执行时,其中条件表达式是关系表达式或逻辑表达式,语句执行时,首先计算条件表达式的值,若为真首先计算条件表达式的值,若为真(.T.)(.T.)则执行语句块中则执行语句块中的语句,否则不执行语句块。无论是否执行语句块中的语的语句,否则不执行语句块。无论是否执行语句块中的语句,程序都将转向句,程序都将转向ENDIFENDIF后面的下一条语句继续执行。后面的下一条语句继续执行。q流程图如图。流程图如图。25Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-36-3】从键盘上输入两个数从键盘上输入两个数x x和和y y,比较大小,若,比较大小,若x x小于小于y y,则交换两个变量值,使得,则交换两个变量值,使得x x不小于不小于y y。q分析:根据题目要求,若满足分析:根据题目要求,若满足“x x小于小于y”y”这个条件,则执这个条件,则执行行“交换两个变量值交换两个变量值”的操作,因此的操作,因此IFIF后面的后面的 应是应是“xy”xy”,满足条件后执行的,满足条件后执行的 ,应是,应是“交换两个变量值交换两个变量值”。q由于计算机内存有易被覆盖的特点,因此计算机中交换两由于计算机内存有易被覆盖的特点,因此计算机中交换两个变量的值只能借助于第三个中间变量来间接交换,如个变量的值只能借助于第三个中间变量来间接交换,如图图6-96-9所示,则交换两个变量值的代码应为:所示,则交换两个变量值的代码应为:t=xt=xx=yx=yy=ty=t26Visual FoxPro 6.0 程序设计.课件前页 后页 首页q本题程序代码如下:本题程序代码如下:* *prog3.prgprog3.prginput x= to xinput x= to xinput y= to yinput y= to yif xyif xy t=x t=x x=y x=y y=t y=tendifendif?x=,x?x=,x?y=,y?y=,y27Visual FoxPro 6.0 程序设计.课件前页 后页 首页 (2)(2)双分支形式双分支形式q双分支格式:双分支格式: IF IF 1ELSEELSE 2 ENDIF ENDIFq语句执行时,根据条件表达式的值选择执行两个语句块中语句执行时,根据条件表达式的值选择执行两个语句块中的一个。若条件表达式的值为真(的一个。若条件表达式的值为真(.T.T.),则执行),则执行IFIF后面后面的语句块的语句块1 1,然后执行,然后执行ENDIFENDIF后面的语句;若条件表达式后面的语句;若条件表达式的值为假(的值为假(.F.F.),则执行),则执行ELSEELSE后面的语句块后面的语句块2 2,然后执,然后执行行ENDIFENDIF后面的语句。其流程图如图后面的语句。其流程图如图6-106-10所示。所示。28Visual FoxPro 6.0 程序设计.课件前页 后页 首页 用双分支实现,其程序代码如下:用双分支实现,其程序代码如下:if x=0 y=cos(x)+sqrt(x2+1)else y=log(x2)+x-10endif 也可用单分支实现,其程序代码如下:也可用单分支实现,其程序代码如下:y=cos(x)+sqrt(x2+1)if x0 y=log(x2)+x-10endif【例例6-4】计算分段函数:计算分段函数:29Visual FoxPro 6.0 程序设计.课件前页 后页 首页(3)IF(3)IF语句的嵌套语句的嵌套qIFIF语句的上述两种形式中的语句块可以包含任何合法的语句的上述两种形式中的语句块可以包含任何合法的VFPVFP语句,当然也可以包含另一条语句,当然也可以包含另一条IFIF语句,这就构成了语句,这就构成了IFIF语句的嵌套,利用语句的嵌套,利用IFIF语句的嵌套可以实现多分支的选择语句的嵌套可以实现多分支的选择结构,结构, 【例例6-56-5】从键盘上输入从键盘上输入3 3个数个数a a、b b、c c,求这,求这3 3个数的最大值个数的最大值并输出。并输出。q分析:假设分析:假设abab且且acac,则最大值肯定是,则最大值肯定是a a,若这个条件不,若这个条件不满足,而所满足的条件是满足,而所满足的条件是baba且且bcbc,则最大值肯定是,则最大值肯定是b b,否则最大值肯定是否则最大值肯定是c c。30Visual FoxPro 6.0 程序设计.课件前页 后页 首页p 程序代码如下:程序代码如下:* *prog5.prgprog5.prginput input 请输入请输入a a的值的值 to a to ainput input 请输入请输入b b的值的值 to b to binput input 请输入请输入c c的值的值 to c to cif ab and acif ab and ac t=a t=aelseelse if ba and bc if ba and bc t=b t=b else else t=c t=c endifendifendifendif?三个数中的最大值是:三个数中的最大值是:,t,t31Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.DO CASE2.DO CASE语句语句q该语句的格式如下:该语句的格式如下: DO CASE DO CASE CASE CASE 1 1 CASE CASE 2 2 CASE CASE n nOTHERWISEOTHERWISE n+1 ENDCASE ENDCASEq语句执行时,依次判断条件表达式的值,一旦某一条件满足,则执行语句执行时,依次判断条件表达式的值,一旦某一条件满足,则执行相应语句块;如果所有条件表达式的值都为假,若无相应语句块;如果所有条件表达式的值都为假,若无OTHERWISEOTHERWISE子句,子句,则不执行任何语句,若有则不执行任何语句,若有OTHERWISEOTHERWISE子句,则执行子句,则执行OTHERWISEOTHERWISE后面的后面的语句块语句块n+1n+1,无论执行哪一个语句块后,都不再判断下面的条件,而,无论执行哪一个语句块后,都不再判断下面的条件,而转去执行转去执行ENDCASEENDCASE后面的语句,其流程图如图后面的语句,其流程图如图6-116-11所示所示 32Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-6】某百货公司打折促销的某百货公司打折促销的优惠方法:每位顾客一次性购物:优惠方法:每位顾客一次性购物: 500元以上者,按九五折优惠;元以上者,按九五折优惠; 1000元以上者,按九折优惠;元以上者,按九折优惠; 2000元以上者,按八五折优惠;元以上者,按八五折优惠; 5000元以上者,按八折优惠。元以上者,按八折优惠。编写程序,实现输入购物款数,编写程序,实现输入购物款数,计算并输出优惠后的价格。计算并输出优惠后的价格。程序代码如下:程序代码如下:*prog6.prginput 请输入原价:请输入原价: to xdo casecase x500y=xcase x1000 y=x*0.95case x2000y=x*0.9case x5000y=x*0.85otherwisey=x*0.8endcase?优惠后的价格是:优惠后的价格是:,y33Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.2.3 循环结构qVFPVFP提供了提供了3 3种循环语句:当型循环种循环语句:当型循环DO WHILEDO WHILE语句、计数型语句、计数型循环循环FORFOR语句和扫描型循环语句和扫描型循环SCANSCAN语句。语句。1. 1. 当型循环当型循环DO WHILEDO WHILE语句语句q该语句的格式如下:该语句的格式如下: DO WHILE DO WHILE EXITEXITLOOPLOOP ENDDO ENDDO34Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-7】编制程序求编制程序求1+2+3+100的和,并输出结果。的和,并输出结果。 分析:实现自然数的累加,应该设置一个累加变量和一个分析:实现自然数的累加,应该设置一个累加变量和一个计数变量,累加变量的初值为计数变量,累加变量的初值为0,计数变量从,计数变量从1开始逐次累加开始逐次累加到累加变量中,每累加一次,计数变量加到累加变量中,每累加一次,计数变量加1,直到计数变量,直到计数变量为为100为止。为止。 程序代码如下:程序代码如下:*prog7.prgs=0i=1do while i20n=n+1 endif skip &修改记录指针,指向下一记录修改记录指针,指向下一记录,若没该句,将造成死循环若没该句,将造成死循环enddouse?年龄大于年龄大于20岁的人数有:岁的人数有:,n 36Visual FoxPro 6.0 程序设计.课件前页 后页 首页q该语句的格式如下:该语句的格式如下:FOR FOR = TO TO STEP STEP EXIT EXIT LOOP LOOPENDFOR|NEXTENDFOR|NEXTq语句执行时,首先给循环变量赋予初值,与终语句执行时,首先给循环变量赋予初值,与终值比较,若超过终值,则循环体一次也不执行,值比较,若超过终值,则循环体一次也不执行,直接转去执行直接转去执行ENDFOR|NEXTENDFOR|NEXT后面的语句;若不超后面的语句;若不超过终值,则依次执行循环体中的语句,遇到过终值,则依次执行循环体中的语句,遇到ENDFORENDFORNEXTNEXT语句,将循环变量加上步长后,语句,将循环变量加上步长后,程序转回到循环初始语句,继续判断,流程图程序转回到循环初始语句,继续判断,流程图如图如图6-136-13所示。所示。q步长可正可负步长可正可负. .步长为步长为1 1时,可省略时,可省略STEPSTEP子句。子句。q当循环次数事先已知时,通常使用计数型循环,当循环次数事先已知时,通常使用计数型循环,循环次数可以根据下式计算:循环次数可以根据下式计算:INT(ABS(INT(ABS(终值终值- -初值初值)/)/步长步长)+1)+12.2.计数型循环计数型循环FORFOR语句语句37Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-96-9】编制程序实现编制程序实现100100以内的奇数累加和,并输出结果。以内的奇数累加和,并输出结果。q分析:实现分析:实现100100以内奇数的累加,循环变量的初值应为以内奇数的累加,循环变量的初值应为1 1,终值应为终值应为9999,循环变量的步长应为,循环变量的步长应为2 2。【例例6-106-10】从键盘上输入一个大于从键盘上输入一个大于1 1的自然数,判断是否为的自然数,判断是否为素数(除素数(除1 1和它本身外,不能被其他任何一个整数整除的和它本身外,不能被其他任何一个整数整除的自然数)。自然数)。q分析:判断某数分析:判断某数n n是否为素数,最简单的方法是:从是否为素数,最简单的方法是:从i=2i=2,3 3,n-1n-1逐个判断逐个判断n n能否被能否被i i整除,只要有一个能整除,整除,只要有一个能整除,n n就不是素数,退出循环;若都不能整除,则就不是素数,退出循环;若都不能整除,则n n是素数。是素数。可进一步证明:若可进一步证明:若n n不能被不能被2 2中的任何一个整数整除,中的任何一个整数整除,则则n n为素数。为素数。38Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.3.扫描型循环扫描型循环SCANSCAN语句语句q该语句的格式如下:该语句的格式如下: SCAN SCAN FOR FOR EXIT EXIT LOOP LOOP ENDSCAN ENDSCANq扫描型循环语句专门用来对当前打开的数据表进行操作,扫描型循环语句专门用来对当前打开的数据表进行操作,它对指定范围满足条件的记录逐一扫描,找到一条满足它对指定范围满足条件的记录逐一扫描,找到一条满足条件的记录就执行一次循环体语句,每执行一次,记录条件的记录就执行一次循环体语句,每执行一次,记录指针后移,直到所有满足条件的记录都执行完毕。指针后移,直到所有满足条件的记录都执行完毕。q说明:说明:语句中语句中 缺省时默认为缺省时默认为ALLALL。其中的其中的EXITEXIT和和LOOPLOOP子句的功能和子句的功能和DO WHILEDO WHILE循环中的功循环中的功能相同。能相同。39Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-11】用扫描型循环用扫描型循环SCAN语句统计学生信息表语句统计学生信息表student中年龄在中年龄在20岁以上的学生人数,并输出结果。岁以上的学生人数,并输出结果。 程序代码如下:程序代码如下:*prog11.prg use student n=0 scan for year(date()-year(出生日期出生日期)20 n=n+1 endscan ?年龄大于年龄大于20岁的人数有:岁的人数有:,n40Visual FoxPro 6.0 程序设计.课件前页 后页 首页4.4.循环的嵌套循环的嵌套q在一个循环体内又包含了一个完整的循环结构时称为循环在一个循环体内又包含了一个完整的循环结构时称为循环结构的嵌套。在实际应用中,三种循环语句可以相互嵌结构的嵌套。在实际应用中,三种循环语句可以相互嵌套,会呈现出多种复杂形式,在编程或阅读程序时要注套,会呈现出多种复杂形式,在编程或阅读程序时要注意各层循环变量的变化规律。意各层循环变量的变化规律。q在使用循环嵌套时需要注意以下几点:在使用循环嵌套时需要注意以下几点:q循环嵌套时,必须完整嵌套,不能交叉嵌套;循环体内可循环嵌套时,必须完整嵌套,不能交叉嵌套;循环体内可以嵌套分支语句,嵌套时也要求完整嵌套,不能交叉嵌以嵌套分支语句,嵌套时也要求完整嵌套,不能交叉嵌套。套。q内重循环的循环变量与外重循环的循环变量不能同名,以内重循环的循环变量与外重循环的循环变量不能同名,以免混淆。免混淆。q多重循环的循环次数等于每一重循环的循环次数的乘积。多重循环的循环次数等于每一重循环的循环次数的乘积。41Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-12】打印九九乘法表,运行界面如图打印九九乘法表,运行界面如图6-14所示。所示。 程序代码如下:程序代码如下:*prog12.prgclear &先将先将VFP主窗口清空主窗口清空1,30 say 九九乘法表九九乘法表2,28 say -?for i=1 to 9 for j=1 to 9 ?str(i,1)+*+STR(j,1)+=+str(i*j,2) ?space(2) &每个算式之间空两格每个算式之间空两格 endfor ? &当前行算式输出完以后,换行再输出下一行当前行算式输出完以后,换行再输出下一行endfor42Visual FoxPro 6.0 程序设计.课件前页 后页 首页q数组这种数据结构在程序设计中经常使用,在数组这种数据结构在程序设计中经常使用,在Visual Visual FoxProFoxPro中,只能定义一维数组和二维数组。因为数组中中,只能定义一维数组和二维数组。因为数组中数组元素的下标是有序的,可以以数组元素的下标作为数组元素的下标是有序的,可以以数组元素的下标作为循环变量,利用循环结构来处理数组中每个数组元素。循环变量,利用循环结构来处理数组中每个数组元素。一般用一重循环来处理一维数组,用二重循环来处理二一般用一重循环来处理一维数组,用二重循环来处理二维数组,下面以一维数组为例进行介绍。维数组,下面以一维数组为例进行介绍。(1)(1)一维数组的基本操作一维数组的基本操作q假设定义有一维数组假设定义有一维数组dimension a(10)dimension a(10),下面以该数组为,下面以该数组为例介绍一维数组的基本操作。例介绍一维数组的基本操作。数组元素的输出数组元素的输出for i=1 to 10 ?a(i)endfor数组元素的输入数组元素的输入for i=1 to 10 input to a(i)endfor5.5.数组问题数组问题43Visual FoxPro 6.0 程序设计.课件前页 后页 首页数组元素的求和数组元素的求和 s=0 for i=1 to 10 s=s+a(i) endfor求数组元素中的最大值求数组元素中的最大值 max=a(1) for i=1 to 10 if(a(i)max) max=a(i) endif endfor44Visual FoxPro 6.0 程序设计.课件前页 后页 首页q数组最典型的应用是排序,排序的算法有多种,如选择法、冒泡法、数组最典型的应用是排序,排序的算法有多种,如选择法、冒泡法、插入法等,下面介绍冒泡法排序。插入法等,下面介绍冒泡法排序。q假设定义了一个数组假设定义了一个数组dimension a(10)dimension a(10),则冒泡法排序的基本思想是:,则冒泡法排序的基本思想是:从第一个元素开始,对数组中两两相邻的元素比较,即从第一个元素开始,对数组中两两相邻的元素比较,即a(1)a(1)与与a(2)a(2)比较,若为逆序,则比较,若为逆序,则a(1)a(1)与与a(2)a(2)交换,然后交换,然后a(2)a(2)与与a(3)a(3)比较比较直直到最后到最后a(9)a(9)与与a(10)a(10)比较,这时最大的数沉底成为数组中的最后一个比较,这时最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置,这是第一趟排序。元素,一些较小的数如同气泡一样上浮一个位置,这是第一趟排序。然后对然后对a(1)a(1)a(9)a(9)中的中的9 9个数进行同上述一样的比较,次最大数放入个数进行同上述一样的比较,次最大数放入a(9)a(9)中,完成第中,完成第2 2趟排序。依此类推,进行趟排序。依此类推,进行9 9趟排序后,所有数均有趟排序后,所有数均有序。因此可以用二重循环来实现这个排序,外循环确定进行几趟排序。因此可以用二重循环来实现这个排序,外循环确定进行几趟排序,内循环确定每趟排序中比较几次。序,内循环确定每趟排序中比较几次。q代码如下:代码如下: for i=1 to 9 for i=1 to 9 &确定排序的趟数确定排序的趟数 for j=1 to 10-I for j=1 to 10-I &确定每趟排序中比较的次数确定每趟排序中比较的次数 if if a(ja(j)a(j+1) )a(j+1) &若相邻的两个数为逆序,则交换若相邻的两个数为逆序,则交换t=t=a(ja(j) )a(ja(j)=a(j+1)=a(j+1)a(j+1)=ta(j+1)=t endifendif endforendfor endforendfor(2)(2)一维数组的排序一维数组的排序45Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-136-13】随机产生随机产生2020个学生成绩,求出他们的平均成绩,个学生成绩,求出他们的平均成绩,并统计出高于平均成绩的学生数,再将这并统计出高于平均成绩的学生数,再将这2020个学生成绩个学生成绩按升序排列后输出。按升序排列后输出。q分析:分析:Visual FoxProVisual FoxPro提供了随机数函数提供了随机数函数RAND()RAND(),可以产,可以产生一个生一个0 01(1(不包括不包括1)1)之间的随机数。学生成绩通常在之间的随机数。学生成绩通常在0 0100100之间,为了产生这之间的随机数,可以用表达式之间,为了产生这之间的随机数,可以用表达式INT(RAND()*100)+1INT(RAND()*100)+1来实现。来实现。q程序代码如下:程序代码如下: * *prog12.prgprog12.prg 46Visual FoxPro 6.0 程序设计.课件前页 后页 首页cleardimension a(20)for i=1 to 20 a(i)=int(rand()*100)+1endfors=0for i=1 to 20 s=s+a(i)endforav=s/20?平均成绩是:平均成绩是:,avn=0for i=1 to 20 if a(i)av n=n+1 endifendfor?高于平均成绩的人数为:高于平均成绩的人数为:,nfor i=1 to 19 for j=1 to 20-iif a(j)a(j+1)t=a(j)a(j)=a(j+1)a(j+1)=tendif endforendfor?for i=1 to 20 ?a(i)endfor47Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3 6.3 过程与过程调用过程与过程调用q 6.3.1 6.3.1 子程序设计与调用子程序设计与调用q 6.3.2 6.3.2 过程与过程文件过程与过程文件q 6.3.3 6.3.3 局部变量和全局变量、过程调用中的参数传递局部变量和全局变量、过程调用中的参数传递-48-Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3.1 子程序设计与调用q在程序设计中,经常会遇到同一段功能代码在不同的程序在程序设计中,经常会遇到同一段功能代码在不同的程序段执行多次的情况,这时往往将该功能代码单独编写成段执行多次的情况,这时往往将该功能代码单独编写成一个独立的程序文件存在磁盘上,需要时调用它,这个一个独立的程序文件存在磁盘上,需要时调用它,这个独立的模块称为子程序。程序之间通过相互调用来建立独立的模块称为子程序。程序之间通过相互调用来建立关系。在关系。在Visual FoxProVisual FoxPro中,子程序是被其他程序调用的中,子程序是被其他程序调用的程序文件,主程序能调用子程序,但子程序不能调用主程序文件,主程序能调用子程序,但子程序不能调用主程序,可是子程序可以调用其他的子程序,构成子程序程序,可是子程序可以调用其他的子程序,构成子程序的嵌套调用。的嵌套调用。q在模块化程序设计中,通常将功能和结构相对独立的功能在模块化程序设计中,通常将功能和结构相对独立的功能模块,单独编写成一个独立的子程序。子程序结构不仅模块,单独编写成一个独立的子程序。子程序结构不仅易于调试和维护,而且当需要时可以多次调用,减少重易于调试和维护,而且当需要时可以多次调用,减少重复编程,提高程序的通用性。子程序的表现形式有过程、复编程,提高程序的通用性。子程序的表现形式有过程、自定义函数和方法自定义函数和方法3 3种。种。49Visual FoxPro 6.0 程序设计.课件前页 后页 首页1.1.子程序的建立子程序的建立q子程序是一个独立的程序文件,文件扩展名为子程序是一个独立的程序文件,文件扩展名为.PRG.PRG,它,它的建立与前面所说的程序建立的方法一样。的建立与前面所说的程序建立的方法一样。2.2.子程序的调用子程序的调用 DO DO WITH WITH q其中其中WITH WITH 是可选项,用于主程序与子是可选项,用于主程序与子程序之间的参数传递,实际参数列表中的各项可以是常程序之间的参数传递,实际参数列表中的各项可以是常量、变量或表达式,相互之间用逗号隔开。量、变量或表达式,相互之间用逗号隔开。3.3.子程序的返回子程序的返回 RETURN TO MASTER|TO RETURN TO MASTER|TO q执行子程序时,遇到执行子程序时,遇到RETURNRETURN命令,就返回到调用它的主命令,就返回到调用它的主程序,或是上一级子程序中调用命令的下一条语句继续程序,或是上一级子程序中调用命令的下一条语句继续执行。通常子程序的最后一条语句是执行。通常子程序的最后一条语句是RETURNRETURN命令,若缺命令,若缺省,则当子程序执行到最后时将自动执行省,则当子程序执行到最后时将自动执行RETURNRETURN功能,功能,返回到主调程序中。返回到主调程序中。50Visual FoxPro 6.0 程序设计.课件前页 后页 首页 图图6-17是子程序嵌套调用时的程序执行过程示意图。是子程序嵌套调用时的程序执行过程示意图。51Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-14】分别建立如上图所示的各程序文件,分析执行分别建立如上图所示的各程序文件,分析执行主程序主程序main.prg的执行结果。的执行结果。程序代码如下:程序代码如下:*main.prgclear?正在执行正在执行main.prg?开始调用子程序开始调用子程序sub1.prgdo sub1?从子程序从子程序sub1.prg中返回中返回*sub1.prg?正在执行正在执行sub1.prg?开始调用子程序开始调用子程序sub2.prgdo sub2?从子程序从子程序sub2.prg中返回中返回?开始调用子程序开始调用子程序sub3.prgdo sub3?从子程序从子程序sub3.prg中返回中返回return*sub2.prg?正在执行正在执行sub2.prgreturn*sub3.prg?正在执行正在执行sub3.prgreturn52Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3.2 过程与过程文件q在编写一个大型程序时,可能划分为许多功能模块,如果都写在编写一个大型程序时,可能划分为许多功能模块,如果都写成子程序,就要创建很多程序文件,这些程序文件都存放在磁成子程序,就要创建很多程序文件,这些程序文件都存放在磁盘上,每调用一次子程序就访问一次磁盘,需要花费一定的时盘上,每调用一次子程序就访问一次磁盘,需要花费一定的时间,如果程序中调用子程序较多,访问磁盘的次数就多,因此间,如果程序中调用子程序较多,访问磁盘的次数就多,因此影响程序运行速度。另外,每调用一次子程序将打开一个文件,影响程序运行速度。另外,每调用一次子程序将打开一个文件,而由于系统允许同时打开文件数目的限制,调用子程序的嵌套而由于系统允许同时打开文件数目的限制,调用子程序的嵌套层数也受到限制,否则程序不能正常运行。层数也受到限制,否则程序不能正常运行。q因此引入过程的概念,其实过程和子程序非常类似,只是将多因此引入过程的概念,其实过程和子程序非常类似,只是将多个子程序的功能模块代码保存在一个程序文件中,在该程序文个子程序的功能模块代码保存在一个程序文件中,在该程序文件中每个子程序都单独定义,而含有多个子程序的程序文件就件中每个子程序都单独定义,而含有多个子程序的程序文件就称为过程文件,这样打开一个过程文件就意味着打开了所有的称为过程文件,这样打开一个过程文件就意味着打开了所有的过程。当然过程也可以不形成过程文件,直接与调用它的程序过程。当然过程也可以不形成过程文件,直接与调用它的程序放在同一个文件中,不过应把过程放在主程序代码之后,不能放在同一个文件中,不过应把过程放在主程序代码之后,不能将主程序代码放在过程之后。将主程序代码放在过程之后。53Visual FoxPro 6.0 程序设计.课件前页 后页 首页1.1.过程的定义过程的定义q过程定义的语法格式如下:过程定义的语法格式如下: PROCEDURE PROCEDURE PARAMETERS PARAMETERS RETURN RETURN ENDPROC ENDPROCq其中各参数的说明如下:其中各参数的说明如下:PROCEDURE PROCEDURE :过程的起始语句。:过程的起始语句。PARAMETERS PARAMETERS :有此子句称为有参过程,否则称为:有此子句称为有参过程,否则称为无参过程。有参过程中,该子句必须是第一条命令语句。无参过程。有参过程中,该子句必须是第一条命令语句。 中形参的个数最多为中形参的个数最多为2727个,且只能是内存变量,相互个,且只能是内存变量,相互之间用逗号隔开。之间用逗号隔开。RETURN RETURN :该子句表示将控制返回到调用该过程的语句:该子句表示将控制返回到调用该过程的语句的下一条语句继续执行。若缺省了该子句,则在过程结束处自动的下一条语句继续执行。若缺省了该子句,则在过程结束处自动执行一条隐含的执行一条隐含的RETURNRETURN语句。语句。ENDPROCENDPROC:过程的结束语句,该语句可以省略,若省略,则过程结:过程的结束语句,该语句可以省略,若省略,则过程结束于下一条束于下一条PROCEDUREPROCEDURE语句或程序文件尾。语句或程序文件尾。54Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.过程的调用过程的调用q调用过程的语法格式如下:调用过程的语法格式如下: DO DO WITH WITH q实参列表中的各项可以是常量、变量或一般表达式,相互实参列表中的各项可以是常量、变量或一般表达式,相互之间用逗号隔开。之间用逗号隔开。【例例6-156-15】利用过程来计算圆面积。利用过程来计算圆面积。q程序代码如下:程序代码如下:clearclearinput input 请输入圆的半径:请输入圆的半径: to r to rs=0s=0do area with do area with r,sr,s?半径为半径为,r,r,的圆的面积为:的圆的面积为:,s,s*area*area过程过程procedure areaprocedure area parameters parameters r,sr,s s=3.14*r*r s=3.14*r*r return returnendprocendproc55Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.3.过程文件的建立过程文件的建立q过程文件是由若干个过程组合而成的,它的建立方法与程序文过程文件是由若干个过程组合而成的,它的建立方法与程序文件的建立方法相同,扩展名也为件的建立方法相同,扩展名也为.PRG.PRG。4.4.过程文件的打开与关闭过程文件的打开与关闭q调用过程文件中的过程前,首先要打开包含它的过程文件。调用过程文件中的过程前,首先要打开包含它的过程文件。(1)(1)过程文件的打开过程文件的打开qSET PROCEDURE TO SET PROCEDURE TO , , , 2 , ADDITIVEADDITIVEq该语句用于打开指定的过程文件,使该过程文件中所有的过程该语句用于打开指定的过程文件,使该过程文件中所有的过程均可供调用。均可供调用。q可以同时打开多个过程文件,如果命令中带有可以同时打开多个过程文件,如果命令中带有ADDITIVEADDITIVE子句,子句,则在打开当前过程文件时,以前打开的过程文件不关闭,即以则在打开当前过程文件时,以前打开的过程文件不关闭,即以前打开的过程文件中的过程仍可以被调用;若命令中未带该子前打开的过程文件中的过程仍可以被调用;若命令中未带该子句,则在打开当前过程文件时,以前打开的所有过程文件都会句,则在打开当前过程文件时,以前打开的所有过程文件都会被关闭,即以前打开的过程文件中的所有过程都不能再被调用。被关闭,即以前打开的过程文件中的所有过程都不能再被调用。(2)(2)过程文件的关闭过程文件的关闭q语句格式语句格式1 1为:为:SET PROCEDURE TOSET PROCEDURE TOq语句格式语句格式2 2为:为:CLOSE PROCEDURECLOSE PROCEDURE56Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-16】调用过程文件中的求阶乘的过程,求1!+2!+n!。 程序代码如下:程序代码如下:*prog16.prgclearset procedure to jcinput 请输入请输入n的值:的值: to nstore 0 to s,jfor i=1 to ndo fact with i,js=s+jendforset procedure to?1!+2!+n!=,s*jc.prgprocedure factparameters x,yt=1for i=1 to xt=t*iendfory=treturnendproc57Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3.3 自定义函数q函数分为系统函数与自定义函数,函数分为系统函数与自定义函数, Visual FoxProVisual FoxPro提供了提供了几百个系统函数供用户调用,大大方便了用户的编程,几百个系统函数供用户调用,大大方便了用户的编程,但在解决实际问题时,系统提供的函数可能不能满足用但在解决实际问题时,系统提供的函数可能不能满足用户的需求,这时可以自己定义和编写的函数,这样的函户的需求,这时可以自己定义和编写的函数,这样的函数称为自定义函数。函数和过程的作用十分相似,用户数称为自定义函数。函数和过程的作用十分相似,用户自定义的函数实质上是带有返回值的子程序或过程。自定义的函数实质上是带有返回值的子程序或过程。1.1.自定义函数的建立自定义函数的建立q自定义函数的语法格式如下:自定义函数的语法格式如下: FUNCTION FUNCTION PARAMETERS PARAMETERS RETURN RETURN ENDFUNCENDFUNC58Visual FoxPro 6.0 程序设计.课件前页 后页 首页q自定义函数的函数名不能与自定义函数的函数名不能与VFPVFP系统函数同名,也不能和系统函数同名,也不能和内存变量同名。内存变量同名。q自定义函数通常会计算出一个值,由自定义函数通常会计算出一个值,由RETURN RETURN 语语句返回,若句返回,若RETURNRETURN后面缺省表达式,默认函数返回值为后面缺省表达式,默认函数返回值为.T.T.,若省略,若省略RETURNRETURN语句,则函数执行结束时,系统自动语句,则函数执行结束时,系统自动执行一个隐含的执行一个隐含的RETURNRETURN命令。命令。q自定义函数可作为一个独立的模块放在调用它的程序文件自定义函数可作为一个独立的模块放在调用它的程序文件中,通常放在程序文件的底部;也可以作为一个独立的中,通常放在程序文件的底部;也可以作为一个独立的程序文件,供所有程序调用,这时可以省略自定义函数程序文件,供所有程序调用,这时可以省略自定义函数的起始语句的起始语句FUNCTION FUNCTION ,若不省略该语句,则函,若不省略该语句,则函数名必须与程序文件名相同;自定义函数还可以放在过数名必须与程序文件名相同;自定义函数还可以放在过程文件中,随着过程文件的打开而打开,以供调用。程文件中,随着过程文件的打开而打开,以供调用。2.2.自定义函数的调用自定义函数的调用 函数名函数名(实际参数列表实际参数列表)q函数定义好后,可供程序在任何地方调用。函数调用时,函数定义好后,可供程序在任何地方调用。函数调用时,实际参数的个数与形式参数的个数必须相等,且依次虚实际参数的个数与形式参数的个数必须相等,且依次虚实结合。若是无参函数,调用时圆括号不能省略。实结合。若是无参函数,调用时圆括号不能省略。59Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-17】将上例改用将上例改用自定义函数来实现,其中自定义函数来实现,其中函数放在调用程序所在的函数放在调用程序所在的程序文件中。程序文件中。 分析:若通过自定义函分析:若通过自定义函数来实现求某个数的阶乘,数来实现求某个数的阶乘,主调模块应通过参数将该主调模块应通过参数将该数传递给被调函数,被调数传递给被调函数,被调函数可以使用返回值将计函数可以使用返回值将计算结果返回给主调模块,算结果返回给主调模块,因此函数中只需有一个形因此函数中只需有一个形式参数:求阶乘的数。式参数:求阶乘的数。 程序代码如下:程序代码如下:*prog17.prgclearinput 请输入请输入n的值:的值: to ns=0for i=1 to ns=s+fact(i)endforset procedure to?1!+2!+n!=,sfunction factparameters xt=1for j=1 to xt=t*jendforreturn tendfunc60Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3.4参数传递q主程序在调用子程序、过程和自定义函数时,经常需要把主程序在调用子程序、过程和自定义函数时,经常需要把主程序中的数据传递给子程序、过程和自定义函数,然主程序中的数据传递给子程序、过程和自定义函数,然后再将处理的结果返回给主程序,这就需要通过实际参后再将处理的结果返回给主程序,这就需要通过实际参数与形式参数间的参数传递来实现。数与形式参数间的参数传递来实现。q参数传递中要求实际参数与形式参数依次相对应,实参与参数传递中要求实际参数与形式参数依次相对应,实参与形参对应的次序应一致、类型应一致、参数个数通常也形参对应的次序应一致、类型应一致、参数个数通常也一致,但可以不相同,若个数不相同时,形参的个数不一致,但可以不相同,若个数不相同时,形参的个数不能少于实参的个数,否则系统产生运行错误,若形参的能少于实参的个数,否则系统产生运行错误,若形参的个数多于实参的个数,多余的形参取初始值为个数多于实参的个数,多余的形参取初始值为.F.F.;但参;但参数名不要求相同,即对应的实参与形参可以不同名。数名不要求相同,即对应的实参与形参可以不同名。q根据形参值的改变是否影响实参的值,可以将参数传递分根据形参值的改变是否影响实参的值,可以将参数传递分为两类:值传递和引用传递。为两类:值传递和引用传递。61Visual FoxPro 6.0 程序设计.课件前页 后页 首页1.1.值传递值传递q值传递中形参值的改变不影响实参的值,形参与实参使用值传递中形参值的改变不影响实参的值,形参与实参使用不同的内存空间。在主程序调用子程序、过程和自定义不同的内存空间。在主程序调用子程序、过程和自定义函数时,形参单独分配空间,系统会计算出主程序中实函数时,形参单独分配空间,系统会计算出主程序中实参的值,并把它们赋值给相应的形参。形参在程序调用参的值,并把它们赋值给相应的形参。形参在程序调用过程中若发生值的改变,不影响实参原来的值。过程中若发生值的改变,不影响实参原来的值。q值传递的两种情况:值传递的两种情况:(1)(1)程序调用时,可以使用如下两种格式的语句:程序调用时,可以使用如下两种格式的语句: 文件名文件名| |过程名过程名| |函数名函数名(实际参数列表实际参数列表) 或者:或者: DO DO 文件名文件名| |过程名过程名 WITH (WITH (实际参数列表实际参数列表) ) 即将实际参数加上圆括号后再放到实参列表中,默认的即将实际参数加上圆括号后再放到实参列表中,默认的是值传递的方式。是值传递的方式。 (2) (2)若程序调用格式为:文件名若程序调用格式为:文件名| |过程名过程名| |函数名函数名( (实际参数实际参数列表列表) ),可在程序调用之前使用命令设置参数传递的方式,可在程序调用之前使用命令设置参数传递的方式为值传递,命令格式如下:为值传递,命令格式如下: SET UDFPARMS TO VALUE SET UDFPARMS TO VALUE62Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.引用传递引用传递q引用传递中形参值的改变影响实参的值,形参与实参使用引用传递中形参值的改变影响实参的值,形参与实参使用的是同一个内存空间(尽管它们的名字可能不同)。的是同一个内存空间(尽管它们的名字可能不同)。q引用传递的引用传递的3 3种情况:种情况:(1) (1) 程序调用时,使用如下的语句调用格式:程序调用时,使用如下的语句调用格式: DO DO 文件名文件名| |过程名过程名 WITH WITH 实际参数列表实际参数列表 (2) (2) 若程序调用格式为:文件名若程序调用格式为:文件名| |过程名过程名| |函数名函数名 ( (实际参实际参数列表数列表) ),可在程序调用之前使用命令设置参数传递的方,可在程序调用之前使用命令设置参数传递的方式为引用传递,命令格式如下:式为引用传递,命令格式如下: SET UDFPARMS TO REFERENCE SET UDFPARMS TO REFERENCE。 (3) (3)使用使用 标记实际参数标记实际参数 程序调用时,在实际参数前加程序调用时,在实际参数前加 标记,则强制参数以标记,则强制参数以引用方式传递引用方式传递 63Visual FoxPro 6.0 程序设计.课件前页 后页 首页【例例6-18】值传递和引用传递示例。程序值传递和引用传递示例。程序prog18.prg如下:如下:clearstore 0 to a,bdo sub with a,(b) &参数参数a是引用传递,参数是引用传递,参数b是值传递是值传递?第第1次调用:次调用:,a,bset udfparms to value &设置为值传递方式设置为值传递方式store 0 to a,bsub(a,(b) &参数参数a,b均为值传递方式均为值传递方式?第第2次调用:次调用:,a,bset udfparms to reference &设置为引用传递方式设置为引用传递方式store 0 to a,bsub(a,(b) &参数参数a是引用传递,参数是引用传递,参数b是值传递是值传递?第第3次调用:次调用:,a,bstore 0 to a,bsub(a,b) &参数参数a,b均为引用传递方式均为引用传递方式?第第4次调用:次调用:,a,bprocedure subparameters x,yx=x+10y=y+10returnendproc64Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.3.5 变量的作用域q内存变量在程序中的作用范围称为内存变量的作用域。根内存变量在程序中的作用范围称为内存变量的作用域。根据变量作用域的不同,可将内存变量分为据变量作用域的不同,可将内存变量分为3 3类:本地变量类:本地变量(局部变量)、私有变量和公共变量(全局变量)。(局部变量)、私有变量和公共变量(全局变量)。1. 1. 本地变量(局部变量)本地变量(局部变量)q本地变量的作用域只包括定义它的模块,不能在其它模块本地变量的作用域只包括定义它的模块,不能在其它模块中使用。本地变量一经定义,就在内存中分配了存储单中使用。本地变量一经定义,就在内存中分配了存储单元,一旦离开了本模块,本地变量所占的存储单元就被元,一旦离开了本模块,本地变量所占的存储单元就被释放,因此不能再被使用。释放,因此不能再被使用。q定义本地变量的语法格式:定义本地变量的语法格式:LOCAL LOCAL q该命令将内存变量表中的变量定义为本地变量,并将这些该命令将内存变量表中的变量定义为本地变量,并将这些变量的初值赋值为变量的初值赋值为.F.F.。q注意:注意:LOCALLOCAL命令可以定义本地变量,也可定义本地数组。命令可以定义本地变量,也可定义本地数组。LOCALLOCAL命令与命令与LOCATELOCATE命令的前命令的前4 4个字符相同,因此不可缩个字符相同,因此不可缩写。写。65Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.私有变量私有变量q私有变量的作用域包括定义它的模块及其调用的子程序、私有变量的作用域包括定义它的模块及其调用的子程序、过程或函数模块,定义私有变量的语法格式如下:过程或函数模块,定义私有变量的语法格式如下: PRIVATE PRIVATE q该命令将内存变量表中的变量定义为私有变量,并将这些该命令将内存变量表中的变量定义为私有变量,并将这些变量的初值赋值为变量的初值赋值为.F.F.。qPRIVATEPRIVATE命令可以定义私有变量,也可定义私有数组。程命令可以定义私有变量,也可定义私有数组。程序中未加定义而直接使用的内存变量是私有变量。序中未加定义而直接使用的内存变量是私有变量。q当被调用的子程序、过程或函数模块中有与主调模块序中当被调用的子程序、过程或函数模块中有与主调模块序中的变量同名时,且希望起作用的是被调用模块中的变量的变量同名时,且希望起作用的是被调用模块中的变量时,可以在被调用模块中用时,可以在被调用模块中用PRIVATEPRIVATE命令声明该变量,来命令声明该变量,来隐藏上级主调模块中的同名变量,使得主调模块中的同隐藏上级主调模块中的同名变量,使得主调模块中的同名变量在被调模块中暂时被屏蔽,直到被调模块执行结名变量在被调模块中暂时被屏蔽,直到被调模块执行结束后,返回到主调模块中,再恢复使用主调模块中的同束后,返回到主调模块中,再恢复使用主调模块中的同名变量。名变量。q在多人开发的应用程序中为了防止不同模块中因变量名相在多人开发的应用程序中为了防止不同模块中因变量名相同而造成失误,可以在各自开发的子程序模块中定义私同而造成失误,可以在各自开发的子程序模块中定义私有变量,以屏蔽主调模块中的同名变量。有变量,以屏蔽主调模块中的同名变量。66Visual FoxPro 6.0 程序设计.课件前页 后页 首页3. 3. 公共变量(全局变量)公共变量(全局变量)q公共变量的作用域包括程序的所有模块,定义公共变量的公共变量的作用域包括程序的所有模块,定义公共变量的语法格式如下:语法格式如下: PUBLIC PUBLIC q该命令将内存变量表中的变量定义为公共变量,并将这些该命令将内存变量表中的变量定义为公共变量,并将这些变量的初值赋值为变量的初值赋值为.F.F.。qPUBLICPUBLIC命令可以定义公共变量,也可定义公共数组。命令可以定义公共变量,也可定义公共数组。q用用PUBLICPUBLIC命令定义的公共变量在整个程序运行过程中始终命令定义的公共变量在整个程序运行过程中始终有效,始终占有内存的存储单元,即使程序运行结束,有效,始终占有内存的存储单元,即使程序运行结束,系统也不会自动释放存储单元,而只能用系统也不会自动释放存储单元,而只能用RELEASERELEASE命令或命令或CLEAR ALLCLEAR ALL命令才能清除公共变量。命令才能清除公共变量。q若某模块中建立的内存变量要供其它模块使用,必须将这若某模块中建立的内存变量要供其它模块使用,必须将这种变量用种变量用PUBLICPUBLIC命令声明为公共变量。在命令窗口中定命令声明为公共变量。在命令窗口中定义的变量或数组都是公共变量,但这些公共变量不能在义的变量或数组都是公共变量,但这些公共变量不能在程序中引用。若同一模块中有同名的各种变量,起作用程序中引用。若同一模块中有同名的各种变量,起作用的优先次序为:本地变量的优先次序为:本地变量 私有变量私有变量 全局变量。全局变量。67Visual FoxPro 6.0 程序设计.课件前页 后页 首页clearpublic c &定义公共变量定义公共变量c,作用域包括各个模块,作用域包括各个模块a=1b=10 &a,b未加定义而直接使用,为私有变量未加定义而直接使用,为私有变量c=100do sub1?主程序中的主程序中的a,b,c值分别为:值分别为:,a,b,cproc sub1 local b &本地变量本地变量b,作用在,作用在sub1模块中模块中 a=2 &使用的是上级主调模块中的变量使用的是上级主调模块中的变量a b=20 c=200 &使用的是上级主调模块中的使用的是上级主调模块中的c do sub2 ?sub1中的中的a,b,c值分别为:值分别为:,a,b,cendprocproc sub2 private a &定义私有变量定义私有变量a,屏蔽上级模块的,屏蔽上级模块的a a=3 b=30 &使用最上级模块中的私有变量使用最上级模块中的私有变量b c=300 &使用最上级模块中的公共变量使用最上级模块中的公共变量c ?sub2中的中的a,b,c值分别为:值分别为:,a,b,cEndproc【例例6-18】观察程序,体会变量的作用域。观察程序,体会变量的作用域。68Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.4 程序的调试q 6.4.1 程序常见错误q 6.4.2 调试器窗口q 6.4.3 “调试”菜单-69-Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.4 6.4 程序的调试程序的调试q程序调试是指在发现程序有错误的情况下,确定出错的位程序调试是指在发现程序有错误的情况下,确定出错的位置并纠正错误,直到达到预定的设计要求为止。程序调置并纠正错误,直到达到预定的设计要求为止。程序调试往往是先分模块调试,当各个模块都调试通过后,再试往往是先分模块调试,当各个模块都调试通过后,再将各模块联合起来进行调试。为了减少程序的调试时间,将各模块联合起来进行调试。为了减少程序的调试时间,在编程时应尽量减少出错,因此应了解程序中的常见错在编程时应尽量减少出错,因此应了解程序中的常见错误。误。70Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.4.1 程序常见错误1.1.语法错误语法错误q 指程序中的命令语句使系统不能识别而无法操作的错误,指程序中的命令语句使系统不能识别而无法操作的错误,这类错误在程序编译时或程序运行时系统会给出出错信息,这类错误在程序编译时或程序运行时系统会给出出错信息,可以根据系统的提示来纠正。常见的系统编译提示信息及可可以根据系统的提示来纠正。常见的系统编译提示信息及可能出现的错误见下表。能出现的错误见下表。提示信息提示信息可能的错误可能的错误不能识别的命令谓词不能识别的命令谓词命令书写错误命令书写错误命令中含有不能识别的短命令中含有不能识别的短语或关键字语或关键字命令中的关键字书写错误命令中的关键字书写错误操作符操作符|操作数类型不匹配操作数类型不匹配表达式或函数中的数据类型不匹配表达式或函数中的数据类型不匹配函数名缺少函数名缺少)括号不匹配括号不匹配找不到变量找不到变量使用了不存在的变量名,可能遗漏了关键字与变量之使用了不存在的变量名,可能遗漏了关键字与变量之间的空格,或变量列表中使用了中文标点等。间的空格,或变量列表中使用了中文标点等。文件不存在文件不存在找不到指定的文件,可能文件名错误,或当前路径下找不到指定的文件,可能文件名错误,或当前路径下没有该文件,需要指定文件的绝对路径等。没有该文件,需要指定文件的绝对路径等。嵌套错误嵌套错误控制语句嵌套错误或缺少语句结束等控制语句嵌套错误或缺少语句结束等71Visual FoxPro 6.0 程序设计.课件前页 后页 首页2.2.逻辑错误逻辑错误q逻辑错误是指每一个语句都符合语法要求,但最后的运算逻辑错误是指每一个语句都符合语法要求,但最后的运算结果不正确。如计算公式不对、语句执行次序不对、程结果不正确。如计算公式不对、语句执行次序不对、程序结构错误等。序结构错误等。q发现程序有错误,就应该确定出错的位置并纠正错误,如发现程序有错误,就应该确定出错的位置并纠正错误,如何确定出错的位置是关键。语法错误通过编译提示的错何确定出错的位置是关键。语法错误通过编译提示的错误信息通常可以确定出错位置;但对于逻辑错误,不易误信息通常可以确定出错位置;但对于逻辑错误,不易确定错误的位置。因此,确定错误的位置。因此,Visual FoxProVisual FoxPro提供了可视化调提供了可视化调试程序的工具试程序的工具调试器,借助调试器,用户能有效地调试器,借助调试器,用户能有效地进行程序的调试。进行程序的调试。72Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.4.2 调试器窗口 单击单击“工具工具”|“调试器调试器”命令,或在命令窗口中输入命令,或在命令窗口中输入“DEBUG”命令,打开调试器命令,打开调试器如图如图73Visual FoxPro 6.0 程序设计.课件前页 后页 首页1.“1.“跟踪跟踪”窗口窗口q用来显示正在调试执行的程序文件,以便调试和观察。单击调试器窗用来显示正在调试执行的程序文件,以便调试和观察。单击调试器窗口中的口中的“文件文件”|“|“打开打开”命令可以打开需要调试执行的程序文件。打命令可以打开需要调试执行的程序文件。打开后,程序将显示在开后,程序将显示在“跟踪跟踪”窗口中,如图窗口中,如图6-226-22所示。所示。“跟踪跟踪”窗口窗口左侧显示的代码指示符号左侧显示的代码指示符号“”“”用来指示调试中正在执行的代码行。用来指示调试中正在执行的代码行。在调试程序过程中,经常需要将程序执行到某个位置停下来,以便分在调试程序过程中,经常需要将程序执行到某个位置停下来,以便分析当前程序执行的变量输出情况,该位置称为断点。若需在某行设置析当前程序执行的变量输出情况,该位置称为断点。若需在某行设置断点,可以双击该代码行,在该行左侧将会出现一个红色的实心圆点断点,可以双击该代码行,在该行左侧将会出现一个红色的实心圆点“”“”,当程序执行到该行时,将中断程序运行。,当程序执行到该行时,将中断程序运行。图6-22 “跟踪”窗口74Visual FoxPro 6.0 程序设计.课件前页 后页 首页q除了在除了在“跟踪跟踪”窗口中双击代码行来设置断点外,还可以窗口中双击代码行来设置断点外,还可以单击单击“工具工具”|“|“断点断点”命令,打开如图命令,打开如图6-236-23所示的所示的“断断点点”对话框来进行断点设置。对话框来进行断点设置。 图6-23 “断点”对话框75Visual FoxPro 6.0 程序设计.课件前页 后页 首页2. “2. “监视监视”窗口窗口q用来监视指定表达式在程序调试过程中的取值变化情况。用来监视指定表达式在程序调试过程中的取值变化情况。在在“监视监视”的文本框内输入需要监视的表达式,回车后被的文本框内输入需要监视的表达式,回车后被加入监视列表框中,当程序调试执行时,列表框中将显示加入监视列表框中,当程序调试执行时,列表框中将显示所有监视表达式的名称、当前值和类型,如图所有监视表达式的名称、当前值和类型,如图6-246-24所示。所示。q双击监视表达式,可对其编辑修改;若删除该表达式,右双击监视表达式,可对其编辑修改;若删除该表达式,右击监视表达式,在弹出菜单中选击监视表达式,在弹出菜单中选“删除监视删除监视”命令即可。命令即可。图6-24 “监视”窗口76Visual FoxPro 6.0 程序设计.课件前页 后页 首页3.“3.“调用堆栈调用堆栈”窗口窗口q显示当前正在执行的程序、过程或方法程序名称。若正在显示当前正在执行的程序、过程或方法程序名称。若正在执行的是一个子程序,则显示该子程序名称和各主调程执行的是一个子程序,则显示该子程序名称和各主调程序名称,其中左侧的代码指示符号序名称,其中左侧的代码指示符号“”“”指向正在执行指向正在执行的程序模块,如图的程序模块,如图6-256-25所示。所示。图6-25 “调用堆栈”窗口77Visual FoxPro 6.0 程序设计.课件前页 后页 首页4.“4.“调试输出调试输出”窗口窗口q编写程序时在程序的适当位置插入调试命令编写程序时在程序的适当位置插入调试命令“DEBUGOUT DEBUGOUT ”命令,则在调试程序中执行到该命令时,就命令,则在调试程序中执行到该命令时,就将表达式的值显示在本窗口中。将表达式的值显示在本窗口中。5.“5.“局部局部”窗口窗口q用来显示指定作用域的内存变量或对象的名称、当前值和用来显示指定作用域的内存变量或对象的名称、当前值和类型。可在类型。可在“位置位置”下拉列表框中指定要查看的程序模下拉列表框中指定要查看的程序模块,也可右击列表窗口,在弹出的快捷菜单中选择块,也可右击列表窗口,在弹出的快捷菜单中选择“公公共共”、“局部局部”、“常用常用”或或“对象对象”选项。选项。78Visual FoxPro 6.0 程序设计.课件前页 后页 首页6.4.3 “调试”菜单q在程序调试时,一般使用调试器窗口中在程序调试时,一般使用调试器窗口中“调调试试”菜单的各个命令(如图菜单的各个命令(如图6-266-26所示)来进所示)来进行程序的调试。行程序的调试。1.“1.“运行运行”命令命令该命令用于执行在该命令用于执行在“跟踪跟踪”窗口中打开的程窗口中打开的程序,程序没有开始运行时出现。若序,程序没有开始运行时出现。若“跟踪跟踪”窗口中没有打开的程序,则会打开窗口中没有打开的程序,则会打开“运行运行”对话框,可以从中选择要调试的程序,调试对话框,可以从中选择要调试的程序,调试器立即执行此程序,并中断于第一条可执行器立即执行此程序,并中断于第一条可执行代码上,此时调试菜单中显示的不再是代码上,此时调试菜单中显示的不再是“运运行行”命令,而是命令,而是“继续执行继续执行”命令。命令。2.“2.“继续执行继续执行”命令命令从中断处继续运行,当程序执行被中断时出从中断处继续运行,当程序执行被中断时出现。当程序第一次执行前,调试菜单中显示现。当程序第一次执行前,调试菜单中显示“运行运行”命令;当程序被中断时,调试菜单命令;当程序被中断时,调试菜单中显示中显示“继续执行继续执行”命令。命令。3.“3.“取消取消”命令命令 用于终止程序的调试执行,并关闭程序。用于终止程序的调试执行,并关闭程序。图6-26 “调试”菜单79Visual FoxPro 6.0 程序设计.课件前页 后页 首页4.“4.“定位修改定位修改”命令:命令:用于终止程序的调试执行,然后打开用于终止程序的调试执行,然后打开所调试程序的所调试程序的“编辑编辑”窗口进行编辑修改。窗口进行编辑修改。5.“5.“跳出跳出”命令:命令:以连续方式继续执行被调模块程序中的代以连续方式继续执行被调模块程序中的代码,然后在主调模块的调用语句下一行处中断。码,然后在主调模块的调用语句下一行处中断。6.“6.“单步单步”命令:命令:该命令单步执行下一行代码。若下一行代该命令单步执行下一行代码。若下一行代码调用了过程或方法程序,则被调用模块在后台执行,码调用了过程或方法程序,则被调用模块在后台执行,代码指示符号指向主调模块调用语句的下一行代码。代码指示符号指向主调模块调用语句的下一行代码。7.“7.“单步跟踪单步跟踪”命令:命令:该命令用于单步执行下一行代码。若该命令用于单步执行下一行代码。若下一行代码调用了过程或方法程序,则代码指示符号跟下一行代码调用了过程或方法程序,则代码指示符号跟踪到被调模块的第一条可执行语句代码。踪到被调模块的第一条可执行语句代码。8.“8.“运行到光标处运行到光标处”命令:命令:该命令从当前位置执行代码直至该命令从当前位置执行代码直至光标处中断。光标位置可以在开始时设置,也可在程序光标处中断。光标位置可以在开始时设置,也可在程序中断时设置。中断时设置。80Visual FoxPro 6.0 程序设计.课件前页 后页 首页9.“9.“调速调速”命令:命令:单击该命令可以打开如图单击该命令可以打开如图6-276-27所示的所示的“调调整运行速度整运行速度”对话框,从中设置执行两代码行之间的延对话框,从中设置执行两代码行之间的延时秒数。时秒数。10.“10.“设置下一条语句设置下一条语句”命令:命令:程序中断时选择该命令,可程序中断时选择该命令,可以使光标所在行成为恢复执行后要执行的语名。以使光标所在行成为恢复执行后要执行的语名。图6-26 “调整运行速度”对话框81Visual FoxPro 6.0 程序设计.课件
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号