《二级visualfoxpro数据库程序设计》教案清华大学出版社程序设计基础PPT课件_第1页
《二级visualfoxpro数据库程序设计》教案清华大学出版社程序设计基础PPT课件_第2页
《二级visualfoxpro数据库程序设计》教案清华大学出版社程序设计基础PPT课件_第3页
《二级visualfoxpro数据库程序设计》教案清华大学出版社程序设计基础PPT课件_第4页
《二级visualfoxpro数据库程序设计》教案清华大学出版社程序设计基础PPT课件_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章程序设计基础 程序设计本身是一种创造性的工作 简单的说 程序设计也就是编写程序 即根据实际问题的需要 将一系列的命令按照一定的逻辑结构有机的组织在一起 在输入计算机后可以自动连续的加以执行 1 8 1程序与程序文件 8 1 1基本概念在前面的学习中 对数据库的建立 维护和使用 都是通过菜单选择方式或直接在命令窗口中键入命令完成的 每输入一个命令或进行一次菜单选择 立即会得到一个结果 这种方式比较直观 方便 灵活 但在实际工作中 面对复杂的任务 需要大量的操作 其中很多操作过程需要重复执行多次 每重复一次 都要在命令窗口中重复输入一组命令或执行一次相同的菜单选择 显然这种方式难以胜任复杂的工作 而程序可以完成这类工作 因此需要编写一些程序 程序 人们采用某种程序设计语言 将需要计算机完成的工作 表达为一组有序的指令 命令 集合 即称之为程序 程序文件 将程序中的指令依次输入计算机并按照文件的形式保存在存储器中 即建立了一个程序文件 当给出相应命令之后 程序文件被调入内存 按照指令的顺序自动执行 以完成指定的任务 2 8 1 1基本概念 例8 1编写程序 根据矩形的两条边长 求矩形的面积 程序如下 SETTALKOFFCLEARa 2 4b 4 8s a b 矩形的面积为 sSETTALKON 3 8 1 2程序文件的创建与修改 进入VisualFoxpro自身的程序编辑器的方法有两种 命令方式和菜单方式 1 命令方式格式 MODIFYCOMMAND 功能 打开VisualFoxpro自带的程序编辑器 创建或修改指定的程序文件 说明 1 VisualFoxpro程序文件的扩展名为 prg 可以看成 program 的简写 在命令行中可以省略程序文件的扩展名 系统会自动加上 2 程序文件名也可以省略 系统会为新建的程序提供一个默认的文件名 程序1 prg 3 若指定的程序文件名为新文件名时 此命令创建一个程序 若指定的程序文件名为已有文件名时 此命令在程序编辑器中打开该文件供编辑修改 4 例8 2创建一个名为Main prg的程序文件 其命令为 MODIFYCOMMANDMain prg例8 3创建一个程序求矩形的面积 1 在 命令 窗口中输入MODIFYCOMMAND 按回车健后 弹出程序编辑器窗口 如图8 1所示 2 在程序编辑器窗口中输入例8 1所示程序 如图8 2所示 图8 1MODIFYCOMMAND命令 图8 2编辑程序 5 3 程序输入完毕 按Ctrl W组合键存盘 弹出 另存为 对话框如图8 3所示 4 系统自动为新建的程序文件命名为 程序1 在 保存文档为 文本框中给文件改名为 MyProg prg 同时可以指定文件的存储位置 单击 保存 按钮进行存盘 即创建了一个名为 MyProg prg 的程序文件 图8 3 另存为 对话框 2 菜单方式 6 8 1 3程序文件的执行 建立好程序文件后 就可以进行调试执行 常见的执行方式有两种 命令方式和菜单方式1 命令方式 格式 DO功能 执行指定的程序文件 例如 若要运行例8 3中的程序MyProg prg 则在命令窗口中输入DOMyProg 如果程序没有错误 执行结果在主窗口中显示 如图8 5所示 图8 5执行程序 7 图8 6程序出错示例 8 如果在执行Myprog prg时出现了错误 系统自动中断程序的运行 弹出 程序错误 对话框 错误的程序行反白显示 如图8 6所示 图8 6程序出错示例 取消 取消程序的运行 释放该程序在内存中所有的变量 该项为默认项 挂起 挂起程序 暂时中断程序的执行 但是并不释放程序在内存中的变量 当再次运行时可从中断处继续执行 忽略 继续程序的执行 直到执行完毕或下一次出错为止 2 菜单方式 9 8 2程序中的常用命令 8 2 1简单的输入输出命令8 2 2其他常用辅助命令 10 8 2 1简单的输入输出命令 在程序的执行过程中 计算机经常需要和用户进行交流 通常是需要用户交互的输入一些数据 常用的交互式输入命令包括ACCEPT INPUT和WAIT等 1 ACCEPT命令ACCEPT命令可称做输入字符串命令 格式 ACCEPT TO功能 暂停程序的执行 等待用户从键盘输入一个字符串 并将字符串存入指定的内存变量中 是可选项 对用户的输入内容加以提示 可以是字符型表达式或字符串 命令执行时 提示信息原样输出 11 例8 4输出提示信息 请输入姓名 并接收数据 输入的数据将存入变量name中 ACCEPT 请输入姓名 TOname命令执行后 主窗口显示 请输入姓名 并有一个不动的光标紧跟其后 提示用户的输入内容 如图8 8所示 若用户输入 李晓勇 并按下回车 然后在 命令 窗口中输入 name 就会在主窗口中显示name的值 系统显示如图8 9所示 变量book的值是 李晓勇 图8 8ACCEPT命令图8 9显示输出结果 12 例8 5试编写一个程序 打开 学生基本信息 表 根据输入的学生姓名查看学生基本信息 SETTALKOFFUSE 学生基本信息 ACCEPT 请输入姓名 TOnameLOCATEFOR姓名 nameDISPLAYSETTALKON 程序运行三次 分别输入 王丽丽 孙晓瑞 李红英 结果如下 13 8 2 1简单的输入输出命令 2 INPUT命令INPUT命令可称做输入表达式命令 格式 INPUT TO功能 暂停程序的执行 等待用户从键盘输入一个表达式 按回车键结束输入 系统首先计算表达式的值 再将表达式的值存入指定的内存变量中 说明 1 可以输入数值型 字符型 逻辑型 日期型和日期时间型的表达式 表达式在形式上可以是常量 变量和函数 但不能不输入任何内容直接按回车键 内存变量的类型由输入表达式的类型决定 2 使用ACCEPT命令输入字符串时 不需用定界符 而使用INPUT命令时 如果输入字符串 必须使用定界符 14 例8 6INPUT命令示例 1 r 3 8INPUT 请输入求解圆面积的数值表达式 TOarea命令执行后 主窗口显示提示信息 然后用户输入相关的表达式 如下所示 请输入求解圆面积的数值表达式 3 14159 r r表达式输入后 系统首先计算表达式的值 然后将计算结果45 3645596存入变量area中 2 INPUT 请输入课程名 TOcourse命令执行后 主窗口显示提示信息 然后用户输入相关的表达式 如下所示 请输入课程名 高等数学 表达式输入后 系统将 高等数学 存入变量course中 注意 输入 高等数学 时必须使用定界符 3 INPUT 请输入出生日期 TObirthday命令执行后 主窗口显示提示信息 然后用户输入相关的表达式 请输入出生日期 CTOD 12 21 90 表达式输入后 系统首先计算表达式的值 然后将计算结果 1990 12 21 存入变量birthday中 15 8 2 1简单的输入输出命令 3 WAIT命令WAIT命令可称做输入单字符命令 格式 WAIT TO WINDOW AT TIMEOUT 功能 暂停程序的执行 等待用户从键盘上输入一个字符 输入字符后程序继续执行 各选项的意义如下 1 原样输出提示信息 如果省略 则显示系统默认的提示信息 按任意键继续 2 TO 用户输入的单个字符后 将字符存入指定的内存变量中 如果省略 输入的字符不保存 3 WINDOW AT 屏幕中出现一个窗口以显示提示信息 如果省略此项 提示信息通常会显示在主窗口中 4 AT 设置了提示窗口的在屏幕中所处的行 列位置 5 TIMEOUT 指定暂停的秒数 如果省略 则一直等待 直到用户输入 16 例8 7WAIT命令示例 1 WAIT 您确定要关闭吗 Y N WINDOWSTIMEOUT6 2 WAIT 输入错误 请重新输入 WINDOWAT1 1小结 三条输入命令的比较 1 ACCEPT命令只能接受字符型数据 因此不需用定界符 输入完毕按回车键结束 2 INPUT命令可接受数值型 字符型 逻辑型 日期型和日期时间型的表达式 如果输入的是字符串 需用定界符 输入完毕按回车键结束 3 WAIT命令只能接受单个字符 且不需用定界符 输入完毕不需按回车键 17 8 2 1简单的输入输出命令 4 定位输出命令格式 SAY功能 在指定的行 列坐标位置输出表达式的值 说明 表达式可以是各种类型的表达式 例8 8定位输出命令示例 1 在屏幕第6行第6列输出当前日期 6 6SAYDATE 2 在屏幕第2行30列输出 欢迎进入学生管理系统 2 30SAY 欢迎进入学生管理系统 18 8 2 2其他常用辅助命令 1 程序注释命令在适当的位置给程序加上注释可以提高程序的可读性 注释命令由三种格式 格式1 NOTE格式2 格式3 功能 注释命令在程序的运行过程中并不执行 只是起到解释说明程序的作用 说明 格式1 格式2一般用于给一段程序做注释 格式3用于给某条命令做注释说明 例7 9注释命令示例 NOTE本程序用于查看当前图书借阅的情况NOTE程序员 李欣完成时间 2007 11 16 以下程序用于显示图书借出信息表的记录OPENDATABASE图书管理 打开指定的数据库文件USE图书借出信息表 打开指定的数据表文件DISPLAYALL 显示当前数据表的记录 19 8 2 2其他常用辅助命令 2 关闭 开启人机会话命令格式 SETTALKOFF ON功能 确定是否显示VisualFoxpro命令执行的状态 说明 当人机会话方式开启时 很多VisualFoxpro命令执行后 系统会自动显示执行后的结果状态 因此严重影响程序的运行速度 因此在程序中 往往最开头有一条SETTALKOFF命令 关闭人机对话 非输出命令不再显示相应输出 在程序结束前 应再放置一条SETTALKON命令 回复人机对话 例如 在SETTALKON状态下 执行LOCATEFOR命令时 如果找到符合条件的记录系统会自动显示被找到的记录号 否则会显示 已到文件尾 但一般在程序中是不需要这些显示的 找到了记录就直接显示出来 没找到一般用一个对话框来给出更清楚的提示 所以在程序一开始往往要设置一条SETTALKON命令 20 8 2 2其他常用辅助命令 3 控制程序运行命令 格式 RETURN MASTER 功能 终止程序执行 返回调用它的上级程序 若无上级程序则返回命令窗口状态 说明 如果选择了MASTER选项 则返回到最上级主程序 格式 CANCEL功能 终止程序执行 释放程序在内存中的变量 返回命令窗口状态 格式 QUIT功能 终止所有程序的执行 关闭所有文件 释放所有内存变量 退出VisualFoxpro系统 返回到Windows操作系统状态 21 8 2 2其他常用辅助命令 4 清屏命令格式 CLEAR功能 清除VisualFoxpro主窗口或当前活动窗口中的信息 5 设置打印状态命令格式 SETPRINTON OFF功能 设置输出结果是否送入打印机打印 默认为OFF状态 6 设置文件搜索路径格式 SETPATHTO功能 设置VisualFoxpro的文件搜索路径 22 8 3程序的基本结构 为了编写出好的程序 必须掌握正确的程序设计方法 结构化程序设计作为一种经典的程序设计方法 得到了广泛的应用 结构化程序设计以模块化设计为中心 将一个待开发的软件系统划分为几个独立的模块 每个模块还可以进一步划分为几个小的模块 每一个模块完成一定的功能 从而把复杂的问题简化为一系列简单模块的设计 结构化程序设计包含三种基本控制结构 顺序结构 选择结构和循环结构 已经证明 任何复杂庞大的程序都可以转换为这三种标准形式的组合 结构化程序设计还采用了 单入口 单出口 的控制结构 因此 结构化的程序具有清晰的结构及良好的可读性 可靠性和可维护性 23 8 3 1顺序结构 顺序结构程序中的各条命令是按照它们出现的先后顺序执行的 是一种最基本 最简单的程序结构 其流程如右图所示 其中命令序列A B可以是一条命令或多条命令 24 例8 10统计选修了 线性代数 的学生人数 程序名Amout prgSETTALKOFFOPENDATABASE学生管理USE课程信息LOCATEFOR课程名 线性代数 number 课程号USE学生成绩COUNTFOR课程号 numberTOamount 选修线性代数的人数为 amountSETTALKON运行本程序 DOAmount prg选修线性代数的人数为 2 25 8 3 2选择结构 在日常学习和生活中 经常需要依据给定的条件进行分析判断 从而决定采取不同的行为 操作 例如 求解分段函数 在VisualFoxpro中 有三种语句可以实现选择结构 判断选择语句 双分支选择语句和多分支选择语句 需要对x的值进行判断 才能决定y的取值 显然顺序结构无法处理这样的问题 解决此类问题常常用到选择结构 选择结构是计算机描述各种分支问题的重要手段 其特点是 对给定的条件进行判断 根据条件成立与否决定程序的走向 26 8 3 2选择结构 1 判断选择语句格式 IF ENDIF功能 首先计算的值 若的值为真 则执行IF和ENDIF之间的 然后继续执行ENDIF后面的语句 若 条件表达式 的值为假 则不执行而直接执行ENDIF后面的语句 27 8 3 2选择结构 1 判断选择语句格式 IF ENDIF说明 条件表达式 可以是各种表达式或函数的组合 其值必须是逻辑值 命令序列 可以包含任意数量的VisualFoxpro命令 ENDIF语句表明了程序的终点 IF语句与ENDIF语句必须成对使用 且各占一行 在书写或输入IF和ENDIF之间的语句序列时 建议各条语句均向右缩进一些 适当的缩进增加程序的可读性 是保证代码整洁 层次清晰的重要手段 28 例8 11编写一个程序 根据输入的姓名查询学生基本信息 程序名Query prgCLEARUSE学生基本信息ACCEPT 请输入学生姓名 TOnameLOCATEFOR姓名 nameIF NOT EOF DISPLAYENDIFMESSAGEBOX 查询结束 USERETURN程序执行LOCATE命令时 从首记录开始查找用户输入的姓名 如果记录指针从表的首记录一直移动到最后一条记录都未发现该学生姓名 则记录指针最后停在文件尾 此时EOF 的值为真 相反 若EOF 的值为假 则表示记录指针已经停在待查的学生记录上 即当 NOT EOF 为真时 表示查找到了指定的记录 另外 程序中的 NOT EOF 也可用FOUND 来代替 29 8 3 2选择结构 2 双分支选择语句IF 条件表达式 命令序列1 ELSE 命令序列2 ENDIF 功能 首先计算 条件表达式 的值 如果 条件表达式 的值为真时 则执行 命令序列1 中的命令 否则 执行 命令序列2 中的命令 执行完 命令序列1 或 命令序列2 后都将执行ENDIF后面的语句 30 例8 12编写一个程序根据通话时间计算应付话费 假设固定电话收费标准为 通话不超过3分钟一律收费0 2元 每超时1分钟加收0 1元 源程序清单如下 程序名TeleRate prgSETTALKOFFINPUT 通话时间 TOminuteIFminute 3 应付话费 0 2元 ELSErate minute 3 0 1 0 2 应付话费 STR rate 6 2 元 ENDIFSETTALKON运行本程序后 VisualFoxpro主窗口显示运行结果 通话时间 89应付话费 8 80元 31 例8 13编写一个程序 对系统管理员密码进行校验 假设管理员密码为1234 源程序清单如下 SETTALKOFFCLEARACCEPT 请输入系统管理员密码 TOpasswordIFpassword 1234 当前时间 date time ELSE 管理员密码错误 WAIT 按任意键退出 QUITENDIFSETTALKON运行本程序两次 VisualFoxpro主窗口显示运行结果 请输入系统管理员密码 1234当前时间 10 08 1015 35 18请输入系统管理员密码 4567管理员密码错误 按任意键退出 32 8 3 2选择结构 3 多分支选择语句当问题比较复杂分支数目较多时 为避免程序结构的混乱不清 增强程序的可读性 VisualFoxpro提供了专门的多分支选择语句 即DO CASE语句 DOCASE CASE 条件表达式1 命令序列1 CASE 条件表达式2 命令序列2 CASE 条件表达式n 命令序列N OTHERWISE 命令序列N 1 ENDCASE 功能 从 条件表达式1 开始 依次判断各条件表达式 当遇到第一个结果为真的条件表达式时 就执行它后面的命令序列 并结束DO CASE语句 继续执行ENDCASE后面的语句 如果所有的条件表达式均为假 若程序中有OTHERWISE选项 则执行 命令序列N 1 否则 直接执行ENDCASE后面的语句 33 8 3 2选择结构 3 多分支选择语句DOCASE CASE 条件表达式1 命令序列1 CASE 条件表达式2 命令序列2 CASE 条件表达式n 命令序列N OTHERWISE 命令序列N 1 ENDCASE 此语句执行过程如右图所示 34 例8 14试编写一个程序 根据我国 8年3月 日起施行的 个人所得税法 计算应征收的个人所得税 税法规定 公民的工资 薪金所得应按月征收个人所得税 以每月收入额减掉2000元后的余额 做为应纳税的所得额 个人所得税九级超额累进税率表如下所示 程序名 IncomeTax prgSETTALKOFFCLEARINPUT 请输入收入金额 TOincomer income 2000DOCASECASEr 500tax r 0 05CASEr 2000tax r 0 10 25CASEr 5000tax r 0 15 125CASEr 20000tax r 0 20 375CASEr 40000tax r 0 25 1375CASEr 60000tax r 0 30 3375CASEr 80000tax r 0 35 6375CASEr 100000tax r 0 40 10375OTHERWISEtax r 0 45 15375ENDCASE 应征收的税金为 taxSETTALKONRETURN 运行本程序后 VisualFoxpro主窗口显示运行结果 请输入收入金额 5896应征收的税金为 459 40 35 8 3 2选择结构 4 选择结构的嵌套在上述三种选择结构的语句中 可以包含任意合法的VisualFoxpro命令 当然也可以包括合法的选择结构语句 也就是说 选择结构可以嵌套使用 一个选择语句嵌入另外一个选择语句时 应当注意 IF必须与ENDIF一一对应 互相匹配 程序中IF的个数应与ENDIF的个数相同 VisualFoxpr允许选择结构的嵌套 但层次必须清楚 不允许交叉嵌套 判断是否发生交叉嵌套的方法为 将每个IF和它相应ENDIF用一条线连接起来 如果线彼此发生交叉 则出现了交叉嵌套 如下图所示 正确错误 36 4 选择结构的嵌套例8 15试编写一个程序 求解一元二次方程ax2 bx c 0 a 0 分析 根据系数a b c的取值 可分为以下几种情况当a 0时 如果b 0 方程有一个根x c b 如果b 0 方程无意义 当a 0时 delta b2 4ac如果delta 0 方程有两个实根 如果delta 0 方程有两个共轭复数根 其中 实部 虚部 37 选择结构嵌套程序举例equation prgSETTALKOFFCLEARINPUT a TOaINPUT b TObINPUT c TOcIFa 0IFb0 x c b 方程仅有一个根 Str x 7 2 ELSE 方程无意义 ENDIFELSEdelta b 2 4 a cIFdelta 0s Sqrt delta x1 b s 2 ax2 b s 2 a 方程有两个实根 x1 Str x1 7 2 x2 Str x2 7 2 ELSEs Sqrt delta realpart b 2 aimagpart s 2 a 方程有两个复数根 x1 Str realpart 7 2 Str imagpart 7 2 i x2 Str realpart 7 2 Str imagpart 7 2 i ENDIFENDIFSETTALKON 运行本程序后 VisualFoxpro主窗口显示运行结果 a 8b 12c 56方程有两个复数根 x1 48 00 162 38i x2 48 00 162 38i 当选择结构嵌套的层数较多的时 常常会降低程序的可读性 结构层次混乱不清 此时可用DO CASE语句代替 38 8 3 3循环结构 在实际应用中 常常需要重复执行一些语句 例如求 即1 2 3 100 每一次的计算都是累加 相应的VF程序为STORE0TOsumSTOREsum 1TOsumSTOREsum 2TOsum STOREsum 100TOsum显然这类问题如果用前面介绍的结构来处理 程序十分烦琐 令人难以忍受 有些程序甚至是不能实现的 而这样的程序适合用循环结构来处理 循环是指在程序当中 反复的执行同一个程序块的过程 在VisualFoxpro中 提供了3种循环语句 DOWHILE循环语句 FOR循环语句及SCAN循环语句 39 8 3 3循环结构 1 DOWHILE循环语句DOWHILE循环语句又称做 当 型循环语句 即当某一条件满足的时候重复执行某一操作 DOWHILE EXIT LOOP ENDDO其中 DOWHILE语句称为循环起始语句 ENDDO语句称为循环终端语句 这两个语句之间的所有语句称为循环体执行过程 程序执行时 首先判断的值 如果的值为假 则结束循环 转去执行ENDDO后面的语句 如果的值为真 则执行DOWHILE和ENDDO之间的循环体 循环体执行结束 程序自动返回DOWHILE语句 重新判断的值 执行过程如图所示 40 8 3 3循环结构 1 DOWHILE循环语句说明 如果循环体包含 EXIT 命令 则当遇到 EXIT 时 直接跳出循环 转去执行 ENDDO后面的语句 如果循环体包含 LOOP 命令 则当遇到 LOOP 时 提前结束循环体的本次执行 不再执行它后面的语句 返回到循环起始语句 重新判断 EXIT 和 LOOP 命令可以放在循环体内的任何位置 而且这两个语句只能用在循环体中 不能单独使用 并且常与条件判断语句相结合 循环体中一定要有使循环趋于结束的语句 避免死循环 通常用一个变量控制循环的次数 这样的变量称做循环控制变量 DOWHILE和ENDDO必须成对使用 41 例8 16试编写程序 求的值 程序名sum prgSETTALKOFFCLEARsum 0i 1DOWHILEi 100sum sum ii i 1ENDDO 1 2 3 100 sumSETTALKONRETURN 此程序使用了一个循环控制变量ii的初值为1 每执行一次循环体 i的值增1 直到i的值超过了100 循环结束 i不但控制了循环的次数 而且通过i获得了1到100这100个数 还使用了一个变量sum 用来存放这100个数的累加和 先把0 1的和放入sum中 再把sum 2的和存放在sum中 依次类推 直到求出100个数的和 运行本程序后 VisualFoxpro主窗口显示运行结果 1 2 3 100 5050 42 例8 17编写程序 逐条显示 学生基本信息 表中党员的信息 源程序清单如下 SETTALKOFFCLEAROPENDATABASE学生管理USE学生基本信息DOWHILE NOT EOF IF政治面貌 党员 DISPLAYENDIFSKIPENDDOCLOSEDATABASESETTALKONRETURN 需要对表文件中的记录自上而下或自下而上的逐条进行操作时 常常用到下面的循环结构 DOWHILE NOT EOF SKIP 1 ENDDO 43 8 3 3循环结构 2 FOR循环语句FOR循环语句也称做 步长 型循环语句 即循环的次数取决于循环控制变量的初值 终值和步长 在已知循环次数的情况下 使用FOR循环语句比较方便 FOR TO STEP ENDFOR NEXT执行过程 首先给赋 然后判断该值是否超过 若超过则结束循环 转而执行ENDFOR或NEXT后面的语句 若不超过终值 则执行循环体 循环体执行一次后 将的值增加一个单位 再判断循环控制变量的当前值是否超过终值 若超过 结束循环 否则 继续执行循环体 直到循环控制环变量的值超过终值为止 44 8 3 3循环结构 2 FOR循环语句说明 FOR循环适用于循环次数已知的情况 而DO WHILE循环可以事先并不清楚循环的次数 步长 是循环控制变量每次的增量 步长可以是正数也可以是负数 但不能为0 如果省略STEP子句 系统默认步长为1 初值 终值 和 步长 可以是数值常量或数值表达式 它们的值仅在循环语句开始执行时计算一次 在循环语句执行过程中 初值 终值和步长不发生变化 并由此确定循环的次数 在FOR循环语句的循环体中 同样也可以出现EXIT和LOOP命令 遇到EXIT命令时 直接跳出循环体 执行后续的命令 遇到LOOP命令时 结束本次循环 循环变量增加一个步长值 返回FOR语句判断循环条件是否成立 ENDFOR和NEXT作用相同 用以表明本循环结构的终点 FOR与ENDFOR NEXT也必须成对使用 45 例8 18采用FOR循环语句 计算的值 源程序清单如下 SETTALKOFFCLEARsum 0FORn 1TO100sum sum nENDFOR sum sumSETTALKONRETURN 46 8 3 3循环结构 3 SCAN循环语句SCAN循环语句又称做 指针 型循环控制语句 即根据表中的当前记录指针 决定循环体内语句的执行次数 SCAN 范围 FOR 条件表达式 WHILE 条件表达式2 ENDSCAN执行过程 SCAN循环语句是为了方便操作数据表记录而产生的 从当前表的首记录开始自动 逐个的移动记录指针扫描每一条记录 对于符合条件的记录执行循环体规定的操作 直到所有记录都检查完毕 说明 只有在子句内指定的记录才能被扫描到 如果省略 默认值为ALL 循环体内同样也可以使用EXIT和LOOP语句 作用与其他循环结构类似 SCAN与ENDSCAN必须配对使用 且各占一行 47 例8 19采用SCAN循环语句 改写例8 17的程序 源程序清单如下 SETTALKOFFCLEAROPENDATABASE学生管理USE学生基本信息SCANFOR政治面貌 党员 DISPLAYENDSCANCLOSEDATABASESETTALKONRETURN SCAN语句逐一遍历当前表中每一条记录 其功能等价于以下的循环结构 DOWHILE NOT EOF SKIPENDDO 48 4 循环语句的嵌套循环语句的嵌套 即在一个循环语句的循环体内又包含了另一个循环结构 也称做多重循环 以 当 型循环结构为例 多重循环的一般格式为 DOWHILEDOWHILEDOWHILEENDDOENDDOENDDO在VisualFoxPro系统中 循环嵌套的层数没有限制 但内层循环的所有语句必须完全嵌套在外层循环中 否则 会引起循环结构的交叉 造成程序逻辑结构的混乱 判断交叉嵌套的方法和选择结构相同 49 例8 20编写程序 输出 九 九 乘法口诀表 输出格式如下所示 SETTALKOFFCLEARx 1DOWHILEx 9y 1DOWHILEy xz x y STR x 1 STR y 1 STR z 2 y y 1ENDDO x x 1ENDDOSETTALKONRETURN 50 例8 21编写程序 输出3 100之间素数并统计个数 素数是指那些大于1 除了1和它本身外 不能被其他数整除的自然数 程序名 prime prgSETTALKOFFCLEARamount 0 3 100之间的素数有 FORn 3TO100FORi 2TOn 1IFMOD n i 0EXIT 退出本层FOR循环ENDIFENDFORIFi n i n说明没有数能将n整除 n是素数 namount amount 1 素数的个数加1ENDIFENDFOR 总计 str amount 2 个 SETTALKONRETURN 运行本程序后 VisualFoxpro主窗口显示运行结果 3 100之间的素数有 357111317192329313741434753596167717379838997总计24个 51 8 4过程与过程文件 结构化程序设计采用模块化的思想 提倡把复杂的问题划分为若干个子问题 模块 而每个子问题的解决 都可以通过编写一个子程序或过程来完成 即每个子程序或过程都可看做是组成应用系统的一个小部件 每个子程序或过程可以称为一个程序模块 在程序设计的过程中 需要重复出现的程序段可以定义为一个子程序或过程 子程序或过程一旦定义好后 可以被一个或多个程序任意调用 不必反复编写 从而避免了程序的冗长 即提高代码的可读性和可维护性 又节省了存储空间 52 8 4 1子程序 子程序也是一段独立的程序 与一般的程序一样 以同样的方式创建和修改 以同样的文件格式存储在磁盘 具有同样的扩展名 prg 不同的是 子程序一般不能独立运行 需要由其他程序调用 对于两个具有调用关系的程序文件 常称调用程序为主程序 被调用程序为子程序 53 例8 22编写一个程序 已知m和n 分析 此程序要求计算3次阶乘 计算阶乘的方法相同 只是每次对不同的数进行计算 因此采用子程序进行程序设计 编写一个求阶乘的子程序 分三次进行调用即可 主程序 main1 prgSETTALKOFFCLEARINPUT 请输入m的值 TOmINPUT 请输入n的值 TOn 计算m temp mDOSUB1 调用子程序c temp c保存计算结果 计算n temp nDOSUB1c c temp 计算 m n temp m nDOSUB1c c temp cSETTALKON 子程序 SUB1 PRGk 1FORi 1TOtempk k iNEXTtemp kRETURN 1 子程序的调用 54 2 子程序的嵌套子程序嵌套的执行过程如图8 16所示 55 8 4 2过程和过程文件 一个实用的应用系统通常含有大量的子程序 每个子程序都需要独立存储 系统每调用一个子程序 就要将相应的程序文件从外存调入内存 调用的次数越多 访问外存的次数也就越多 相应的 系统运行速度也就越慢 因此 VisualFoxpro提供了过程文件 过程与子程序类似 均可看做是完成某以特定功能的程序段 可以将多个过程放入同一个过程文件 执行时 只要将过程文件打开 所包含的过程一次全部调入内存 以后就可以随意调用其中任何过程 从而减少了访问外存的次数 过程与子程序的区别 子程序的开头加上一个过程说明语句 即可称之为 过程 过程文件是过程的集合 不能含有子程序 过程说明语句的格式 PROCEDURE 当应用程序所需的过程较少时 可将过程直接放在调用它的程序的尾部 而子函数必须单独编写 56 8 4 2过程和过程文件 1 过程文件的创建和修改过程文件的创建和修改方法与程序文件相同 可以使用MODIFYCOMMAND 命令来建立 过程文件的结构一般为 PROCEDURERETURNPROCEDURERETURN PROCEDURERETURN 57 8 4 2过程和过程文件 2 过程文件的打开调用某过程文件中的过程时 必须先打开该过程文件 打开过程文件命令为 格式 SETPROCEDURETO 任何时候系统只能打开一个过程文件 打开一个新的过程文件时 自动关闭原来已经打开的过程文件 3 过程文件的关闭格式1 SETPROCEDURETO格式2 CLOSEPROCEDURE 58 例8 23用过程文件实现对学生管理数据库的 学生基本信息 表进行查询 删除和插入操作 主程序如下 主程序名Main prgSETTALKOFFCLEAROPENDATABASE学生管理SETPROCEDURETOProce 打开过程文件USE学生基本信息INDEXON姓名TOxmCLEAR 2 20SAY 学生管理系统 4 20SAY A 查询学生信息 6 20SAY B 删除学生信息 8 20SAY C 插入学生信息 10 20SAY D 退出 choise WAIT 请选择A B C D WINDOWAT18 20TOchoiseDOCASECASEchoise A DOproce1CASEchoise B DOproce2CASEchoise C DOproce3CASEchoise D QUITENDCASESETPROCEDURETO 关闭过程文件CLOSEDATABASESETTALKON 59 过程文件如下 过程文件名Proce prgPROCEDUREproce1 查询过程CLEARACCEPT 请输入学生姓名 TOnameSEEKnameIFFOUND DISPLAYELSE 该生的信息不存在 ENDIFRETURNPROCEDUREproce2 删除记录过程CLEARINPUT 请输入要删除的学生姓名 TOnameSEEKnameDELETEWAIT 物理删除吗Y N TOflagIFflag Y OR flag y PACKENDIFRETURNPROCEDUREproce3 插入新的记录过程CLEARAPPENDRETURN 60 8 4 3自定义函数 VisualFoxpro中 除了系统提供的标准函数之外 用户还可以根据实际需要自己定义一些函数 自定义函数的命令格式如下 FUNCTION PARAMETER RETURN 说明 FUNCTION语句指出了函数名 若以FUNCTION语句开头 表示该函数包含在调用它的程序中 若缺省该语句 表示该函数独立存储在一个程序文件中 该程序文件名即为函数名 RETURN语句用于返回函数值 即函数运行后所得到的的值 若缺省该语句 则返回的函数值为 T 自定义函数与系统提供的标准函数调用方法完全相同 其形式为 函数名 61 例8 24采用自定义函数的方法计算t的值 t 1 2 3 4 5 主程序 main prgSETTALKOFFCLEARt 0FORi 1to5 STR i 1 的阶乘 STR jc i 3 t t jc i 调用自定义函数jcNEXT 1 2 3 4 5 STR t 3 SETTALKON 自定义函数 jc prgFUNCTIONjcPARAMETERSn 定义形式参数s 1FORj 1TOns s jNEXTRETURNs 返回函数值 运行本程序后 VisualFoxpro主窗口显示运行结果 1的阶乘 12的阶乘 23的阶乘 64的阶乘 245的阶乘 1201 2 3 4 5 153 62 8 4 4参数传递 程序模块相互调用时 各模块之间经常需要传递一些数据 调用模块将数据传送给被调用模块 经被调用模块处理后 再把结果传回到调用模块中 在调用的过程中 需要传递的数据称做参数 调用模块可称为主调模块 被调用模块可称为被调模块 程序模块之间进行参数传递时 被调模块中需要设置接受参数命令 相应的 主调模块中应设置调用模块命令 接受参数命令格式 PARAMETERS PARAMETERS命令必须是被调用模块中的第一条可执行命令 形式参数可以是任意合法的内存变量名 调用模块程序命令 格式1 DOWITH 格式2 实参可以是常量 变量 还可以是表达式 63 调用模块程序命令 说明 主调模块调用被调模块时 主调模块中出现的参数称为实际参数 相应的被调模块中 PARAMATERS命令中的参数称为形式参数 实际参数与形式参数应该相容 即个数相同 类型和位置一一对应 若实际参数的个数少于形式参数的个数 多余的形式参数的值为逻辑假 F 若形式参数的个数少于实际参数的个数 系统会产生运行时错误 当主调模块中采用格式1调用相应模块时 参数传递规则为 如果实际参数是常数或表达式则传值 即实际参数的值 如果实际参数是变量则传址 即变量的地址 这样 形参和实参实际上是一个变量 被调模块中对形参变量值的改变也将使实参变量值改变 当主调模块中采用格式2调用相应模块时 默认情况下传递的实参的值 可以设置参数传递方式 相应命令格式如下 SETUDFPARMSTOVALUE REFERENCE若选择了VALUE 表示传递实参的值 若选择REFERENCE 表示传递实参的地址 64 8 4 4参数传递 返回命令当主调模块执行到调用相应模块的命令时 程序转到被调模块中执行相关命令 被调模块执行完毕 仍要返回到主调模块中 返回命令格式 格式 RETURN 该命令将的值返回给主调函数 若缺省 则返回逻辑真 T 若被调模块中缺省RETURN语句 被调模块中所有命令执行完毕 自动执行一条隐含的RETURN命令 65 例8 25采用子程序编程 计算圆的面积 主程序main prgSETTALKOFFCLEARSTORE0TOr1 areaDOWHILE T INPUT 请输入圆的半径 TOr1DOmysubWITHr1 area 半径为 ALLTRIM STR r1 的圆的面积是 areaWAIT 还要继续计算吗 Y N TOanswerIFUPPER answer Y LOOPELSEEXITENDIFENDDOSETTALKON 子程序mysub prgPARAMETERSr2 ss 3 1415926 r2 2RETURN 66 8 4 5变量的作用域和参数传递 一个内存变量除了其数据类型和取值之外 还有一个重要的属性就是它的作用域 内存变量的作用域也就是变量的有效范围 在VisualFoxpro中 根据作用域可将内存变量分为三类 公共变量 私有变量和本地变量 1 公共变量公共变量在所有程序模块中均可以使用 定义公共变量的命令如下 格式 PUBLIC说明 公共变量必须先定义后使用 公共变量在定义它的程序模块运行结束后并不释放 因此可以在任何模块中使用 公共变量一旦建立就一直有效 即使程序执行完毕也不会释放 只有执行了CLEARMEMORY RELEASE QUIT等命令后 全局变量才能被释放 在命令窗口中创建的任何变量都默认为公共变量 67 8 4 5变量的作用域和参数传递 2 私有变量私有变量可以在创建它的模块以及相应的低层模块中使用 当创建它的模块运行结束 私有变量自动被释放 定义私有变量的命令如下 格式 PRIVATE说明 私有变量可以不加定义 直接使用 系统自动隐含定义创建 也就是说 程序中未经特殊定义的内存变量 系统自动默认为私有变量 PRIVATE 命令可以将高层模块中创建的同名变量隐藏起来 即本模块中定义的私有变量 可以与高层模块中的内存变量同名 但它们是不同的变量 在执行本模块和相应的低层模块期间 高层模块中的同名变量将被隐藏 68 8 4 5变量的作用域和参数传递 3 本地变量本地变量也称局部变量 只能在创建它的程序模块中使用 任何其他模块不能访问此变量 当创建它的程序模块运行结束时 本地变量自动被释放 定义本地变量的命令如下 格式 LOCAL说明 本地变量也必须先定义后使用了解 变量的类型是不能预先定义的 无论是PUBLIC定义的公共变量 用LOCAL定义的本地变量 用PRIVATE定义的私有变量 定义后其默认的数据类型都是逻辑型 其值均为假 f 定义后将其初始化 便可明确其数据类型 69 例8 26变量的隐藏与恢复示例 首先建立以下程序文件 程序名circle prgPARAMETERrPRIVATEvava 2 3 14 r 程序中 LISTMEMORYLIKEv RETURN 然后在命令窗口中输入下列命令 CLEARRELEASEALLva 1vr 9 6 命令窗口中 LISTMEMORYLIKEv DOcircle prgWITHvr 返回命令窗口后 LISTMEMORYLIKEv 70 例8 27公共变量 私有变量 本地变量及其作用域示例 主程序mains prgRELEASEALL 清除所有用户定义的内存变量CLEARPUBLICma1 ma2ma1 10ma2 abc LOCALmb1mb1 T STORE100TOmc1 主程序中 LISTMEMORYLIKEm DOsubs 返回主程序后 LISTMEMORYLIKEm RETURN 子程序subs prgma1 20ma2 30mc1 200mc2 xyz 子程序中 LISTMEMORYlikem RETURN 71 8 5程序的调试 编写程序时错误在所难免 因此在写完所有代码后 还有一件非常重要的工作 那就是对程序的调试 DEBUG 调试的目的就是找出程序错误的原因 关键是确定出错的位置 系统在编译的程序时 大部分工作是检查代码的基本正确性 检查命令和文本串的拼写 表达式的有效性和命令的基本结构 如果程序中有此类语法错误 运行到错误的语句时系统就会停下来 显示一个 程序错误 对话框 并给出简单的出错信息 但有些时候 程序中的语句并没有错误

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论