560 likes | 711 Views
第 6 章 程序设计基础. 本章主要内容. 程序设计的基本概念 程序文件建立与运行 三种程序控制结构 程序调试. 程序设计的基本概念. 一、 VFP 的工作方式 命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的。 程序工作方式 根据解决实际问题的需要,将一系列符合 Visual FoxPro 要求的命令按一定的逻辑结构编排成一个完整的应用程序,然后输入到计算机内自动地、连续地加以执行。. 程序设计的基本概念. 二、 VFP 的编程方式 面向过程编程方式
E N D
本章主要内容 • 程序设计的基本概念 • 程序文件建立与运行 • 三种程序控制结构 • 程序调试
程序设计的基本概念 一、VFP的工作方式 • 命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的。 • 程序工作方式 根据解决实际问题的需要,将一系列符合Visual FoxPro要求的命令按一定的逻辑结构编排成一个完整的应用程序,然后输入到计算机内自动地、连续地加以执行。
程序设计的基本概念 二、 VFP的编程方式 • 面向过程编程方式 用结构化编程语言来编写结构化的程序,它把一个复杂的程序分成较小的过程,每个过程可以单独进行调试。 • 面向对象编程方式 用面向对象的技术编程,它把编程工作主要集中在描述的对象上,程序是事件驱动的,在执行过程中,等待的是一个事件。 对于制作简单短小的应用程序,使用过程编程方式比较容易,同时,这也是面向对象编程方式的基础。本章重点介绍面向过程的程序设计。
程序设计的基本概念 三、程序设计的步骤 • 分析问题或任务,总结或抽象出问题的数学模型 • 根据数学模型确定解决问题的算法思想 • 确定要建立的数据表或数据库的基本结构及其数据表之间的关系 • 画出程序流程图 • 编写程序,实现功能要求,并在计算机上调试通过 • 用典型数据对所编写的程序进行测试,验证程序的可靠性 • 编写使用说明书,整理有关资料,进行总结
6.1 程序文件建立与运行 • 程序文件 程序是由命令组成的ASCII码文本文件,所以程序文件也称为命令文件。该文件可用任何文本编辑器或字处理软件来建立。 • 程序文件扩展名 源文件的扩展名是.PRG,程序在运行时,会产生主文件名与.PRG程序主文件名相同,扩展名为.FXP的目标文件。
6.1.1 程序文件建立 建立程序最简单的方法是用系统本身提供的编辑器。 VFP有2种方式进入程序编辑器窗口:菜单方式和命令方式
菜单方式建立程序文件 单击“新建文件”命令按钮 程序编辑窗口标题栏,显示程序的文件名,这里“程序1”为临时文件名,可以保存为其他文件名。 用菜单建立程序的步骤为: • 单击菜单“文件”→“新建”命令或者单击常用工具栏的“新建”按钮,打开“新建”对话框。 • 打开“程序1”的程序编辑新窗口。 在插入点“|”后可输入程序需要的命令。 选择“程序”单选按钮
命令方式建立程序文件 在“查找范围”下拉列表框选择程序所在或要保存的文件夹。 格式:MODIFY COMMAND [<程序文件名>]|? 功能:打开程序编辑窗口,从中可以修改或创建程序文件。 几点说明: • <程序文件名>:指定修改或创建的程序文件名。 • 如果用MODIFY COMMAND ?,则出现“打开”对话框,如图所示。 在“文件名”文本框输入要创建的文件名;如果选择了一个已存在的文件,该文件名也会出现在该处。 单击“确定”按钮,进入程序编辑窗口修改或编写程序。 在“文件类型”下拉列表框选择文件类型。
命令方式建立程序文件 在用命令建立程序文件时,最好在命令后加上程序文件名,这样可以直接创建或修改用户给出的程序文件。 建好的文件将保存在“默认目录”指定的文件夹下,默认的扩展名是.PRG。如果需要保存在其它文件夹下,还可在命令中指定路径。如: MODI COMM D:\excercise\example 注意:这里的命令动词“MODIFY COMMAND”用了简写形式。
程序输入与保存 [例 6-1] 在程序编辑窗口输入如下6条命令。 CLEAR &&将屏幕输出窗口内容清空 a=12 &&将数值12赋值给变量a b=18 &&将数值18赋值给变量b c=a+b &&将变量a与b和计算出来,赋值给变量c ?a,b,c &&输出变量a、b、c的值 RETURN &&表示程序结束 CLEAR a=12 b=18 c=a+b ?a,b,c RETURN 打开程序编辑窗口,即可输入上述程序代码,如图所示。
程序输入与保存 在输入一个程序时,请用户注意以下几点: • 一个命令语句中只能有一个命令动词。 • 每输入完一个语句按回车键表示该语句结束。 • 程序中用到的所有作为“分隔符号”的标点符号一律用英文半角符号。 • 输入或修改结束按“Ctrl+W”存盘,“Ctrl+Q”取消本次输入或修改结果。还可使用“文件”→“另存为”命令将编辑好的程序以另外的名称存盘。
6.1.2 程序运行 通过“查找范围”下拉列表框确定文件所在的文件夹。 • 菜单方式运行程序 单击菜单“程序”→“运行”命令,打开“运行”对话框。选定定要执行的程序文件,如选择:cx1 ,单击“运行”按钮,如图所示。 选择要执行的文件(即单击该文件)。 单击“运行”按钮执行程序。 选择的文件出现在“执行文件”文本框中。
6.1.2 程序运行 • 命令方式运行程序 格式:DO <程序文件名> 功能:将指定的程序文件调入内存并运行。 如在命令窗口里输入:DO cx1 将在屏幕输出程序计算结果: 12 18 30
6.1.2 程序运行 • 单击常用工具栏上“!”命令按钮执行该程序 在程序打开并且为当前程序的情况下,单击常用工具栏上“!”命令按钮可执行该程序。
6.1.2 程序运行 • 程序错误对话框 在程序执行过程中,如果程序出现运行错误或用户按下了“Esc”键,将弹出“程序错误”对话框,如图所示。 单击“挂起”按钮,可暂时停止程序的运行,可在命令窗口里输入命令:RESUME,或单击菜单“程序”→“继续执行”命令可继续执行程序 。 单击“帮助”命令按钮可提示相关帮助信息。 单击“取消”按钮可取消程序的执行。 单击“忽略”命令按钮忽略程序的错误继续执行程序 。
6.1.3 程序辅助命令 以前介绍的所有Visual FoxPro命令都可以用在程序设计中。另外Visual FoxPro还提供了一些辅助命令,这些命令能使程序更好地阅读和有效地运行。本小节介绍: • 程序注释命令 • 程序结束命令 • 信息对话框函数MESSAGEBOX
程序注释命令 Visual FoxPro提供了3种注释命令: 格式1: NOTE <注释内容> 格式2: * <注释内容> 功能:使 NOTE或* 后面的内容成为注释内容。 格式3:[<命令>] &&<注释内容> 功能:<注释内容>对&&左面的命令做出解释或给出运行结果,又称为行尾注释命令。
程序结束命令 格式1:RETURN 功能:返回到上一级模块。如果本程序是以菜单方式或在命令窗口中调用执行的,则返回到命令交互状态。 格式2:CANCEL 功能:终止程序运行,清除程序中的私有变量,返回到命令窗口。 格式3:QUIT 功能:关闭Visual FoxPro,返回到操作系统。
信息对话框函数MESSAGEBOX 信息对话框的“标题”部分。 MessageBox函数用于显示一个信息对话框,可以在程序运行过程中,显示一些信息,例如提示信息、错误信息等。其构成如图所示。 信息对话框的“提示信息”部分。 信息对话框的“图标”部分。 信息对话框的“按钮”部分。
信息对话框函数MESSAGEBOX 格式: MESSAGEBOX(<字符表达式1>[,<数值表达式>[,<字符表达式2>]]) 功能:供用户定义信息对话框,按下相应的按钮返回一个数值。 说明: • <字符表达式1>用于指定在对话框中显示的信息文本。 • <数值表达式>用于根据表6-1的内容设置对话框中的按钮、图标和默认按钮,缺省该参数表示取0。
信息对话框函数MESSAGEBOX • <字符表达式2>用于指定对话框标题栏的显示文本。缺省该参数表示在标题栏显示“Microsoft Visual FoxPro”。 • 函数值返回一个数值,用户可根据操作时按下的按钮来获得相应的返回值,返回值见表6-2,用户编程时根据返回值来设置动作。
信息对话框函数MESSAGEBOX [例 6-3] 在信息对话框中使用2个按钮“是”和“否”,使用“问号”图标,默认按钮为第二个按钮,显示“真的要退出系统吗?”信息,对话框标题为“提示信息”。 在命令窗口里输入: a=MESSAGEBOX("真的要退出系统吗?",4+32+256,"提示信息") 就会显示如图所示的信息对话框。
6.1.4 交互式输入命令 根据解决实际问题的需要,往往在程序运行的过程中,由用户向程序输入一些数据或信息,完成这种功能的一些命令称为交互式输入命令。Visual FoxPro提供了多种交互式输入命令。本小节介绍三种命令: • ACCEPT • INPUT • WAIT
字符型数据输入命令ACCEPT 格式:ACCEPT [<提示信息>] TO <内存变量> 功能:暂停程序的执行,等待用户输入一个字符串给变量。 说明: (1)[<提示信息>],是在屏幕上出现的提示信息。它可以是字符串,此时必须用双引号将其括起来,也可以是字符型内存变量,该内存变量必须预先赋值。 (2)用户在键盘输入的任何字符信息都被赋值给“内存变量”。输入的数据将作为字符型数据处理,不需要定界符括起来,如果输入了定界符,则这些定界符也被作为输入字符的一部分。 (3)输入完需要的信息后,按“Enter”键结束本命令的输入。如果没有输入其他信息,只按回车键,将把一个空字符串赋值给内存变量。
ACCEPT使用举例 [例 6-4] 编一程序,将人事数据表打开,在程序运行中输入人员姓名,显示指定姓名的人员记录。 程序代码如下: NOTE 该程序用于从人事数据表中查找用户指定姓名的人员信息。 CLEAR USE rsb ACCEPT "请输入要查找的姓名:" TO name LOCATE FOR ALLTRIM(姓名)=name DISPLAY RETURN
表达式输入命令INPUT 格式:INPUT[<提示信息>] TO <内存变量> 功能:暂停程序的执行,接受用户输入合法的表达式并将表达式的值赋值给内存变量。 说明: (1)[<提示信息>],同“ACCEPT”命令中的[<提示信息>]。 (2)用户可输入任何一个合法的数值型(N)、字符型(C)、日期型(D)、逻辑型(L)表达式,系统先计算表达式的值并将该值赋值给内存变量。 (3)如果输入字符串信息,则必须加上双引号或单引号定界符,如"ABC"。 (4)按“Enter”键结束输入,如果输入的是非法表达式,系统将提示重新输入。
INPUT使用举例 [例 6-5] 已知圆半径为r,求圆面积s(要求四舍五入保留三位小数)。 分析:假设圆的半径为r,则计算圆面积s的公式为:s=πr2,计算圆面积公式的Visual FoxPro表达式为:PI()*r^2 。程序代码如下: * 该程序用于计算用户指定半径的圆的面积。 CLEAR INPUT "请输入圆半径r=" TO r s=ROUND(PI()*r^2,3) &&PI()为圆周率函数π,ROUND函数为四舍五入函数 ?"该圆半径为:",r ?"该圆面积为:",s RETURN
接收单字符命令WAIT 说明: 格式:WAIT [<提示信息>] [TO <内存变量>] [WINDOWS [AT <行坐标>,<列坐标>]] [TIMEOUT<等待秒数>] [NOWAIT] 功能:暂停程序,用户按任意键或者时间超过等待的秒数后,程序继续执行。如果包含[TO <内存变量>]短语,将用户所按键盘字符赋值给指定的内存变量。 (3)TIMEOUT <等待秒数>:指定在执行 WAIT 命令之后,程序暂停的时间,<等待秒数>参数指定等待的时间秒数。 (4)NOWAIT子句指在前述指定的Windows窗口中显示WAIT信息的同时,程序继续执行而不暂停。 (1)[<提示信息>],指定要显示的自定义信息。若省略该参数,则 Visual FoxPro 显示默认的信息“按任意键继续……”。如果该参数为空字符,则不显示信息。 (2)[WINDOWS]:在 Visual FoxPro 主窗口右上角的系统信息窗口中,显示提示信息。如果指定[AT <行坐标>,<列坐标>],则该窗口在指定屏幕坐标位置显示。
WAIT使用举例 下列命令将在屏幕16行、16列位置处显示一含有提示信息的小窗口,如图所示,此时单击鼠标按键、按下键盘上任意一个按键或小窗口在屏幕上停留7秒后,从屏幕上消失。 WAIT "请稍后,程序将继续执行......。" WINDOWS AT 16,16 TIMEOUT 7
课堂提问 • 程序设计的步骤有哪些? • 进入程序编辑器窗口的方法有哪2种? • 进入程序编辑器窗口的命令是什么?
6.2 程序控制结构 结构化程序包括三种基本结构,即 • 顺序结构 • 选择结构 • 循环结构
6.2.1 顺序结构 顺序结构是程序设计中最基本的结构,该结构按照程序命令出现的先后顺序依次执行。事实上,如果不进行特殊说明,程序中的命令就自动按其前后排列顺序执行。
顺序结构程序举例1 程序代码如下: CLEAR p0=200000 a=0.1 n=13 p1=p0*(1+a)^n ?"我国2007年的国民生产总值为:",p0, "亿元。" ?"我国2020年的国民生产总值为:",p1, "亿元。" RETURN [例 6-6] 假设我国2007年国民生产总值为200,000亿元,按每年平均10%的速度递增,编程计算到2020年我国国民生产总值将会达到多少? 国民生产总值计算公式为:未来值p1=初值p0×(1+速度a)时间间隔n 这里,初值 p0=200000 亿元,速度为 a=0.1,时间间隔 n=2020-2007=13,P1为未来待计算的值。Visual FoxPro计算表达式为:p1=p0*(1+a)^n 。该程序流程图如图所示。
6.2.2 选择结构 选择结构,是一种常用的基本结构,是根据所给条件是否为真,选择执行某一分支的相应操作。按照选择结构执行路径的多少,可分为: • 简单分支结构 • 双分支选择结构 • 多分支选择结构
简单分支结构 说明: 格式: IF <条件> [命令序列] ENDIF 功能:根据条件的逻辑值来确定是否执行[命令序列]。 (3)为了程序阅读方便,便于以后维护修改,建议对于[命令序列]部分采取向右缩进书写的方式。 (1)根据<条件>的逻辑值进行判断。如果<条件>的逻辑值为.T.,就依次执行[命令序列],执行完后就转去执行ENDIF之后的命令。如果<条件>的逻辑值为.F.,则IF<条件>和ENDIF之间的所有命令都不执行,而直接转到ENDIF之后的命令。 (2)IF语句和ENDIF语句必须成对出现,且各占一行。
简单分支结构举例1 该问题计算机程序框图如图所示 程序代码如下: NOTE 计算铁路托运行李费,W为行李重量,P为运费。 CLEAR INPUT "请输入行李重量:" TO w P=0.25*w IF w>50 P=50*0.25+(w-50)*0.45 ENDIF ?"行李重量为:",w,"公斤" ?"应付运费为:",p,"元" RETURN [例 6-8] 铁路托运行李,按规定每张客票托运行李不超过50公斤时,每公斤0.25元,如超过50公斤,超过部分按每公斤0.45元计算。编写一个程序,把行李重量输入计算机,计算出运费,并打印出付款清单。 问题分析:设行李重量为W公斤,应付运费为P元,则运费公式为: 当W≤50, p=0.25×w 当W>50, p=50×0.25+(w-50)×0.45
双分支选择结构 说明: 格式: IF <条件> [命令序列1] ELSE [命令序列2] ENDIF 功能:根据条件的逻辑值来决定程序执行[命令序列1]还是[命令序列2]。 (2)ELSE语句单独占一行,IF语句和ENDIF语句必须成对出现,且各占一行。 (1)如果<条件>的逻辑值为.T.,就执行[命令序列1],执行完后就转到执行ENDIF之后的命令。如果<条件>的逻辑值为.F.,就执行[命令序列2],完成后,转去执行ENDIF之后的命令。
双分支选择结构举例 CLEAR INPUT "请输入里程数:" TO k IF k<=2 cf=7 ELSE cf=7+(k-2)*2.6 ENDIF ?"里程为:",k,"公里" ?"车费为:",cf,"元" RETURN [例 6-10] 设出租车不超过2公里时一律收费7元钱,超过时则超过部分每公里加收2.6元。试根据里程数编程计算并显示出应付车费(用双分支选择结构编程)。 程序代码如下:
分支结构嵌套 在分支结构的<命令序列>中,可以包含任何Visual FoxPro命令语句,也可以包括另外一个或几个合法的分支结构语句,也就是说分支结构可以嵌套。对于嵌套的分支结构语句,一定注意内外层分支结构层次分明,即注意各个层次的IF…ELSE…ENDIF语句的配对情况。
分支结构嵌套举例 IF salevolume<=100000 pays=pay1 ELSE IF salevolume<=300000 pays=pay1+ROUND((salevolume-100000)*0.02,0) ELSE IF salevolume<=500000 pays=pay2+ROUND((salevolume-300000)*0.05,0) ELSE pays=pay3+ROUND((salevolume-500000)*0.1,0) ENDIF ENDIF ENDIF ?salenumber+"号销售员工作报酬:"+STR(pays,6,0)+"元。" RETURN [例 6-11] 永立公司对销售人员的报酬计算方法如下:每月销售10万元(含10万元)以下者,只得基本工资1000元;每月销售10万元以上至30万元(含30万元)者,则超过10万元以上部分按2%提成;每月销售30万至50万(含50万元)者,超过30万元部分按5%提成;超过50万元部分按10%提成。以上各个级别的计算实行累加计算。编程按输入每个销售人员编号和销售额,计算每个销售人员的报酬(报酬结果按四舍五入规则取整)。 编程思路:为了编程方便,先将每个级别的基准报酬计算出来,再根据销售额的多少用嵌套分支结构判断计算。该程序代码如下: CLEAR ACCEPT "销售员编号:" TO salenumber INPUT "销售额:" TO salevolume pay1=1000 pay2=pay1+ROUND((300000-100000)*0.02,0) pay3=pay2+ROUND((500000-300000)*0.05,0)
多分支选择结构 说明: 格式: DO CASE CASE <条件1> <命令序列1> CASE <条件2> <命令序列2> ... ... CASE <条件n> <命令序列n> [OTHERWISE <命令序列n+1>] ENDCASE 功能:根据<条件>是否成立来决定是否执行其下的命令序列。 (1)多分支选择结构执行的过程是:系统依次判断各<条件>是否满足,若某一<条件>为.T.,就执行该<条件> 下的<命令序列>,执行后不再判断其它<条件>,而转去执行ENDCASE后面的第一条命令。如果没有一个<条件>为.T.,就执行OTHERWISE后面的[命令序列n+1],直到ENDCASE;如果没有OTHERWISE,则不作任何操作就转向ENDCASE之后的第一条命令。 (3)多分支选择结构中各CASE语句后的<条件>是按其先后顺序判断执行的,因此对实际问题进行编程时,应认真考虑各个条件排列的先后顺序。 (2)DO CASE语句和ENDCASE语句必须成对出现,各占一行。
多分支选择结构 DO CASE CASE salevolume<=100000 pays=pay1 CASE salevolume<=300000 pays=pay1+ROUND((salevolume-100000)*0.02,0) CASE salevolume<=500000 pays=pay2+ROUND((salevolume-300000)*0.05,0) OTHERWISE pays=pay3+ROUND((salevolume-500000)*0.1,0) ENDCASE ?salenumber+"号销售员工作报酬:"+STR(pays,6,0)+"元。" RETURN [例 6-12] 用多分支选择结构编程计算[例 6-11]。程序代码如下: CLEAR ACCEPT "销售员编号:" TO salenumber INPUT "销售额:" TO salevolume pay1=1000 pay2=pay1+ROUND((300000-100000)*0.02,0) pay3=pay2+ROUND((500000-300000)*0.05,0)
6.2.3 循环结构 在程序设计中,有时需要从某处开始有规律地反复执行某些类似的操作,这些类似的操作一般用循环结构程序设计来解决。在Visual FoxPro中,提供了3种循环结构,即: • 当型循环结构 • 步长型循环结构 • 表扫描型循环结构
当型循环结构 说明: 格式: DO WHILE <条件> [命令序列] ENDDO 功能:根据<条件>是否满足来决定是否执行[命令序列]。 (1)当型循环执行的过程是:根据<条件>的逻辑值,进行判断。如果<条件>的逻辑值为.T.,则执行DO WHILE和ENDDO之间的[命令序列](也称为循环体),当[命令序列]包含的所有命令执行完毕后,程序自动返回到DO WHILE语句,每执行一遍就判断一次DO WHILE语句中的<条件>。如果<条件>仍然为.T.,则继续执行DO WHILE和ENDDO之间的[命令序列],直到<条件>的逻辑值为.F.,结束循环,转去执行ENDDO之后的第一条命令。 (3)在[命令序列]的适当位置可以放置EXIT和LOOP语句,用以对循环过程作特殊处理。EXIT的功能是:结束循环命令,转去执行ENDDO之后的第一条命令。LOOP语句的功能是:终止本次循环命令,返回到循环入口。EXIT和LOOP语句只能在循环结构中使用,并且常常附加条件加以限制。 (2)DO WHILE和ENDDO语句应配对使用,各占一行。 (4)在命令序列中可以嵌套IF…ENDIF、DO CASE…ENDCASE、DO WHILE…ENDDO、FOR…ENDFOR、SCAN…ENDSCAN等程序结构。
当型循环结构程序举例 程序代码如下: CLEAR cocks=0 foots=0 DO WHILE foots<>138 cocks=cocks+1 rabbits=38-cocks foots=2*cocks+4*rabbits ENDDO ?"鸡的数量为:",cocks ?"兔的数量为:",rabbits RETURN [例 6-13] 鸡兔同笼问题。设鸡和兔共有头38个,脚138个,问鸡和兔各为多少只? 问题分析:设鸡为cocks只,兔为rabbits只,则有:cocks + rabbits=38;2*cocks+4*rabbits =138。可令鸡和兔的头数之和或者脚数之和为一变量,如本题令二者脚数之和foots为变量,开始令cocks=0,foots=0,用循环进行判断是否foots<>138,如果是,则进行如下运算:cocks=cocks+1; rabbits=38-cocks;foots=2*cocks+4*rabbits;再进行循环判断,直到foots<>138不成立(即foots=138),循环结束,输出结果。程序框图如图所示。
步长型循环结构 说明: 格式: FOR <循环变量>=<初值> TO <终值> [STEP <步长值>] [命令序列] ENDFOR|NEXT 功能:根据循环变量的值是否超过终值来决定是否执行[命令序列]。
步长型循环结构程序举例1 [例 6-15] 求1+2+3+…+99+100的值。 问题分析:采用累加的办法,用循环变量产生1、2、3、…、99、100这些数。用s保存累加和,s的初始值为0,每次循环将s加上循环变量的值,再赋值给变量s,循环结束即求得s。 程序代码为: CLEAR s=0 FOR x=1 TO 100 s=s+x ENDFOR ?"1--100自然数累加和是:",s RETURN
步长型循环结构程序举例2 [例 6-16] 从键盘上输入任何一个自然数,求该自然数的阶乘。 问题分析:假设该自然数为n,那么求n的阶乘的公式是: n*(n-1)*(n-2)*......*2*1 有了这样的公式,我们就可以用循环程序将该n的阶乘求解出来。将循环变量的初值设为n,终值设为1,步长值设为-1。用factor作为存放阶乘的变量,factor的初始值为1,每次循环都使factor 乘以循环变量的值,循环结束即求得factor的值。该程序代码如下: CLEAR factor=1 INPUT "请输入一个自然数:" TO n FOR x=n TO 1 STEP -1 factor=factor*x ENDFOR ? "自然数"+ALLTRIM(STR(n,10))+"的阶乘是:"+ALLTRIM(STR(factor,20)) RETURN
表扫描循环结构 说明: 格式: SCAN [<范围>][FOR <条件1> |WHILE <条件2>] [命令序列] ENDSCAN 功能:根据对打开数据表的范围和条件来决定是否执行[命令序列]。