第4章(办公自动化)_第1页
第4章(办公自动化)_第2页
第4章(办公自动化)_第3页
第4章(办公自动化)_第4页
第4章(办公自动化)_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第四章程序设计初步4.1程序文件4.2程序的控制结构4.3多模块程序设计4.4窗口设计样例4.1程序文件4.1.1程序文件的建立与执行命令格式:MODIFYCOMMAND<文件名>功能:打开文本编辑窗口,建立或修改程序文件。说明:⑴程序文件由VFP命令组成。⑵关闭编辑窗口的方法:Ctrl+W键;Esc键;双击控制菜单按钮;单击关闭按钮。一、程序文件的建立和修改二、程序的运行命令格式:

DO<文件名>说明:⑴程序文件可编译成以下几种类型:①.EXE:可执行文件,可脱离VFP的环境运行。②.APP:应用程序,在VFP的环境下运行。③.FXP:目标程序,非文本文件,运行速度快,可起到对源程序加密的作用。⑵如果执行的程序不包含扩展名,VFP就按.EXE、.APP、.FXP、.PRG的顺序查找并执行这些版本的程序。⑶DO命令也可运行查询、菜单等程序,但必须包括各自的扩展名。三、程序书写规则1.命令分行程序中每条命令都以回车键结尾,一行只能写一条命令。2.命令注释程序中可插入注释,以提高程序的可读性。例如:

*本程序用于修改表的指定记录

SETDATEUSA&&

日期格式设置为MM-DD-YY四、求解的基本逻辑与程序通用性1.求解的基本逻辑

VFP程序多数用于数据处理,解决问题的基本逻辑是:

输入数据→处理数据→输出数据例:计算圆的面积⑴给出圆的半径;⑵按公式计算圆面积;⑶输出圆面积。VFP程序为:

r=3s=3.1415*r*r?“圆面积=”,s2.程序的通用性4.1.2程序文件中的专用命令一、程序执行的终止命令1.终止命令命令格式:CANCEL功能:结束当前VFP程序的执行,清除私有变量,返回命令窗口2.返回命令命令格式:RETURN功能:终止本程序运行,返回调用它的上一级程序继续执行,若无上级程序则返回到命令窗口。(可省略)3.退出命令命令格式:QUIT功能:退出VFP系统,返回操作系统。二、输入输出专用命令1.字符串输入语句命令格式:ACCEPT[提示信息]TO<内存变量>功能:暂停程序执行,将用户从键盘上输入的内容作为字符串赋值给指定的内存变量。说明:⑴该语句只能输入字符串,输入时不必加字符串定界符。⑵如果指定的变量不存在,则创建该变量。⑶提示信息,指定要显示的自定义信息,若省略则不显示信息。【例4-1】编写一个程序CX1.PRG,该程序打开SB.DBF,查找用户输入的设备情况。*CX1.PRGUSEsbACCEPT“请输入要查询的设备编号:”TOBHLOCATEFOR编号=BHDISPLAYUSERETURN2.表达式输入语句命令格式:INPUT[提示信息]TO<内存变量名>功能:暂停程序执行,将用户从键盘上输入的内容作为表达式,将表达式的值赋给指定的内存变量。说明:⑴该语句可输入数值型、字符型、逻辑型或日期型表达式。⑵该语句先计算表达式的值,后将结果赋值给内存变量。【例4-2】编写一个CX2.PRG,该程序打开SB.DBF,查找价格为5000.00元的设备。*CX2.PRGUSEsbINPUT“请输入要查询的设备价格:”TOJGLOCATEFOR价格=JGDISPLAYUSERETURN3.定位输入输出命令命令格式:@<行,列>[SAY<表达式1>][GET<变量名>][DEFAULT<表达式2>]功能:在屏幕指定行列输出SAY子句的表达式值,并可修改GET子句的变量值。说明:⑴<行,列>表示数据在窗口中的显示位置,可使用小数精确定位。⑵SAY子句用来输出数据,GET子句用来输入及编辑数据。⑶GET子句中的变量必须具有初值,或用DEFAULT子句中的<表达式>指定初值。⑷GET子句的变量必须用READ命令来激活。【例4-3】试编写一程序,能根据记录号来修改某个设备的价格和部门。*e4-3.prgCLEARUSEsb

