好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

程序设计基础.ppt

132页
  • 卖家[上传人]:鲁**
  • 文档编号:587331078
  • 上传时间:2024-09-05
  • 文档格式:PPT
  • 文档大小:686.02KB
  • / 132 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 程序设计基础程序设计基础9/5/20241 本章主要内容本章主要内容l程序设计的基本概念程序设计的基本概念l程序文件建立与运行程序文件建立与运行 l三种程序控制结构三种程序控制结构 l多模块程序多模块程序 l程序调试程序调试 9/5/20242 程序设计的基本概念程序设计的基本概念一、一、VFPVFP的工作方式的工作方式l命令工作方式(或交互工作方式)命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的命令的方法来执行的l程序工作方式程序工作方式 根根据据解解决决实实际际问问题题的的需需要要,,将将一一系系列列符符合合Visual Visual FoxProFoxPro要要求求的的命命令令按按一一定定的的逻逻辑辑结结构构编编排排成成一一个个完完整整的的应应用用程程序序,,然然后后输输入入到到计计算算机机内内自自动动地地、、连续地加以执行连续地加以执行 9/5/20243 程序设计的基本概念程序设计的基本概念二、二、 VFPVFP的编程方式的编程方式l 面向过程编程方式面向过程编程方式 用结构化编程语言来编写结构化的程序,它把用结构化编程语言来编写结构化的程序,它把一个复杂的程序分成较小的过程,每个过程可以单一个复杂的程序分成较小的过程,每个过程可以单独进行调试。

      独进行调试l 面向对象编程方式面向对象编程方式 用面向对象的技术编程,它把编程工作主要集用面向对象的技术编程,它把编程工作主要集中在描述的对象上,程序是事件驱动的,在执行过中在描述的对象上,程序是事件驱动的,在执行过程中,等待的是一个事件程中,等待的是一个事件 对对于于制制作作简简单单短短小小的的应应用用程程序序,,使使用用过过程程编编程程方方式式比比较较容容易易,,同同时时,,这这也也是是面面向向对对象象编编程程方方式式的的基基础础本本章章重重点点介介绍绍面面向向过过程程的的程序设计程序设计 9/5/20244 程序设计的基本概念程序设计的基本概念三、程序设计的步骤三、程序设计的步骤 Ø分析问题或任务,总结或抽象出问题的数学模型分析问题或任务,总结或抽象出问题的数学模型Ø根据数学模型确定解决问题的算法思想根据数学模型确定解决问题的算法思想Ø确定要建立的数据表或数据库的基本结构及其数据表之间确定要建立的数据表或数据库的基本结构及其数据表之间的关系的关系Ø画出程序流程图画出程序流程图Ø编写程序,实现功能要求,并在计算机上调试通过编写程序,实现功能要求,并在计算机上调试通过 Ø用典型数据对所编写的程序进行测试,验证程序的可靠性用典型数据对所编写的程序进行测试,验证程序的可靠性 Ø编写使用说明书,整理有关资料,进行总结编写使用说明书,整理有关资料,进行总结 9/5/20245 6.1 6.1 程序文件建立与运行程序文件建立与运行l程序文件程序文件程程序序是是由由命命令令组组成成的的ASCIIASCII码码文文本本文文件件,,所所以以程程序序文文件件也也称称为为命命令令文文件件。

      该该文文件件可可用用任任何何文文本本编编辑辑器或字处理软件来建立器或字处理软件来建立 l程序文件扩展名程序文件扩展名源源文文件件的的扩扩展展名名是是.PRG.PRG,,程程序序在在运运行行时时,,会会产产生生主主文文件件名名与与.PRG.PRG程程序序主主文文件件名名相相同同,,扩扩展展名名为为.FXP.FXP的目标文件的目标文件 9/5/20246 6.1.1 6.1.1 程序文件建立程序文件建立 建立程序最简单的方法是用系统本建立程序最简单的方法是用系统本身提供的编辑器身提供的编辑器 VFPVFP有有2 2种方式进入程种方式进入程序编辑器窗口序编辑器窗口:菜单方式和命令方式:菜单方式和命令方式 9/5/20247 菜单方式建立程序文件菜单方式建立程序文件 用菜单建立程序的步骤为:用菜单建立程序的步骤为: Ø单击菜单单击菜单““文件文件””→→““新建新建””命令或者单击常用命令或者单击常用工具栏的工具栏的““新建新建””按钮,打开按钮,打开““新建新建””对话框 Ø打开打开““程序程序1 1””的程序编辑新窗口的程序编辑新窗口9/5/20248 命令方式建立程序文件命令方式建立程序文件格式:格式:MODIFY COMMAND []|?>]|?功能:打开程序编辑窗口,从中可以修改或功能:打开程序编辑窗口,从中可以修改或 创建程序文件。

      创建程序文件几点说明:几点说明:l< <程序文件名程序文件名> >:指定修改或创建的程序文件名指定修改或创建的程序文件名l如果用如果用MODIFY COMMAND ?MODIFY COMMAND ?,,则出现则出现““打开打开””对话对话框,如图所示框,如图所示9/5/20249 命令方式建立程序文件命令方式建立程序文件 在用命令建立程序文件时,最好在命令后加上程在用命令建立程序文件时,最好在命令后加上程序文件名,这样可以直接创建或修改用户给出的程序文件名,这样可以直接创建或修改用户给出的程序文件 建好的文件将保存在建好的文件将保存在““默认目录默认目录””指定的文件夹指定的文件夹下,默认的扩展名是下,默认的扩展名是.PRG.PRG如果需要保存在其它文如果需要保存在其它文件夹下,还可在命令中指定路径如:件夹下,还可在命令中指定路径如: MODI COMM D:\MODI COMM D:\excerciseexcercise\example\example9/5/202410 程序输入与保存程序输入与保存[ [例例 6-1] 6-1] 在程序编辑窗口输入如下在程序编辑窗口输入如下6 6条命令。

      条命令CLEARCLEAR && &&将屏幕输出窗口内容清空将屏幕输出窗口内容清空a=12a=12 && &&将数值将数值1212赋值给变量赋值给变量a ab=18b=18 && &&将数值将数值1818赋值给变量赋值给变量b bc=a+bc=a+b && &&将变量将变量a a与与b b和计算出来,赋值给变量和计算出来,赋值给变量c c?a,b,c &&?a,b,c &&输出变量输出变量a a、、b b、、c c的值的值RETURN &&RETURN &&表示程序结束表示程序结束9/5/202411 程序输入与保存程序输入与保存在输入一个程序时,请用户注意以下几点:在输入一个程序时,请用户注意以下几点:l一个命令语句中只能有一个命令动词一个命令语句中只能有一个命令动词l每输入完一个语句按回车键表示该语句结束每输入完一个语句按回车键表示该语句结束l程序中用到的所有作为程序中用到的所有作为“分隔符号分隔符号”的标点符号的标点符号一律用英文半角符号一律用英文半角符号l输入或修改结束按输入或修改结束按“Ctrl+W”存盘,存盘,“Ctrl+Q”取消本次输入或修改结果还可使用取消本次输入或修改结果。

      还可使用“文件文件”→“另存为另存为”命令将编辑好的程序以另外的名命令将编辑好的程序以另外的名称存盘9/5/202412 6.1.2 6.1.2 程序运行程序运行l 菜单方式运行程序菜单方式运行程序 单单击击菜菜单单““程程序序””→→““运运行行””命命令令,,打打开开““运运行行””对对话话框框选选定定定定要要执执行行的的程程序序文文件件,,如如选选择择::cx1 cx1 ,,单击单击““运行运行””按钮,即可运行程序按钮,即可运行程序9/5/202413 6.1.2 6.1.2 程序运行程序运行l 命令方式运行程序命令方式运行程序格式:格式:DO >功能:将指定的程序文件调入内存并运行功能:将指定的程序文件调入内存并运行如在命令窗口里输入:如在命令窗口里输入:DO cx1DO cx1将在屏幕输出程序计算结果:将在屏幕输出程序计算结果: 12 18 3012 18 309/5/202414 6.1.2 6.1.2 程序运行程序运行l 单击常用工具栏上单击常用工具栏上““! !””命令按钮执行该程序命令按钮执行该程序 在程序打开并且为当前程序的情况下,在程序打开并且为当前程序的情况下,单击常用工具栏上单击常用工具栏上““! !””命令按钮可执行该程命令按钮可执行该程序。

      序 9/5/202415 6.1.2 6.1.2 程序运行程序运行l 程序错误对话框程序错误对话框 在程序执行过程中,如果程序出现运行错误或用户按下了在程序执行过程中,如果程序出现运行错误或用户按下了““EscEsc””键,将键,将弹出弹出““程序错误程序错误””对话框,如图所示对话框,如图所示 单单 击击 “取取 消消”按按钮钮可可取取消消程序的执行程序的执行 单单击击““挂挂起起””按按钮钮,,可可暂暂时时停停止止程程序序的的运运行行,,可可在在命命令令窗窗口口里里输输入入命命令令::RESUMERESUME,,或或单单击击菜菜单单““程程序序””→→““继继续续执执行行””命令可继续执行程序命令可继续执行程序 单单击击“忽忽略略”命命令令按按钮钮忽忽略略程程序序的的错错误误继继续续执执行行程程序序 单单击击““帮帮助助””命命令令按按钮钮可可提提示示相相关帮助信息关帮助信息 9/5/202416 6.1.3 6.1.3 程序辅助命令程序辅助命令 以以前前介介绍绍的的所所有有Visual Visual FoxProFoxPro命命令令都都可可以以用用在在程程序序设设计计中中。

      另另外外Visual Visual FoxProFoxPro还还提提供供了了一一些些辅辅助助命命令令,,这这些些命命令令能能使使程程序序更更好好地阅读和有效地运行本小节介绍:地阅读和有效地运行本小节介绍:l 程序注释命令程序注释命令 l 程序结束命令程序结束命令l 信息对话框函数信息对话框函数MESSAGEBOX MESSAGEBOX l 运行环境设置命令运行环境设置命令 9/5/202417 程序注释命令程序注释命令 Visual FoxProVisual FoxPro提供了提供了3 3种注释命令:种注释命令:格式格式1 1:: NOTE >格式格式2 2:: * * < <注释内容注释内容> >功能:使功能:使 NOTENOTE或或* * 后面的内容成为注释内容后面的内容成为注释内容格式格式3 3::[<[<命令命令>] &&<>] &&<注释内容注释内容> >功能:功能:< <注释内容注释内容> >对对&&&&左面的命令做出解释或给左面的命令做出解释或给出运行结果,又称为行尾注释命令出运行结果,又称为行尾注释命令 9/5/202418 格式格式1 1::RETURNRETURN功功能能::返返回回到到上上一一级级模模块块。

      如如果果本本程程序序是是以以菜菜单单方方式式或或在在命命令令窗窗口口中中调调用用执执行行的的,,则则返返回回到到命命令令交交互互状态格式格式2 2::CANCELCANCEL功功能能::终终止止程程序序运运行行,,清清除除程程序序中中的的私私有有变变量量,,返返回到命令窗口回到命令窗口格式格式3 3::QUITQUIT功能:关闭功能:关闭Visual FoxProVisual FoxPro,,返回到操作系统返回到操作系统程序结束命令程序结束命令 9/5/202419 信息对话框函数信息对话框函数MESSAGEBOXMESSAGEBOX MessageBoxMessageBox函函数数用用于于显显示示一一个个信信息息对对话话框框,,可可以以在在程程序序运运行行过过程程中中,,显显示示一一些些信信息息,,例例如如提提示示信信息息、、错错误误信息等其构成如图所示其构成如图所示信信息息对对话话框框的的“标标题题”部分信信息息对对话话框框的的“图图标标”部分信信息息对对话话框框的的“提示信息提示信息”部分信信息息对对话话框框的的“按钮按钮”部分9/5/202420 信息对话框函数信息对话框函数MESSAGEBOXMESSAGEBOX格式:格式: MESSAGEBOX([,<1>[,<数值表达式数值表达式>[,<>[,<字符表达式字符表达式2>]])2>]])功能:供用户定义信息对话框,按下相应的按钮返功能:供用户定义信息对话框,按下相应的按钮返回一个数值。

      回一个数值说明:说明:l <字符表达式字符表达式1>用于指定在对话框中显示的信息用于指定在对话框中显示的信息文本l <数值表达式数值表达式>用于根据表用于根据表6-1的内容设置对话框中的内容设置对话框中的按钮、图标和默认按钮,缺省该参数表示取的按钮、图标和默认按钮,缺省该参数表示取09/5/202421 信息对话框函数信息对话框函数MESSAGEBOXMESSAGEBOX9/5/202422 信息对话框函数信息对话框函数MESSAGEBOXMESSAGEBOXl< <字字符符表表达达式式2>2>用用于于指指定定对对话话框框标标题题栏栏的的显显示示文文本本缺缺省省该该参参数数表表示示在在标标题题栏栏显显示示““Microsoft Microsoft Visual Visual FoxProFoxPro”” l函函数数值值返返回回一一个个数数值值,,用用户户可可根根据据操操作作时时按按下下的的按按钮钮来来获获得得相相应应的的返返回回值值,,返返回回值值见见表表6-26-2,,用用户户编编程程时时根根据据返回值来设置动作返回值来设置动作 9/5/202423 信息对话框函数信息对话框函数MESSAGEBOXMESSAGEBOX举例举例[ [例例 6-3] 6-3] 在在信信息息对对话话框框中中使使用用2 2个个按按钮钮““是是””和和““否否””,,使使用用““问问号号””图图标标,,默默认认按按钮钮为为第第二二个个按按钮钮,,显显示示““真真的的要要退退出出系系统统吗吗??””信信息息,,对对话话框框标标题题为为““提提示示信信息息””。

      在命令窗口里输入:在命令窗口里输入:a=MESSAGEBOX("a=MESSAGEBOX("真的要退出系统吗?真的要退出系统吗?",4+32+256,"",4+32+256,"提示信息提示信息")") 就会显示如图所示的信息对话框就会显示如图所示的信息对话框9/5/202424 运行环境设置命令运行环境设置命令 在程序中运用一些环境设置命令,可使程在程序中运用一些环境设置命令,可使程序正常而高效地运行运行环境设置命令大序正常而高效地运行运行环境设置命令大多数是由多数是由SETSET命令设置的,它一般有命令设置的,它一般有ONON和和OFFOFF两个选项,当为两个选项,当为ONON状态时,设置有效,为状态时,设置有效,为OFFOFF状态时设置无效有的状态时设置无效有的SETSET命令用命令用TOTO指定设置指定设置值常用的环境设置命令如表值常用的环境设置命令如表6-36-3所示 9/5/202425 运行环境设置命令运行环境设置命令 9/5/202426 6.1.4 6.1.4 交互式输入命令交互式输入命令 根根据据解解决决实实际际问问题题的的需需要要,,往往往往在在程程序序运运行行的的过过程程中中,,由由用用户户向向程程序序输输入入一一些些数数据据或或信信息息,,完完成成这这种种功功能能的的一一些些命命令令称称为为交交互互式式输输入入命命令令。

      Visual Visual FoxProFoxPro提提供供了了多多种种交交互互式式输入命令本小节介绍三种命令:输入命令本小节介绍三种命令:l ACCEPTACCEPTl INPUT INPUTl WAIT WAIT9/5/202427 字符型数据输入命令字符型数据输入命令ACCEPTACCEPT 格式:格式:ACCEPT [] TO <>] TO <内存变量内存变量> >功能:暂停程序的执行,等待用户输入一个字符串给变量功能:暂停程序的执行,等待用户输入一个字符串给变量说明:说明:((1 1))[<[<提提示示信信息息>]>],,是是在在屏屏幕幕上上出出现现的的提提示示信信息息它它可可以以是是字字符符串串,,此此时时必必须须用用双双引引号号将将其其括括起起来来,,也也可可以以是是字字符符型型内内存存变变量,该内存变量必须预先赋值量,该内存变量必须预先赋值2 2))用用户户在在键键盘盘输输入入的的任任何何字字符符信信息息都都被被赋赋值值给给““内内存存变变量量””输输入入的的数数据据将将作作为为字字符符型型数数据据处处理理,,不不需需要要定定界界符符括括起起来来,,如如果输入了定界符,则这些定界符也被作为输入字符的一部分。

      果输入了定界符,则这些定界符也被作为输入字符的一部分3 3))输输入入完完需需要要的的信信息息后后,,按按““EnterEnter””键键结结束束本本命命令令的的输输入入如如果果没没有有输输入入其其他他信信息息,,只只按按回回车车键键,,将将把把一一个个空空字字符符串串赋赋值值给内存变量给内存变量 9/5/202428 ACCEPTACCEPT使用举例使用举例[ [例例 6-4] 6-4] 编一程序,将人事数据表打开,在程序运编一程序,将人事数据表打开,在程序运行中输入人员姓名,显示指定姓名的人员记录行中输入人员姓名,显示指定姓名的人员记录程序代码如下:程序代码如下:NOTE NOTE 该程序用于从人事数据表中查找用户指定姓名的人员信息该程序用于从人事数据表中查找用户指定姓名的人员信息CLEARCLEARUSE USE rsbrsbACCEPT "ACCEPT "请输入要查找的姓名:请输入要查找的姓名:" TO name" TO nameLOCATE FOR ALLTRIM(LOCATE FOR ALLTRIM(姓名姓名)=name)=nameDISPLAYDISPLAYRETURNRETURN9/5/202429 表达式输入命令表达式输入命令INPUTINPUT格式:格式:INPUT[] TO <>] TO <内存变量内存变量> >功能:暂停程序的执行,接受用户输入合法的表达式并将表功能:暂停程序的执行,接受用户输入合法的表达式并将表达式的值赋值给内存变量。

      达式的值赋值给内存变量说明:说明:((1 1))[<[<提示信息提示信息>]>],同,同““ACCEPTACCEPT””命令中的命令中的[<[<提示信息提示信息>]>]2 2))用用户户可可输输入入任任何何一一个个合合法法的的数数值值型型((N N))、、字字符符型型((C C))、、日日期期型型((D D))、、逻逻辑辑型型((L L))表表达达式式,,系系统统先先计计算算表表达式的值并将该值赋值给内存变量达式的值并将该值赋值给内存变量3 3))如如果果输输入入字字符符串串信信息息,,则则必必须须加加上上双双引引号号或或单单引引号号定定界符,如界符,如"ABC""ABC"4 4))按按““EnterEnter””键键结结束束输输入入,,如如果果输输入入的的是是非非法法表表达达式式,,系统将提示重新输入系统将提示重新输入9/5/202430 INPUTINPUT使用举例使用举例[ [例例 6-5] 6-5] 已知圆半径为已知圆半径为r r,,求圆面积求圆面积s s((要求四舍五入保留要求四舍五入保留三位小数)三位小数)分分析析::假假设设圆圆的的半半径径为为r r,,则则计计算算圆圆面面积积s s的的公公式式为为::s=πrs=πr2 2,,计计算算圆圆面面积积公公式式的的Visual Visual FoxProFoxPro表表达达式式为为::PI()*r^2 PI()*r^2 。

      程序代码如下:程序代码如下:* * 该程序用于计算用户指定半径的圆的面积该程序用于计算用户指定半径的圆的面积CLEARCLEARINPUT "INPUT "请输入圆半径请输入圆半径r=" TO rr=" TO rs=ROUND(PI()*r^2,3) s=ROUND(PI()*r^2,3) &&PI()&&PI()为圆周率函数为圆周率函数ππ,,ROUNDROUND函数为四舍五入函数函数为四舍五入函数?"?"该圆半径为:该圆半径为:",r",r?"?"该圆面积为:该圆面积为:",s",sRETURNRETURN9/5/202431 接收单字符命令接收单字符命令WAITWAIT 格式:格式:WAIT [] [TO <>] [TO <内存变量内存变量>] >] [WINDOWS [AT <[WINDOWS [AT <行坐标行坐标>,<>,<列坐标列坐标>]] [TIMEOUT<>]] [TIMEOUT<等等待秒数待秒数>] [NOWAIT]>] [NOWAIT]功功能能::暂暂停停程程序序,,用用户户按按任任意意键键或或者者时时间间超超过过等等待待的的秒秒数数后后,,程程序序继继续续执执行行。

      如如果果包包含含[TO [TO < <内内存存变变量量>]>]短短语语,,将将用用户户所所按按键键盘盘字字符符赋赋值值给给指指定定的的内内存存变变量9/5/202432 接收单字符命令接收单字符命令WAITWAIT说明说明((1 1))[<[<提示信息提示信息>]>],指定要显示的自定义信息若,指定要显示的自定义信息若省略该参数,则省略该参数,则 Visual FoxPro Visual FoxPro 显示默认的信息显示默认的信息““按任意键继续按任意键继续……”……”如果该参数为空字符,则不显如果该参数为空字符,则不显示信息2 2))[WINDOWS][WINDOWS]::在在 Visual FoxPro Visual FoxPro 主窗口右上角主窗口右上角的系统信息窗口中,显示提示信息如果指定的系统信息窗口中,显示提示信息如果指定[AT <[AT <行坐标行坐标>,<>,<列坐标列坐标>]>],则该窗口在指定屏幕坐标位置,则该窗口在指定屏幕坐标位置显示9/5/202433 接收单字符命令接收单字符命令WAITWAIT说明说明 ((3 3))TIMEOUT >:指定在执行:指定在执行 WAIT WAIT 命令命令之后,程序暂停的时间,之后,程序暂停的时间,< <等待秒数等待秒数> >参数指定等待的参数指定等待的时间秒数。

      时间秒数4 4))NOWAITNOWAIT子句指在前述指定的子句指在前述指定的WindowsWindows窗口中显示窗口中显示WAITWAIT信息的同时,程序继续执行而不暂停信息的同时,程序继续执行而不暂停9/5/202434 WAITWAIT使用举例使用举例 下列命令将在屏幕下列命令将在屏幕1616行、行、1616列位置处显示一列位置处显示一含有提示信息的小窗口,如图所示,此时单击含有提示信息的小窗口,如图所示,此时单击鼠标按键、按下键盘上任意一个按键或小窗口鼠标按键、按下键盘上任意一个按键或小窗口在屏幕上停留在屏幕上停留7 7秒后,从屏幕上消失秒后,从屏幕上消失WAIT "WAIT "请稍后,程序将继续执行请稍后,程序将继续执行............" WINDOWS AT 16,16 TIMEOUT 7" WINDOWS AT 16,16 TIMEOUT 79/5/202435 6.2 6.2 程序控制结构程序控制结构 结构化程序包括三种基本结构,即结构化程序包括三种基本结构,即l 顺序结构顺序结构l 选择结构选择结构l 循环结构循环结构 9/5/202436 6.2.1 6.2.1 顺序结构顺序结构 顺序结构是程序设计中最基本的顺序结构是程序设计中最基本的结构,该结构按照程序命令出现的结构,该结构按照程序命令出现的先后顺序依次执行。

      事实上,如果先后顺序依次执行事实上,如果不进行特殊说明,程序中的命令就不进行特殊说明,程序中的命令就自动按其前后排列顺序执行自动按其前后排列顺序执行 9/5/202437 顺序结构程序举例顺序结构程序举例1 1 [ [例例 6-6] 6-6] 假假设设我我国国20072007年年国国民民生生产产总总值值为为200,000200,000亿亿元元,,按按每每年年平平均均10%10%的的速速度度递递增增,,编编程程计计算到算到20202020年我国国民生产总值将会达到多少?年我国国民生产总值将会达到多少? 国民生产总值计算公式为:未来值国民生产总值计算公式为:未来值p1=p1=初值初值p0p0××((1+1+速度速度a a))时间间隔时间间隔n n 这这里里,,初初值值 p0=200000 p0=200000 亿亿元元,,速速度度为为 a=0.1a=0.1,,时时间间间间隔隔 n=2020-2007=13n=2020-2007=13,,P1P1为为未未来来待待计计算算的的值值Visual Visual FoxProFoxPro计计算算表表达达式式为为::p1=p0*(1+a)^n p1=p0*(1+a)^n 。

      该该程序流程图如图所示程序流程图如图所示 9/5/202438 顺序结构程序举例顺序结构程序举例1 1程序代码如下:程序代码如下:CLEARCLEARp0=200000p0=200000a=0.1a=0.1n=13n=13p1=p0*(1+a)^np1=p0*(1+a)^n?"?"我国我国20072007年的国民生产总值为:年的国民生产总值为:",p0, "",p0, "亿元" "?"?"我国我国20202020年的国民生产总值为:年的国民生产总值为:",p1, "",p1, "亿元" "RETURNRETURN9/5/202439 顺序结构程序举例顺序结构程序举例2 2[ [例例 6-7] 6-7] 在人事数据表中,根据从屏幕在人事数据表中,根据从屏幕上输入的职工姓名来查询该职工的姓名、性上输入的职工姓名来查询该职工的姓名、性别、职称、出生日期、工作日期别、职称、出生日期、工作日期用用ACCEPTACCEPT命令输入和命令输入和? ?命令输出,程序代命令输出,程序代码如下9/5/202440 顺序结构程序举例顺序结构程序举例2 2CLEARCLEARUSE USE rsbrsbACCEPT "ACCEPT "请输入被查询职工的姓名:请输入被查询职工的姓名:" TO name" TO nameLOCATE FOR ALLTRIM(LOCATE FOR ALLTRIM(姓名姓名)=name)=name?"?"姓名:姓名:"+"+姓名姓名?"?"性别:性别:"+"+性别性别?"?"职称:职称:"+"+职称职称?"?"出生日期:出生日期:"+DTOC("+DTOC(出生日期出生日期) )?"?"工作日期:工作日期:"+DTOC("+DTOC(工作日期工作日期) )USEUSERETURNRETURN9/5/202441 6.2.2 6.2.2 选择结构选择结构选选择择结结构构,,是是一一种种常常用用的的基基本本结结构构,,是是根根据据所所给给条条件件是是否否为为真真,,选选择择执执行行某某一一分分支支的的相相应应操操作作。

      按按照照选选择择结结构构执执行行路路径径的的多多少少,,可分为:可分为:l简单分支结构简单分支结构l双分支选择结构双分支选择结构l多分支选择结构多分支选择结构9/5/202442 简单分支结构简单分支结构 格式:格式: IF > [ [命令序列命令序列] ] ENDIF ENDIF功能:根据条件的逻辑值来确定是否执行功能:根据条件的逻辑值来确定是否执行[ [命命令序列令序列] ] 9/5/202443 简单分支结构说明简单分支结构说明((1 1))根根据据< <条条件件> >的的逻逻辑辑值值进进行行判判断断如如果果< <条条件件> >的的逻逻辑辑值值为为.T..T.,,就就依依次次执执行行[ [命命令令序序列列] ],,执执行行完完后后就就转转去去执执行行ENDIFENDIF之之后后的的命命令令如如果果< <条条件件> >的的逻逻辑辑值值为为.F..F.,,则则IF >和和ENDIFENDIF之之间间的的所所有有命命令令都都不不执执行行,,而而直直接接转到转到ENDIFENDIF之后的命令之后的命令 ((2 2))IFIF语句和语句和ENDIFENDIF语句必须成对出现,且各占一行。

      语句必须成对出现,且各占一行3 3)为了程序阅读方便,便于以后维护修改,建议)为了程序阅读方便,便于以后维护修改,建议对于对于[ [命令序列命令序列] ]部分采取向右缩进书写的方式部分采取向右缩进书写的方式9/5/202444 简单分支结构举例简单分支结构举例1 1 [ [例例 6-8] 6-8] 铁铁路路托托运运行行李李,,按按规规定定每每张张客客票票托托运运行行李李不不超超过过5050公公斤斤时时,,每每公公斤斤0.250.25元元,,如如超超过过5050公公斤斤,,超超过过部部分分按按每每公公斤斤0.450.45元元计计算算编编写写一一个个程程序序,,把把行行李李重重量量输输入入计计算算机机,,计算出运费,并打印出付款清单计算出运费,并打印出付款清单 问题分析:设行李重量为问题分析:设行李重量为W W公斤,应付运公斤,应付运费为费为P P元,则运费公式为:元,则运费公式为: 当当W≤50W≤50,, p=0.25p=0.25××w w 当当W W>>5050,, p=50p=50××0.25+(w-50)0.25+(w-50)××0.450.459/5/202445 简单分支结构举例简单分支结构举例1 1该问题计算机程序框图如该问题计算机程序框图如右右图所示。

      图所示 程序代码如下:程序代码如下:NOTE NOTE 计算铁路托运行李费,计算铁路托运行李费,W W为行李重量,为行李重量,P P为运费CLEARCLEARINPUT "INPUT "请输入行李重量:请输入行李重量:" TO w" TO wP=0.25*wP=0.25*wIF w>50IF w>50 P=50*0.25+(w-50)*0.45 P=50*0.25+(w-50)*0.45ENDIFENDIF?"?"行李重量为:行李重量为:",w,"",w,"公斤公斤" "?"?"应付运费为:应付运费为:",p,"",p,"元元" "RETURNRETURN9/5/202446 简单分支结构举例简单分支结构举例2 2[ [例例 6-9] 6-9] 程序运行时,从键盘输入两个程序运行时,从键盘输入两个数数a a、、b b,,如果如果a>ba>b,,则将二者的数据交换则将二者的数据交换程序代码如下:程序代码如下:9/5/202447 简单分支结构举例简单分支结构举例2 2CLEARCLEARINPUT "INPUT "请输入给变量请输入给变量a a的数值:的数值:" TO a " TO a INPUT "INPUT "请输入给变量请输入给变量b b的数值:的数值:" TO b " TO b ?"a?"a与与b b交换之前的值分别是:交换之前的值分别是:"+ALLTRIM(STR(a,10))+","+ALLTRIM(STR(b,10))"+ALLTRIM(STR(a,10))+","+ALLTRIM(STR(b,10))IF a>bIF a>b c=a && c c=a && c为中间变量为中间变量 a=ba=b b=c b=cENDIFENDIF?"a?"a与与b b交换之后的值分别是:交换之后的值分别是:"+ALLTRIM(STR(a,10))+","+ALLTRIM(STR(b,10))"+ALLTRIM(STR(a,10))+","+ALLTRIM(STR(b,10))RETURNRETURN9/5/202448 双分支选择结构双分支选择结构 格式:格式: IF > [ [命令序列命令序列1]1] ELSE ELSE [ [命令序列命令序列2]2] ENDIF ENDIF功能:根据条件的逻辑值来决定程序执行功能:根据条件的逻辑值来决定程序执行[ [命命令序列令序列1]1]还是还是[ [命令序列命令序列2]2]。

      9/5/202449 双分支选择结构说明双分支选择结构说明 ((1 1))如如果果< <条条件件> >的的逻逻辑辑值值为为.T..T.,,就就执执行行[ [命命令令序序列列1]1],,执执行行完完后后就就转转到到执执行行ENDIFENDIF之之后后的的命命令令如如果果< <条条件件> >的的逻逻辑辑值值为为.F..F.,,就就执执行行[ [命命令令序序列列2]2],,完完成后,转去执行成后,转去执行ENDIFENDIF之后的命令之后的命令2 2))ELSEELSE语句单独占一行,语句单独占一行,IFIF语句和语句和ENDIFENDIF语句必语句必须成对出现,且各占一行须成对出现,且各占一行9/5/202450 双分支选择结构举例双分支选择结构举例[ [例例 6-10] 6-10] 设设出出租租车车不不超超过过2 2公公里里时时一一律律收收费费7 7元元钱钱,,超超过过时时则则超超过过部部分分每每公公里里加加收收2.62.6元元试试根根据据里里程程数数编编程程计计算算并并显显示示出出应应付付车车费费((用用双分支选择结构编程)双分支选择结构编程)程序代码如下:程序代码如下:9/5/202451 双分支选择结构举例双分支选择结构举例CLEARCLEARINPUT "INPUT "请输入里程数:请输入里程数:" TO k" TO kIF k<=2IF k<=2 cfcf=7=7ELSEELSE cfcf=7+(k-2)*2.6=7+(k-2)*2.6ENDIFENDIF?"?"里程为:里程为:",k,"",k,"公里公里" "?"?"车费为:车费为:",",cfcf,","元元" "RETURNRETURN9/5/202452 分支结构嵌套分支结构嵌套 在在分分支支结结构构的的< <命命令令序序列列> >中中,,可可以以包包含含任任何何Visual Visual FoxProFoxPro命命令令语语句句,,也也可可以以包包括括另另外外一一个个或或几几个个合合法法的的分分支支结结构构语语句句,,也也就就是是说说分分支支结结构构可可以以嵌嵌套套。

      对对于于嵌嵌套套的的分分支支结结构构语语句句,,一一定定注注意意内内外外层层分分支支结结构构层层次次分分明明,,即即注注意意各各个个层层次次的的IF…ELSE…ENDIFIF…ELSE…ENDIF语句的配对情况语句的配对情况9/5/202453 分支结构嵌套举例分支结构嵌套举例 [ [例例 6-11] 6-11] 永永立立公公司司对对销销售售人人员员的的报报酬酬计计算算方方法法如如下下::每每月月销销售售1010万万元元((含含1010万万元元))以以下下者者,,只只得得基基本本工工资资10001000元元;;每每月月销销售售1010万万元元以以上上至至3030万万元元((含含3030万万元元))者者,,则则超超过过1010万万元元以以上上部部分分按按2%2%提提成成;;每每月月销销售售3030万万至至5050万万((含含5050万万元元))者者,,超超过过3030万万元元部部分分按按5%5%提提成成;;超超过过5050万万元元部部分分按按10%10%提提成成以以上上各各个个级级别别的的计计算算实实行行累累加加计计算算编编程程按按输输入入每每个个销销售售人人员员编编号号和和销销售售额额,,计计算算每每个个销销售售人人员员的的报报酬酬((报报酬酬结结果果按按四四舍舍五五入入规规则则取取整)。

      整)9/5/202454 分支结构嵌套举例分支结构嵌套举例 编程思路:为了编程方便,先将每个级别的编程思路:为了编程方便,先将每个级别的基准报酬计算出来,再根据销售额的多少用嵌基准报酬计算出来,再根据销售额的多少用嵌套分支结构判断计算该程序代码如下:套分支结构判断计算该程序代码如下:CLEARCLEARACCEPT "ACCEPT "销售员编号:销售员编号:" TO " TO salenumbersalenumberINPUT "INPUT "销售额:销售额:" TO " TO salevolumesalevolumepay1=1000pay1=1000pay2=pay1+ROUND((300000-100000)*0.02,0)pay2=pay1+ROUND((300000-100000)*0.02,0)pay3=pay2+ROUND((500000-300000)*0.05,0)pay3=pay2+ROUND((500000-300000)*0.05,0)9/5/202455 分支结构嵌套举例分支结构嵌套举例IF IF salevolumesalevolume<=100000<=100000 pays=pay1 pays=pay1ELSEELSE IF IF salevolumesalevolume<=300000<=300000 pays=pay1+ROUND((salevolume-100000)*0.02,0) pays=pay1+ROUND((salevolume-100000)*0.02,0) ELSE ELSE IF IF salevolumesalevolume<=500000<=500000 pays=pay2+ROUND((salevolume-300000)*0.05,0) pays=pay2+ROUND((salevolume-300000)*0.05,0) ELSE ELSEpays=pay3+ROUND((salevolume-500000)*0.1,0)pays=pay3+ROUND((salevolume-500000)*0.1,0) ENDIF ENDIF ENDIF ENDIFENDIFENDIF? ?salenumbersalenumber+"+"号销售员工作报酬:号销售员工作报酬:"+STR(pays,6,0)+""+STR(pays,6,0)+"元。

      元" "RETURN RETURN 9/5/202456 多分支选择结构多分支选择结构 格式:格式:DO CASEDO CASE CASE < CASE <条件条件1>1> < <命令序列命令序列1>1> CASE < CASE <条件条件2>2> < <命令序列命令序列2>2> ... ... ... ... CASE < CASE <条件条件n>n> < <命令序列命令序列n>n> [OTHERWISE [OTHERWISE < <命令序列命令序列n+1>]n+1>]ENDCASEENDCASE功能:根据功能:根据< <条件条件> >是否成立来决定是否执行其下的命令序列是否成立来决定是否执行其下的命令序列 9/5/202457 多分支选择结构说明多分支选择结构说明((1 1))多多分分支支选选择择结结构构执执行行的的过过程程是是::系系统统依依次次判判断断各各< <条条件件> >是是否否满满足足,,若若某某一一< <条条件件> >为为.T..T.,,就就执执行行该该< <条条件件> > 下下的的< <命命令令序序列列> >,,执执行行后后不不再再判判断断其其它它< <条条件件> >,,而而转转去去执执行行ENDCASEENDCASE后后面面的的第第一一条条命命令令。

      如如果果没没有有一一个个< <条条件件> >为为.T..T.,,就就执执行行OTHERWISEOTHERWISE后后面面的的[ [命命令令序序列列n+1]n+1],,直直到到ENDCASEENDCASE;;如如果果没没有有OTHERWISEOTHERWISE,,则则不不作作任任何何操操作就转向作就转向ENDCASEENDCASE之后的第一条命令之后的第一条命令2 2))DO CASEDO CASE语句和语句和ENDCASEENDCASE语句必须成对出现,各占语句必须成对出现,各占一行9/5/202458 多分支选择结构说明多分支选择结构说明((3 3)多分支选择结构中各)多分支选择结构中各CASECASE语句后的语句后的< <条件条件> >是按是按其先后顺序判断执行的,因此对实际问题进行编程其先后顺序判断执行的,因此对实际问题进行编程时,应认真考虑各个条件排列的先后顺序时,应认真考虑各个条件排列的先后顺序 9/5/202459 多分支选择结构举例多分支选择结构举例[ [例例 6-12] 6-12] 用多分支选择结构编程计算用多分支选择结构编程计算[ [例例 6-11]6-11]程序代码如下:。

      程序代码如下: CLEARCLEARACCEPT "ACCEPT "销售员编号:销售员编号:" TO " TO salenumbersalenumberINPUT "INPUT "销售额:销售额:" TO " TO salevolumesalevolumepay1=1000pay1=1000pay2=pay1+ROUND((300000-100000)*0.02,0)pay2=pay1+ROUND((300000-100000)*0.02,0)pay3=pay2+ROUND((500000-300000)*0.05,0)pay3=pay2+ROUND((500000-300000)*0.05,0)9/5/202460 多分支选择结构举例多分支选择结构举例DO CASEDO CASE CASE CASE salevolumesalevolume<=100000<=100000pays=pay1pays=pay1 CASE CASE salevolumesalevolume<=300000<=300000pays=pay1+ROUND((salevolume-100000)*0.02,0)pays=pay1+ROUND((salevolume-100000)*0.02,0) CASE CASE salevolumesalevolume<=500000<=500000pays=pay2+ROUND((salevolume-300000)*0.05,0)pays=pay2+ROUND((salevolume-300000)*0.05,0) OTHERWISE OTHERWISEpays=pay3+ROUND((salevolume-500000)*0.1,0)pays=pay3+ROUND((salevolume-500000)*0.1,0)ENDCASEENDCASE? ?salenumbersalenumber+"+"号销售员工作报酬:号销售员工作报酬:"+STR(pays,6,0)+""+STR(pays,6,0)+"元。

      元" "RETURN RETURN 9/5/202461 6.2.3 6.2.3 循环结构循环结构 在在程程序序设设计计中中,,有有时时需需要要从从某某处处开开始始有有规规律律地地反反复复执执行行某某些些类类似似的的操操作作,,这这些些类类似似的的操操作作一一般般用用循循环环结结构构程程序序设设计计来来解解决决在在Visual Visual FoxProFoxPro中中,,提提供供了了3 3种循环结构,即:种循环结构,即:l 当型循环结构当型循环结构l 步长型循环结构步长型循环结构l 表扫描型循环结构表扫描型循环结构9/5/202462 当型循环结构当型循环结构 格式:格式: DO WHILE > [ [命令序列命令序列] ] ENDDO ENDDO功能:根据功能:根据< <条件条件> >是否满足来决定是否执行是否满足来决定是否执行[ [命令序列命令序列] ]9/5/202463 当型循环结构说明当型循环结构说明 ((1 1))当当型型循循环环执执行行的的过过程程是是::根根据据< <条条件件> >的的逻逻辑辑值值,,进进行行判判断断。

      如如果果< <条条件件> >的的逻逻辑辑值值为为.T..T.,,则则执执行行DO DO WHILEWHILE和和ENDDOENDDO之之间间的的[ [命命令令序序列列] ]((也也称称为为循循环环体体)),,当当[ [命命令令序序列列] ]包包含含的的所所有有命命令令执执行行完完毕毕后后,,程程序序自自动动返返回回到到DO DO WHILEWHILE语语句句,,每每执执行行一一遍遍就就判判断断一一次次DO DO WHILEWHILE语语句句中中的的< <条条件件> >如如果果< <条条件件> >仍仍然然为为.T..T.,,则则继继续续执执行行DO DO WHILEWHILE和和ENDDOENDDO之之间间的的[ [命命令令序序列列] ],,直直到到< <条条件件> >的的逻逻辑辑值值为为.F..F.,,结结束束循循环环,,转去执行转去执行ENDDOENDDO之后的第一条命令之后的第一条命令2 2))DO WHILEDO WHILE和和ENDDOENDDO语句应配对使用,各占一行语句应配对使用,各占一行9/5/202464 当型循环结构说明当型循环结构说明 ((3 3))在在[ [命命令令序序列列] ]的的适适当当位位置置可可以以放放置置EXITEXIT和和LOOPLOOP语语句句,,用用以以对对循循环环过过程程作作特特殊殊处处理理。

      EXITEXIT的的功功能能是是::结结束束循循环环命命令令,,转转去去执执行行ENDDOENDDO之之后后的的第第一一条条命命令令LOOPLOOP语语句句的的功功能能是是::终终止止本本次次循循环环命命令令,,返返回回到到循循环环入入口口EXITEXIT和和LOOPLOOP语语句句只只能能在在循循环环结结构构中中使使用用,,并并且且常常附加条件加以限制常常附加条件加以限制4 4)在命令序列中可以嵌套)在命令序列中可以嵌套IFIF……ENDIFENDIF、、DO DO CASECASE……ENDCASEENDCASE、、DO WHILEDO WHILE……ENDDOENDDO、、FORFOR……ENDFORENDFOR、、SCANSCAN……ENDSCANENDSCAN等程序结构等程序结构9/5/202465 当型循环结构程序举例当型循环结构程序举例 [ [例例 6-13] 6-13] 鸡鸡兔兔同同笼笼问问题题设设鸡鸡和和兔兔共共有有头头3838个个,,脚脚138138个,问鸡和兔各为多少只?个,问鸡和兔各为多少只? 问问题题分分析析::设设鸡鸡为为cockscocks只只,,兔兔为为rabbitsrabbits只只,,则则有有 :: cocks cocks + + rabbits=38rabbits=38;; 2*cocks+4*rabbits 2*cocks+4*rabbits =138=138。

      可可令令鸡鸡和和兔兔的的头头数数之之和和或或者者脚脚数数之之和和为为一一变变量量,,如如本本题题令令二二者者脚脚数数之之和和footsfoots为为变变量量,,开开始始令令cocks=0cocks=0,, foots=0foots=0,, 用用 循循 环环 进进 行行 判判 断断 是是 否否foots<>138foots<>138,, 如如 果果 是是 ,, 则则 进进 行行 如如 下下 运运 算算 ::cocks=cocks+1cocks=cocks+1;; rabbits=38-cocksrabbits=38-cocks;;foots=2*cocks+4*rabbitsfoots=2*cocks+4*rabbits;;再再进进行行循循环环判判断断,,直直到到foots<>138foots<>138不不成成立立((即即foots=138foots=138)),,循循环环结结束束,,输输出结果程序框图如图所示程序框图如图所示9/5/202466 当型循环结构程序举例当型循环结构程序举例程序代码如下:程序代码如下:CLEARCLEARcocks=0cocks=0foots=0foots=0DO WHILE foots<>138DO WHILE foots<>138 cocks=cocks+1 cocks=cocks+1 rabbits=38-cocks rabbits=38-cocks foots=2*cocks+4*rabbits foots=2*cocks+4*rabbitsENDDOENDDO?"?"鸡的数量为:鸡的数量为:",cocks",cocks?"?"兔的数量为:兔的数量为:",rabbits",rabbitsRETURNRETURN9/5/202467 步长型循环结构步长型循环结构格式:格式: FOR =<>=<初值初值> TO <> TO <终值终值> [STEP <> [STEP <步长值步长值>]>] [ [命令序列命令序列] ] ENDFOR|NEXT ENDFOR|NEXT功能:根据循环变量的值是否超过终值来决功能:根据循环变量的值是否超过终值来决定是否执行定是否执行[ [命令序列命令序列] ]。

      9/5/202468 步长型循环结构说明步长型循环结构说明 ((1 1))< <初值初值> >、、< <终值终值> >、、< <步长值步长值> >都是数值表都是数值表达式;当达式;当< <步长值步长值> >是是1 1时,可以省略时,可以省略STEPSTEP子子句2 2))ENDFORENDFOR或或NEXTNEXT语句为循环终端语句,用语句为循环终端语句,用以标明本循环结构的终点该语句必须和以标明本循环结构的终点该语句必须和FORFOR语句配对使用语句配对使用9/5/202469 步长型循环结构说明步长型循环结构说明 ((3 3)该循环结构的执行过程是:首先将初值赋值给循环变)该循环结构的执行过程是:首先将初值赋值给循环变量,然后判断循环变量的值是否超过终值(这里超过终值量,然后判断循环变量的值是否超过终值(这里超过终值的含义是:如果步长值为正数,则循环变量的值大于终值的含义是:如果步长值为正数,则循环变量的值大于终值为超过,如果步长值为负数,则循环变量的值小于终值为为超过,如果步长值为负数,则循环变量的值小于终值为超过),不超过就执行循环体,遇到超过),不超过就执行循环体,遇到ENDFORENDFOR或或NEXTNEXT语句,语句,自动使循环变量增加一个步长值,再将循环变量的值与终自动使循环变量增加一个步长值,再将循环变量的值与终值比较,如果循环变量的值不超过终值,就再执行循环体,值比较,如果循环变量的值不超过终值,就再执行循环体,不断循环执行。

      如果循环变量的值超过终值则不执行循环不断循环执行如果循环变量的值超过终值则不执行循环体,而转去执行体,而转去执行ENDFORENDFOR或或NEXTNEXT语句后面的第一条语句语句后面的第一条语句4 4)在循环体内的适当位置也可以放置)在循环体内的适当位置也可以放置EXITEXIT和和LOOPLOOP语句,语句,作用和用法与当型循环结构类似作用和用法与当型循环结构类似9/5/202470 步长型循环结构程序举例步长型循环结构程序举例1 1 [ [例例 6-15] 6-15] 求求1+2+3+1+2+3+……+99+100+99+100的值 问问题题分分析析::采采用用累累加加的的办办法法,,用用循循环环变变量量产产生生1 1、、2 2、、3 3、、……、、9999、、100100这这些些数数用用s s保保存存累累加加和和,,s s的的初初始始值值为为0 0,,每每次次循循环环将将s s加加上上循循环环变变量量的的值值,,再再赋赋值值给给变变量量s s,,循循环环结结束束即即求求得得s s 程序代码为:程序代码为:9/5/202471 步长型循环结构程序举例步长型循环结构程序举例1 1CLEARCLEARs=0s=0FOR x=1 TO 100FOR x=1 TO 100 s=s+x s=s+xENDFORENDFOR?"1--100?"1--100自然数累加和是:自然数累加和是:",s",sRETURNRETURN9/5/202472 步长型循环结构程序举例步长型循环结构程序举例2 2 [ [例例 6-16] 6-16] 从键盘上输入任何一个自然数,求该从键盘上输入任何一个自然数,求该自然数的阶乘。

      自然数的阶乘 问题分析:假设该自然数为问题分析:假设该自然数为n n,,那么求那么求n n的阶乘的的阶乘的公式是:公式是: n*(n-1)*(n-2)*......*2*1n*(n-1)*(n-2)*......*2*1 有有了了这这样样的的公公式式,,我我们们就就可可以以用用循循环环程程序序将将该该n n的的阶阶乘乘求求解解出出来来将将循循环环变变量量的的初初值值设设为为n n,,终终值值设设为为1 1,,步步长长值值设设为为-1-1用用factorfactor作作为为存存放放阶阶乘乘的的变变量量,,factorfactor的的初初始始值值为为1 1,,每每次次循循环环都都使使factor factor 乘乘以以循循环环变变量量的的值值,,循循环环结结束束即即求求得得factorfactor的的值值该该程程序序代码如下:代码如下:9/5/202473 步长型循环结构程序举例步长型循环结构程序举例2CLEARCLEARfactor=1factor=1INPUT "INPUT "请输入一个自然数:请输入一个自然数:" TO n" TO nFOR x=n TO 1 STEP -1FOR x=n TO 1 STEP -1 factor=factor*x factor=factor*xENDFORENDFOR? "? "自然数自然数"+ALLTRIM(STR(n,10))+""+ALLTRIM(STR(n,10))+"的阶乘是:的阶乘是:"+ALLTRIM(STR(factor,20))"+ALLTRIM(STR(factor,20))RETURNRETURN9/5/202474 表扫描循环结构表扫描循环结构 格式:格式:SCAN [][FOR <>][FOR <条件条件1> |WHILE <1> |WHILE <条件条件2>]2>] [ [命令序列命令序列] ] ENDSCANENDSCAN功能:根据对打开数据表的范围和条件来决定功能:根据对打开数据表的范围和条件来决定是否执行是否执行[ [命令序列命令序列] ]。

      9/5/202475 表扫描循环结构说明表扫描循环结构说明((1 1)该结构是针对当前打开的数据表进行操作的它的功能是:)该结构是针对当前打开的数据表进行操作的它的功能是:对当前打开的数据表中指定范围内符合条件的记录,逐个进行对当前打开的数据表中指定范围内符合条件的记录,逐个进行< <命令序列命令序列> >所规定的操作,如果缺省范围和条件子句时,则对所所规定的操作,如果缺省范围和条件子句时,则对所有记录逐个进行有记录逐个进行< <命令序列命令序列> >规定的操作规定的操作2 2)表扫描型循环结构每循环一遍,记录指针自动移动到下一)表扫描型循环结构每循环一遍,记录指针自动移动到下一条记录,不需要设置条记录,不需要设置SKIPSKIP语句3 3))SCANSCAN和和ENDSCANENDSCAN语句要配对使用,且各占一行语句要配对使用,且各占一行4 4)在)在< <命令序列命令序列> >的适当位置也可以放置的适当位置也可以放置EXITEXIT和和LOOPLOOP语句,功语句,功能和用法同其他循环结构类似能和用法同其他循环结构类似9/5/202476 表扫描循环结构程序举例表扫描循环结构程序举例 [ [例例 6-17] 6-17] 将将人人事事数数据据表表中中基基本本工工资资小小于于10001000的的姓姓名名、、基基本本工工资资两两个个字字段段输输出出,,并并统统计计这这些些职职工工的的人人数数。

      用用SCANSCAN…… ENDSCANENDSCAN结结构编程)构编程) 基基本本操操作作步步骤骤为为::关关闭闭所所有有数数据据表表,,打打开开人人事事数数据据表表,,设设计计一一个个累累加加变变量量n n,,代代表表满满足足条条件件的的记记录录数数,,给给n n 赋赋初初值值0 0,,用用表表扫扫描描循循环环结结构构定定位位满满足足条条件件的的记记录录,,输输出出姓姓名名、、基基本本工工资资两两个个字字段段,,并并对对n n 进进行行累累加加1 1,,循循环环结结束束即求得即求得n n,,输出输出n n程序代码如下:程序代码如下:9/5/202477 表扫描循环结构程序举例表扫描循环结构程序举例CLOSE DATABASECLOSE DATABASECLEARCLEARUSE USE rsbrsbn=0n=0SCAN FOR SCAN FOR 基本工资基本工资<1000<1000 ? ?姓名姓名, ,基本工资基本工资 n=n+1n=n+1ENDSCAN ENDSCAN ?"?"基本工资在基本工资在10001000元以下的人数有:元以下的人数有:"+STR(N,2)+""+STR(N,2)+"人。

      人" "CLOSE DATABASECLOSE DATABASERETURNRETURN9/5/202478 循环结构嵌套循环结构嵌套 循循环环结结构构的的嵌嵌套套是是指指在在一一个个循循环环体体内内包包含含其它的循环结构,也称为多重循环结构其它的循环结构,也称为多重循环结构 同同一一种种类类型型的的循循环环结结构构可可以以嵌嵌套套,,不不同同类类型的循环结构也可以嵌套型的循环结构也可以嵌套 要要编编好好循循环环结结构构嵌嵌套套程程序序,,必必须须做做到到::循循环环开开始始语语句句和和循循环环结结束束语语句句配配对对出出现现;;内内外外层循环层次分明,不得交叉层循环层次分明,不得交叉 Visual Visual FoxPro FoxPro 最最多多允允许许128128层层嵌嵌套套请请看看下面的例子下面的例子9/5/202479 循环结构嵌套举例循环结构嵌套举例 [ [例例 6-18] 6-18] 用双重循环打印九九乘法表,即:用双重循环打印九九乘法表,即: 1 1××1=11=1,,1 1××2=22=2,,……,,1 1××9=99=9 2 2××1=21=2,,1 1××2=42=4,,……,,2 2××9=189=18 …… …… …… …… …… …… …… …… …… …… 9 9××1=91=9,,9 9××2=182=18,,……,,9 9××9=819=81 问题分析:这是一个有问题分析:这是一个有9 9个行、个行、9 9个列数据项的矩个列数据项的矩阵,可以用双重循环解决。

      外循环用于控制各个行,阵,可以用双重循环解决外循环用于控制各个行,内循环用于控制每一行的各个列项,一行输出完毕内循环用于控制每一行的各个列项,一行输出完毕以后,换行输出下一行各个列的数据项程序代码以后,换行输出下一行各个列的数据项程序代码如下:如下: 9/5/202480 循环结构嵌套举例循环结构嵌套举例* *打印乘法九九表打印乘法九九表CLEARCLEARFOR a=1 TO 9FOR a=1 TO 9 FOR b=1 TO 9 FOR b=1 TO 9 p=a*b p=a*b ??STR(a,1)+"??STR(a,1)+"××"+STR(b,1)+"="+STR(p,2)+" ""+STR(b,1)+"="+STR(p,2)+" " ENDFOR ENDFOR ? && ? &&注意注意????和和? ?的区别的区别ENDFORENDFORRETURNRETURN9/5/202481 6.3 6.3 多模块程序多模块程序 应应用用程程序序一一般般都都是是多多模模块块程程序序,,可可包包含含多多个个程程序序模模块块。

      模模块块是是可可以以命命名名的的一一个个程程序序段段,,可可指指主主程程序序、、子程序、函数、过程子程序、函数、过程 9/5/202482 6.3.1 6.3.1 子程序子程序能能够够完完成成一一定定功功能能的的可可供供其其它它程程序序使使用用((调调用用))的的独独立立程程序序段段称称为为子子程程序序它它独独立立存存在在,,但但可可以以被被多多次次调调用用,,调调用用子子程程序序的的程程序序称称为为主主程程序序在在应应用用系系统统开开发发中中,,把把程程序序完完成成的的主主要要功功能能都都分分配配给给各各子子程程序序去去完完成成,,这这样样主主程程序序可可以以写写得得比比较较简简捷捷,,整整个个应应用用系系统的维护方便,应用系统运行的效率也很高统的维护方便,应用系统运行的效率也很高9/5/202483 1.1.子程序的调用子程序的调用格式:格式: DO [WITH <1> [WITH <参数表参数表>] [IN <>] [IN <程序文件名程序文件名2>]2>]功能:用来执行一个程序功能:用来执行一个程序说明:说明: ((1 1))程程序序文文件件名名1 1::指指定定要要执执行行程程序序的的名名字字。

      DO DO < <程程序序文文件件名名1>1>直接执行或调用直接执行或调用< <程序文件名程序文件名1>1>指定的程序指定的程序 ((2 2))[WITH [WITH < <参参数数表表>]>]::指指定定传传递递到到子子程程序序的的参参数数,,在在< <参参数数表表> >中中列列出出的的参参数数可可以以是是表表达达式式、、内内存存变变量量、、常常量量、、字字段段或或用用户户自定义函数自定义函数 ((3 3))当当< <程程序序文文件件名名1>1>是是子子句句IN IN < <程程序序文文件件名名2>2>中中的的一一个个过过程时,程时,DODO命令调用该过程请参阅例命令调用该过程请参阅例6-246-249/5/202484 2. 2. 子程序的返回子程序的返回格式:格式: RETURN [TO MASTER | TO ]>]功能:将程序执行的控制权返回到指定程序的相关代码行功能:将程序执行的控制权返回到指定程序的相关代码行说明:说明: ((1 1)该语句放在一个程序的末尾该语句放在一个程序的末尾。

      ((2 2)不带参数的)不带参数的RETURNRETURN语句的功能是将程序控制权返回语句的功能是将程序控制权返回到调用该子程序的主程序的下一条命令语句到调用该子程序的主程序的下一条命令语句 ((3 3))RETURN TO MASTERRETURN TO MASTER::如果有多级程序调用,某一子如果有多级程序调用,某一子程序的该语句将使程序控制权返回到最高一级调用程序程序的该语句将使程序控制权返回到最高一级调用程序 ((4 4))RETURN TO >:表示将控制权交给指定:表示将控制权交给指定的程序9/5/202485 3. 3. 子程序的建立子程序的建立 建立子程序的方法与建立程序的方法类似建立子程序的方法与建立程序的方法类似但要注意:但要注意:l 每个子程序必须单独使用一个文件名保存每个子程序必须单独使用一个文件名保存起来,子程序文件名的扩展名也是起来,子程序文件名的扩展名也是.PRG.PRGl 主程序和子程序之间有关变量值的传递关主程序和子程序之间有关变量值的传递关系 9/5/202486 子程序举例子程序举例1 1 [ [例例 6-19] 6-19] 利用主程序调用子程序的方法计算任利用主程序调用子程序的方法计算任意意3 3个自然数的阶乘和,即求个自然数的阶乘和,即求s = a! + b! + c!s = a! + b! + c!。

      建立步骤:先建立好求任一自然数阶乘的程序,建立步骤:先建立好求任一自然数阶乘的程序,如例如例 6-166-16由于这里是通过主程序调用子程序的方由于这里是通过主程序调用子程序的方法求三个自然数阶乘之和,因此在子程序中所求出法求三个自然数阶乘之和,因此在子程序中所求出的每个自然数的阶乘就不用输出了;另外子程序计的每个自然数的阶乘就不用输出了;另外子程序计算所需的自然数是主程序通过变量传递到子程序的,算所需的自然数是主程序通过变量传递到子程序的,因此,在子程序中输入自然数的语句也可以不要因此,在子程序中输入自然数的语句也可以不要所以,在本例中,作为求阶乘的子程序可以是如下所以,在本例中,作为求阶乘的子程序可以是如下的程序代码:的程序代码: 9/5/202487 子程序举例子程序举例 注意,该子程序中的变量注意,该子程序中的变量n n的值需的值需要由主程序传递将该子程序保存文要由主程序传递将该子程序保存文件名为:件名为:jcjc 主程序的编写:在程序运行时输入主程序的编写:在程序运行时输入三个任意自然数分别给三个变量三个任意自然数分别给三个变量a a、、b b、、c c,,定义与子程序中传递数据的相关定义与子程序中传递数据的相关变量,这里分别是传递求阶乘需要的变量,这里分别是传递求阶乘需要的自然数变量自然数变量n n,,保存计算阶乘结果的保存计算阶乘结果的变量变量factorfactor。

      然后三次调用子程序即然后三次调用子程序即可分别计算出三个自然数的阶乘,计可分别计算出三个自然数的阶乘,计算这三个阶乘之和并输出算这三个阶乘之和并输出 根据以上分析,主程序代码如下:根据以上分析,主程序代码如下:* *子程序,文件名为子程序,文件名为jcjcfactor=1factor=1FOR x=n TO 1 STEP -1FOR x=n TO 1 STEP -1 factor=factor*x factor=factor*xENDFORENDFORRETURNRETURN9/5/202488 子程序举例子程序举例* *主程序代码主程序代码CLEARCLEARINPUT "a=" TO aINPUT "a=" TO aINPUT "b=" TO bINPUT "b=" TO bINPUT "c=" TO cINPUT "c=" TO cs=0s=0factor=1factor=1n=an=aDO DO jcjcs=factors=factorn=bn=bDODO jc jcs=s+factors=s+factorn=cn=cDODO jc jcs=s+factors=s+factor?ALLTRIM(STR(a,3))+"!+"+ALLTRIM(STR(b,3));?ALLTRIM(STR(a,3))+"!+"+ALLTRIM(STR(b,3)); +"!+"+ALLTRIM(STR(c,3))+"!=",s +"!+"+ALLTRIM(STR(c,3))+"!=",sRETURNRETURN9/5/202489 子程序举例子程序举例2 2 [ [例例 6-20] 6-20] 用带参数传递数据的方法编程计算球的体积用带参数传递数据的方法编程计算球的体积(四舍五入保留三位小数)。

      球体积的计算公式是:(四舍五入保留三位小数)球体积的计算公式是:volume=4/3πr3volume=4/3πr3,,Visual FoxProVisual FoxPro表达式是:表达式是:volume=4/3*PI()*r^3volume=4/3*PI()*r^3 注意,在建立含有参数传递子程序时,子程序的第一条注意,在建立含有参数传递子程序时,子程序的第一条语句必须是:语句必须是:PARAMETER > < <参参数数表表> >要要与与DO DO < <程程序序文文件件名名> > WITH WITH < <参参数数表表> > 语语句句中中的的< <参参数数表表> >中中的的参参数数一一一一对对应应,,以以便便相相互互传传递递数数据据,,由由PARAMETER PARAMETER < <参参数数表表> >中中给给出出的的参参数数叫叫形形参参,,而而DO DO < <程程序序文文件件名名> > WITH WITH < <参参数数表表> >中中给给出出的的参参数数叫叫实实参参实实参参的的名名称称与与形形参参的的名名称称可可以以一一样样,,也也可可以以不不一一样样。

      一一般般情情况况下下实实参参的的个个数数等等于于( (或或小小于于))形形参参的的个个数数,,但但不不能能大大于于形形参参的的个个数数,,如如实实参个数小于形参的个数,多出的形参取逻辑值参个数小于形参的个数,多出的形参取逻辑值.F..F.9/5/202490 子程序举例子程序举例2 2 本例计算球的体积的本例计算球的体积的子程序代码是:子程序代码是:PARAMETER r,volume PARAMETER r,volume volume=ROUND(4/3*PI()*r^3,3volume=ROUND(4/3*PI()*r^3,3) )RETURNRETURN 将该子程序以文件名将该子程序以文件名qtjqtj 保存起来保存起来主程序代码如下:主程序代码如下:CLEARCLEARINPUT "INPUT "请输入球的半径:请输入球的半径:" TO r" TO rcube=0cube=0DO DO qtjqtj WITH r,cube WITH r,cube?"?"半径为半径为"+ALLTRIM(STR(r,10))+"+ALLTRIM(STR(r,10))+““; ;球的体球的体积是:积是:",cube",cubeRETURNRETURN9/5/202491 6.3.2 6.3.2 自定义函数自定义函数 Visual Visual FoxProFoxPro提提供供了了许许多多系系统统函函数数,,用用户户也也 可可 以以 自自 己己 定定 义义 函函 数数 (( User User Defined Defined FunctionFunction)),,简简称称UDFUDF。

      在在Visual Visual FoxProFoxPro中中有两种形式的有两种形式的UDFUDF::l 独立用户定义函数独立用户定义函数l 依附用户定义函数依附用户定义函数 9/5/202492 独立用户定义函数独立用户定义函数 格式:格式:[PARAMETERS <[PARAMETERS <参数表参数表>]>][ [命令序列命令序列] ]RETURN []>]功能:定义一个可以独立运行的函数功能:定义一个可以独立运行的函数9/5/202493 独立用户定义函数说明独立用户定义函数说明 ((1 1))[PARAMETERS [PARAMETERS < <参参数数表表>]>]::接接受受函函数数运运行行时时传传递递过过来来的的数数据据,,如如果果函函数数不不需需要要传传递递数数据据,,该该语语句句可省略2 2))[ [命命令令序序列列] ]::用用于于进进行行各各种种处处理理的的命命令令组组合合简单的函数也可以为空简单的函数也可以为空3 3))RETURN RETURN < <表表达达式式> >语语句句中中< <表表达达式式> >的的值值作作为为返返回回函函数数值值,,它它决决定定了了函函数数的的类类型型。

      如如缺缺省省该该语语句句,,则返回函数值为则返回函数值为.T..T. 9/5/202494 独立用户定义函数说明独立用户定义函数说明 ((4 4))函函数数名名称称就就是是保保存存时时用用的的程程序序文文件件名名如如果果UDFUDF的的名名称称与与已已有有的的函函数数名名相相同同,,系系统统只只承承认认已已有有函函数,因此不能用已有的函数名来命名数,因此不能用已有的函数名来命名UDFUDF5 5))UDFUDF的的调调用用形形式式是是< <函函数数名名> >(([<[<参参数数表表>]>]))参参数数表表中中每每个个参参数数可可以以是是任任何何合合法法的的Visual Visual FoxProFoxPro表表达达式式,,参参数数的的个个数数必必须须与与UDFUDF中中PARAMETERSPARAMETERS语语句句里里的的参参数数表表参参数数个个数数相相等等,,数数据据类类型型也也应应符符合合UDFUDF中中的的要求9/5/202495 独立用户定义函数举例独立用户定义函数举例[ [例例 6-21] 6-21] 定义一个计算求立方定义一个计算求立方数的函数数的函数该程序的代码如下该程序的代码如下* *求立方数函数。

      函数名为求立方数函数函数名为cubecube*(*(即以即以cube.cube.prgprg为文件名存盘为文件名存盘) ) PARAMETERS v PARAMETERS v RETURN v*v*v RETURN v*v*v 在右面程序代码中,调用求在右面程序代码中,调用求立方函数立方函数cube.cube.prgprg, ,求求1 1到到1010的立的立方数 *求求1 1到到1010的立方数的立方数CLEARCLEARFOR i=1 TO 10FOR i=1 TO 10 ?i,cube(i) ?i,cube(i)ENDFORENDFORRETURNRETURN独立用户定独立用户定义函数义函数9/5/202496 依附用户定义函数依附用户定义函数 依附用户定义函数不能作为一个独立的程序文件,它以依附用户定义函数不能作为一个独立的程序文件,它以FUNCTION >开头,依附在某程序的后面或某过程文件开头,依附在某程序的后面或某过程文件中依附用户定义函数用如下格式定义依附用户定义函数用如下格式定义 FUNCTION > [PARAMETERS < [PARAMETERS <内存变量表内存变量表>]>] [ [命令序列命令序列] ] RETURN [< RETURN [<表达式表达式>]>]功能:定义一个跟随在主程序后面的依附用户定义函数。

      功能:定义一个跟随在主程序后面的依附用户定义函数说明:说明:FUNCTION >在程序里标识在程序里标识UDFUDF的开始并定义函的开始并定义函数名其它与独立函数规定相同其它与独立函数规定相同9/5/202497 依附用户定义函数举例依附用户定义函数举例[ [例例 6-22] 6-22] 用依附定义函数编写求用依附定义函数编写求1--101--10的立方数的立方数该程序的代码如下:该程序的代码如下: * *求求1 1到到1010的立方数主程序的立方数主程序 CLEARCLEAR FOR i=1 TO 10 FOR i=1 TO 10 ?i,cube1(i) ?i,cube1(i) ENDFOR ENDFOR RETURN RETURN * * 下面是依附用户定义函数代码下面是依附用户定义函数代码 FUNCTION cube1FUNCTION cube1 PARAMETERS v PARAMETERS v RETURN v*v*v RETURN v*v*v依附用户定义依附用户定义函数函数9/5/202498 6.3.3 6.3.3 过程过程 可可以以把把多多个个子子程程序序合合并并成成一一个个大大的的文文件件,,在在该该文文件件中中,,每每个个子子程程序序仍仍然然是是独独立立的的,,这这个个大大的的公公用用程程序序文文件件被被称称作作过过程程文文件件,,其其中中的的每每个个子子程程序序模模块块称称为为过过程程。

      由由于于过过程程文文件件是是集集中中起起来来以以一一个个文文件件的的形形式式存存储储在在磁磁盘盘上上的的,,调调用用时时作作为为一一个个文文件件一一次次打打开开,,每每个个子子过过程程可可随随时时调调用用,,从从而而大大大大减减少少了了访访问问磁磁盘盘的次数,能够提高程序运行效率的次数,能够提高程序运行效率 9/5/202499 6.3.3 6.3.3 过程过程格式:格式: PROCEDURE > [PARAMETERS < [PARAMETERS <参数表参数表>]>] < <命令序列命令序列> > RETURN RETURN功能:定义一个过程功能:定义一个过程说明:说明:((1 1))过过程程是是以以PROCEDUREPROCEDURE开开头头,,并并标标识识出出< <过过程程名名> >的的程程序序或或程程序序段段,,指指定定生生成成过过程程的的名名称称,,< <命命令令序序列列> >是是过过程程体体,,用用DO DO < <过过程名程名> > 命令调用命令调用2 2))过过程程可可以以放放在在主主程程序序的的后后面,由主程序调用。

      面,由主程序调用3 3))可可以以将将一一个个或或多多个个过过程程组组织织在在一一个个程程序序文文件件中中,,需需要要时时分别调用分别调用 9/5/2024100 过程举例过程举例1 1[ [例例 6-23] 6-23] 用用主主程程序序调调用用过过程程的的方方式式编编程程求求圆圆面积、圆周长、球体积面积、圆周长、球体积过程代码如下(跟随在过程代码如下(跟随在主程序的后面):主程序的后面):9/5/2024101 过程举例过程举例1 1* *主程序代码如下:主程序代码如下:CLEARCLEARINPUT "INPUT "请输入半径:请输入半径:" TO radius" TO radiusmjmj=0=0zczc=0=0tjtj=0=0DO DO ymjymj WITH WITH mjmj,radius,radiusDO DO yzcyzc WITH WITH zczc,radius,radiusDO DO qtjqtj WITH WITH tjtj,radius,radius?"?"半径为半径为"+ALLTRIM(STR(radius,10))+""+ALLTRIM(STR(radius,10))+"的圆面积是:的圆面积是:",",mjmj?"?"半径为半径为"+ALLTRIM(STR(radius,10))+""+ALLTRIM(STR(radius,10))+"的圆周长是:的圆周长是:",",zczc?"?"半径为半径为"+ALLTRIM(STR(radius,10))+""+ALLTRIM(STR(radius,10))+"的球体积是:的球体积是:",",tjtjRETURNRETURN9/5/2024102 过程举例过程举例2 2 [ [例例 6-24] 6-24] 在在主主程程序序中中调调用用过过程程文文件件中中的的过程的方式编程求圆面积、圆周长、球体积。

      过程的方式编程求圆面积、圆周长、球体积 可可以以将将例例6-236-23中中三三个个子子过过程程组组合合成成一一个个过过程程文文件件,,假假设设文文件件名名为为::circlecircle它它的的程程序序代码如下:代码如下:9/5/2024103 过程举例过程举例2 2* *过程文件过程文件circlecircle的代码的代码PROCEDURE PROCEDURE ymjymjPARAMETERS s,rPARAMETERS s,rs=pi()*r^2s=pi()*r^2RETURNRETURNPROCEDURE PROCEDURE yzcyzcPARAMETERS s,rPARAMETERS s,rs=2*pi()*rs=2*pi()*rRETURNRETURNPROCEDURE PROCEDURE qtjqtjPARAMETERS s,rPARAMETERS s,rs=4/3*pi()*r^3s=4/3*pi()*r^3RETURNRETURN9/5/2024104 过程举例过程举例2 2* * 方法方法1 1程序代码如下:程序代码如下:CLEARCLEARINPUT "INPUT "请输入半径:请输入半径:" TO radius" TO radiusmjmj=0=0zczc=0=0tjtj=0=0DO DO ymjymj WITH WITH mjmj,radius IN circle &&,radius IN circle &&以以ININ子句调用过程子句调用过程 DO DO yzcyzc WITH WITH zczc,radius IN circle,radius IN circleDO DO qtjqtj WITH WITH tjtj,radius IN circle,radius IN circle?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的圆面积是:的圆面积是:",",mjmj?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的圆周长是:的圆周长是:",",zczc?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的球体积是:的球体积是:",",tjtjRETURNRETURN9/5/2024105 过程举例过程举例2 2* * 方法方法2 2程序代码如下:程序代码如下:SET PROCEDURE TO circle &&SET PROCEDURE TO circle &&先将过程文件打开,需要时可先将过程文件打开,需要时可 &&&&直接调用其中包含的过程直接调用其中包含的过程CLEARCLEARINPUT "INPUT "请输入半径:请输入半径:" TO radius" TO radiusmjmj=0=0zczc=0=0tjtj=0=0DO DO ymjymj WITH WITH mjmj,radius &&,radius &&不再需要不再需要ININ子句子句DO DO yzcyzc WITH WITH zczc,radius ,radius DO DO qtjqtj WITH WITH tjtj,radius ,radius ?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的圆面积是:的圆面积是:",",mjmj?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的圆周长是:的圆周长是:",",zczc?"?"半径为半径为"+ALLTRIM(str(radius,10))+""+ALLTRIM(str(radius,10))+"的球体积是:的球体积是:",",tjtjRETURNRETURN9/5/2024106 6.3.4 6.3.4 变量作用域变量作用域 在多模块程序中,根据变量发生作用在多模块程序中,根据变量发生作用的范围,可将变量分为:的范围,可将变量分为:l 公共变量公共变量 l 私有变量私有变量l 本地变量本地变量9/5/2024107 公共变量公共变量 在在任任何何模模块块中中都都能能使使用用的的变变量量称称为为公公共共变变量量,,也也称称为为全全局局变变量量。

      当当某某些些变变量量需需要要在在各各个个模模块块中中都都可可能能发发挥挥作作用用的的时时候候,,要要定定义义成成公共变量用下列格式定义变量为公共变量公共变量用下列格式定义变量为公共变量 PUBLIC >功功能能::将将PUBLICPUBLIC后后指指定定的的变变量量定定义义为为公公共共变变量9/5/2024108 公共变量说明公共变量说明 ((1 1))将将< <内内存存变变量量表表> >指指定定的的所所有有变变量量定定义义为为公公共共变变量,并赋初值为量,并赋初值为 .F..F.2 2))在命令窗口里定义的变量都是公共变量在命令窗口里定义的变量都是公共变量3 3))程程序序终终止止时时,,公公共共变变量量不不会会自自动动清清除除,,需需要要用用CLEAR ALLCLEAR ALL或者或者RELEASE ALLRELEASE ALL命令清除命令清除4 4))可可以以用用类类似似的的格格式式将将数数组组建建立立并并声声明明为为全全局局数数组,如下列命令:组,如下列命令:PUBLIC PUBLIC [ARRAY]<[ARRAY]<数数组组名名>(<>(<数数值值表表达达式式1>[,<1>[,<数数值值表表达达式式2>])[,<2>])[,<数数组组名名>(<>(<数数值值表表达达式式1>[<1>[<数数值值表表达达式式2>]),2>]),……] ]9/5/2024109 私有变量私有变量 程程序序中中使使用用的的内内存存变变量量,,凡凡未未经经特特殊殊说说明明的的均均属属于于私私有有变变量量,,这这些些内内存存变变量量可可以以在在本本级级程程序序及及以以下下各各级级子子程程序序中中使使用用,,其其值值可可以以在在子子程程序序中中改改变变,,返返回回主主程程序时保留改变后的值。

      序时保留改变后的值 如如果果在在某某一一级级模模块块中中使使用用的的变变量量名名称称可可能能与与上上级级模模块块使使用用的的变变量量名名称称一一样样,,而而这这些些变变量量返返回回到到上上级级模模块块时时,,又又不不想想让让子子程程序序中中变变量量值值影影响响上上级级模模块块中中同同名名变变量量的的值值,,Visual Visual FoxProFoxPro提提供供了了屏屏蔽蔽上上级级模模块块变变量量的的方方法法,,被被屏屏蔽蔽的的变变量量名名,,当当子子程程序序结结束束返返回回到到主主程程序序时时,,不不会会影影响响主主程程序序中中同同名名变变量量的的值值下下述述声声明明私私有有变量的命令就能起到屏蔽上级同名变量的作用变量的命令就能起到屏蔽上级同名变量的作用9/5/2024110 私有变量私有变量格式:格式: PRIVATE |[ALL [LIKE|EXCEPT <>|[ALL [LIKE|EXCEPT <通配符通配符>]]>]]功能:将功能:将PRIVATEPRIVATE后的后的< <内存变量表内存变量表> >定义为私定义为私有变量。

      有变量9/5/2024111 私有变量说明私有变量说明((1 1)) 声声明明为为私私有有变变量量,,只只能能在在当当前前以以及及下下级级程程序序中中有有效效,,当当本本级级程程序序结结束束返返回回上上级级程程序序时时,,私私有有变变量量自自动清除,主程序中同名变量恢复其原来的值动清除,主程序中同名变量恢复其原来的值2 2))在在程程序序模模块块调调用用时时,,PARAMETERS PARAMETERS < <参参数数表表> > 语语句中句中< <参数表参数表> >指定的变量自动声明为私有变量指定的变量自动声明为私有变量3 3))使使用用PRIVATE PRIVATE 声声明明的的私私有有变变量量没没有有赋赋初初值值,,使使用前必须为变量赋值用前必须为变量赋值9/5/2024112 本地变量本地变量 本地变量既不能在上级模块中发挥作用,也不能本地变量既不能在上级模块中发挥作用,也不能在下级模块中发挥作用,只能在建立它的模块中发在下级模块中发挥作用,只能在建立它的模块中发挥作用,本级模块结束,本地变量自动清除下列挥作用,本级模块结束,本地变量自动清除下列命令将变量声明为本地变量。

      命令将变量声明为本地变量 LOCAL >功能:将功能:将LOCAL LOCAL 后的后的< <内存变量表内存变量表> >指定的内存变量指定的内存变量定义为本地变量定义为本地变量说明:说明:LOCALLOCAL将将< <内存变量表内存变量表> >指定的变量声明为本地指定的变量声明为本地变量的同时,并赋初值为变量的同时,并赋初值为.F. .F. 注意,注意,LOCALLOCAL不能简不能简写为写为LOCALOCA((Visual FoxProVisual FoxPro认为认为LOCALOCA与与LOCATELOCATE具有同具有同样的含义)样的含义)9/5/2024113 变量范围作用举例变量范围作用举例 请大家认真分析教材请大家认真分析教材[ [例例 6-25] 6-25] 中给出变量的作用范围中给出变量的作用范围9/5/2024114 在在开开发发应应用用程程序序时时,,为为了了保保证证程程序序的的正正确确性性和和合合理理性性,,需需要要对对应应用用程程序序进进行行调调试试,,以以发发现现其其中中的的错错误误并并进进行行修修改改,,直直至至达达到到设设计计要求,才能投入使用。

      本小节主要介绍:要求,才能投入使用本小节主要介绍:l 程序中常见的错误程序中常见的错误 l 程序查错程序查错 6.4 6.4 程序调试程序调试9/5/2024115 程序中常见的错误程序中常见的错误 l 语法错误语法错误 包包括括命命令令字字拼拼写写错错误误、、命命令令格格式式错错误误、、使使用用了了中中文文标标点点符符号号作作为为分分界界符符、、使使用用了了没没有有定定义义的的变变量量、、数据类型不匹配、操作的文件不存在等数据类型不匹配、操作的文件不存在等 l 溢出错误溢出错误 包包括括计计算算结结果果超超过过Visual Visual FoxProFoxPro所所允允许许的的最最大大值值、、文件太大、嵌套层数超过允许范围等文件太大、嵌套层数超过允许范围等 9/5/2024116 程序中常见的错误程序中常见的错误 • 逻辑错误逻辑错误 指程序设计的差错,如要计算圆的面积,在程序中指程序设计的差错,如要计算圆的面积,在程序中却用了计算圆周长的公式等却用了计算圆周长的公式等 该种程序错误需要用典型数据进行测试才能发现与该种程序错误需要用典型数据进行测试才能发现与修改。

      修改9/5/2024117 程序查错程序查错 查查错错技技术术可可分分为为两两类类::一一类类是是静静态态检检查查,,例例如如通通过过阅阅读读程程序序寻寻找找错错误误;;另另一一类类是是动动态态检检查查,,即即通通过过运运行行程程序序来来检检查查运运行行结结果果是是否否正确、是否符合要求动态检查方法有:正确、是否符合要求动态检查方法有:l 使用出错信息检查程序错误使用出错信息检查程序错误 l 使用调试器检查程序错误使用调试器检查程序错误 l 使用错误处理程序检查程序错误使用错误处理程序检查程序错误9/5/2024118 使用出错信息检查程序错误使用出错信息检查程序错误在程序运行过程中,如果程序存在语法错在程序运行过程中,如果程序存在语法错误或者溢出错误,系统会出现误或者溢出错误,系统会出现““程序错误程序错误””窗口,根据窗口的提示信息进行修改程序错窗口,根据窗口的提示信息进行修改程序错误9/5/2024119 使用调试器检查程序错误使用调试器检查程序错误l 调试器的作用调试器的作用 利利用用Visual Visual FoxProFoxPro提提供供的的““调调试试器器””工工具具,,通通过过调调试试设设置置、、执执行行程程序序、、修修改改程程序序等等步步骤骤可可帮帮助助用用户户调调试试修修改改程程序序。

      调调试试设设置置可可为为用用户户程程序序设设置置断断点点、、设设置置监监视视表表达达式式、、设设置置显显示示的的变变量量、、设设置置显显示示的的结结果果等等,,如果发现错误,可以当场切入程序修改如果发现错误,可以当场切入程序修改 l 调试器的启动调试器的启动 单单击击菜菜单单““工工具具””→→““调调试试器器””命命令令或或在在命命令令窗窗口里输入:口里输入:DEBUGDEBUG9/5/2024120 使用调试器检查程序错误使用调试器检查程序错误l 调试器介绍调试器介绍 调调试试器器窗窗口口打打开开后后,,通通过过在在该该窗窗口口的的窗窗口口菜菜单单中中选选定定跟跟踪踪、、监监视视、、局局部部、、调调用用堆堆栈栈或或调调试试输输出出命命令令,,就就可可以以打打开开相相应应的的子子窗窗口口 如图所示如图所示9/5/2024121 使用调试器检查程序错误使用调试器检查程序错误调试器菜单栏调试器菜单栏调试器工具栏调试器工具栏跟跟踪踪窗窗口口::显显示示要要打打开开的的程程序序,,以以便便调试和观察调试和观察监监 视视 窗窗 口口 设设置置监监视视表表达式 局局部部窗窗口口。

      显显示示程程序序、、过过程程或或者者方方法法程程序序中中的的所所有有变变量量、、数数组组、、对对象象以以及对象成员及对象成员 调调用用堆堆栈栈窗窗口口显显示示正正在在执执行行的的过过程程、、程程序序和和方方法程序的名称法程序的名称 调调试试输输出出窗窗口口显显示示活活动动程程序序、、过过程程或或方方法程序法程序 9/5/2024122 调试器调试器“调试调试”菜单介绍菜单介绍运运行行::开开始始执执行行在在跟跟踪踪窗窗口口中中打打开的程序开的程序 取取消消::关关闭闭程程序序,,终止程序运行终止程序运行 定定位位修修改改::在在程程序序暂暂停停时时,,选选定定该该命命令令后后将将会会出出现现一一个个取取消消程程序序信信息息框框,,选选定定其其中中的的“是是”按按钮钮,,就就会会切切换换到到程程序序编编辑辑器器窗窗口口,,用户可修改程序用户可修改程序 跳跳出出::从从当当前前光光标标处处跳跳到到下下一一断断点点处处或或需需要要屏屏幕幕输入数据处输入数据处 单单步步::逐逐行行执执行行该该程程序序代代码码,,如如果果代代码码调调用用了了函函数数、、方方法法程程序序或或者者过过程程,,那那么么这这些些函函数数、、方方法法程程序序或或者者过过程程在在后台运行。

      后台运行单单步步跟跟踪踪::逐逐行行执行代码执行代码 运运行行到到光光标标处处::执执行行从从当当前前行行指指示示器器到到光光标标所所在在行行之之间间的的代代码码 调调速速::调调整整运运行行速速度度,,即即设设置置“延延迟迟时间时间”9/5/2024123 使用调试器检查程序错误使用调试器检查程序错误[ [例例 6-26] 6-26] 编写如下程序代码,保存文件名为:编写如下程序代码,保存文件名为:cx26cx26并在并在调试器打开进行调试操作调试器打开进行调试操作 CLEARCLEAR a===123 a===123 &&&&赋值命令错误赋值命令错误 b="b="lklk””&&&&分界符号错误分界符号错误 c=180^180c=180^180 d=PI()*5^2 d=PI()*5^2 ?c ?c&&&&结果为若干个结果为若干个* *号,溢出错误号,溢出错误 ?d?d RETURN RETURN9/5/2024124 使用调试器检查程序错误使用调试器检查程序错误操作步骤如下:操作步骤如下:a. a. 打开调试器。

      打开调试器b. b. 打开跟踪窗口、监视窗口、局部窗口打开跟踪窗口、监视窗口、局部窗口c. c. 打开打开cx26cx26程序d. d. 在监视器窗口设置表达式分别在监视文本框中在监视器窗口设置表达式分别在监视文本框中输入输入PI()PI()、、PI()*5^2PI()*5^2两个表达式两个表达式e. e. 设置断点本例设置设置断点本例设置3 3个断点f. f. 执行程序运用调试器窗口调试菜单的各种调试执行程序运用调试器窗口调试菜单的各种调试命令调试本程序,观察各种调试命令的执行结果命令调试本程序,观察各种调试命令的执行结果 9/5/2024125 使用调试器检查程序错误使用调试器检查程序错误9/5/2024126 错误处理程序错误处理程序 格式:格式: ON ERROR ON ERROR 功功能能::用用来来当当程程序序出出现现错错误误时时指指定定执执行行的的程程序序,,可可以以帮助我们定位错误和提供相关信息帮助我们定位错误和提供相关信息 9/5/2024127 错误处理程序说明错误处理程序说明① ① COMMANDCOMMAND是是指指定定程程序序出出错错时时应应执执行行的的Visual Visual FoxProFoxPro命命令令。

      执执行行此此命命令令后后,,程程序序将将从从引引起起错错误误的的程程序序行行的的下下一一行行重重新新开开始始执执行行但但如如果果错错误误处处理理过过程程中中包包含含RETRYRETRY,,则则重重新新执执行行引起错误的程序行引起错误的程序行 ② ② 如果命令指定了错误出现时执行的一个过程,那么可以如果命令指定了错误出现时执行的一个过程,那么可以使用使用ERROR()ERROR()、、MESSAGE()MESSAGE()、、LINENO()LINENO()和和PROGRAM()PROGRAM()函数将错函数将错误代码、错误消息、程序行号和程序名称传递到该过程,误代码、错误消息、程序行号和程序名称传递到该过程,这些信息可以帮助纠正错误这些信息可以帮助纠正错误 9/5/2024128 错误处理程序说明错误处理程序说明③ ③ 使用不带参数的使用不带参数的ON ERRORON ERROR命令可以恢复命令可以恢复Visual FoxProVisual FoxPro默认的错误处理程序默认的错误处理程序 ④ ④ ERROR ERROR 过过程程不不能能嵌嵌套套如如果果在在ON ON ERRORERROR过过程程中中又又出出现现了了ON ON ERRORERROR命命令令,,则则恢恢复复Visual Visual FoxProFoxPro默默认认的的错误处理程序。

      错误处理程序 9/5/2024129 本章小结本章小结((1 1)程序的建立与运行,介绍了菜单和命令)程序的建立与运行,介绍了菜单和命令方式进入程序编辑器、常用的程序辅助命令方式进入程序编辑器、常用的程序辅助命令和交互式命令和交互式命令2 2)程序的三种基本结构,即顺序结构、选)程序的三种基本结构,即顺序结构、选择结构、循环结构择结构、循环结构3 3)子程序、自定义函数、过程等多模块程)子程序、自定义函数、过程等多模块程序,便量的作用范围和程序的调试序,便量的作用范围和程序的调试9/5/2024130 本章重点本章重点 本章重点是程序的三种基本结本章重点是程序的三种基本结构以及程序的调试构以及程序的调试 9/5/2024131 本章难点本章难点 本章的难点是多模块程序,需要本章的难点是多模块程序,需要用户反复学习,才能逐步掌握用户反复学习,才能逐步掌握 9/5/2024132 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.