2023年安徽专升本VF程序设计基础知识_第1页
2023年安徽专升本VF程序设计基础知识_第2页
2023年安徽专升本VF程序设计基础知识_第3页
2023年安徽专升本VF程序设计基础知识_第4页
2023年安徽专升本VF程序设计基础知识_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础知识程序是为了完毕一项任务而编写的指令的集合,在某种限度上VFP中的程序设计同传统的程序设计有很大的不同。在VFP中可以同时应用面向过程和面向对象两种编程方法,面向对象的程序设计是其重要特色。一般来说,对于制作简朴、较小的应用程序,使用过程编程方式比较容易,同时这也是面向对象编程方式的基础。本章重要介绍的是面向过程的编程方法。程序设计概念4.1.1程序设计从某种意义上来说,是根据算法环节把命令、函数、变量、常量、表达式等以逻辑的方式组合成程序文献或系统。拟定算法和编写程序是两个重要环节。算法是指为解决一个问题而采用的方法和环节,或者说解决环节的精确描述。算法分为数值运算算法和非数值运算算法。数值运算算法的目的是计算数值解,如求方程的根,求函数的定积分等。非数值运算算法,涉及的范围很广,常见的办公室自动化系统、管理领域、商业领域及医学应用等等,重要是描述其解决应用问题的逻辑环节。描述实现算法的逻辑环节,一般采用流程图方式,流程图分传统流程图;N--S流程图等。传统流程图是用一些图框,流程线以及文字说明来描述操作过程,这样的表达算法,直观,形象,容易理解。如图4.1和图4.2:.“起止框”用来表达算法的开始和结束。“解决框”用来表达一般的数据解决。“输入/出框”表达输入,输出操作。“流程线”表达流程的方向(执行方向)。“连接点”用于将画在不同地方的线连接起来。“判断框”用来根据给定条件是否满足,决定执行两条途径中的某一途径。图4.1拿到一个问题后,一方面拟定并写出算法,画出结构流程图,然后再根据算法书写程序,是一个良好的习惯。这样做不仅可提高所写程序的对的性,也容易修改程序,提高整个程序设计的效率4.1.2源程序实例例:显示”student.dbf”表中“总成绩“小于360的所有学生的学号,姓名,总成绩.分析问题:逐个判断每条记录的总成绩字段的值是否大于360,假如大于就显示,否则不显示.根据分析结果画出结构流程图,如:图4.2,然后写出源程序如下:SETTALKOFFCLEAROPENDATABASESTUDENTSUSESTUDENT1DOWHILE!EOF()初始化打开数据库和表是否表末尾总成绩>360显示,移记录指针初始化打开数据库和表是否表末尾总成绩>360显示,移记录指针移记录指针结束?学号,姓名,总成绩SKIPELSEYSKIPYENDIFNENDDONCLOSEDATABASENYNRETURNNYNNY4.1.3程序的创建、编辑和运营NYVFP6.0源程序文献的扩展名是.PRG,程序运营时,系统自动编译产生扩展名为.FXP的文献,其文献主名与.PRG为扩展名的文献主名相同,在VFP下若修改了.PRG为扩展名的文献,系统也会自动重新编译.4.1.3.1程序文献的创建图4.2创建VFP6.0源程序文献,可使用任何文本编辑器建立;本系统中使用自身编辑器创建,编辑源程序文献。VFP提供了以下三种方法。图4.2图4-3编辑文献窗口图4-3编辑文献窗口图4-2新建文献方法一可以在VFP主窗口的“文献“菜单中选择“新建“或工具栏中的“新建”按钮,选择“程序“如图4-2所示。然后单击“新建文献”,这时系统将打开一个编辑窗口,可以往里输入程序,如图4-3所示。源程序输完后,运用文献菜单进行保存。也可立即运用【程序】|【运营】菜单和【程序】|【编译】菜单,进行编译和运营程序。程序执行结果显示在主窗口中。方法二在命令窗口中执行命令:MODIFYCOMMAND<文献名>这时,系统将打开一个如图4-3的编辑窗口,可以往里输入程序代码。编辑完毕,使用CTRL+W键,则存盘退出。方法三在“项目管理器”中选择“代码”选项卡中的程序选项,选择“新建”命令。系统将打开编辑窗口,可以创建一个程序,如图4-4所示。图4-4在项目管理器中建立程序4.1.3.2程序的保存图4-4在项目管理器中建立程序程序输入完毕后,可以选择“文献”菜单中的“保存”项保存程序文献。图4-5关闭没有保存的程序时将出现询问若用户要关闭一个没有保存的程序,则会弹出相应的对话框,提醒用户是保存还是放弃已作的修改,如图4-5所示。图4-5关闭没有保存的程序时将出现询问若用户保存了一个由“项目管理器”创建的程序,则该程序被加入项目中。若用户保存了一个尚未命名的程序,则会打开“另存为。。。。”对话框,用户应当从中选择或输入对的的盘符、途径、文献名。程序保存后,用户可以在其后任一时刻运营或修改程序。4.1.3.3程序的修改程序的修改即对源程序文献打开进行编辑。有以下方法:方法一若程序包含在某一个项目中,则可以在“项目管理器“中选定它,并选择“修改”方法二在“文献”菜单中选择“打开”命令,这时将出现一个包含文献列表的“文献类型”对话框。从中选择“程序”,然后找到要编辑修改的程序,选定后单击“拟定”按钮,如图4-6所示。图4-6在打开文献窗口中选定要修改的程序图4-6在打开文献窗口中选定要修改的程序方法三在“命令”窗口中键入如下命令:MODIFYCOMMAND<程序文献名>然后将出现程序文献编辑窗口,如图4-3所示。接下来可对显示在编辑窗口中的程序进行修改。4.1.3.4程序的运营程序创建或修改完毕,最终需要运营。运营程序有如下几种方法。方法一在“程序”菜单中选择“运营”菜单项,然后选择一个程序文献,如图4-6方法二在命令窗口中运营命令:DO<程序文献名>方法三若程序包含在一个项目中,则可以在“项目管理器”中选定它并选择“运营”命令,如图4-4所示。4.2常用命令和语句VFP的一个特点,是大量使用系统环境设立命令以及其他一些控制命令,以帮助用户进行数据解决、安全管理、程序调试、结果输出等方面的工作。本节重要介绍一些常用的命令和语句。4.2.1基本输入、输出语句程序最基本的操作就是输入、输出。输入是从键盘或鼠标等设备中接受数据。输出是指将计算机所做的运算结果输出到屏幕或打印机。4.2.1.1输入命令1)字符型键盘输入命令ACCEPT格式:ACCEPT[<提醒>]TO<内存变量>功能:建立内存变量,并用键盘输入的方式将字符型数据赋值给内存变量。说明:①<提醒>表达需输入内容的提醒信息,是命令执行时显示的内容。<提醒>一般为字符型常量,字符型变量或字符型表达式。②<内存变量>表达存储字符数据的字符变量或数组元素。③输入的数据作为字符型数据解决,不需要定界符括起来。若使用定界符,则定界符成为输入字符的一部分。输入回车健则按空字符解决。例11-2输入班级编号和姓名,并打印出来。ACCEPT“请输入班级编号:”TOnumberACCEPT“请输入姓名:”TOname?“班级编号:”,number,“姓名:”,name2)任意类型键盘输入命令INPUT格式:INPUT[<提醒>]TO<内存变量>功能:建立内存变量,并用键盘输入的方式将数值型,字符型,逻辑型或日期型数据赋值给内存变量。说明:①<提醒>是命令执行时显示的提醒内容。可是一个字符型表达式。②<内存变量>可为数组元素。内存变量不必事先定义。③从键盘输入的数据可以是命令允许的四种类型表达式。执行该命令时计算键盘输入的表达式的值,将其赋给内存变量。④字符型常量必须有定界符,且不能单用回车输入。3)程序暂停,等待接受单字符命令WAIT格式:WAIT[<提醒>]TO<内存变量>[WINDOW[AT<行坐标,列坐标>]][TIMEOUT<等待秒数>]功能:显示提醒并暂停程序运营,直到按下任意一键或鼠标按键程序才继续执行。说明:①<提醒>表达要显示提醒的内容,省略提醒,系统给出“按任意键继续。。。。。。。”。②TO<内存变量>]表达键盘的输入以字符形式存入指定的内存变量。内存变量类型为字符型,宽度为1。③[WINDOW]表达在VisualFoxPro主窗口右上角出现的系统消息窗口的位置中显示消息。WAITWINDOW支持多行消息。④[AT<行坐标,列坐标>]指VisualFoxPro主窗口中消息窗口的位置。⑤[NOWAIT]表达在消息被显示后不移去消息窗口,立即继续执行程序。省略时,程序暂停直到按下一个键或鼠标按钮,并将消息窗口从主窗口中移走。4.2.1.2格式输出命令格式:@<行,列>SAY<表达式>[PICTURE<模式符>][FUNCTION<功能符>]功能:在指定坐标位置按格式输出表达式的值。例11-5在程序编辑窗口输入如下内容*ex1.PRGVb1=49562.89Vb2=--0.5@3,10SAYVb1FUNCTION”B”@5,10SAYVb1FUNCTION”C”@7,10SAYVb2FUNCTION”X”运营ex1.PRG结果显示49562.8949562.89CR_0.5DB4.2.1.3格式输入命令格式:@<行,列>SAY<提醒信息>GET<变量>[FUNCTION<功能符>][PICTURE<模式符>[RANGE<数值表达式1>,<数值表达式2>[VALID<逻辑表达>]READ[SAVE]功能:在指定行、列一方面显示<提醒信息>,接着按规定的格式反显GET后变量的值;当执行命令READ时,子命令GET被激活,其变量值处在编辑状态。一个READ语句可以激活多个在它前面的GET子命令。说明:①命令中的功能符和模式符代码及其含义如下表11-1和表11-2②命令的执行过程是,系统先在指定的行列显示SAY后的提醒信息,在提醒信息后显示GET变量的值,此前GET后的变量必须赋值,且变量值反显,当顺序执行READ语句后,反显的变量值被激活,此时,可编辑变量的值,按回车键可结束此过程。③一个READ命令可激活多个GET的编辑区,因此,只要GET语句是在READ语句前,当第一个GET激活变量值编辑后光标可自动跳到下一个编辑区,依次执行。④RANGE中数值表达式1和2,表达数据编辑和显示的下限和上限。⑤VALID<逻辑表达式>表达数据编辑和显示的条件范围。表4-1PICTURE模式符代码表代码含义代码含义A只允许字母L只允许逻辑型数据N只允许字母或数字X允许任何字符Y只允许逻辑数据且小写换大写G只允许数字#允许数字,空格和正负号!小写转换成大写¥数值前显示货币符号指定小数点位置,分隔多位数数值前显示星号表4-2FUNCTION功能符代码表代码含义代码含义A只允许字符字母B数值数据在显示区左对齐C在正数之后显示CR表达贷款D使用当前的SetDate日期格式E使用欧洲日期格式Dd/mm/yyL数值显示时显示前导0,而不是空格X在负数后面显示DB表达借贷T去掉表达式首尾空格S(n)限制字符显示的宽度为n个字符Z数值为0时刻用空格显示C将负数括在括号内!将小写字母转化成大写字母*用科学计数法显示¥用SetCURRENCY指定货币格式显示例4-6指定坐标位置的格式输出例1。**exp.prgva1=47612.78va2=-0.6@4,10sayva1function“B”@8,10sayva1function“c”@10,10sayva2function“x”将以上程序存盘,并运营。结果显示:47612.7847612.78CR-0.6DB例4-7格式输出例2。**exp.prgvbr1=space(20)vbr2=0vbr3=date()var4=.F.clear@4,15say“编辑字符:”getvbr1function“s14!”@5,15say“编辑数字:”getvbr2picture“999999.99”RANGE1000,40000@6,15say“编辑日期:”getvbr3VLALIDvbr3<ctod(“99/12/31@7,15say“编辑逻辑:”getvbr4picture“Y”read执行上述程序时,依次输入数据:“WorldWideWebVirtualHospital”,8888.88,98/09/01,和y。其中Vbr1可以接受20个字符,显示前14个。屏幕显示为:编辑字符:WORIDWIDEWEB编辑数字:8888.88编辑日期:98-09-01编辑逻辑:y4.2.2注释语句和续行语句4.2.2.1注释语句顾名思义,注释语句用来给程序加注释,以提高程序的可读性。有以下两种注释语句注释行格式*<注释内容>或NOTE<注释内容>行末注释格式<执行语句>&&<注释内容>例:*这是一个示例程序*1999.9.9SETSTATUON&&显示状态栏NAME=“张三”*ACCEPT“姓名:”TONAME?NAMECANCEL4.2.2.2续行标志VFP允许一个语句行最多可又254个字符长,这一长度足以满足绝大多数语句格式的规定,但是,为了使程序便于阅读,往往需要将一行程序分作几行来写。将一行分作几行来写时,要使用续行标志“;”,表达本语句尚未结束。例如:REPLACE应发工资WITH基本工资*1.15+职务津贴+奖金;扣款WITH房租水电+医药费+应发工资*所得税率;是发工资WITH应发工资-扣款4.2.2.3指定缺省驱动器和目录由于数据库应用通常涉及大量的文献,为了应用程序的顺利进行,应当将这些文献集中在一个专属目录中。然后将此专属目录指定为缺省驱动器和目录,这样既可大大地方便程序开发工作,又能保证应用程序的顺利进行。将一专属目录指定为缺省驱动器和目录,有两种方式:在程序或命令窗口中使用SETDEFAULT命令,命令格式为SETDEFAULTTO[<途径>]例如:指定C:\mysystem\gzl为缺省目录;SETDEFAULTTOC:\MYSYSTEM\GZL若执行不带途径的SETDEFAULT命令,则恢复系统缺省设立。修改系统缺省设立。在缺省系统配置文献CONFIG.FPW或专属系统配置文献(如:MYCONFIG.FPW)中,假如下面一行:DEFAULT=C:\MYSYSTEM\GZL控制结构VFP的程序结构,与其他高级语言同样,分为三种控制结构,即顺序结构、分支结构和循环结构,各个结构可以实现不同的功能。图4-7语句系列2语句系列1图4-7语句系列2语句系列14.3.1顺序结构顺序结构是程序结构设计中最常用,最简朴,最基础的基本结构。该结构的特点表白语句排列的顺序就是命令的执行顺序,其间既没有分支跳转、也没有反复。如图4-7。组成顺序结构的语句,一般涉及赋值语句、输入、输出、注释和终止语句以及有关系统环境设立等。4.3.2选择结构选择结构:选择结构是程序设计中的基本结构之一。它用选择命令描述分支现象,拟定程序执行的途径。常用的选择命令有单条件选择和多条件选择。如图4-8Y命令组1N命令组2条件如图4-8Y命令组1N命令组2条件1、IF条件选择命令格式:IF〈条件表达式〉[THEN][命令组1][ELSE[命令组2]]ENDIF功能:若<条件表达式>的值为真,执行<命令组1>;否则(即<条件表达式>的值为假)执行<命令组2>;无论哪种情况,命令组系列执行完后,就执行ENDIF下的第一个命令。如图4-8所示.说明:①<条件表达式>可为关系或逻辑表达式,其逻辑值为T或F;当[ELSE-[命令组2]]不存在时,<条件表达式>的值为真,执行<命令组1>后,就转到执行ENDIF之后的第一个命令;若<条件表达式>的值为假,则不执行IF与ENDIF之间的命令系列,而直接转到执行ENDIF之后的第一个命令。②IF—ENDIF结构命令必须配对使用;并且可以通过多层嵌套以实现多条件的选择。例11-9铁路拖运营李,从甲地到乙地,按规定每张客票拖运营李不超过50公斤时,每公斤0.25元,如超过50公斤,超过部分按每公斤问题分析:设行李重量W公斤,应付运费P元,则运费公式为:0.25*W当W≤50P=50*0.25+(W-50)*0.45当W>50编写程序为:INPUT“请输入行李重量:”TOWIFW<=50P=0.25*WELSEP=50*0.25+(W-50)*0.45ENDIF?“应付运送费为:”,P,“元”CANCEL2、IF嵌套条件选择结构在IF条件选择结构中,允许包含新的选择结构,一层套一层形成嵌套结构。注意:形成嵌套结构中,只允许嵌套,不允许交叉,层次必须分明。例11-10已知系数a,b,c编写程序,求一元二次方程ax2+bx+c=0的根。例题分析:①当a<>0时,有两个根;②当△>0时,有两个不同的实根;③当△=0时,有两个相同的实根;④当△<0时,有两个不同的根;⑤当a=0,b<>0时,有一个根;⑥当a=0,b=0时,方程无意根据以上分析,写出程序:INPUT“a=”TOaINPUT“b=”TOb INPUT“c=”TOcIFa<>0delta=b^2-4*a*cre=-b/(2*a)im=SQRT(ABS(delta))/(2*a)IFdelta>=0root1=re+imroot1=re-im?“两个根为:“,root1,root2ELSE?“两个根为:“,re,”+”,im,”I”,re,”-”,im,”I”ENDIFELSEIFb<>0?“只有一个根:”,-c/bELSE?“方程退化”ENDIFENDIFCANCEL3、DOCASE多条件选择命令格式:DOCASECASE<条件表达式1><命令组1>CASE<条件表达式2><命令组2……CASE<条件表达式n><命令组n>[OTHERWISE<命令组n+1>]ENDCASE图4-9多条件分支语句语句组n语句组1语句组2条件2语句组3条件3Otherwise条件1图4-9多条件分支语句语句组n语句组1语句组2条件2语句组3条件3Otherwise条件1功能:执行时,系统将依次检查每一个条件表达式的值,当找到有一个条件为真时,则执行该条件下的命令系列,接着再执行ENDCASE后面的语句,当前面几个条件表达式值均为假时,若有OTHERWISE就执行语句序列n+1。否则就直接执行ENDCASE后面的语句。如图4-9所示:说明:①在DOCASE与第一个CASE之间不能有任何命令,并且在一个DOCASE结构中,最多只能执行一个CASE语句。②<条件表达式>可认为关系表达式或逻辑表达式,根据其逻辑值进行判断,若为.T.,就执行该[命令组],直到碰到下一个CASE或OTHERWISE就转向ENDCASE后面的第一条命令。③假如没有一个<条件>为.T.,就执行OTHERWISE后面的[命令组],转到ENDCASE之后的语句。假如没有OTHERWISE,则不作任何操作就转向ENDCASE之后的第一条命令。④DOCASE与ENDCASE必须对的配对;并且本命令结构只能在程序中使用,且DOCASE,CASE,OTHERWISE,ENDCASE必须各占一行,。例11-11设计一个按不同幼儿年龄服药的程序,年龄变量为AGE,每次服药次数COUNT,每次服药量MOUNT。程序为:MEDICINE=‘阿司匹林’INPUT‘输入年龄:’TOAGEDOCASECASEAGE<5COUNTS=‘4次/天’MOUNT=‘每次1片’CASEAGE<10COUNTS=‘4次/天’MOUNT=‘每次2片’OTHERWISECOUNTS=‘3次/天’MOUNT=‘每次2片’ENDCASE?MEDICINE+‘服法是’+COUNTS+‘·'+MOUNTRETURNDOCASE命令表达程序的多分支结构,与IF命令同样允许多重嵌套,既可以多个DOCASE-ENDCASE一层层嵌套,也可以DOCASE-ENDCAS与IF-ENDIF嵌套。对students库中3个表student.dbfscure1.dbf和symbolic.dbf用CASE命令实现在不同的条件下显示不同的文献记录。SETTALKOFFACCEPT“输入表文献名:”TONAMEOPENOPENDATABASESTUDENTSDOCASECASENAME=”student”USEstudentDISPLYALLFOR专业=“临床医学”CASENAME=”scure1”USEscure1AVERGE生物TOt1FORSUBSTR(学号,7,1)=”4”AVERGE生物TOt2FORSUBSTR(学号,7,1)<>”4”?“T1=”,t1,”T2=”,t2CASENAME=”symbolic”USEsymbolicLISTFOR“96”$学号ENDCASEuse&NAMEWAITLISTCLOSEDATABASERETURN4.3.3循环结构程序设计图4-10循环结构流程图NYexitloop语句组条件图4-10循环结构流程图NYexitloop语句组条件循环结构是程序设计的一种基本结构。描述循环现象的命令重要为实现某一段程序有规律的反复执行。VFP中给出三种循环结构命令,“当型”,“步长型”和“表扫描型”。VFP中各循环结构的基本流程是同样的,如图4-10所示。1、当循环命令DOWHILE—ENDDO格式:DOWHILE<条件表达式>[<命令组>][EXIT][LOOP]ENDDO功能:当<条件表达式>的计算值为真时,就使DOWHILE…ENDDO之间的命令序列反复执行,以实现循环;当条件表达式的值为假时,退出循环执行ENDDO后的命令。说明:①循环结构的DOWHILE为循环起始语句,ENDDO为循环终端语句,在DOWHILE与ENDDO之间的语句称循环体。②<条件表达式>的值是逻辑值。执行时,系统先检测逻辑值的真、假而拟定是否执行循环体。ENDDO命令是将循环返回到循环的起始语句。执行过程如图4-10所示。③强制退出循环命令EXIT,表达执行该命令后从控制从DOWHILE…ENDDO循环中跳出,而去执行ENDDO后的命令。[LOOP]执行该命令后,将控制直接转回到DOWHILE子句,而不执行LOOP和ENDDO之间的命令,LOOP称为无条件循环命令,并且只能在循环结构中使用。一般情况下,在循环体中出现LOOP或EXIT命令时就会有IF条件选择命令的配合使用。④dowhile…….enddo必须成对出现,并且dowhile…….enddo可进行嵌套,形成多重循环。例11-13有一张厚0.5毫米,面积足够大的纸,将它不断对折。问对折多少次后,其厚度可达珠穆郎玛峰的高度(8848米)。问题分析:每次对折都是上次厚度的2倍,然后用此厚度与珠穆郎玛峰的高度作比较,每次循环作一次计数,以便记录对折的次数。N=0H=0.5DOWHILEH<88488000N=N+1H=2*HENDDO?“对折次数为:”,HCANCEL例11-14在数据库STUDENTS.DBC的表Student.DBF中找出所有男性的学生。SETTALKOFFOPENDATABASESTUDENTSUSESTUDENTDOWHILE.T.IF性别<>‘男’SKIPElseDISPLAYSKIPENDIFIFEOF()EXITENDIFENDDOCLOSEDATABASERETURN当循环结构的嵌套。循环结构嵌套是在一个循环体内又完整的包含另一个循环,当循环可以嵌套形成多重循环,但规定每层循环DOWHILE…ENDDO必须成对出现,不能交叉。如:DOWHILE<条件1>DOWHILE<条件2>内<命令序列>ENDDO外DOWHILE<条件3>内<命令序列>ENDDOENDDO例11-15打印九九乘法表。程序(EXP.PRG)如下:SettalkoffClearA=1B=1DowhileA<=9DowhileB<=9T=A*B??TB=B+1ENDDOA=A+1?EnddoCancel以上双循环执行过程是:当第一次进入外循环DOWHILEA<=9…ENDDO时,内循环DOWHILEB<=9…ENDDO中的循环体需执行9次,输出1,2,…,9。当第十次执行DOWHILEB<=9时,由于B<=9为假时,需跳到执行A=A+1和?命令。当第二次进入DOWHILEA<=9…ENDDO的循环体时,内循环又执行9次输出为2,4,…,18。当第十次执行内循环DOWHILEB<=9时,B<=9为假,跳出内循环,这样反复下去外循环循环9次,内循环共循环81次,直到输出T的值为81。然后整个程序结束。2、步长型循环(或计数循环)FOR—ENDFOR格式FOR<循环变量>=<初值>TO<终值>[STEP<步长值>]<命令组>[EXIT][LOOP]ENDFOR(或NEXT)功能:执行时,系统一方面给循环变量赋初值,然后判断循环变量的值是否超过终值(即循环终值),若超过则跳出循环,执行ENDFOR后面的命令,否则反复依次执行循环体命令组序列及语句。说明:①FOR…循环起始语句,ENDFOR为循环终端语句,在FOR…ENDFOR之间的语句序列为循环体。②循环变量的初值,终值和步长拟定循环次数。INT((终值-初值)/步长)+1为循环次数。③步长值可为正值和负值,步长缺省时,系统默认步长值为1。④EXIT和LOOP命令的用法与DOWHILE循环结构中的使用相同。⑤FOR—ENDFOR循环可嵌套使用。例11-17求1!+2!+3!+…+N!的值S=OT=1INPUT“请输入N的值:“TONFORX=1TONT=T*XS=S+TENDFOR?“S=”;SCANCEL例11-18设计一个保密口令程序,规定用户使用某个系统时,必须回答口令,该程序口令为“49712”才干允许进入系统,但最多只允许输入三次,否则,退FoxPro系统。程序如下:SETTALKOFFFORI=1TO3CLEAR@10,10SAY“请输入口令:“SETCONSOLEOFFACCEPTTOk1SETCONSOLEONIFk1=“49712WAIT“欢迎使用本系统!”TIMEOUT10EXITELSEWAIT“口令错,请按任意键后重新输入!”ENDIFENDFORIFI>3WAIT“对不起,你不能使用本系统!“TIMEOUT10QUITENDIFRETURN3、循环结构SCAN_ENDSCAN对数据表和记录的解决,用DOWHILE—ENDDO和FOR—ENDFOR循环命令编程时,需要编写记录指针的移动和控制移动的多条命令。由于,这两条命令用于操作数据记录的编程不够抱负,效率不高。VFP提供了SCAN—ENDSCAN命令,使用该命令编写解决记录的程序时,不仅形式简练,并且程序执行速度和效率都能得到提高。格式:SCAN[NOOPTIMIZE][SCOPE][FOR<exp1>][WHILE<exp2>][命令组][LOOP][EXIT]ENDSCAN功能:对当前数据表中符合指定条件的数据记录按照命令组序列进行解决(SCAN表达循环开始,并按指定条件移动记录指针;ENDSCAN表达一次循环结束,使循环返回。)说明:①NOOPTIMIZE参数严禁扫描Rushmore优化。若VFP使用Rushmore技术来优化数据解决。刚技术可以提高其性能。②SCOPE参数指定扫描范围,只有在范围内的记录才干扫描,扫描范围为ALL、NEXT、RECORDN和REST,缺省为ALL③FORexp1是一个过滤条件,它可以过滤掉不扫描的记录。WHILEexp2指定条件表达式,只要其值为真,命令就执行。④LOOP使控制直接返回到,放在SCAN和ENDSCAN之间任意位置,EXIT使控制转向ENDSCAN后的第一条命令。用法与在DoWhile循环结构中使用同样。例4-19输出临床医学,学制五年的全体学生的学号,姓名,专业,学制.SETTALKOFFCLEAROPENDATABASESTUDENTSUSESTUDENTCLEARSCANFOR专业=“临床医学”.AND.学制=‘五’?学号,姓名,专业,学制ENDSCANCLOSEDATABASESCANCEL4.4数组及其应用数组是VFP中解决数据而采用的一种重要内存变量表达形式。当解决大批量数据时,若使用简朴变量就不胜其烦,而使用数组就显得相称方便,简洁。数组是将一组排列有序的,个数有限的变量作为一个整体,用一个统一的名字来表达,这些有序变量的全体称为数组。如S(1),S(2)……,S(50)等称为数组S,构成数组的成员为数组元素,也称下标变量,如S(15),S为数组名,用园括号括起来的15为下标(即序号),S(15)是一个数组元素或数组变量。数组使用时具有以下特点:①一个数组下标变量的作用域和类型与一个简朴内存变量同样,并且都可存放一个数据,都可被赋值和引用。②数组变量的类型取决最初一次被赋值的类型。VFP中,不同类型的数据可同时存在于同一数组中。③数组在内存中以一片连续区域存储,每个数组元素可通过下标来访问;数组元素的下标可以是变量,常量,表达式,如a(4),a(I),a(I+4),且下标必须是整数值。4.4.1数组的创建VFP支持一维数组和二维数组,编程中可用命令DIMENSION,DECLARE,PUBLIC和LOCAL建立变量数组(或称声明数组变量),本书只对前两条命令建立数组作较具体介绍。建立数组命令DIMENSION和DECLARE格式:DIMENSION<数组名1>(<下标1>,[下标2])[,<数组名2>(<下标1>,[下标2])]…DICLARE<数组名1>(<下标1>,[下标2])[,<数组名2>(<下标1>,[下标2])]…功能:两条命令都是建立一维或二维内存变量数组。说明:①数组名最长达254字符,包含字母,数字及下划线。若只选择数值表达式1,则定义数组的一维。次数组为一维数组。若既选择数值表达式1,有选择数值表达式2,则数组的二维下标(或行下标,列下标)数组为二维数组。②数组中的表达式为非整数要取整,下标计算的下界为1,不能为负数或0。③数组的维数拟定此数组能表达的数组元素个数,元素的个数为:一维数组一般为下标的最大数(上界),二维数组为行下标与列下标上界的乘积。如DIMENSIONmyarray[12,5]即表达拥有12*5=60个元素。又如,DECELAREmyarry1(5)表达拥有5个数组元素。④在VFP中,每个数组最多可拥有65000个元素。内存是多的情况,最多可建立65000个数组。如DIMENSIONa1(7),ab1(12,3),xy(9)⑤二维数组中的存储单元按行的顺序顺序排列,因此二维数组也可当作为一维数组去存取。4.4.2数组变量的赋值和引用用命令定义数组后,数组元素的值一般为逻辑值F,只有在用赋值命令Store、=或SCATTER命令,对数组元素赋值后,数据的类型拟定数组中各元素的类型,因此同一数组中各数组元素可采用不同的数据类型。举例:DIMENSIONxx(2,3)DISPLAYMENMORYLIKExx显示:XxPUBA(1,1)LF(1,2)LF(1,3)LF(2,1)LF(2,2)LF(2,3)LF显示表白,数组定义后,没有赋值前,数组元素中的值都是逻辑值F。用Store或=赋值后,各数组单元内容发生了变化,如应用以下命令,可得到:举例:Store”AA”Toxx(1,2)Store5TOxx(6)Xx(1)=tXx(2,2)=”HELLO”DISPLAYMENMORYLIKExx显示:XxPUBA(1,1)LT(1,2)C“AA”(1,3)LF(2,1)LF(2,2)C“HELLO”(2,3)N5(5.0000000)举例:DIMENSONYY(5)StoreOTOyyDISPLAYMENMORY显示:YyPUBA(1)NO(2)NO(3)NO(4)NO(5)NO此例说明给数组变量赋值时,不指明数组的下标,表白该数组的所有元素赋同一值。一维数组和二维数组都可重新定义维数,即一维数组可重新定义成二维数组,二维数组可重新定义为一维数组。4.4.3数组与数据表之间的数据传递:数组和表之间的数据传递VFP提供多种方法,但SCATTER和GATHER命令使用较为灵活。以下予以介绍。①将数据表中的数据传递给数组的命令格式:SCATTER[FIELDS<字段名表>]TO<数组名>功能:将当前表文献中当前记录指定的值顺序的传递给数组中各数组元素。在传递时,从第一字段开始依次向数组中相应顺序的元素传递,该元素的类型由响应字段类型决定。如数组元素的个数比字段个数少,则SCATTER命令先删除该数组,再重建立一个同名的数组,其元素个数正好等于字段的个数。②将数组中的数据传递给数据表的命令格式:GATHERFROM<数组名>[FIELDS<字段名表>]功能:将数组中的数据顺序传递给当前表文献当前记录中指定的字段,,注意,数组与表文献各字段的类型必须一致。备注字段不受本命令的影响,当碰到备注字段时就越过它解决下一个字段。例:将STUDENT.DBF的首记录复制到最末尾。CLEARMEMORYDIMEARRAY(10)USESTUDENTSCATTERTOARRAYLISTMEMORYGOTOBOTTOMAPPENDBLANKGATHERFROMARRAY4.5过程和自定义函数一个大的应用程序往往是由若干个较小的程序模块(称为过程)、函数等组成,这些也称为子模块。过程和函数可以将常用代码集中在一起,供应用程序在需要时调用,这样做提高了程序代码的可读性和可维护性,在需要修改程序时,不必对程序进行多次修改,而只变动一个过程或函数即可。4.5.1过程子程序的概念VFP中,一个应用程序可以由若干模块组成。各个模块之间存在调用关系。一般把主调模块成为主程序,将被调模块称为子程序。这些模块可以放在一个。PRG文献中,也可以放在几个。PRG文献中。其中,主程序和子程序是相对而言的。子程序也可以调用下一级程序,则该程序相对下一级程序来说,便是主程序。一个程序调用子程序后,系统就从子程序的第一条命令开始执行。子程序结束后,返回主程序。子程序可以单独存在于一个.PRG文献中。这时,应注意:文献名必须以子程序名命名,文献必须放在主程序同一目录或指定目录下。子程序可以用以下命令返回结束格式:RETURN[TOMASTER]功能:结束子程序运营,返回上一级调用的主程序命令的下一条命令。TOMASTER选项,返回最初的程序调用处的下一条命令,如图4-5-1所示*主程序MAIN.PRG*子程序PROG1.PRG*子程序PROG2.PRG。。。。RETURNRETURNTOMASTER图4-5-1子程序调用与返回。。。。RETURNRETURNTOMASTER图4-5-1子程序调用与返回。。。DOPROG2。。。。。。DOPROG2。。RETURN2、子程序也可以放在主调用程序中。这时,子程序也称为过程。过程是重要的。由于:假如子程序都以单独的文献形式存在,则每调用一次子程序都要进行I/O操作,影响应用程序的工作效率。系统允许打开的文献数是有限的。VFP过程的格式:PROCEDUREProcedureName[PARAMETER〈VarName〉[[,〈VarName〉]...]][{〈Statement〉}……]ENDPROC PROCEDURE指明过程的开始,ENDPROC指明过程的结束。ProcedureName指定要创建的过程名。过程的命名规则:必须以字母或下划线开头,可以包含字母、数字和下划线的任意组合过程名的长度小于255个字符PARAMETER指明过程所需的参数,VarName是形参变量,其作用域仅限于本过程及被调用过程(由它调用的其它过程)中。如过程无参数,则PARAMETER命令不能在过程中出现;如过程有参数,则PARAMETER命令必须紧位于PROCEDURE命令之后。过程调用的格式:DOProcedureName[WITH〈Exp〉[[,〈Exp〉]...]][IN〈FileName〉]注:Exp是实参,可以是常量、变量或表达式。INFileName显式指明过程所在的文献有参过程在调用时,实参与形参均从左依次开始一一传递,实参数目不能超过形参的数目,多余形参的值为逻辑假值。假如实参数目大于形参数目,将产生错误。所有常量、表达式的传递均以值引用方式进行,此时形参值的改变不影响实参。而变量的传递有值引用和地址引用两种方式,默认方式是地址引用方式,既将实参自身的地址传递给形参,此时形参值的改变将同时引起实参值的改变。在程序设计中,若采用地址引用方式,可从被调用过程中返回值。假如将实参用括号括住,则强制参数传递以值引用方式进行。在VFP中,也可使用如下命令明确参数传递的方式:SETUDFPARMSTO{REFERENCE|VALUE}注:1.REFERENCE明确指定地址引用方式,VALUE明确指定值引用方式2.本命令一经设立就永远有效,直到再次用本命令改变设立为止。例4.1:下面的程序说明了过程的用法及参数是如何传递的:*Thisisamainprogram *ThisisaprocedureSETTALKOFF PROCEDUREproc1PRIVATEq1,q2 PARAMETERp1,p2q1=1 ?‘Step3:p1=‘,p1,‘p2=‘,p2q2=2 p1=p1+10?’Step1:q1=’,q1,’q2=’,q2 p2=p2+10DOproc1WITH(q1),q2 ?‘Step4:p1=‘,p1,‘p2=‘,p2?’Step2:q1=’,q1,’q2=’,q2 ENDPROCRETURN 假如过程很多,将所有的过程存放在主调程序中,显得过于繁琐,这时可以定义一个过程文献。过程文献是一个。PRG文献。过程文献有多个过程连接而成。VFPXITONG规定一个过程文献中最多存放1170个过程。过程文献的定义*过程文献名PROCEDURE<过程1><语句系列1>endprocPROCEDURE〈过程2><语句系列2>ENDPROCPROCEDURE<过程n>

〈语句系列n>ENDPROC注意过程文献名与过程名是两个概念,一个过程文献中可以存放多个过程。自定义函数(UDF)除系统提供的标准函数外,用户还可以自己定义函数,称为UDF(USERDEFINEFUNCTION)VFP自定义函数格式如下:FUNCTIONFunctionName[PARAMETER〈VarName〉[[,〈VarName〉]...]][{〈Statement〉}……]RETURN<ReturnValue>ENDFUNC 自定义函数的命名规则、参数传递方式与过程同样。但有两种调用方式:1.过程调用方式:在此种方式下,自定义函数等同于过程,其返回值无效2.系统函数调用方式:自定义函数与系统函数的地位同样,但这时参数的传递方式只能用命令SETUDFPARMSTO{REFERENCE|VALUE}拟定。例5.17:下面的程序说明了自定义函数的用法及参数是如何传递的:*Thisisamainprogram *ThisisauserdefinefunctionSETTALKOFF FUNCTIONfunc1PRIVATEq1,q2,q PARAMETERp1,p2q1=1 ?‘Step4:p1=‘,p1,‘p2=‘,p2q2=2 p1=p1+10?’Step1:q1=’,q1,’q2=’,q2 p2=p2+10DOfunc1WITH(q1),q2 ?‘Step5:p1=‘,p1,‘p2=‘,p2?’Step2:q1=’,q1,’q2=’,q2 RETURNp1+p2q=func1(q1,q2) ENDFUNC?’Step3:q1=‘,q1,‘q2=‘,q2RETURN变量的作用域应用结构化程序设计方法,大大简化了程序设计过程,然而也给变量的使用带来了一些问题。这重要跟变量的作用范围有关。比如调用程序和被调用程序往往由不同的人编写,而他们也许使用了相同的变量名,这时就有也许出现问题。例如:计算1!+3!+5!,编程如下:s=0fori=1to5step2s=s+fun(i)endfor?"s=",sreturnfunctionfunparameterks=1fori=1toks=s*iendfor?str(k,1)+"!=",sreturnsendfunc运营结果1!=14!=24s=25下面我们再看一个例子,编写一个程序,从键盘输入X的,根据X的值计算Y的值,运用过程编程如下:运营该程序时,发现执行到dojisuan时程序给出X变量未定义错误。由于在前一个子程序shuru中定义的变量X,在执行过程jisuan时不再存在。settalkoffdoshurudojisuan?"y=",yreturnprocshuruinput"请输入X的值:"toxreturnendprocprocjisuanifx>=0y=x+10elsey=x-10endifreturnendproc从上面的两个例子可以看出,变量的作用范围有时需要限定在定义它的程序内,有时又希望扩大到别的子程序内。这就是变量的作用域问题。VFP中,根据变量的作用范围可将变量分为全局变量、私有变量和局部变量。变量的作用域由关键词LOCAL、PRIVATE和PUBLIC指定。LOCAL定义局部变量,局部变量只能在当前模块或过程中使用,而不能被其它更高层或更低层的过程调用。当所属程序停止运营时,局部变量或数组被释放。PRIVATE定义私有变量。私有变量在调用程序中将自身隐藏,这样用户就可在当前程序中可引用和这些变量同名的变量,而不影响这些变量初始值。当调用私有变量的程序段结束时,所有被声明为私有的变量和数组都可以重新被访问。在一个过程内部定义的未指明作用域的变量自动成为私有变量。PUBLIC定义全局变量。全局变量在任何程序中都可被调用和修改,直到所有程序结束。命令窗口中创建的变量和数组自动赋予全局变量的属性。定义变量作用域的格式是:LOCAL变量表/PRIVATE变量表/PUBLIC变量表注意:全局变量一经说明,则自动建立,其值为.F.,而私有变量和局部变量则要赋值后才干建立。s=0fori=1to5step2s=s+fun(i)endfor?"s=",sreturnfunctionfunparameterkprivateis=1fori=1toks=s*iendfor?str(k,1)+"!=",sreturnsendfuncsettalkoffdoshurudojisuan?"y=",yreturnprocshurupublicxinput"请输入X的值:"toxendprocprocjisuanifx>=0y=x+10elsey=x-10endifendproc应用变量作用域的概念,现可将上述两个程序略加修改,以便得到对的结果。修改如下:4应用举例例11-24编程实现对数据库STUDENT.DBC中表文献student.dbf进行显示,增长,修改和删除等操作*主程序exm.PRGSETTALKkOFFSetPROCEDURETOTZZ&&打开过程文献tzz.PRGOPENDATABASEStudentUSEStudentDOWHILE.T.CLEAR@2,10SAY“﹡﹡对数据表student文献的修改﹡﹡”@4,14SAY“1.显示记录2.增长记录”@6,14SAY“3.修改记录4.删除记录”@8,14SAY“5.退出系统”INPU

温馨提示

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

评论

0/150

提交评论