jlh=1@2,10SAY“请输入记录号:”GETjlh

READGOjlh@4,10SAY“请修改第”+STR(jlh,1)+“个设备的数据:”@5,10SAY“价格”GET价格

@6,10SAY“部门”GET部门

READUSE三、WAIT命令命令格式:WAIT[<信息文本>][TO<内存变量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<数值表达式>]功能:暂停程序的运行,直到用户输入一个字符。也可只用于输出一条提示信息。【例4-4】WAIT命令输出信息示例。

WAIT“请检查输入内容!”WINDOW4.2程序的控制结构VFP程序中常用的3种基本控制结构:顺序结构、分支结构、循环结构。顺序结构:按命令的书写顺序依次执行。分支结构:根据指定条件的当前值在两条或多条程序路径中选择一条执行。循环结构:由指定条件的当前值来控制循环体中的语句(或命令)序列是否要重复执行。4.2.1顺序结构例4-1、例4-2和例4-3均为顺序结构4.2.2分支结构一、简单的条件语句语句格式:IF<逻辑表达式><语句序列>ENDIF图4-1简单条件语句逻辑图【例4-5】将SB.DBF中第一个非主要设备的价格减少10%。*e4-5.prgUSEsbLOCATEFORNOT主要设备

IFFOUND()DISPLAY名称,价格

REPLACE价格WITH价格*(1-0.1)DISPLAY名称,价格

ENDIFUSERETURN二、带ELSE的条件语句语句格式:IF<逻辑表达式><语句序列1>ELSE<语句序列2>ENDIF图4-2带ELSE的条件语句的逻辑图宏找换函数函数格式:

&<字符型内存变量>[.<字符表达式>]功能:替换出字符型内存变量的值。【例4-6】宏代换示例。*e4-6.prgm=5x=“m”?x?&x【例4-7】试编写一程序,能打开任意一个表来浏览。*e4-7.prg@5,10SAY“请输入表名:”GETbmDEFAULTSPACE(10)

READ

bm=ALLTRIM(bm)

IF

FILE(“&bm..dbf”)USE&bmBROWSE

ELSEWAIT“该文件不存在!”WINDOWENDIF三、多分支语句语句格式:DOCASECASE<逻辑表达式1><语句序列1>CASE<逻辑表达式2><语句序列2>……CASE<逻辑表达式n><语句序列n>[OTHERWISE<语句序列n+1>]ENDCASE图4-3多分支语句框图【例4-8】显示当前季节程序*e4-8.prgyue=MONTH(DATE())DOCASECASEINLIST(yue,3,4,5)

jj=“春”

CASEINLIST(yue,6,7,8)

jj=“夏”

CASEINLIST(yue,9,10,11)

jj=“秋”

CASEINLIST(yue,12,1,2)

jj=“冬”ENDCASEWAITjjWINDOW4.2.3循环结构

VFP中的循环语句:WHILE条件循环、FOR步长循环、SCAN扫描循环。一、条件循环语句格式:

DOWHILE<逻辑表达式><语句序列>ENDDO【例4-9】试编写一程序,显示SB.DBF中所有单价超过10000元的设备名称。*e4-9USEsbDOWHILENOTEOF()IF价格>10000?名称

