




已阅读5页,还剩124页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础 程序文件程序的基本结构过程及其调用 人机交互方式交互式方式是通过在命令窗口中输入命令或通过选择菜单项来实现各种操作 适用于解决一些较为简单的问题 程序方式要处理复杂的问题 就应采取程序方式 VFP的工作方式 6 1程序文件 程序由能够完成指定任务的一系列命令组成 这些命令被保存在程序文件中 程序文件又称为命令文件 其扩展名为PRG 程序文件中既可包含能在命令窗口执行的VFP命令 也可包含一些程序控制语句 如IF语句 循环语句 6 1 1程序文件 程序文件既可通过VFP内置的文本编辑器来建立和修改 也可通过其他文本编辑器 如记事本 来编辑 程序一旦建立 可以多次执行 也可被其他的程序 表单 菜单等调用 执行程序时 系统会自动地按一定的顺序来执行程序中的命令 程序的概念 菜单方式 6 1 2程序文件的建立和修改 选择 文件 菜单的 打开 命令 打开 打开 对话框 在 打开 对话框中 在 查找范围 下拉列表中定位到程序文件所在的文件夹 在 文件类型 下拉列表中选择 程序 文件列表中显示出此文件夹下的程序文件 双击要打开的程序文件 或者选择它 再单击 确定 按钮 即可打开程序文件的编辑窗口 修改程序 MODIFYCOMMAND 当程序文件是一个新文件名时 系统将创建一个新的程序文件 并打开其编辑窗口 当程序文件是一个已经存在的文件时 系统将打开该程序文件的编辑窗口 供用户修改 命令方式 在项目管理器中建立和修改程序 在程序中 每条命令都以回车键结束 一行只能写一条命令 若命令需分行书写 应在上一行终了时输入续行符 在程序中可插入注释 以提高程序的可读性 注释行以单词 NOTE 或符号 开头 它仅在编辑程序时显示 不会在运行程序时执行 在语句末尾也可添加注释 这种注释以符号 开头 程序书写规则 6 1 3程序的运行 在程序处于打开状态时运行程序 如果程序已在编辑窗口被打开 单击常用工具栏的 运行 按钮 或在 程序 菜单中选择 执行程序名 prg 命令 可执行此程序 通过菜单执行程序文件 DO 通过命令执行程序文件 由于DO命令默认是运行PRG程序 若用户要运行程序文件 则只需指定主文件名 不需指定扩展名 通过项目管理器执行程序文件 在项目管理器中 选择 代码 选项卡中 程序 选项下的程序名 单击 运行 按钮可以运行该程序文件 当VFP执行PRG源程序文件时 系统将自动对其编译 产生相应的FXP文件 系统实际执行的是FXP目标文件 在执行程序的过程中 系统会自动地按一定的顺序逐条来执行程序中的命令 中止程序的运行 如果程序有错 或在执行过程中用户按了ESC键中止程序 系统会打开 程序错误 对话框 中止程序的运行 系统将取消此次程序的执行 系统将暂停程序的运行 返回到命令窗口用户可以在执行其他的操作后 选择 程序 菜单的 继续执行 命令或在命令窗口中执行 RESUME 命令 从程序的中止处继续运行程序 当用户选择 忽略 时 系统将忽略程序错误 继续执行程序 6 1 4输入命令 在VFP中 应用程序的输入 输出界面通常采用表单 报表等形式 但在编写小程序时 仍然常使用传统的输入命令 ACCEPT TO 程序中执行到该语句时 在主窗口显示用户设置的提示信息 等待用户从键盘输入数据 用户输入数据后 按回车键 系统将接收到的数据作为字符串赋值给内存变量 再继续往下执行程序 字符串接收命令 是一个字符型表达式 执行此命令时 该表达式的内容作为提示信息 显示在屏幕上 若缺省此项 则不显示提示信息 由于此命令接收到的任何数据都会作为字符串 用户在输入数据时 不需要输入字符串定界符 若用户不输入任何数据 直接按回车键 则系统会将对内存变量赋值为空串 字符串接收命令 USE图书 打开图书表ACCEPT 请输入要查询的条形码 totxm 接收用户要查询的条形码LOCATEFOR条形码 txm 根据用户的输入查找记录DISPLAY条形码 书名 售价 作者 显示图书记录的相关信息USE 关闭数据表RETURN 例题 在图书表中 根据用户输入的条形码 查找书籍的条形码 书名 售价 作者信息 INPUT TO 该命令与ACCEPT命令类似 但该命令可接收用户输入的多种数据类型的表达式 用户可输入数值型 字符型 日期型或逻辑型表达式 系统先计算表达式的值 然后将值赋给指定的内存变量 内存变量的类型由表达式的数据类型决定 当用户输入字符型 日期型或逻辑型常量时 应加上相应的定界符 表达式输入命令 WAIT TO WINDOW AT TIMEOUT 该命令与ACCEPT命令类似 但该命令只能接收用户输入的一个字符 单个字符接收命令 若缺省 执行此命令时 屏幕上显示 按任意键继续 若指定TO短语 执行此命令时 用户按任意键 不需按回车键 该键作为一个字符被接收到指定的内存变量中 若用户不输入任何数据 直接按回车键 或单击鼠标 系统会将对内存变量赋值为空串 若不指定TO短语 此语句的功能为暂停程序的执行 显示提示信息 用户按任意键 或单击鼠标 将继续执行程序 单个字符接收命令 若指定WINDOW短语 将显示一个窗口显示提示信息 通常 窗口显示在屏幕的右上角 若用AT 短语 可指定窗口的位置 TIMEOUT短语 用来设置等待用户输入的时间 以秒为单位 如果在指定的时间内用户未输入任何字符 系统将自动执行后面的命令 单个字符接收命令 例如 用户要在程序执行过程中查看数值型变量A的值 要求结果显示在10行30列位置的窗口中 显示5秒钟后继续执行程序 则语句为WAIT 变量A的值为 STR A WINDOWAT10 30TIMEOUT5又例如 用户要在程序执行过程中接收一个字符 将此值存储在变量B中 则语句为WAIT 请输入一个字符 TOB 单个字符接收命令 6 1 5其他命令 在程序的结尾 通常执行以下命令 以结束程序的运行 当然 如果省略这些命令 也可以终止程序 RETURN 结束当前程序的执行 返回到调用它的上级程序 若无上级程序 则返回到命令窗口 结束程序运行命令 CANCEL 终止程序运行 清除所有的私有变量 返回命令窗口 QUIT 退出VisualFoxPro系统 返回到Windows 结束程序运行命令 CLEAR 清除主屏幕窗口上的所有信息 清屏命令 CLOSEALL 关闭所有已打开的各类文件 并将当前工作区设为1号工作区 关闭文件命令 CLEARALL 可以关闭文件 还可以清除所有用户定义的内存变量 关闭文件命令 SETTALKON OFF 许多命令在执行时会返回一些执行状态的信息这些信息通常会显示在窗口或状态栏中开启或关闭人机会话 设置环境参数命令 SETDEFAULTTO 设置默认的文件路径 设置环境参数命令 6 2程序的基本结构 结构化程序设计是根据给定的任务 设计 编写和调试出完成该任务的过程 结构化程序设计的基本思想是采用 自顶向下 逐步求精 的程序设计方法和 单入口单出口 的控制结构 程序的基本结构 自顶向下 逐步求精的程序设计方法是从问题本身开始 经过逐步细化 将解决问题的步骤分解为由基本程序结构模块组成的结构化程序框图 程序的基本结构 单入口单出口 的思想认为 一个复杂的程序 如果它仅是由顺序 选择和循环三种基本程序结构通过组合 嵌套构成 那么这个一定只有一个唯一的入口和出口 据此 就很容易编写出结构良好 易于调试的程序 程序的基本结构 顺序结构程序是最简单的程序结构 先执行A操作 再执行B操作 依次执行各条语句 6 2 1顺序结构 6 2 2选择结构 选择结构是在程序执行时 根据不同的条件 选择执行不同的程序语句 VFP的分支结构程序可以分为简单分支 IF ENDIF 选择分支 IF ELSE ENDIF 以及多路分支 DOCASE ENDCASE 三种不同的程序 IFENDIF ENDIF的下一条语句 简单选择语句 如果条件成立 即的值为真 则执行语句序列 然后再执行ENDIF后面的语句 否则 直接执行ENDIF后面的语句 某地的计程车收费规则为 不超过2公里时 一律收取6元 超过部分每公里加收1 8元 编程根据行车里程计算应付车费 INPUT 请输入里程数 TOx 接收要计算的行车里程y 6 将车费赋值为6元IFx 2 判断x是否超过2公里y 6 x 2 1 8 重新计算车费ENDIF 里程数为 x 车费为 y 显示里程和车费RETURN 返回命令窗口 例题 简单选择语句 IFELSEENDIF 双分支选择语句 如果条件成立 即的值为真 则执行语句序列1 然后执行ENDIF后面的语句 否则 执行语句序列2的语句 再执行ENDIF后面的语句 ENDIF的下一条语句 双分支选择语句 某地的计程车收费规则为 不超过2公里时 一律收取6元 超过部分每公里加收1 8元 编程根据行车里程计算应付车费 INPUT 请输入里程数 TOx 接收要计算的行车里程IFx 2 判断x是否超过2公里y 6 将车费赋值为6元ELSEy 6 x 2 1 8 将车费赋值为6元加超出的部分ENDIF 里程数为 x 车费为 y 显示里程和车费RETURN 返回命令窗口 例题 双分支选择语句 在图书表中 根据用户输入的条形码查找书籍 如果找到 则显示书籍的条形码 书名 售价 作者信息 如果没有找到 显示 查无此书 USE图书 打开图书表ACCEPT 请输入要查询的条形码 totxm 接收用户要查询的条形码LOCATEFOR条形码 txm 根据用户的输入查找记录IFFOUND 判断是否找到了输入条码DISPLAY条形码 书名 售价 作者 显示图书记录的相关信息ELSE 查无此书 显示没有这本书ENDIFUSE 关闭数据表RETURN 返回命令窗口 例题 双分支选择语句 嵌套选择语句 在解决一些复杂问题时 需要将多个选择结构语句结合起来使用 也就是说 在选择结构的中 允许包括另一个合法的选择结构 形成选择的嵌套 对于嵌套选择结构的程序而言 每一个IF必须和一个ENDIF配对 为了使程序易于阅读 内外层选择结构层次分明 通常按缩进格式来书写 某商场采取打折的方法进行促销 购物金额在300元以上 按九五折优惠 购物金额在500元以上 按九折优惠 购物金额在1000元以上 按八五折优惠 编写程序 根据用户的购物金额 计算其优惠额及实际付款金额 例题 嵌套选择语句 INPUT 请输入购物金额 TOje 接收要计算的购物金额IFje 300 判断金额是否超过300元yh 0 没有优惠ELSEIFje 500yh je 0 05 优惠额为5 ELSEIFje 1000 判断金额是否超过1000元yh je 0 1 优惠额为10 ELSEyh je 0 15 优惠额为15 ENDIFENDIFENDIF 优惠额为 yh 实际付款为 je yh 显示优惠额和实际付款RETURN 返回命令窗口 例题 嵌套选择语句 DOCASECASECASE CASE OTHERWISE ENDCASE 多路分支 系统自上而下依次对各个CASE语句的条件进行判断 若某个的值为真 则执行该语句下的语句序列 然后 不管其他CASE语句的条件是否成立 转去执行ENDCASE后的语句 若所有的值都不为真 又有OTHERWISE子句 则执行OTHERWISE后的语句序列 再转去执行ENDCASE后的语句 若所有的值都不为真 又没有OTHERWISE子句 则直接执行ENDCASE后的语句 多路分支 ENDCASE的下一条语句 多路分支流程图 INPUT 请输入购物金额 TOje 接收要计算的购物金额DOCASECASEje 300 判断金额是否超过300元yh 0 没有优惠CASEje 500 判断金额是否超过500元yh je 0 05 优惠额为5 CASEje 1000 判断金额是否超过1000元yh je 0 1 优惠额为10 OTHERWISEyh je 0 15 优惠额为15 ENDCASE 优惠额为 yh 实际付款为 je yh 显示优惠额和实际付款RETURN 返回命令窗口 例题 多路分支 由于各个CASE条件是按其排列的前后顺依次被判断的 所以 哪一个条件在前 哪一个条件在后 可能会影响程序的执行结果 编写程序时 应根据条件所蕴含的逻辑关系 认真考虑 多路分支 6 2 3循环结构 循环结构是指在程序执行的过程中 某段代码被重复地执行若干次 被重复执行的代码段称之为循环体 VFP支持三种循环结构的控制语句 条件循环 DOWHILE ENDDO 步长型循环 FOR ENDFOR 扫描型循环 SCAN ENDSCAN DOWHILEENDDO 条件循环 条件循环语句 是根据条件表达式的值 决定循环体语句的执行次数 条件循环 执行该语句时 先判断DOWHILE处的循环条件是否成立 如果条件为真 则执行DOWHILE与ENDDO之间的命令序列 循环体 当执行到ENDDO时 返回到DOWHILE 再次判断循环条件是否为真 以确定是否再次执行循环体 若条件为假 则结束该循环语句 执行ENDDO后面的语句 如果第一次判断条件时 条件即为假 则循环体一次都不执行 条件 循环体 条件循环 USE图书 打开图书表jx Y 设置变量jx的初值DOWHILEjx Y ORjx y 根据变量jx的值判断是否循环ACCEPT 请输入要查询的条形码 totxm 接收用户要查询的条形码LOCATEFOR条形码 txm 根据用户的输入查找记录IFFOUND 判断是否找到了输入条码DISPLAY条形码 书名 售价 作者 显示图书记录的相关信息ELSE 查无此书 显示没有这本书ENDIFWAIT 是否继续 Y N TOjx 接收用户输入的字符是否继续查找ENDDOUSE 关闭数据表RETURN 返回命令窗口 例题 条件循环 条件循环 在循环体中可以出现两条特殊的命令 LOOP和EXIT 如果循环体包含LOOP命令 那么当遇到LOOP时 就结束循环体的本次执行 不再执行其后面的语句 而是转回DOWHILE处重新判断条件 如果循环体包含EXIT命令 那么当遇到EXIT时 就结束该语句的执行 转去执行ENDDO后面的语句 通常LOOP和EXIT出现在循环体内包含的选择结构中 根据选择语句的条件来判断是否LOOP或EXIT 条件 命令组 无条件循环命令 无条件结束循环命令 条件循环 例题 条件循环 实现程序例6 7的功能 且如果用户输入的条形码不是8位字符 则提示用户重新输入条形码 USE图书 打开图书表DOWHILE T 循环条件永远为真值ACCEPT 请输入要查询的条形码 totxm 接收用户要查询的条形码IFLEN ALLT TXM 8 如果用户输入的条形码不是8位WAIT 请输入8位条形码 AT50 20TIMEOUT3 显示警告信息LOOP 跳转到循环的条件判断处ENDIFLOCATEFOR条形码 txm 根据用户的输入查找记录IFFOUND 判断是否找到了输入条码DISPLAY条形码 书名 售价 作者 显示图书记录的相关信息ELSE 查无此书 显示没有这本书ENDIFWAIT 是否继续 Y N TOjx 接收用户输入的字符是否继续查找IFjx Y ANDjx y 如果用户回答的不是Y或yEXIT 退出循环ENDIFENDDOUSE 关闭数据表RETURN 返回命令窗口 例题 条件循环 循环条件为逻辑常量 T 循环条件永远成立 这种循环被称为绝对循环 这时 在循环体内应该有EXIT语句退出循环 使用循环结构时 为使程序最终能退出循环 在循环体中必须要有使循环条件的值的发生改变的语句 或者有EXIT语句 否则程序将永远重复地执行循环体 这种情况称为死循环 调试过程中遇到死循环时 按键盘的ESC键可结束程序的运行 条件循环 求1到100之间全部数之和 i 1 设置计数变量i的初值为1s 0 设置求和变量s的初值为0DOWHILEi 100 循环条件为i不超过100s s i 使s的值增加ii i 1 使i的值增加1ENDDO 1到100的和为 s 显示求和变量的值RETURN 返回命令窗口 例题 条件循环 si初值01循环1 12循环2 1 23循环3 1 2 34循环4 1 2 3 45循环5 1 2 3 4 56 循环100 1 2 100101 例题 条件循环 对于读者表的所有读者根据不同的身份来收取押金 其中 教研人员收取50元 工作人员收取30元 研究生收取20元 将所有读者的姓名 身份和押金显示出来 例题 条件循环 USE读者 打开读者表DOWHILENOTEOF 循环条件为记录指针不指向文件尾DOCASECASE身份 教研人员 判断当前记录的身份字段的值是否为教研人员yj 50 对yj赋值为50CASE身份 工作人员 判断当前记录的身份字段的值是否为工作人员yj 30 对yj赋值为30CASE身份 研究生 判断当前记录的身份字段的值是否为研究生yj 20 对yj赋值为20ENDCASE 姓名 身份 yj 显示当前记录的姓名和身份字段及变量yj的值SKIP 向下移动记录指针ENDDOUSE 关闭数据表RETURN 返回命令窗口 例题 条件循环 FOR循环变量 TO STEP ENDFOR NEXT 步长型循环 步长型循环 执行该语句时 系统首先自动将初值赋给循环变量 然后判断循环变量是否超过终值 若步长值为正数 则循环变量大于终值为超过 若步长值为负数 则循环变量小于终值为超过 若没有超过 则执行循环体 并将循环变量增加一个步长值 然后 再去判断循环变量是否超过终值 如果没有超过终值 则再次执行循环体 否则 转去执行ENDFOR后面的语句 在缺省步长值时 默认的步长值为1 都是数值型表达式 这些表达式的值在第一次循环时被计算出来 在以后循环的执行过程中不再会被改变 循环变量超过终值 循环变量 初值 步长型循环 使用步长型循环实现例6 9 s 0 设置求和变量为sFORi 1TO100 设置循环变量i的初值为1 终值为100 步长为1s s i 使s的值增加iENDFOR 1到100的和为 s 显示求和变量的值RETURN 返回命令窗口 例题 步长型循环 判断某数是否为质数除了1和它本身之外不能被任何一个整数所整除的数为质数 除了2以外的质数均为素数 要判断一个数n是否素数 只需用2到n 1的各个整数去除n 如果都不能整除n 则n就是素数 只要有一个数能整除n 则n就不是一个素数 例题 步长型循环 INPUT 请输入一个大于2的整数 ton 接收从键盘输入的整数赋值给变量nFORi 2TOn 1 设置循环变量i的初值为2 终值为n 1 步长为1IFMOD n i 0 若i整除n 则退出循环EXITENDIFENDFORIFi n 1 退出循环后 判断i是否大于n 1 n 是一个素数 若i等于n 则说明2到n 1没有一个数整除nELSE n 不是一个素数 否则 说明是在i整除n的情况下退出循环ENDIFRETURN 返回命令窗口 例题 步长型循环 SCAN FOR ENDSCAN 扫描型循环 扫描型循环 执行该语句时 系统首先将记录指针指向给定范围内满足指定条件的第一条记录上 如果此时记录指针指向的不是文件尾 即EOF 为假值 则执行循环体 执行完 系统自动将记录指针定位到给定范围内下一条满足指定条件的记录 然后重新判断记录指针是否指向文件尾 若不是文件尾 则再次执行循环体 否则转去执行ENDSCAN后的语句 当缺省范围和条件时 数据表的所有记录都将执行循环体的语句 扫描型循环 USE读者 打开读者表SCAN 对所有记录进行扫描DOCASECASE身份 教研人员 判断当前记录的身份字段的值是否为教研人员yj 50 对yj赋值为50CASE身份 工作人员 判断当前记录的身份字段的值是否为工作人员yj 30 对yj赋值为30CASE身份 研究生 判断当前记录的身份字段的值是否为研究生yj 20 对yj赋值为20ENDCASE 姓名 身份 yj 显示当前记录的姓名和身份字段及变量yj的值ENDSCANUSE 关闭数据表RETURN 返回命令窗口 例题 扫描循环 在一个循环结构的循环体内包含另一个循环结构 则称为多重循环 或称为循环的嵌套 前面所介绍的几种循环语句不仅自身可以嵌套自身 也可以互相嵌套 实现多重循环但是 每一层次的循环开始语句和循环结束语句必须互相对应 层次分明 不能互相交叉 多重循环 显示出3到100之间的所有素数 并求这些数的和 s 0 设置求和变量s的初值为0FORn 3TO99STEP2 设置循环变量n的初值为3 终值为100 步长为2FORi 3TOINT SQRT n 设置i的初值为2 终值为n的平方根的整数值IFMOD n i 0 若i整除n 则退出循环EXITENDIFENDFORIFi INT SQRT n 退出循环后 判断i是否大于内层循环的终值 n 说明没有发生i整除n的情况 即n是素数s s n 使求和变量s的值增加nENDIFENDFOR 素数的和为 sRETURN 返回命令窗口 例题 编程输出乘法九九表 例题 多重循环 s 0 设置求和变量s的初值为0FORi 1TO9 外层循环变量i从1到9FORj 1toi 内层循环变量j从1到i str i 1 str j 1 str i j 2 在本行显示数学式i j i与j的乘积ENDFOR 换行输出ENDFOR 例题 多重循环 输入9个数值 建立一个三行三列的数组 求出每行元素的最大值 并输出 例题 多重循环 DIMEa 3 3 m 3 定义三行三列的a数组 用来保存各行最大值的m数组FORi 1TO3FORj 1TO3INPUT 请输入 STR i 1 行 STR j 1 列的元素 TOa i j ENDFORENDFOR 上述语句为对二维数组的各个元素逐一赋值FORi 1TO3 外层循环变量i从2到3m i a i 1 设m i 初值为i行的第一列的数组元素FORj 2TO3 内层循环变量j从2到3IFm i a i j 判断第j列元素是否大于m i 中保存的值m i a i j 将m i 重新赋值为第j列元素ENDIFENDFORENDFOR 下列语句为对二维数组的各个元素逐一输出 并显示各行的最大值FORi 1TO3 FORj 1TO3 a i j ENDFOR 最大值为 m i ENDFOR 例题 多重循环 显示读者表中还有未还书籍的读者的姓名 电话 未还书籍的本数 未还书籍的条形码和借阅日期 例题 多重循环 SELE2 选择2号工作区为当前工作区USE借阅 打开借阅表SELE1 选择1号工作区为当前工作区USE读者 打开读者表SCAN 对读者表所有记录进行扫描循环c 0 设统计未还图书本数的变量c的初值为0SELE2 选择借阅表为当前表SCANFOR读者证号 读者 读者证号ANDEMPTY 还书日期 扫描读者证号与读者表当前记录的读者证号相同且还书日期为空的记录c c 1 未还图书本数变量c增加1 c 条形码 借阅日期 显示未还图书的条形码和借阅日期ENDSCAN 内层循环结束SELE1 选择读者表为当前表IFc 0 判断该读者未还图书的本数是否大于0 姓名 电话 电话号码 总计 c 本 显示该读者的姓名 电话号码 未还图书的本数ENDIFENDSCAN 外层循环结束USE 关闭读者表SELE2 选择借阅表为当前表USE 关闭借阅表RETURN 返回命令窗口 例题 多重循环程序 6 3多模块程序设计 结构化程序设计的基本思想是将一个复杂的规模较大的程序系统划分为若干个功能相关又相对独立的一个个较小的模块 这样 既有利于程序的编写和开发 也有利于程序的维护和扩充 此外 在程序设计中 如果某个功能的程序段需要多次重复使用的话 也要把这样的程序段独立出来成为一个模块 当系统中任何地方要用到该功能时 只要调用相应的模块即可 而不必再重复编写 多模块程序设计 求组合数 Cm n m n INPUT m TOmINPUT n TOnt 1FORi 1TOmt t iENDFORa tt 1FORi 1TOnt t iENDFORb tt 1FORi 1TOm nt t iENDFORc t 组合数为 a b c n m 例题 由于公式中出现了3个阶乘 所以程序中计算阶乘的程序段重复出现三次 为了简化程序 我们可以把计算阶乘的功能定义为一个模块 在VFP中 模块可以是一个子程序 也可以是一个过程 子程序就是将模块建成一个独立的命令文件 当其他程序中需要用到该模块的功能 可以通过DO命令来调用此子程序 由于每调用一个子程序就要打开一个文件 减慢了程序运行的速度 为此 可以通过定义过程实现模块功能 而一个程序文件中可存放多个过程 多模块程序设计 6 3 1过程的定义和使用 PROCEDURE FUNCTION RETURN ENDPROC ENDFUNC 定义过程 PROCDURE或FUNCTION命令表示过程的开始 并对过程命名 过程名必须以字母或下划线开头 可包含字母 数字和下划线 ENDPROC或ENDFUNC命令表示过程的结束 如果缺省 过程结束于下一个过程的开始处或文件结尾处 RETURN命令表示过程的返回 如果缺省RETURN命令 则在过程的结束处将自动执行一条隐含的RETURN命令 若RETURN带 则过程将返回表达式的值 若不带表达式 过程返回一个逻辑真 T 定义过程 过程可以保存在程序文件中 放置在程序文件正常代码的后面 一个程序文件中可以存放多个过程 定义过程 当主程序中要用到过程所定义的功能 可以用下列两种格式调用过程 调用过程 DO 当系统运行到程序中调用过程的命令时 便从过程的第一条语句开始执行 执行中只要碰到RETURN语句 控制返回到主程序 从主程序中调用过程的下一条语句处继续执行 使用第二种格式调用过程时 该过程将返回一个值 可以作为函数出现在主程序的表达式中 调用过程 使用过程的方式求组合数 INPUT m TOmINPUT n TOnk ma jc k nb jc k m nc jc a b c RETURNPROCjct 1FORi 1TOkt t iENDFORRETURNtENDP 例题 一个应用程序往往需要用到多个过程 用户可将多个过程的定义存放在一个程序文件中 该文件被称为过程文件 过程文件 PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC 过程文件 由于过程文件也是一个扩展名为prg的程序文件 其建立和编辑的方法和其他的程序文件相同 当主程序中要用到过程文件中所定义的过程时 首先要在主程序中通过SETPROCEDURETO命令打开过程文件 此后 主程序可以调用过程文件中的任一过程 当不再需要调用过程时 应该在主程序中使用命令CLOSEPROCEDURE或SETPROCEDURETO关闭过程文件 过程文件 在调用过程时 往往需要将一些数据从主程序传送到被调用的过程中 或将过程运行的结果上传到主程序中 为此 在定义过程时 可以用PARAMETER语句来定义参数 PARAMETER必须是过程的第一个语句 在PARAMETER中所说明的变量 称其为形参 6 3 2参数传递 当主程序中调用过程时 可以用DOWITH或过程名 进行参数传递 在调用语句中的参数 称其为实参 实参和形参的个数 类型必须一一对应 实参可为常量 变量 表达式 若实参为变量 必须在调用前赋予初值 参数传递 使用带参数的过程实现求组合数 INPUT m TOmINPUT n TOn jc m jc n jc m n RETURNPROCjcPARAMETERkt 1FORi 1TOkt t iENDFORRETURNtENDP 例题 以m为实参 m的值传送给k调用结束后 t的值通过过程名传回到主程序 以n为实参 n的值传送给k过程的值为n的阶乘 以m n为实参 过程的值为m n的阶乘 当实参是常量或表达式时 采取值传递 即实参的值传给形参 过程中形参变化的结果不传给实参 若采取DOWITH格式调用过程 当实参是变量时 采取的是地址传递 即过程中形参变化的结果将传给实参 或者说 对形参的操作实际上相当于在对实参所对应的变量进行 如果将作为实参的变量加上括号 则采取值传递 过程中形参变化的结果不传给实参 参数传递 若采取过程名 格式调用过程 在进行参数传递时 默认是采取值传递方式 使用命令SETUDFPARMSTOVALUE REFERENCE可改变参数传递方式 SETUDFPARMSTOVALUE为按值传递 SETUDFPARMSTOREFERENCE为按参数传递 形参变量是局部变量 当控制返回到主程序后 形参变量即被清除 参数传递 参数传递举例 x 15y 7DOsubWITHx y x y sub x y x yRETURNPROCsubPARAMETERSa ba a bb aRETURNa bENDP 例题 x是地址传递 y是值传递返回主程序后 x的值变为22 y的值仍为7 x y均为值传递 返回主程序后 x和y的值不变 显示结果58 22 7 6 3 3变量的作用域 多模块程序中 在一个模块中定义的变量在其他模块中不一定能够使用 不同的变量有不同的作用域 即每个变量有其发挥作用的有效范围 根据变量作用域不同 变量分为全局变量 局部变量和私有变量 全局变量也称为公共变量 是在任何语句和各个程序模块中都有效的内存变量 PUBLIC 定义全局内存变量 全局内存变量 全局变量应先定义后赋值 不能在赋值一个变量后再将其定义为全局变量 全局变量在定义以后 默认的初值是逻辑假 F定义全局变量的程序运行结束后 全局变量并未被释放 仍然可以在其他程序中使用 只有在执行CLEARMEMORY RELEASE等命令或退出VFP后 全局变量才被释放 在命令窗口所建立的内存变量 默认为全局变量 全局内存变量 在程序中所有未经说明而直接建立的内存变量都是私有变量 私有变量可以在创建它的模块及其调用的下层模块中使用 一旦建立它的模块程序运行结束 这些私有变量将被清除 也就是说 在下层模块定义的私有变量 无法在其上层模块中使用 私有变量 局部变量只能在建立它的模块中使用 不能在上层或下层模块中使用 当建立它的模块程序运行结束 局部变量被释放 LOCAL命令定义的变量是局部变量 并赋予其初值为逻辑值假 F 同样 局部变量也要先定义后使用 局部变量 LOCALaSTORE10TOa b 执行过程前a b的值 a bDOp1 执行过程后a b的值 a b c cPROCp1STORE20toa b 执行过程时a b的值 a bPUBLICcc 30ENDPROC 例题 变量作用域 显示结果1010 显示结果1020 显示结果2020 由于一个大型的程序可能由多人开发 在下级子程序中可能会无意地改变上级程序中的私有变量 为了避免这种情况 可以在过程中使用PRIVATE 该命令并不建立变量 而是用来隐藏在上层程序中可能已经存在的内存变量 使得这些变量在当前模块程序中暂时无效 这样 这些变量名可以用来命名在当前模块或其下属模块中需要的私有变量 并且不会改变上层模块中同名变量的取值 一旦当前模块程序运行结束返回上层模块 那些被隐藏的内存变量就恢复原有的取值 隐藏变量 LOCALaSTORE10TOa b 执行过程前a b的值 a bDOp1 执行过程后a b的值 a b c cPROCp1PRIVATEa bSTORE20toa b 执行过程时a b的值 a bPUBLICcc 30ENDPROC 例题 变量作用域 显示结果1010 显示结果1010 显示结果2020 6 3 4存储过程 存储过程是保存在数据库文件中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025自考专业(金融)考前冲刺练习试题及答案详解
- 2024年工程硕士通关题库及参考答案详解(轻巧夺冠)
- 中考物理常考题型归纳及模拟训练
- 2025年黄岛区工业地产行业研究报告及未来发展趋势预测
- 2024广东省罗定市中考数学考前冲刺练习题(培优B卷)附答案详解
- 砌筑工程施工技术要点总结
- 青年教师职业发展考核标准
- 高校网络安全技术管理办法
- 2025年人教版8年级数学下册《平行四边形》同步练习试题(含解析)
- 2024-2025学年郑州工商学院病理与病理生理期末真题及答案详解(夺冠)
- 工业机器人离线编程与应用-认识FANUC工业机器人
- 义务教育信息科技课程标准(2022年版)解读
- 空调维保项目进度保障计划
- 既有建筑混凝土结构改造设计规范DBJ-T 15-182-2020
- 放射科室风险评估报告
- 各类组织架构图课件
- 创伤性窒息护理课件
- 人口老龄化对寿险产品需求结构的影响
- 最常用2000个英语单词-电子表格版
- 《解决方案营销》节选版
- 秋季慢性病知识讲座
评论
0/150
提交评论