《VisualFoxPro程序设计》第6章结构化程序设计.ppt

上传人:max****ui 文档编号:8305670 上传时间:2020-03-28 格式:PPT 页数:81 大小:448KB
返回 下载 相关 举报
《VisualFoxPro程序设计》第6章结构化程序设计.ppt_第1页
第1页 / 共81页
《VisualFoxPro程序设计》第6章结构化程序设计.ppt_第2页
第2页 / 共81页
《VisualFoxPro程序设计》第6章结构化程序设计.ppt_第3页
第3页 / 共81页
点击查看更多>>
资源描述
VisualFoxPro6 0程序设计 课件 1 第6章结构化程序设计 6 1程序文件6 2程序控制结构6 3过程与过程调用6 4程序的调试 提示 单击各个标题前的动画符号 链接到相应的章节 VisualFoxPro6 0程序设计 课件 2 在程序设计的方法中 结构化程序设计是程序设计的基本方法 结构化程序设计的基本思想是逐步求精 模块化和自顶向下 将一个复杂的程序系统的设计任务分成多个易于控制和处理的子任务 每个子任务都是可独立编程的子程序 过程或函数模块 其程序控制结构有顺序结构 分支结构和循环结构三种 VisualFoxPro6 0程序设计 课件 3 6 1程序文件 6 1 1程序文件建立6 1 2简单的交互方式输入输出命令6 1 3应用程序的调试与执行 VisualFoxPro6 0程序设计 课件 4 6 1程序文件 前面已经介绍了VisualFoxPro的交互式操作方式 菜单操作方式和命令操作方式 这两种方式对于需要大量重复操作的数据库管理工作来说 效率低下 而且这两种方式都要求用户熟练掌握VisualFoxPro中的各种数据操作 这在实际应用环境中并不现实 因此 VisualFoxPro提供了程序文件方式来管理数据库 即通过程序文件编辑工具 将数据库操作的命令 函数等编制成一个有序序列存放在程序文件中 然后通过菜单操作方式或命令操作方式运行该程序文件 即可完成相应的一系列操作 程序文件的扩展名为 PRG VisualFoxPro6 0程序设计 课件 5 6 1 1程序文件的建立 VisualFoxPro中编写的代码都存放在纯文本格式的文件中 因此任何可以建立 编辑文本文件的工具都可以创建和编辑VisualFoxPro程序文件 通常使用的是VisualFoxPro提供的内部编辑器 程序文件建立的方法有多种 常用的有下列3种方法 1 菜单方式单击 文件 新建 命令 在弹出的 新建 对话框中 选择文件类型为 程序 然后单击 新建文件 按钮 即可打开如图所示的程序编辑窗口 在编辑窗口中可以逐条输入命令 程序文件建立好后 可以单击 文件 保存 命令来保存该程序文件 VisualFoxPro6 0程序设计 课件 6 2 项目管理器方式 1 单击 文件 新建 命令 在弹出的 新建 对话框中 选择文件类型为 项目 然后单击 新建文件 按钮 在打开的 创建 对话框中输入项目文件名后 单击 保存 按钮 即可打开 项目管理器 对话框 2 在 项目管理器 对话框的 全部 选项卡中 单击 代码 前的 号展开 代码 文件夹 选择 程序 选项 然后单击 新建 按钮 如图所示 也可打开程序编辑窗口 VisualFoxPro6 0程序设计 课件 7 3 命令方式 命令格式如下 MODIFYCOMMAND 在命令窗口中输入该命令后 也会打开程序编辑窗口 其中各参数的说明如下 如果命令中给出 若该文件不存在 则打开以该文件名为标题的程序编辑窗口 若该文件已存在 则在程序编辑窗口中打开该文件 可以重新进行编辑修改 如果命令中缺省 则会打开默认以 程序1 程序2 为标题的程序编辑窗口 在保存时 用户应重新为程序文件命名 若中未给出包含盘符和路径的绝对路径 默认保存在当前文件中 中可以缺省程序文件的扩展名 系统会自动加上扩展名 PRG VisualFoxPro6 0程序设计 课件 8 6 1 2简单的交互方式输入输出命令 在程序的执行过程中 经常需要从键盘输入数据 或将运行结果在屏幕上显示出来 这就需要在程序设计中使用到交互式的输入输出命令 1 输入单字符命令输入单字符命令的格式如下 WAIT TO 其中各参数的说明如下 表示在等待用户输入时 在屏幕上显示的提示内容 通常是一个字符串 需用单引号 双引号或方括号作为定界符括起来 也可以是字符串变量 若省略该项 屏幕上显示的是系统默认的提示信息 按任意键继续 TO 表示将输入的单个字符赋给内存变量 输入字符时 不需输入字符的定界符 否则内存变量得到的是第一个定界符 若未输入字符就按回车键或单击鼠标 则内存变量得到空值 若省略该项 则输入的字符不能保留 注意 该命令一般只是为了显示提示信息 等待用户按任意键后继续执行 VisualFoxPro6 0程序设计 课件 9 2 输入字符串命令 输入字符串命令的格式如下 ACCEPT TO其中各参数的说明如下 表示在等待用户输入时 在屏幕上显示的提示内容 通常是一个字符串 需用单引号 双引号或方括号作为定界符括起来 也可以是字符串变量 TO表示将输入的字符串赋给内存变量 输入字符串时 不需输入字符串的定界符 否则定界符也会作为字符串的一部分被赋给内存变量 若未输入字符就按回车键或单击鼠标 则内存变量得到空值 若省略该项 则输入的字符不能保留 例6 1 编写程序文件prog prg 要求根据键盘输入的学生姓名 显示该学生的学生信息 分析 要在表中查询满足条件的记录 首先应打开该表 根据题目要求 本题应先打开的是学生信息表student 再用ACCEPT命令将所输入的学生姓名存放到内存变量中 再根据该值在表中进行查询并显示 所有操作结束后应关闭该表 VisualFoxPro6 0程序设计 课件 10 程序编辑窗口的输入如图6 3所示 运行时在屏幕中输入 王燕燕 结果如图6 4所示 图6 3程序编辑窗口的输入 图6 4结果显示 VisualFoxPro6 0程序设计 课件 11 3 输入任意数据命令 输入任意数据命令的格式如下 INPUT TO其中各参数的说明如下 表示在等待用户输入时 在屏幕上显示的提示内容 通常是一个字符串 需用单引号 双引号或方括号作为定界符括起来 也可以是字符串变量 TO表示将输入的数据赋给内存变量 INPUT命令可以接受字符型 数值型 逻辑型 日期型和日期时间型数据 可以接受常量 变量或一般表达式 数值型常量可直接输入 字符型常量必须加定界符 逻辑型常量必须加圆点定界符 如 T 或 F 日期型和日期时间型常量既可按严格格式输入 也可利用相应的转换函数输入 如 2008 5 27 2008 5 2711 14 20a CTOD 05 27 08 CTOT 05 27 0811 14 20a 若未输入直接按回车键 屏幕会继续显示提示信息等待输入 VisualFoxPro6 0程序设计 课件 12 4 非格式输出命令 该命令的格式如下 该命令的功能是在VisualFoxPro的主窗口中换行或不换行输出中各个表达式的值 其中 表示换行输出 即中各个表达式的值在当前主窗口中最后一次输出位置的下一行输出 表示不换行输出 即中各个表达式的值在当前主窗口中最后一次输出位置后直接输出 并不换行 VisualFoxPro6 0程序设计 课件 13 5 格式输入输出命令 该命令格式如下 SAY GET READ 其中各参数的说明如下 表示在VisualFoxPro的主窗口中指定的位置输入输出 起始行列号均为0 行和列可以是常量值 也可以是数值型表达式 SAY GET 如果后面没有READ选项 将在指定的位置输出表达式和变量的值 如果后面有READ选项 则对变量的原有值进行编辑修改 并将结果保存在变量中 其中的变量可以是已赋值的内存变量 也可以是字段变量 类型可以是数值型 字符型 逻辑型 日期型 日期时间型 备注型 通用型等 VisualFoxPro6 0程序设计 课件 14 图6 5程序编辑窗口的输入 图6 6结果显示 例6 2 编写程序prog2 prg 使用格式输入输出命令 修改学生信息表student中指定学号的学生记录的字段值 程序编辑窗口的输入如图6 5 运行时在屏幕中输入 王燕燕 运行结果如图6 6 VisualFoxPro6 0程序设计 课件 15 6 其他辅助命令 1 清屏命令清屏命令主要用于清除VFP主窗口中的内容 清除完后光标回到窗口的左上角 该命令格式如下 CLEAR 2 终止程序命令该命令的功能是终止程序的运行 返回VFP的主窗口 同时释放所有私有变量 其格式如下 CANCEL 3 退出系统命令该命令的功能是退出VFP系统 回到操作系统 退出前将关闭所有文件 清除所有变量 其格式如下 QUIT 4 设置会话状态命令该命令的格式如下 SERTALKON OFF该命令用于设置是否显示命令执行过程中的状态信息 默认时为SETTALKON 即打开会话状态 通常在执行单命令或调试程序时 设置为ON状态 而在程序执行时设置为OFF状态 VisualFoxPro6 0程序设计 课件 16 6 1 3应用程序的执行 运行程序文件的方法有多种 常用的方法主要有以下3种 单击 程序 运行 命令 在打开的 运行 对话框中选择要运行的程序文件 然后单击 运行 按钮即可运行该程序文件 在 项目管理器 对话框的 全部 选项卡中 先选中要运行的程序 然后单击 运行 按钮 即可执行该程序 在命令窗口中输入命令 DO 也可以执行相应的程序文件 事实上 在程序输入完毕后 不关闭程序编辑窗口 直接单击工具栏的 运行 按钮可以直接运行程序 若程序无语法错误 可以得到运行结果 若程序中存在语法错误 则会弹出 程序错误 对话框 给出错误的提示信息 此时 可以单击 取消 按钮 或按 Esc 键终止程序的运行 再根据错误提示修改程序 VisualFoxPro6 0程序设计 课件 17 6 2程序控制结构 6 2 1顺序结构程序设计6 2 2分支结构程序设计6 2 3循环结构程序设计 VisualFoxPro6 0程序设计 课件 18 6 2程序控制结构 程序的控制结构包括顺序结构 分支结构和循环结构3种 每一种控制结构可以包含一个或多个语句 任何程序都是由这3种基本控制结构构成的 VisualFoxPro6 0程序设计 课件 19 6 2 1顺序结构 顺序结构是程序设计中最简单 最常用的基本结构 在该结构中 程序按照命令语句书写的先后顺序依次执行 该结构的流程图如图6 7所示 顺序结构是任何程序的主体基本结构 在分支结构和循环结构内部 也常以顺序结构作为其子结构 前面介绍的例子使用的都是顺序结构 顺序结构的基本组成语句是数据的输入输出 赋值语句等 数据的输入和输出已在上一节介绍 下面介绍顺序结构中常用的赋值语句和语句的续行与注释功能 VisualFoxPro6 0程序设计 课件 20 1 赋值语句 程序设计中经常要使用变量 变量在使用之前需要设定一个初始值 使用过程中也可能要重新赋值 因此可以使用赋值语句将指定的值赋给变量或对象的某个属性 赋值语句主要有如下两种格式 1 使用赋值符号 该语句的格式如下 该语句的意思是将表达式的值计算出来后赋给变量名所代表的存储单元 2 使用STORE TO 命令该命令的格式如下 STORETO该命令是将表达式的值计算出来后赋值变量名表中的每个变量 如 STORE3 5TOa b c d是将变量a b c d同时赋值为15 VisualFoxPro6 0程序设计 课件 21 在使用赋值语句时需要注意以下几点 应注意区分赋值符号与数学中的等号 a 3应读作 将数值3赋给变量a a a 1表示将原来a的值加上1后再放到原来a的存储单元中 即将原来a的值加上1后再赋给a 因此 下面两个语句的意思是不同的 X y 表示将y的值赋给xy x 表示将x的值赋给y若要对日期型或日期时间型内存变量赋值 如果表达式是同样类型的常量 必须用花括号 括起来并在前面加一个 符号 如果表达式是字符串 则应用转换函数将其转换为相应的类型 例如 t1 2008 5 27 t2 2008 5 2711 14 20a t3 CTOD 05 27 08 t4 CTOT 05 27 0811 14 20a 赋值符号的左边只能是变量 不能是表达式 如x y z是错误的赋值语句 VisualFoxPro6 0程序设计 课件 22 2 语句的续行 当一条语句很长时 在程序编辑窗口中书写或阅读都不方便 例如 selecttop50percent学号 姓名 身高 year 出生日期 出生年份fromstudentorderby出生年份desc 身高这时 为了便于书写和理解 可以使用语句的续行功能 用分号 将较长的语句分为两行或多行 因此上述语句可以改写为 selecttop50percent学号 姓名 身高 year 出生日期 出生年份 fromstudent orderby出生年份desc 身高注意 作为续行符的分号只能出现在行尾 VisualFoxPro6 0程序设计 课件 23 3 语句的注释 为了提高程序的可读性 通常在程序的适当位置加上相应的注释 VisualFoxPro中提供了两种注释语句 1 程序注释该语句的格式如下 NOTE 该语句通常单独放置一行 用于对程序进行注释 程序运行时 不执行以NOTE或 开头的行 2 行注释语句格式如下 该语句通常放在某行命令之后 用于对该行命令进行注释 注意 不能在命令语句行的续行分号后面加入注释 VisualFoxPro6 0程序设计 课件 24 6 2 2分支结构 分支结构也称为选择结构 是在程序执行时 根据不同的条件 选择执行不同的语句 VisualFoxPro中提供了两种分支结构语句 分别是IF语句和DOCASE语句 1 IF语句IF语句主要有两种形式 单分支形式和双分支形式 1 单分支形式单分支形式的格式如下 IFENDIF注意 IF和ENDIF必须成对使用 并分两行书写 VisualFoxPro6 0程序设计 课件 25 其中条件表达式是关系表达式或逻辑表达式 语句执行时 首先计算条件表达式的值 若为真 T 则执行语句块中的语句 否则不执行语句块 无论是否执行语句块中的语句 程序都将转向ENDIF后面的下一条语句继续执行 流程图如图 VisualFoxPro6 0程序设计 课件 26 例6 3 从键盘上输入两个数x和y 比较大小 若x小于y 则交换两个变量值 使得x不小于y 分析 根据题目要求 若满足 x小于y 这个条件 则执行 交换两个变量值 的操作 因此IF后面的应是 x 应是 交换两个变量值 由于计算机内存有易被覆盖的特点 因此计算机中交换两个变量的值只能借助于第三个中间变量来间接交换 如图6 9所示 则交换两个变量值的代码应为 t xx yy t VisualFoxPro6 0程序设计 课件 27 本题程序代码如下 prog3 prginput x toxinput y toyifx yt xx yy tendif x x y y VisualFoxPro6 0程序设计 课件 28 2 双分支形式 双分支格式 IFELSEENDIF语句执行时 根据条件表达式的值选择执行两个语句块中的一个 若条件表达式的值为真 T 则执行IF后面的语句块1 然后执行ENDIF后面的语句 若条件表达式的值为假 F 则执行ELSE后面的语句块2 然后执行ENDIF后面的语句 其流程图如图6 10所示 VisualFoxPro6 0程序设计 课件 29 用双分支实现 其程序代码如下 ifx 0y cos x sqrt x 2 1 elsey log x 2 x 10endif也可用单分支实现 其程序代码如下 y cos x sqrt x 2 1 ifx0y log x 2 x 10endif 例6 4 计算分段函数 VisualFoxPro6 0程序设计 课件 30 3 IF语句的嵌套 IF语句的上述两种形式中的语句块可以包含任何合法的VFP语句 当然也可以包含另一条IF语句 这就构成了IF语句的嵌套 利用IF语句的嵌套可以实现多分支的选择结构 例6 5 从键盘上输入3个数a b c 求这3个数的最大值并输出 分析 假设a b且a c 则最大值肯定是a 若这个条件不满足 而所满足的条件是b a且b c 则最大值肯定是b 否则最大值肯定是c VisualFoxPro6 0程序设计 课件 31 程序代码如下 prog5 prginput 请输入a的值 toainput 请输入b的值 tobinput 请输入c的值 tocifa banda ct aelseifb aandb ct belset cendifendif 三个数中的最大值是 t VisualFoxPro6 0程序设计 课件 32 2 DOCASE语句 该语句的格式如下 DOCASECASECASE CASE OTHERWISE ENDCASE语句执行时 依次判断条件表达式的值 一旦某一条件满足 则执行相应语句块 如果所有条件表达式的值都为假 若无OTHERWISE子句 则不执行任何语句 若有OTHERWISE子句 则执行OTHERWISE后面的语句块n 1 无论执行哪一个语句块后 都不再判断下面的条件 而转去执行ENDCASE后面的语句 其流程图如图6 11所示 VisualFoxPro6 0程序设计 课件 33 例6 6 某百货公司打折促销的优惠方法 每位顾客一次性购物 500元以上者 按九五折优惠 1000元以上者 按九折优惠 2000元以上者 按八五折优惠 5000元以上者 按八折优惠 编写程序 实现输入购物款数 计算并输出优惠后的价格 程序代码如下 prog6 prginput 请输入原价 toxdocasecasex 500y xcasex 1000y x 0 95casex 2000y x 0 9casex 5000y x 0 85otherwisey x 0 8endcase 优惠后的价格是 y VisualFoxPro6 0程序设计 课件 34 6 2 3循环结构 VFP提供了3种循环语句 当型循环DOWHILE语句 计数型循环FOR语句和扫描型循环SCAN语句 1 当型循环DOWHILE语句该语句的格式如下 DOWHILE EXIT LOOP ENDDO VisualFoxPro6 0程序设计 课件 35 例6 7 编制程序求1 2 3 100的和 并输出结果 分析 实现自然数的累加 应该设置一个累加变量和一个计数变量 累加变量的初值为0 计数变量从1开始逐次累加到累加变量中 每累加一次 计数变量加1 直到计数变量为100为止 程序代码如下 prog7 prgs 0i 1dowhilei 100s s ii i 1enddo s s VisualFoxPro6 0程序设计 课件 36 例6 8 统计学生信息表student中年龄在20岁以上的学生人数 并输出结果 程序代码如下 prog8 prgusestudentn 0 计数变量初值为0dowhilenoteof 循环条件是还未到表尾ifyear date year 出生日期 20n n 1endifskip 修改记录指针 指向下一记录 若没该句 将造成死循环enddouse 年龄大于20岁的人数有 n VisualFoxPro6 0程序设计 课件 37 该语句的格式如下 FOR TO STEP EXIT LOOP ENDFOR NEXT语句执行时 首先给循环变量赋予初值 与终值比较 若超过终值 则循环体一次也不执行 直接转去执行ENDFOR NEXT后面的语句 若不超过终值 则依次执行循环体中的语句 遇到ENDFOR NEXT语句 将循环变量加上步长后 程序转回到循环初始语句 继续判断 流程图如图6 13所示 步长可正可负 步长为1时 可省略STEP子句 当循环次数事先已知时 通常使用计数型循环 循环次数可以根据下式计算 INT ABS 终值 初值 步长 1 2 计数型循环FOR语句 VisualFoxPro6 0程序设计 课件 38 例6 9 编制程序实现100以内的奇数累加和 并输出结果 分析 实现100以内奇数的累加 循环变量的初值应为1 终值应为99 循环变量的步长应为2 例6 10 从键盘上输入一个大于1的自然数 判断是否为素数 除1和它本身外 不能被其他任何一个整数整除的自然数 分析 判断某数n是否为素数 最简单的方法是 从i 2 3 n 1逐个判断n能否被i整除 只要有一个能整除 n就不是素数 退出循环 若都不能整除 则n是素数 可进一步证明 若n不能被2 中的任何一个整数整除 则n为素数 VisualFoxPro6 0程序设计 课件 39 3 扫描型循环SCAN语句 该语句的格式如下 SCAN FOR EXIT LOOP ENDSCAN扫描型循环语句专门用来对当前打开的数据表进行操作 它对指定范围满足条件的记录逐一扫描 找到一条满足条件的记录就执行一次循环体语句 每执行一次 记录指针后移 直到所有满足条件的记录都执行完毕 说明 语句中缺省时默认为ALL 其中的EXIT和LOOP子句的功能和DOWHILE循环中的功能相同 VisualFoxPro6 0程序设计 课件 40 例6 11 用扫描型循环SCAN语句统计学生信息表student中年龄在20岁以上的学生人数 并输出结果 程序代码如下 prog11 prgusestudentn 0scanforyear date year 出生日期 20n n 1endscan 年龄大于20岁的人数有 n VisualFoxPro6 0程序设计 课件 41 4 循环的嵌套 在一个循环体内又包含了一个完整的循环结构时称为循环结构的嵌套 在实际应用中 三种循环语句可以相互嵌套 会呈现出多种复杂形式 在编程或阅读程序时要注意各层循环变量的变化规律 在使用循环嵌套时需要注意以下几点 循环嵌套时 必须完整嵌套 不能交叉嵌套 循环体内可以嵌套分支语句 嵌套时也要求完整嵌套 不能交叉嵌套 内重循环的循环变量与外重循环的循环变量不能同名 以免混淆 多重循环的循环次数等于每一重循环的循环次数的乘积 VisualFoxPro6 0程序设计 课件 42 例6 12 打印九九乘法表 运行界面如图6 14所示 程序代码如下 prog12 prgclear 先将VFP主窗口清空 1 30say 九九乘法表 2 28say fori 1to9forj 1to9 str i 1 STR j 1 str i j 2 space 2 每个算式之间空两格endfor 当前行算式输出完以后 换行再输出下一行endfor VisualFoxPro6 0程序设计 课件 43 数组这种数据结构在程序设计中经常使用 在VisualFoxPro中 只能定义一维数组和二维数组 因为数组中数组元素的下标是有序的 可以以数组元素的下标作为循环变量 利用循环结构来处理数组中每个数组元素 一般用一重循环来处理一维数组 用二重循环来处理二维数组 下面以一维数组为例进行介绍 1 一维数组的基本操作假设定义有一维数组dimensiona 10 下面以该数组为例介绍一维数组的基本操作 数组元素的输出fori 1to10 a i endfor 数组元素的输入fori 1to10inputtoa i endfor 5 数组问题 VisualFoxPro6 0程序设计 课件 44 数组元素的求和s 0fori 1to10s s a i endfor 求数组元素中的最大值max a 1 fori 1to10if a i max max a i endifendfor VisualFoxPro6 0程序设计 课件 45 数组最典型的应用是排序 排序的算法有多种 如选择法 冒泡法 插入法等 下面介绍冒泡法排序 假设定义了一个数组dimensiona 10 则冒泡法排序的基本思想是 从第一个元素开始 对数组中两两相邻的元素比较 即a 1 与a 2 比较 若为逆序 则a 1 与a 2 交换 然后a 2 与a 3 比较 直到最后a 9 与a 10 比较 这时最大的数沉底成为数组中的最后一个元素 一些较小的数如同气泡一样上浮一个位置 这是第一趟排序 然后对a 1 a 9 中的9个数进行同上述一样的比较 次最大数放入a 9 中 完成第2趟排序 依此类推 进行9趟排序后 所有数均有序 因此可以用二重循环来实现这个排序 外循环确定进行几趟排序 内循环确定每趟排序中比较几次 代码如下 fori 1to9 确定排序的趟数forj 1to10 I 确定每趟排序中比较的次数ifa j a j 1 若相邻的两个数为逆序 则交换t a j a j a j 1 a j 1 tendifendforendfor 2 一维数组的排序 VisualFoxPro6 0程序设计 课件 46 例6 13 随机产生20个学生成绩 求出他们的平均成绩 并统计出高于平均成绩的学生数 再将这20个学生成绩按升序排列后输出 分析 VisualFoxPro提供了随机数函数RAND 可以产生一个0 1 不包括1 之间的随机数 学生成绩通常在0 100之间 为了产生这之间的随机数 可以用表达式INT RAND 100 1来实现 程序代码如下 prog12 prg VisualFoxPro6 0程序设计 课件 47 cleardimensiona 20 fori 1to20a i int rand 100 1endfors 0fori 1to20s s a i endforav s 20 平均成绩是 avn 0fori 1to20ifa i avn n 1endifendfor 高于平均成绩的人数为 nfori 1to19forj 1to20 iifa j a j 1 t a j a j a j 1 a j 1 tendifendforendfor fori 1to20 a i endfor VisualFoxPro6 0程序设计 课件 48 6 3过程与过程调用 6 3 1子程序设计与调用6 3 2过程与过程文件6 3 3局部变量和全局变量 过程调用中的参数传递 VisualFoxPro6 0程序设计 课件 49 6 3 1子程序设计与调用 在程序设计中 经常会遇到同一段功能代码在不同的程序段执行多次的情况 这时往往将该功能代码单独编写成一个独立的程序文件存在磁盘上 需要时调用它 这个独立的模块称为子程序 程序之间通过相互调用来建立关系 在VisualFoxPro中 子程序是被其他程序调用的程序文件 主程序能调用子程序 但子程序不能调用主程序 可是子程序可以调用其他的子程序 构成子程序的嵌套调用 在模块化程序设计中 通常将功能和结构相对独立的功能模块 单独编写成一个独立的子程序 子程序结构不仅易于调试和维护 而且当需要时可以多次调用 减少重复编程 提高程序的通用性 子程序的表现形式有过程 自定义函数和方法3种 VisualFoxPro6 0程序设计 课件 50 1 子程序的建立子程序是一个独立的程序文件 文件扩展名为 PRG 它的建立与前面所说的程序建立的方法一样 2 子程序的调用DO WITH 其中 WITH 是可选项 用于主程序与子程序之间的参数传递 实际参数列表中的各项可以是常量 变量或表达式 相互之间用逗号隔开 3 子程序的返回RETURN TOMASTER TO 执行子程序时 遇到RETURN命令 就返回到调用它的主程序 或是上一级子程序中调用命令的下一条语句继续执行 通常子程序的最后一条语句是RETURN命令 若缺省 则当子程序执行到最后时将自动执行RETURN功能 返回到主调程序中 VisualFoxPro6 0程序设计 课件 51 图6 17是子程序嵌套调用时的程序执行过程示意图 VisualFoxPro6 0程序设计 课件 52 例6 14 分别建立如上图所示的各程序文件 分析执行主程序main prg的执行结果 程序代码如下 main prgclear 正在执行main prg 开始调用子程序sub1 prg dosub1 从子程序sub1 prg中返回 sub1 prg 正在执行sub1 prg 开始调用子程序sub2 prg dosub2 从子程序sub2 prg中返回 开始调用子程序sub3 prg dosub3 从子程序sub3 prg中返回 return sub2 prg 正在执行sub2 prg return sub3 prg 正在执行sub3 prg return VisualFoxPro6 0程序设计 课件 53 6 3 2过程与过程文件 在编写一个大型程序时 可能划分为许多功能模块 如果都写成子程序 就要创建很多程序文件 这些程序文件都存放在磁盘上 每调用一次子程序就访问一次磁盘 需要花费一定的时间 如果程序中调用子程序较多 访问磁盘的次数就多 因此影响程序运行速度 另外 每调用一次子程序将打开一个文件 而由于系统允许同时打开文件数目的限制 调用子程序的嵌套层数也受到限制 否则程序不能正常运行 因此引入过程的概念 其实过程和子程序非常类似 只是将多个子程序的功能模块代码保存在一个程序文件中 在该程序文件中每个子程序都单独定义 而含有多个子程序的程序文件就称为过程文件 这样打开一个过程文件就意味着打开了所有的过程 当然过程也可以不形成过程文件 直接与调用它的程序放在同一个文件中 不过应把过程放在主程序代码之后 不能将主程序代码放在过程之后 VisualFoxPro6 0程序设计 课件 54 1 过程的定义 过程定义的语法格式如下 PROCEDURE PARAMETERS RETURN ENDPROC 其中各参数的说明如下 PROCEDURE 过程的起始语句 PARAMETERS 有此子句称为有参过程 否则称为无参过程 有参过程中 该子句必须是第一条命令语句 中形参的个数最多为27个 且只能是内存变量 相互之间用逗号隔开 RETURN 该子句表示将控制返回到调用该过程的语句的下一条语句继续执行 若缺省了该子句 则在过程结束处自动执行一条隐含的RETURN语句 ENDPROC 过程的结束语句 该语句可以省略 若省略 则过程结束于下一条PROCEDURE语句或程序文件尾 VisualFoxPro6 0程序设计 课件 55 2 过程的调用 调用过程的语法格式如下 DO WITH 实参列表中的各项可以是常量 变量或一般表达式 相互之间用逗号隔开 例6 15 利用过程来计算圆面积 程序代码如下 clearinput 请输入圆的半径 tors 0doareawithr s 半径为 r 的圆的面积为 s area过程procedureareaparametersr ss 3 14 r rreturnendproc VisualFoxPro6 0程序设计 课件 56 3 过程文件的建立 过程文件是由若干个过程组合而成的 它的建立方法与程序文件的建立方法相同 扩展名也为 PRG 4 过程文件的打开与关闭调用过程文件中的过程前 首先要打开包含它的过程文件 1 过程文件的打开SETPROCEDURETO ADDITIVE 该语句用于打开指定的过程文件 使该过程文件中所有的过程均可供调用 可以同时打开多个过程文件 如果命令中带有ADDITIVE子句 则在打开当前过程文件时 以前打开的过程文件不关闭 即以前打开的过程文件中的过程仍可以被调用 若命令中未带该子句 则在打开当前过程文件时 以前打开的所有过程文件都会被关闭 即以前打开的过程文件中的所有过程都不能再被调用 2 过程文件的关闭语句格式1为 SETPROCEDURETO语句格式2为 CLOSEPROCEDURE VisualFoxPro6 0程序设计 课件 57 例6 16 调用过程文件中的求阶乘的过程 求1 2 n 程序代码如下 prog16 prgclearsetproceduretojcinput 请输入n的值 tonstore0tos jfori 1tondofactwithi js s jendforsetprocedureto 1 2 n s jc prgprocedurefactparametersx yt 1fori 1toxt t iendfory treturnendproc VisualFoxPro6 0程序设计 课件 58 6 3 3自定义函数 函数分为系统函数与自定义函数 VisualFoxPro提供了几百个系统函数供用户调用 大大方便了用户的编程 但在解决实际问题时 系统提供的函数可能不能满足用户的需求 这时可以自己定义和编写的函数 这样的函数称为自定义函数 函数和过程的作用十分相似 用户自定义的函数实质上是带有返回值的子程序或过程 1 自定义函数的建立自定义函数的语法格式如下 FUNCTION PARAMETERS RETURN ENDFUNC VisualFoxPro6 0程序设计 课件 59 自定义函数的函数名不能与VFP系统函数同名 也不能和内存变量同名 自定义函数通常会计算出一个值 由RETURN语句返回 若RETURN后面缺省表达式 默认函数返回值为 T 若省略RETURN语句 则函数执行结束时 系统自动执行一个隐含的RETURN命令 自定义函数可作为一个独立的模块放在调用它的程序文件中 通常放在程序文件的底部 也可以作为一个独立的程序文件 供所有程序调用 这时可以省略自定义函数的起始语句FUNCTION 若不省略该语句 则函数名必须与程序文件名相同 自定义函数还可以放在过程文件中 随着过程文件的打开而打开 以供调用 2 自定义函数的调用函数名 实际参数列表 函数定义好后 可供程序在任何地方调用 函数调用时 实际参数的个数与形式参数的个数必须相等 且依次虚实结合 若是无参函数 调用时圆括号不能省略 VisualFoxPro6 0程序设计 课件 60 例6 17 将上例改用自定义函数来实现 其中函数放在调用程序所在的程序文件中 分析 若通过自定义函数来实现求某个数的阶乘 主调模块应通过参数将该数传递给被调函数 被调函数可以使用返回值将计算结果返回给主调模块 因此函数中只需有一个形式参数 求阶乘的数 程序代码如下 prog17 prgclearinput 请输入n的值 tons 0fori 1tons s fact i endforsetprocedureto 1 2 n sfunctionfactparametersxt 1forj 1toxt t jendforreturntendfunc VisualFoxPro6 0程序设计 课件 61 6 3 4参数传递 主程序在调用子程序 过程和自定义函数时 经常需要把主程序中的数据传递给子程序 过程和自定义函数 然后再将处理的结果返回给主程序 这就需要通过实际参数与形式参数间的参数传递来实现 参数传递中要求实际参数与形式参数依次相对应 实参与形参对应的次序应一致 类型应一致 参数个数通常也一致 但可以不相同 若个数不相同时 形参的个数不能少于实参的个数 否则系统产生运行错误 若形参的个数多于实参的个数 多余的形参取初始值为 F 但参数名不要求相同 即对应的实参与形参可以不同名 根据形参值的改变是否影响实参的值 可以将参数传递分为两类 值传递和引用传递 VisualFoxPro6 0程序设计 课件 62 1 值传递值传递中形参值的改变不影响实参的值 形参与实参使用不同的内存空间 在主程序调用子程序 过程和自定义函数时 形参单独分配空间 系统会计算出主程序中实参的值 并把它们赋值给相应的形参 形参在程序调用过程中若发生值的改变 不影响实参原来的值 值传递的两种情况 1 程序调用时 可以使用如下两种格式的语句 文件名 过程名 函数名 实际参数列表 或者 DO文件名 过程名WITH 实际参数列表 即将实际参数加上圆括号后再放到实参列表中 默认的是值传递的方式 2 若程序调用格式为 文件名 过程名 函数名 实际参数列表 可在程序调用之前使用命令设置参数传递的方式为值传递 命令格式如下 SETUDFPARMSTOVALUE VisualFoxPro6 0程序设计 课件 63 2 引用传递 引用传递中形参值的改变影响实参的值 形参与实参使用的是同一个内存空间 尽管它们的名字可能不同 引用传递的3种情况 1 程序调用时 使用如下的语句调用格式 DO文件名 过程名WITH实际参数列表 2 若程序调用格式为 文件名 过程名 函数名 实际参数列表 可在程序调用之前使用命令设置参数传递的方式为引用传递 命令格式如下 SETUDFPARMSTOREFERENCE 3 使用 标记实际参数程序调用时 在实际参数前加 标记 则强制参数以引用方式传递 VisualFoxPro6 0程序设计 课件 64 例6 18 值传递和引用传递示例 程序prog18 prg如下 clearstore0toa bdosubwitha b 参数a是引用传递 参数b是值传递 第1次调用 a bsetudfparmstovalue 设置为值传递方式store0toa bsub a b 参数a b均为值传递方式 第2次调用 a bsetudfparmstoreference 设置为引用传递方式store0toa bsub a b 参数a是引用传递 参数b是值传递 第3次调用 a bstore0toa bsub a b 参数a b均为引用传递方式 第4次调用 a bproceduresubparametersx yx x 10y y 10returnendproc VisualFoxPro6 0程序设计 课件 65 6 3 5变量的作用域 内存变量在程序中的作用范围称为内存变量的作用域 根据变量作用域的不同 可将内存变量分为3类 本地变量 局部变量 私有变量和公共变量 全局变量 1 本地变量 局部变量 本地变量的作用域只包括定义它的模块 不能在其它模块中使用 本地变量一经定义 就在内存中分配了存储单元 一旦离开了本模块 本地变量所占的存储单元就被释放 因此不能再被使用 定义本地变量的语法格式 LOCAL该命令将内存变量表中的变量定义为本地变量 并将这些变量的初值赋值为 F 注意 LOCAL命令可以定义本地变量 也可定义本地数组 LOCAL命令与LOCATE命令的前4个字符相同 因此不可缩写 VisualFoxPro6 0程序设计 课件 66 2 私有变量私有变量的作用域包括定义它的模块及其调用的子程序 过程或函数模块 定义私有变量的语法格式如下 PRIVATE该命令将内存变量表中的变量定义为私有变量 并将这些变量的初值赋值为 F PRIVATE命令可以定义私有变量 也可定义私有数组 程序中未加定义而直接使用的内存变量是私有变量 当被调用的子程序 过程或函数模块中有与主调模块序中的变量同名时 且希望起作用的是被调用模块中的变量时 可以在被调用模块中用PRIVATE命令声明该变量 来隐藏上级主调模块中的同名变量 使得主调模块中的同名变量在被调模块中暂时被屏蔽 直到被调模块执行结束后 返回到主调模块中 再恢复使用主调模块中的同名变量 在多人开发的应用程序中为了防止不同模块中因变量名相同而造成失误 可以在各自开发的子程序模块中定义私有变量 以屏蔽主调模块中的同名变量 VisualFoxPro6 0程序设计 课件 67 3 公共变量 全局变量 公共变量的作用域包括程序的所有模块 定义公共变量的语法格式如下 PUBLIC该命令将内存变量表中的变量定义为公共变量 并将这些变量的初值赋值为 F PUBLIC命令可以定义公共变量 也可定义公共数组 用PUBLIC命令定义的公共变量在整个程序运行过程中始终有效 始终占有内存的存储单元 即使程序运行结束 系统也不会自动释放存储单元 而只能用RELEASE命令或CLEARALL命令才能清除公共变量 若某模块中建立的内存变量要供其它模块使用 必须将这种变量用PUBLIC命令声明为公共变量 在命令窗口中定义的变量或数组都是公共变量 但这些公共变量不能在程序中引用 若同一模块中有同名的各种变量 起作用的优先次序为 本地变量 私有变量 全局变量 VisualFoxPro6 0程序设计 课件 68 clearpublicc 定义公共变量c 作用域包括各个模块a 1b 10 a b未加定义而直接使用 为私有变量c 100dosub1 主程序中的a b c值分别为 a b cprocsub1localb 本地变量b 作用在sub1模块中a 2 使用的是上级主调模块中的变量ab 20c 200 使用的是上级主调模块中的cdosub2 sub1中的a b c值分别为 a b cendprocprocsub2privatea 定义私有变量a 屏蔽上级模块的aa 3b 30 使用最上级模块中的私有变量bc 300 使用最上级模块中的公共变量c sub2中的a b c值分别为 a b cEndproc 例6 18 观察程序 体会变量的作用域 VisualFoxPro6 0程序设计 课件 69 6 4程序的调试 6 4 1程序常见错误6 4 2调试器窗口6 4 3 调试 菜单 VisualFoxPro6 0程序设计 课件 70 6 4程序的调试 程序调试是指在发现程序有错误的情况下 确定出错的位置并纠正错误 直到达到预定的设计要求为止 程序调试往往是先分模块调试 当各个模块都调试通过后 再将各模块联合起来进行调试 为了减少程序的调试时间 在编程时应尽量减少出错 因此应了解程序中的常见错误 VisualFoxPro6 0程序设计 课件 71 6 4 1程序常见错误 1 语法错误指程序中的命令语句使系统不能识别而无法操作的错误 这类错误在程序编译时或程序运行时系统会给出出错信息 可以根据系统的提示来纠正 常见的系统编译提示信息及可能出现的错误见下表 VisualFoxPro6 0程序设计 课件 72 2 逻辑错误 逻辑错误是指每一个语句都符合语法要求 但最后的运算结果不正确 如计算公式不对 语句执行次序不对 程序结构错误等 发现程序有错误 就应该确定出错的位置并纠正错误 如何确定出错的位置是关键 语法错误通过编译提示的错误信息通常可以确定出错位置 但对于逻辑错误 不易确定错误的位置 因此 VisualFoxPro提供了可视化调试程序的工具 调试器 借助调试器 用户能有效地进行程序的调试 VisualFoxPro6 0程序设计 课件 73 6 4 2调试器窗口 单击 工具 调试器 命令 或在命令窗口中输入 DEBUG 命令 打开调试器如图 VisualFoxPro6 0程序设计 课件 74 1 跟踪 窗口用来显示正在调试执行的程序文件 以便调试和观察 单击调试器窗口中的 文件 打开 命令可以打开需要调试执行的程序文件 打开后 程序将显示在 跟踪 窗口中 如图6 22所示 跟踪 窗口左侧显示的代码指示符号 用来指示调试中正在执行的代码行 在调试程序过程中 经常需要将程序执行到某个位置停下来 以便分析当前程序执行的变量输出情况 该位置称为断点 若需在某行设置断点 可以双击该代码行 在该行左侧将会出现一个红色的实心圆点 当程序执行到该行时 将中断程序运行 图6 22 跟踪 窗口 VisualFoxPro6 0程序设计 课件 75 除了在 跟踪 窗口中双击代码行来设置断点外 还可以单击 工具 断点 命令 打开如图6 23所示的 断点 对话框来进行断点设置 图6 23 断点 对话框 VisualFoxPro6 0程序设计 课件 76 2 监视 窗口用来监视指定表达式在程序调试过程中的取值变化情况 在 监视 的文本框内输入需要监视的表达式 回车后被加入监视列表框中 当程序调试执行时 列表框中将显示所有监视表达式的名称 当前值和类型 如图6 24所示 双击监视表达式 可对其编辑修改 若删除该表达式 右击监视表达式 在弹出菜单中选 删除监视 命令即可 图6 24 监视 窗口 VisualFoxPro6 0程序设计 课件 77 3 调用堆栈 窗口显示当前正在执行的程序 过程或方法程序名称 若正在执行的是一个子程序 则显示该子程序名称和各主调程序名称 其中左侧的代码指示符号 指向正在执行的程序模块 如图6 25所示 图6 25 调用堆栈 窗口 VisualFoxPro6 0程序设计 课件 78 4 调试输出 窗口编写程序时在程序的适当位置插入调试命令 DEBUGOUT 命令 则在调试程序中执行到该命令时 就将表达式的值显示在本窗口中 5 局部 窗口用来显示指定作用域的内存变量或对象的名称 当前值和类型 可在 位置 下拉列表框中指定要查看的程序模块 也可右击列表窗口 在弹出的快捷菜单中选择 公共 局部 常用 或 对象 选项 VisualFoxPro6 0程序设计 课件 79 6 4 3 调试 菜单 在程序调试时 一般使用调试器窗口中 调试 菜单的各个命令 如图6 26所示 来进行程序的调试 1 运行 命令该命令用于执行在 跟踪 窗口中打开的程序 程序没有开始运行时出现 若 跟踪 窗口中没有打开的程序 则会打开 运行 对话框 可以从中选择要调试的程序 调试器立即执行此程序 并中断于第一条可执行代码上 此时调试菜单中显示的不再是 运行 命令 而是 继续执行 命令 2 继续执行 命令从中断处继续运行 当程序执行被中断时出现 当程序第一次执行前 调试菜单中显示 运行 命令 当程序被中断时 调试菜单中显示 继续执行 命令 3 取消 命令用于终止程序的调试执行 并关闭程序 图6 26 调试 菜单 VisualFoxPro6 0程序设计 课件 80 4 定位修改 命令 用于终止程序的调试执行 然后打开所调试程序的 编辑 窗口进行编辑修改 5 跳出 命令 以连续方式继续执行被调模块程序中的代码 然后在主调模块的调用语句下一行处中断 6 单步 命令 该命令单步执行下一行代码 若下一行代码调用了过程或方法程序 则被调用模块在后台执行 代码指示符号指向主调模块调用语句的下一行代码 7 单步跟踪 命令 该命令用于单步执行下一行代码 若下一行代码调用了过程或方法程序 则代码指示符号跟踪到被调模块的第一条可执行语句代码 8 运行到光标处 命令 该命令从当前位置执行代码直至光标处中断 光标位置可以在开始时设置 也可在程序中断时设置 VisualFoxPro6 0程序设计 课件 81 9 调速 命令 单击该命令可以打开如图6 27所示的 调整运行速度 对话框 从中设置执行两代码行之间的延时秒数 10 设置下一条语句 命令 程序中断时选择该命令 可以使光标所在行成为恢复执行后要执行的语名 图6 26 调整运行速度 对话框
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!