ENDIFSKIPENDDOUSE【例4-10】按9万元以上,1~9万元,1万元以下三级价格分档统计SB.DBF中设备的个数。*e4-10STORE0TOK1,K2,K3USEsbDOWHILENOTEOF()DOCASECASE价格>90000K1=K1+1CASE价格<10000K1=K1+1OTHERWISEK2=K2+1ENDCASESKIPENDDO?“9万元以上设备个数:”+STR(K1)?“1~9万元设备个数:”+STR(K2)?“1万元以下设备个数:”+STR(K3)USE二、步长循环语句格式:FOR<内存变量>=<数值表达式1>TO<数值表达式2>[STEP<数值表达式3>]<语句序列>ENDFOR|NEXT【例4-11】编写计算s=1+2+3+……+100的程序。*e4-11s=0FORi=1TO100s=s+iNEXT?“s=”,s三、扫描循环语句格式:SCAN[<范围>][FOR<逻辑表达式1>][WHILE<逻辑表达式2>]<语句序列>ENDSCAN【例4-12】根据例4-9的要求,用扫描循环语句编程。*e4-12USEsbSCANFOR价格>10000?名称ENDSCANUSE四、循环辅助语句LOOP:使执行转向循环语句开头部继续循环;EXIT:立即退出循环,转去执行ENDDO、ENDFOR或ENDCASE后面的语句。图4-4LOOP语句的转向图4-5EXIT语句的转向【例4-13】编程计算s=1+2+3+…+100,并求1~100之间奇数之和。*e4-13.prgSTORE0TOi,s,tDOWHILEi<100i=i+1s=s+iIFINT(i/2)=i/2LOOPENDIFt=t+iENDDO?“1+2+3+…+100=”,s?“1~100的奇数和:”,t五、多重循环【例4-14】在SB.DBF中找出所有价格超过P的设备编号、名称与价格,并要求在各输出行下显示一行虚线。*e4-14.prgCLEARUSEsb@5,10SAY“请输入价格:”GETjgDEFAULT0READSCANIF价格>jg?编号+SPACE(3)+名称+SPACE(3)+STR(价格,9,2)?FORi=1TO30??“-”ENDFORENDIFENDSCANUSE4.3多模块程序设计4.3.1子程序一、调用与返回调用:主程序执行时遇到DO命令,执行就转向子程序。返回:子程序执行遇到RETURN命令,返回到主程序中转出处的下一语句继续执行。二、带参数子程序的调用与返回1.用DO命令进行调用子程序并参数传递命令格式:DO<程序名1>[WITH<参数表>][IN<程序名2>]说明:⑴<参数表>中的参数可以是表达式,但若为内存变量必须具有初值。⑵当<程序名1>是IN子句<程序名2>中一个过程时,DO命令调用该过程。2.参数接收语句命令格式:

PARAMETERS<参数表>说明:⑴

PARAMETERS必须是被调用程序的第一个语句。⑵命令中的参数被VFP默认为私有变量,返主回送参数值后即被清除。⑶命令中的参数依次与调用命令WITH子句中的参数相对应,故两者参数个数必须相同。【例4-15】设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。主程序:*e4-15.prgymj=0@5,10SAY“请输入圆的半径:”GETbjDEFAULT0READDOjsWITHbj,ymj?“ymj=”,ymjRETURN子程序:*js.prgPARAMETERSr,ss=PI()*r*rRETURN三、子程序嵌套命令格式:

RETURN[TOMASTER|TO<程序文件名>]图4-6子程序嵌套示意图4.3.2自定义函数一、自定义函数的建立函数格式:

[FUNCTION<函数名>][PARAMETERS<参数表>]<语句序列>[RETURN<表达式>]【例4-16】设计一个自定义函数,用来求一元一次方程AX+B=0的根。解法一:自定义函数作为一个独立的文件。*root.prgPARAMETERSa,bRETURNIIF(a=0,“无解”,-b/a)如调用ROOT函数解方程3X+1=0:?“X:”,ROOT(3,1)解法二:自定义函数与其调用语句包含在同一程序中。*root1.prgCLEAR@5,10SAY“一次项系数:”GETaDEFAULT1@7,10SAY“常数项:”GETbDEFAULT0READ?“x:”,root(a,b)FUNCTIONrootPARAMETERSu,vRETURNIIF(u=0,无解,-v/u)二、数组参数的传递*root2.prgCLEARDIMENSIONfs(2)fs(1)=1fs(2)=0@5,10SAY“一次项系数:”GETfs(1)@7,10SAY“常数项:”GETfs(2)READ?“x:”,root(@fs)FUNCTIONrootPARAMETERSjsRETURNIIF(js(1)=0,无解,-js(2)/js(1))4.3.3过程函数格式:PROCEDURE<过程名>[PARAMETERS<参数表>]<命令序列>[RETURN]【例4-17】将例4-15的程序改变为过程调用。*e4-17SETDECIMALSTO2ymj=0@5,10SAY“请输入半径:”GETbjDEFAULT0READDOjsWITHbj,ymjRETURNPROCEDUREjsPARAMETERSr,ss=PI()*r*rRETURN过程是一个程序文件时,需用带IN子句的DO命令来调用。【例4-18】调用过程文件中的过程示例。*e4-18ymj=0@5,10SAY“请输入半径:”GETbjDEFAULT0READDOjsWITHbj,ymjINjs1?“ymj=”,ymj过程文件:*js1.prgPROCEDUREjsPARAMETERSr,ss=PI()*r*r补充内容:1.编写一密码效验程序CLEAR@5,10SAY"请输入密码:"GETMMDEFAULTspace(6)READIFMM="123456"CLEARWAIT"欢迎使用本系统!"WINDOWAT5,10TIMEOUT3ELSEWAIT"密码错误,系统将退出!"WINDOWAT5,10TIMEOUT3QUITENDIF2.编写乘法口诀表程序,要示输出一上三角口诀表。CLEARFORI=1TO9FORJ=1TO9IFJ<=IS=I*J??STR(I,1)+"*"+STR(J,1)+"="+STR(S,2)+""ENDIFENDFOR?ENDFOR4.3.4变量的作用域内存变量按作用域可分为:公共变量、私有变量和本地变量。一、公共变量公共变量:在任何模块中都可以使用的变量。命令格式:

PUBLIC<内存变量表>建立同时赋初值为.F.需要字义为公共变量的变量:⑴下层模块建立的变量要供上层使用;⑵某模块建立的变量要供并列模块使用;注意:⑴VFP命令窗口定义的变量均为公共变量;⑵公共变量必须用命令(RELEASE或CLEAR)来清除二、私有变量私有变量:仅在定义它的模块及其下层模块中使用命令格式:

PRIVATE[<内存变量表>][ALL[LIKE|EXCEPT<通配符>]]定义它的模块运行结束后自动清除注意:⑴PARAMETERS声明的参变量也是私有变量⑵PUBLIC命令除声明明变量类型外还赋初值,称为建立;PRIVATE只是声明而已,不进行赋值。⑶私有变量准许与上层模块的变量同名,同名时屏蔽上层模块的变量.本模块运行结束再恢复上层模块变量。【例4-19】变量隐藏与恢复的示例。⑴假定已建立了如下的程序:*e4-19PARAMETERSsjPRIVATEmjmj=3.14*sj*sj?“程序执行时的变量清单:”LISTMEMOLIKE?jRETURN⑵在命令窗口中键入下列命令:RELEASEALLmj=0bj=3?“程序执行前的变量清单:”LISTMEMOLIKE?jDOe4-19WITHbj?“程序执行后的变量清单:”LISTMEMOLIKE?j⑶命令及程序执行结果显示如下:程序执行前的变量清单:

MJPubN0(0.00000000)BJPubN3(3.00000000)程序执行时的变量清单:

MJ(hid)N0(0.00000000)BJ(hid)N3(3.00000000)SJPriv

bjMJPrivN28.26(28.26000000)e4-19程序执行后的变量清单:

MJPubN0(0.00000000)BJPubN3(3.00000000)三、本地变量本地变量:只能在建立它的模块使用的变量。命令格式:

LOCAL<内存变量表>注意:

LOCAL不可缩写。(LOCATE)定义它的模块运行结束后自动清除图4-7变量的作用域4.3.5程序调试方法一.调试的概念目的:检查并纠正程序中的错误,以保证程序正确、可靠地运行。

步骤:检查程序是否存在错误→确定出错位置→纠正错误。1.程序中常见的错误⑴语法错误,例:数据类型不匹配等⑵超出系统准许范围错误,例:文件太大等⑶逻辑错误,例:计算逻辑错误等2.查错技术查错技术一:静态检查,通过阅读程序,找出错误查错技术二:动态检查,通过执行程序考察程序是否有错常用动态查错技术:⑴设置断点在断点处查看中间结果,考察程序是否有错⑵单步执行一次执行一个命令,相当于断点设在每条指令之后⑶跟踪在程序执行过程中,跟踪某些信息的变化,以确定程序序是否有错⑷设置错误陷阱通过错误陷阱捕捉可能发生的错误。可通过ONERROR语句设置陷阱二、调试器1.打开调试器窗口⑴“工具”菜单“调试器”命令⑵命令窗口键如DEBUG命令2.调试器窗口的组成调试器可以打开5个子窗口,只要选定“跟踪”、“监视”、“局部”、“调用堆栈”或“输出”命令,即可打开相应各子窗口图4-8调试器窗口

⑴跟踪窗口

单击此处设置断点,双击取消表示断点表示正在执行

监视窗口输入监视表达式回车,进入下面的列表执行时显示监视表达式及其当前值可将表达式拖至文本框编辑,可用快捷菜单插入、删除表达式⑶局部窗口

⑷调用堆栈窗口

⑸调试输出窗口显示正在执行的程序和过程显示活动程序、过程代码输出显示所有变量、数组以及对象3.调试器窗口的部分调试命令

⑴运行开始执行打开的程序

⑵继续执行断点停止后继续

⑶单步逐行执行代码,函数、过程等后台运行

⑷单步跟踪逐行执行代码

⑸运行到光标处从当前行运行到光标所在行之间的代码4.3.6结构化程序设计【例4-21】试编写一应用程序,能对SB表进行维护、查询和打印设备数据。CLEARUSEsbTEXT****************************************************1.设备数据维护3.打印设备数据****2.按编号查询设备4.退出****************************************************ENDTEXTDOWHILE.T.@6,5CLEAR@6,5SAY"请输入1~4:"GETxzDEFAULTSPACE(1)READ

DOCASECASExz="1"*DOe1CASExz="2"*DOe2CASExz="3"LISTTOPRINTERPROMPTNOCONSOLECASExz="4"WAIT"系统将关闭!"WINDOWTIMEOUT3QUITENDCASEENDDOUSE结构化设计的三种方法⑴自顶向下,逐步求精从整体出发,逐层分解,使复杂的问题简单化。⑵模块化将系统分解为若干功能相关而又相对独立的模块。⑶层次化系统按层次结构布局,即以树型结构来组织系统的全部模块。图4-9应用系统的层次结构4.4窗口设计样例4.4.1浏览窗口的定制

VFP准许用户按照自己的需要配置浏览窗口的功能。一、BROWSE命令

BROWSE[FIELDS<字段表>][FONT<字符表达式1>[,<数值表达式1>]][STYLE<字符表达式2>]字体:宋,楷字体大小:16,20字体形状:B,I,U见下页解释<字段名>[:R][:<数值表达式>][:V=<表达式1>[:F][:E=<字符表达式1>]]只读栏宽设置字段级有效性检验[:P=<字符表达式2>][:B=<表达式2>,<表达式3>[:F]][:H=<字符表达式3>][:W=<逻辑表达式1>]表达式1为检验条件,光标离开字段时检验格式码、掩码范围检查栏目名设置光标进入字段验证条件[FOR<逻辑表达式>[REST][FREEZE<字段>][LAST][LOCK<数值表达式2>][LPARTITION][NAME<对象名>]记录指针移到首记录记录指针保持原位置光标只能在指定字段移动保存浏览窗口外观保持某些字段保持显示光标在左分区第一字段准许使用表格控件的对象LOCK使浏览窗口一分为二,右分区按常规显示左分区显示表的前N个字段[NOAPPEND][NODELETE][NOEDIT|NOMODIFY][NOLGRID][NORGRID][NOLINK][NOMENU][NOREFRESH][NORMAL][NOWAIT]不准许追加记录不准许做删除标记不准许编辑,但准许删除和添加删除左分区网格线删除右分区网格线取消左、右分区显示按记录联动使系统菜单不出现表菜单禁止刷新浏览窗口用默认配置打开浏览窗口打开窗口继续运行程序[SAVE][TIMEOUT<数值表达式3>][TITLE<字符表达式3>][VALID[:F]<逻辑表达式2>[ERROR<字符表达式4>]]保持浏览窗口为活动,操作其它窗口后即返回等待输入时间,超过浏览窗口自动关闭设置浏览窗口标题设置光标离开校验:记录修改后光标离开后计算<逻辑表达式2>,其值为真准许光标离开;<字符表达式4>为出错提示信息[WHEN<逻辑表达式3>][WIDTH<数值表达式4>][WINDOW<窗口名1>][IN[WINDOW]<窗口名2>|INSCREEN]设置光标进入校验:为真准许修改记录,否则为只读浏览窗口每个字段宽度,但操作时可变指定一个用户定义的窗口,浏览窗口采用其特性窗口名2指定浏览窗口的父窗口,SCREEN表示父窗口为VFP主窗口二、字义功能键功能键:指键盘的单键、组全键或鼠标的按键,当用户按下指定键后即能实现一定的功能,但按键及其功能都须事先设置。命令格式:

ONKEY[LABEL<键标号>][<命令>]功能:设置功能键及其功能,包括为鼠标按键设置功能。说明:⑴LABEL子句的<键标号>表示定义功能的按键,功能由<命令来实现>。⑵ONKEYLABEL命令执行后,若进入了某种状态,则用户按了指定的功能键或鼠标键就会执行所设置的命令(一般为DO命令)。⑶保存:PUSHKEY

恢复:POPKEY

清除:PUSHKEYCLEAR【例4-23】设计一个可利用功能键为SB.DBF添加记录、删除记录或恢复记录的浏览窗口。*主程序:定义功能键,打开设备表,设置窗口标题PUSHKEYCLEARONKEYLABELF4DOtjONKEYLABELF5DOschfONKEYLABELF6DOpkbs="BROWSETITLE'设备表'+'F4:添加F5:删除/恢复F6:清除'"USEsb&bs*过程:添加(tj)、删除/恢复(schf)、彻底删除(pk)PROCEDUREtjAPPENDBLANKPROCEDUREschfIFDELETE()RECALLELSEDELETEENDIFPROCEDUREpkPACK&bs【例4-24】将鼠标右键设置为功能键,使用户在SB.DBF浏览窗口中编辑部门字段时,按下鼠标右键可出现另一个浏览窗口,在其中显示部门代码及名称。CLEARALLPUSHKEYCLEARONKEYLABELrightmouseDOtisSELECT0USEbmdmSELECT0USEsbBROWSETITLE"设备表"PUSHKEYCLEARPROCEDUREtisIFVARREAD()="部门"SELECTbmdmBROWSETITLE"部门表"NOMODIFY=INKEY(0,"MH")SELECTsbENDIF4.4.2窗口命令函数一、窗口命令表4-1VFP部分常用窗口命令命令名简要功能ACTIVATEWINDOW激活指定窗口CLEARWINDOWS关闭所有用户自定义窗口DEACTIVATEWINDOW使窗口失效并从

温馨提示

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

评论

0/150

提交评论