数据库系统与Visual FoxPro第四章课件_第1页
数据库系统与Visual FoxPro第四章课件_第2页
数据库系统与Visual FoxPro第四章课件_第3页
数据库系统与Visual FoxPro第四章课件_第4页
数据库系统与Visual FoxPro第四章课件_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

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

文档简介

第四章

程序设计基础

11/19/20221第四章第四章程序设计基础

11/10/20221第四章4.1程序的建立、修改和运行

一、程序文件的建立与修改

1.方法一:用命令方式命令格式:MODIFYCOMMAND<文件名>功能:打开文本编辑窗口,用来建立或修改程序文件。2.方法二:用菜单方式11/19/20222第四章4.1程序的建立、修改和运行

一、程序文件的建立与修改11/二、程序的运行

1.方法一:用命令方式命令格式:DO<文件名>功能:执行由<文件名>表示的程序。2.方法二:用菜单方式如要运行的程序没有打开,可单击主窗口中的“程序”菜单下的“运行”命令,弹出运行对话框,选择要运行的程序,单击“运行”按钮。11/19/20223第四章二、程序的运行11/10/20223第四章4.2结构化程序设计

4.2.1程序文件中的常用命令一、程序结尾的专用命令1.RETURN命令格式:RETURN[<表达式>][TOMASTER]功能:程序、过程或函数的末尾可放一条RETURN命令,它能使程序执行结束,并返回到调用它的上级程序继续执行,若无上级程序则返回到命令窗口。说明:表达式指定返回调用程序的表达式;TOMASTER将返回最高层次的调用程序。11/19/20224第四章4.2结构化程序设计

4.2.1程序文件中的常用命令11/2.CANCEL命令格式:CANCEL功能:CANCEL能使程序运行终止,清除程序的私有变量,并返回到命令窗口。3.QUIT命令格式:QUIT功能:该命令与文件菜单的退出命令功能相同,使系统正常退出VisualFoxPro6.0,返回到Windows。11/19/20225第四章2.CANCEL命令11/10/20225第四章二、注释命令格式1:NOTE|*<注释字符串>格式2:&&<注释字符串>说明:注释命令不做任何操作,只是注释标记,用于说明程序或命令的功能。NOTE或*用于整行注释,它必须写在每一个注释行的开头;而&&用于注释一行的部分内容,它可以写在行中(命令的尾部)。11/19/20226第四章二、注释命令11/10/20226第四章三、程序中两个常用命令1.清屏命令格式:CLEAR功能:清除屏幕上的显示内容。一般用于程序开头。2.SETTALKON|OFF功能:用于设置一些非输出语句(如APPEND、SORT、GO等)是否显示命令的执行结果。ON为允许显示,OFF为不允许显示。一般在程序开始设置为OFF状态。11/19/20227第四章三、程序中两个常用命令11/10/20227第四章四、输入输出专用命令1.字符接收命令格式:ACCEPT[<提示信息>]TO<内存变量名>功能:将从键盘上接收的字符串存入指定的内存变量中。说明:执行此语句时,先在屏幕上显示<提示信息>,光标紧跟其后,然后暂停程序运行,等待用户从键盘上输入信息。例:ACCEPT“请输入姓名:”TOXM11/19/20228第四章四、输入输出专用命令11/10/20228第四章格式:INPUT[<提示信息>]TO<内存变量名>功能:用于接收从键盘上输入的表达式,并将计算结果存入指定的内存变量中。说明:INPUT语句与ACCEPT语句的执行过程相同,功能相似。INPUT语句与ACCEPT语句的区别是:ACCEPT命令只能接收字符串,而INPUT语句可以接收任意类型的数据;如果输入的是字符串,ACCEPT语句在接受数据时,不用使用字符型定界符;而INPUT接受字符型数据时,必须用定界符括起来。11/19/20229第四章格式:INPUT[<提示信息>]TO<内存变量名>113.输入一个字符语句格式:WAIT[<信息文本>][TO<内存变量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<数值表达式>]功能:暂停程序的运行,直到用户输入一个字符。也可只用于输出一条提示信息。例:WAIT“请检查输人内容!”WINDOW11/19/202210第四章3.输入一个字符语句11/10/202210第四章(二)定位输入输出命令格式:@<行,列>[SAY<表达式1>][GET<变量名>][DEFAULT<表达式2>]功能:在屏幕的指定行列输出SAY子句的表达式值,并可修改GET子句的变量值。说明:(1)<行,列>表示数据在窗口中显示的位置。(2)SAY子句用来输出数据,GET子句用来输入及编辑数据。11/19/202211第四章(二)定位输入输出命令11/10/202211第四章(3)GET子句中的变量必须具有初值,或用DEFAULT子句的<表达式2>指定初值。(4)GET子句的变量必须用READ命令来激活。例:@3,10SAY姓名@4,10SAY“成绩:”GETCJDEFAULT0READ11/19/202212第四章(3)GET子句中的变量必须具有初值,或用DEFAULT子句4.2.2程序的控制结构

1.顺序结构在程序执行时,按程序中命令的书写顺序依次执行。2.分支结构能根据指定条件的不同当前值,在两条或多条程序路径中选择一条执行。3.循环结构能使循环体中的语句(或命令)序列重复执行若干次。4.过程结构

11/19/202213第四章4.2.2程序的控制结构

1.顺序结构11/10/2024.2.3顺序结构

例4-1:从键盘随机输入某个表的文件名,要求打开并显示此表的内容。CLEARSETTALKOFFACCEPT“请输入表文件名”TOFILENAMEUSE(FILENAME)LISTUSE11/19/202214第四章4.2.3顺序结构

例4-1:从键盘随机输入某个表的文件名例:圆的面积计算程序为SETTALKOFFCLEARINPUT“请输入圆半径:”TORS=3.1416*R*R?“圆面积=”,S上述3条命令的先后次序不能颠倒:只有执行INPUT后才能计算S,随后才能输出S,否则会因变量找不到而无法继续下去。11/19/202215第四章例:圆的面积计算程序为11/10/202215第四章4.2.4分支结构

一、简单的条件语句语句格式:IF<逻辑表达式><语句序列>ENDIF功能:首先计算<逻辑表达式>的值,若其值为真,对IF与ENDIF之间的语句顺序执行,然后执行ENDIF后面的语句;若其值为假,直接执行ENDIF后面的语句。11/19/202216第四章4.2.4分支结构

一、简单的条件语句11/10/2022例4-3:将商品销售表.DBF中第一个单价在2500元以上的商品价格降低5%。USE商品销售表LOCATEFOR单价>2500IFFOUND()DISPLAY商品编号,单价REPLACE单价WITH单价*0.95DISPLAY商品编号,单价ENDIFUSERETURN11/19/202217第四章例4-3:将商品销售表.DBF中第一个单价在2500元以二、带ELSE的条件语句语句格式:IF<逻辑表达式><语句序列l>ELSE<语句序列2>ENDIF功能:若<逻辑表达式>值为真,先执行<语句序列1>,然后再执行ENDIF后面的语句;若其值为假,先执行<语句序列2>,然后再执行ENDIF后面的语句。11/19/202218第四章二、带ELSE的条件语句11/10/202218第四章例4-4:铁路托运行李,假设每张车票可按每千克0.5元托运50千克以内的行李,如果超过50千克时,超过部分每千克加价0.3元。计算公式和程序如下:

0.5*W(W<=50,W为行李重量)X=0.5*50+0.8*(W-50)(W>50)

11/19/202219第四章例4-4:铁路托运行李,假设每张车票可按每千克0.5元托运5SETTALKOFFINPUT“请输入行李的重量:”TOWIFW<=50X=0.5*WELSEX=0.5*50+0.8*(W-50)ENDIF?“行李重量为”+STR(W,6,2)+“千克,运费为”+STR(X,6,2)+“元”CANCEL11/19/202220第四章SETTALKOFF11/10/202220第四章语句格式:IF<条件表达式1><语句序列1>ELSEIF<条件表达式2><语句序列2>ELSE<语句序列3>ENDIFENDIF11/19/202221第四章语句格式:IF<条件表达式1>11/10/202221第例4-5:上例托运行李的计算公式改为:

0.5*W(W<=50)X=0.5*50+0.8*(W-50)(100>=W>50)0.5*50+0.8*50+1.0*(W-100)(W>100)11/19/202222第四章例4-5:上例托运行李的计算公式改为:11/10/20222STETALKOFFINPUT“输入行李重量”TOWIFW<=50X=0.5*WELSEIFW<=100X=0.5*50+0.8*(W-50)ELSEX=0.5*50+0.8*50+1.0*(W-100)ENDIFENDIF?“行李运费为:”,XCANCEL

11/19/202223第四章STETALKOFF11/10/202223第四章三、多分支语句

DOCASECASE<逻辑表达式1><语句序列l>CSAE<逻辑表达式2><语句序列2>…………CASE<逻辑表达式n><语句序列n>[OTHERWISE<语句序列n+l>]ENDCASE11/19/202224第四章三、多分支语句11/10/202224第四章功能:执行多分支语句时,系统将依次判断逻辑表达式值是否为真,若某个逻辑表达式值为真,则执行该CASE段的语句序列,然后执行ENDCASE后面的语句。在各逻辑表达式值均为假的情况下,若有OTHERWISE子句,就执行<语句序列n+1>,然后结束多分支语句,否则直接结束多分支语句。11/19/202225第四章功能:执行多分支语句时,系统将依次判断逻辑表达式值是否为真,我们用DOCASE语句来实现例4-5的计算,只要将IF语句的嵌套部分改为:DOCASECASEW<=50X=0.5*WCASEW<=100.AND.W>50X=0.5*50+0.8*(W-50)CASEW>100X=0.5*50+0.8*50+1.0*(W-100)ENDCASE11/19/202226第四章我们用DOCASE语句来实现例4-5的计算,只要将IF语句的例4-6:显示当前季节程序CLEARYue=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=“冬”ENDCASEWAITJJWINDOW11/19/202227第四章例4-6:显示当前季节程序11/10/202227第四章在构成分支结构时需注意:(1)条件语句中的IF和ENDIF必须配对出现;同样,多分支语句中的DOCASE和ENDCASE也须配对出现。(2)为使程序清晰易读,对分支、循环等结构应使用缩格书写方式,见上述例。(3)分支、循环的每种语句都不允许在一个命令行中输入完,必须按本书所示语句格式一行一个回车分行键人。由此可见,这些语句不能用于命令窗口中。11/19/202228第四章在构成分支结构时需注意:11/10/202228第四章4.2.4循环结构

一、条件循环语句格式:DOWHILE<逻辑表达式><语句序列>ENDDO功能:若DOWHILE子句的循环条件为假循环就结束,执行ENDDO子句后面的语句;条件为真则执行循环体,一旦遇到ENDDO就自动返回到DOWHILE重新判断循环条件是否成立,以决定是否继续循环。11/19/202229第四章4.2.4循环结构

一、条件循环11/10/202229第说明:1.语句格式中的<逻辑表达式>称为循环条件,<语句序列>称为循环体,循环体可以是一个语句或一组语句。2.ENDDO语句是循环终止语句,表示循环以此语句为终点。但执行到ENDDO语句时并不是直接退出循环,而是转到DOWHILE语句去判断<逻辑表达式>的值的真假。3.循环语句本身不会修改执行条件,因此循环体内一定要设置修改循环条件的语句。否则,可能出现死循环,无法退出循环。11/19/202230第四章说明:11/10/202230第四章例4-7:试编一程序,显示商品销售表.DBF中所有单价超过2000元的商品编号。CLEARUSE商品销售表DOWHILE.NOT.EOF()IF单价>2000?商品编号ENDIFSKIPENDDOUSE11/19/202231第四章例4-7:试编一程序,显示商品销售表.DBF中所有单价超过例4-8:STORE0TOK1,K2,K3ZS=1DOWHILEZS<=200ACCEPT“请输入选票代号”TOXPDOCASECASEXP=“1”K1=K1+1CASEXP=“2”K2=K2+lCASEXP=“3”K3=K3+1ENDCASEZS=ZS+1ENDDO?“甲得票数:”+STR(K1)?“乙得票数:”+STR(K2)?“丙得票数:”+STR(K3)RETURN11/19/202232第四章例4-8:STORE0TOK1,K2,K31二、步长循环语句格式:FOR<内存变量>=<数值表达式1>TO<数值表达式2>[SETP<数值表达式3>]<语句序列>ENDFOR|NEXT说明:语句格式中的<内存变量>称为循环变量,<数值表达式l>、<数值表达式2>、<数值表达式3>分别称为初值、终值、步长。步长的缺省时值为1。11/19/202233第四章二、步长循环11/10/202233第四章功能:语句执行时,通过比较循环变量值与终值来决定是否执行<语句序列>。步长为正数时,若循环变量值不大于终值就执行循环体;步长为负数时,若循环变量值不小于终值就执行循环体。执行一旦遇到ENDFOR或NEXT,循环变量值即加上步长,然后返回到FOR重新与终值比较。注意:循环体中不需要改变循环变量语句。因为,ENDFOR或NEXT语句会改变循环变量的值。这一点与DOWHILE…ENDDO语句不同。11/19/202234第四章功能:语句执行时,通过比较循环变量值与终值来决定是否执行<语例4-9:编写计算S=1+2+3+…+100的程序。SETTALKOFFCLEARS=0&&S为累加器,初值为0FORI=1TO100&&I为计数器,初值为1S=S十I&&累加NEXT?“S=”,SRETURN11/19/202235第四章例4-9:编写计算S=1+2+3+…+100的程序。1三、扫描循环语句格式:SCAN[〈范围〉][FOR〈逻辑表达式〉]〈语句序列〉ENDSCAN功能:SCAN循环针对当前表进行循环,〈范围〉子句表示记录范围,缺省值为ALL。语句执行时在〈范围〉中依次寻找满足FOR条件的记录,并对找到的记录执行〈语句序列〉。执行到ENDSCAN语句,指针就指向下一条满足条件的记录,继续执行循环体,直到所有的记录都执行完,就结束循环。11/19/202236第四章三、扫描循环11/10/202236第四章

例4-10:根据例4-7的要求,用扫描循环语句编程。CLEARUSE商品销售表SCANFOR单价>2000?商品编号ENDSCANUSE11/19/202237第四章例4-10:根据例4-7的要求,用扫描循环语句编程。1四、循环辅助语句1.跳转语句格式:LOOP功能:该语句能中断本次循环体的执行,回到循环开始处,重新对条件表达式进行判断。说明:LOOP语句一定放在循环体内才有意义,2.出口语句格式:EXIT功能:终止正常循环,无条件地转到循环终止语句后去执行后续语句。11/19/202238第四章四、循环辅助语句11/10/202238第四章例4-11:SETTALKOFFCLEARSTORE0TOI,S,TDOWHILEI<=100I=I+1S=S+I&&累加I值IFINT(I/2)=I/2LOOPENDIFT=T+I&&累加奇数ENDDO?“l+2+3+…+100=”,S?”1~100奇数和为:”,TRETURN11/19/202239第四章例4-11:SETTALKOFF11/10/202例4-12:

@4,10SAY“请输入一自然数:”GETXDEFAULT0

READN=0DOWHILEN<=XIFINT(X/N)=X/NEXITENDIFN=N+1ENDDOIFN=X@6,10SAYSTR(X)+“为素数”ELSE@6,10SAYSTR(X)+“不为素数”ENDIF11/19/202240第四章例4-12:11/10/202240第四章例4-13:编程修改商品表.DBF中的商品名称和生产单位,要求能修改多个商品。程序如下:CLEARUSE商品表DOWHILE.T.SPBH=SPACE(6)@4,10SAY“请输入要修改的商品编号:”GETSPBHREADLOCATEFOR商品编号=SPBH11/19/202241第四章例4-13:编程修改商品表.DBF中的商品名称和生产单位,要IFFOUND()@6,10SAY“商品名称”GET商品名称@7,10SAY“生产单位”GET生产单位READELSE@6,10SAY“无此商品!”ENDIFWAIT“是否继续修改?”TOXGIFUPPER(XG)=“Y”LOOPELSEEXITENDIFENDDORETURN11/19/202242第四章IFFOUND()11/10/202242第四章五、多重循环若一个循环语句的循环体内又包含其它循环,就构成了多重循环,也称为循环嵌套。较为复杂的问题往往要用多重循环来处理。例4-14:编一程序在屏幕上显示九九乘法表。11/19/202243第四章五、多重循环11/10/202243第四章CLEARA=1DOWHILEA<=9B=1DOWHILEB<=AC=A*B??LTRIM(STR(A,2)),“*”,LTRIM(STR(B,2)),“=”,LTRM(STR(C,2)),“”B=B+1ENDDO?A=A+1ENDDORETURN11/19/202244第四章CLEAR11/10/202244第四章4.3过程与函数

4.3.1子程序一、调用与返回对于两个具有调用关系的程序文件,常称调用程序为主程序,被调用程序为子程序。主程序执行时遇到DO命令,执行就转向子程序,称为调用子程序。子程序执行到RETURN语句(或缺省该语句),就会返回到主程序继续执行程序,称为从子程序返回,或简称返主。11/19/202245第四章4.3过程与函数

4.3.1子程序11/10/2022二、带参数子程序的调用与返回DO<程序名l>[WITH<参数表>][IN<程序名2>]功能:带参数调用子程序。说明:(1)<参数表>中的参数可以是常量、变量或表达式,但若为内存变量必须具有初值。(2)当<程序名1>是IN子句<程序名2>中的一个过程时,DO命令调用该过程,请参阅以下过程部分内容。11/19/202246第四章二、带参数子程序的调用与返回11/10/202246第四章调用子程序时参数表中的参数要传送给子程序,子程序中也必须设置相应的参数接收语句。PARAMETERS<参数表>功能:指定内存变量以接收DO命令发送的参数值,返主时把内存变量值回送给调用程序中相应的内存变量。说明:(l)PARAMETERS必须是被调用程序的第一个语句。(2)命令中的参数被默认为私有变量,返主时回送参数值后即被清除。(3)命令中的参数依次与调用命令WITH子句中的参数相对应,故两者参数个数必须相同,类型必须匹配。11/19/202247第四章调用子程序时参数表中的参数要传送给子程序,子程序中也必须设置例4-15:设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。主程序:(文件名MAIN.PRG)CLEARYMJ=0@5,10SAY“请输人半径:”GETBJDEFAULT0READDOJSWITHBJ,YMJ?“YMJ=”,YMJ&&显示圆面积RETURN11/19/202248第四章例4-15:设计一个计算圆面积的子程序,并要求在主程序中带子程序:文件名为JS.PRGPARAMETERSR,SS=PI()*R*R&&PI()函数返回3.14RETURN&&返主三、子程序嵌套主程序与子程序的概念是相对的,子程序还可调用它自己的子程序,即子程序可以嵌套调用。RETURN[TOMASTER|TO<程序文件名>]11/19/202249第四章子程序:文件名为JS.PRG11/10/202249第四章4.3.2过程

一、过程文件及过程的概念VisualFoxPro6.0允许在一个.PRG文件中设置多个程序模块,将主程序以外的每个模块定义为一个过程。这种包含多个过程的文件称为“过程文件”。“过程文件”实质仍是命令文件,仍使用.PRG为扩展名。其建立的方法与一般命令文件一样用命令:MODIFYCOMMAND<过程文件名>11/19/202250第四章4.3.2过程

一、过程文件及过程的概念11/10/202一个过程文件可包含128个过程。每个过程都有一个过程名进行标识。过程名的约定与内存变量名的约定一样。过程文件中的每一个过程结构如下:PROCEDURE<过程名><命令序列>[RETURN]注意:每一个过程能完成某一独立的功能,像子程序一样被其它程序调用。但过程不是一个独立的.PRG文件,它只是一个过程文件中的一段程序。而每一个子程序是一个独立的命令文件。因此,过程与过程文件不是同一概念,不可混淆。11/19/202251第四章一个过程文件可包含128个过程。每个过程都有一个过程名进行标二、过程的调用:过程也用DO命令调用。1.过程可作为程序的一部分,列在程序的最后,例4-16:SETDECIMALSTO2YMJ=0@5,10SAY“请输人半径:”GETBJDEFAULT0READDOJSWITHBJ,YMJ&&调用过程JS?“YMJ=”,YMJRETURNPROCEDUREJS&&过程JS开始语句PARAMETERSr,sS=PI()*R*RRETURN11/19/202252第四章二、过程的调用:过程也用DO命令调用。11/10/202252.过程有可能不在调用程序中,而是被包含在某一个过程文件中,在调用过程文件中的过程时,必须打开包含该过程的过程文件,再用DO命令调用。打开过程文件的命令如下:格式:SETPROCEDURETO<过程文件名>功能:打开指定的过程文件。过程文件使用完毕后,要关闭。过程文件关闭的命令是:格式一:CLOSEPROCEDURE格式二:SETPROCEDURETO功能:关闭当前打开的过程文件。11/19/202253第四章2.过程有可能不在调用程序中,而是被包含在某一个过程文件中,例4-17:CLEARR=5MJ=0TJ=0SETPROCEDURETOQMJTJDOQMJ&&调用过程QMJ?“球的表面积为:”,MJDOQTJ&&调用过程QTJ?“球体积为:”,TJSETPROCEDURETO&关闭过程文件RETURN11/19/202254第四章例4-17:CLEAR11/10/202254第四章*过程文件:文件名为QMJTJ.PRGPROCEDUREQMJMJ=4*PI()*R*RRETURNPROCDUERQTJTJ=4*PI()*R*R*R/3RETURN11/19/202255第四章*过程文件:文件名为QMJTJ.PRG11/10/20224.3.3自定义函数

一、自定义函数的建立自定义函数的格式如下:FUNCTION<函数名>[PARAMETERS<参数表>]<语句序列>[RETURN<表达式>]功能:定义一个函数,供调用。11/19/202256第四章4.3.3自定义函数

一、自定义函数的建立11/10/20说明:(1)自定义函数的函数名不能和VisualFoxPro6.0系统函数同名,也不能和内存变量同名。(2)<语句序列>组成为函数体,用于进行各种处理;简单的函数其函数体也可为空。(3)RETURN语句用于返回函数值,其中的<表达式>值就是函数值。若缺省该语句,则返回的函数值为.T.。(4)自定义函数与系统函数调用方法相同,其形式为:函数名(<参数表>)11/19/202257第四章说明:11/10/202257第四章例4-18:设计一个自定义函数,用来求一元一次方程AX+B=0的根。*root.prgCLEAR@5,10SAY“一次项系数:”GETaDEFAULT1@7,10SAY“常数项:”GETbDEFAULT0READ?“x:”,root(a,b)&&调用函数ROOTFUNCTIONROOTPARAMETERSu,vRETURNIIF(u=0,“无解”,-v/u)11/19/202258第四章例4-18:设计一个自定义函数,用来求一元一次方程AX+B4.3.4变量的作用域

一、公共变量在任何模块中都可使用的变量称为公共变量,公共变量可用下述命令来建立。命令格式:PUBLIC<内存变量表>功能:将<内存变量表>指定的变量设置为公共变量,并将这些变量的初值均赋以.F.。

11/19/202259第四章4.3.4变量的作用域

一、公共变量11/10/2022说明:(1)若下层模块中建立的内存变量要供上层模块使用,或某模块中建立的内存变量要供并列模块使用,必须将这种变量说明成公共变量。(2)VisualFoxPro6.0默认命令窗口中定义的变量都是公共变量,但这样定义的变量不能在程序方式下利用。(3)程序终止执行时公共变量不会自动清除,而只能用命令来清除。前面提到过的RELEASE命令可用来清除公共变量。

11/19/202260第四章说明:11/10/202260第四章二、私有变量VisualFoxPro6.0默认程序中定义的变量是私有变量,也就是凡是未用PUBLIC定义过的变量都是私有变量。私有变量仅在定义它的模块及其下层模块中有效,而在定义它的模块运行结束时自动清除。私有变量允许与上层模块的变量同名,但此时为分清两者是不同的变量,需要采用暂时屏蔽上级模块变量的办法。下述命令声明的私有变量就能起这样的作用。

11/19/202261第四章二、私有变量11/10/202261第四章命令格式:PRIVATE[<内存变量表>][ALL[LIKE|EXCEPT<通配符>]功能:声明私有变量并隐藏上级模块的同名变量,直到声明它的程序、过程或自定义函数执行结束后,才恢复使用先前隐藏的变量。11/19/202262第四章命令格式:11/10/202262第四章三、本地变量本地变量只能在建立它的模块中使用,而且不能在高层或底层模块使用,该模块运行结束时本地变量就自动释放。命令格式:LOCAL<内存变量表>功能:将<内存变量表>指定的变量设置为本地变量,并将这些变量的初值均赋以.F.。注意:LOCAL与LOCATE前4个字母相同,故不可缩写。

11/19/202263第四章三、本地变量11/10/202263第四章第四章

程序设计基础

11/19/202264第四章第四章程序设计基础

11/10/20221第四章4.1程序的建立、修改和运行

一、程序文件的建立与修改

1.方法一:用命令方式命令格式:MODIFYCOMMAND<文件名>功能:打开文本编辑窗口,用来建立或修改程序文件。2.方法二:用菜单方式11/19/202265第四章4.1程序的建立、修改和运行

一、程序文件的建立与修改11/二、程序的运行

1.方法一:用命令方式命令格式:DO<文件名>功能:执行由<文件名>表示的程序。2.方法二:用菜单方式如要运行的程序没有打开,可单击主窗口中的“程序”菜单下的“运行”命令,弹出运行对话框,选择要运行的程序,单击“运行”按钮。11/19/202266第四章二、程序的运行11/10/20223第四章4.2结构化程序设计

4.2.1程序文件中的常用命令一、程序结尾的专用命令1.RETURN命令格式:RETURN[<表达式>][TOMASTER]功能:程序、过程或函数的末尾可放一条RETURN命令,它能使程序执行结束,并返回到调用它的上级程序继续执行,若无上级程序则返回到命令窗口。说明:表达式指定返回调用程序的表达式;TOMASTER将返回最高层次的调用程序。11/19/202267第四章4.2结构化程序设计

4.2.1程序文件中的常用命令11/2.CANCEL命令格式:CANCEL功能:CANCEL能使程序运行终止,清除程序的私有变量,并返回到命令窗口。3.QUIT命令格式:QUIT功能:该命令与文件菜单的退出命令功能相同,使系统正常退出VisualFoxPro6.0,返回到Windows。11/19/202268第四章2.CANCEL命令11/10/20225第四章二、注释命令格式1:NOTE|*<注释字符串>格式2:&&<注释字符串>说明:注释命令不做任何操作,只是注释标记,用于说明程序或命令的功能。NOTE或*用于整行注释,它必须写在每一个注释行的开头;而&&用于注释一行的部分内容,它可以写在行中(命令的尾部)。11/19/202269第四章二、注释命令11/10/20226第四章三、程序中两个常用命令1.清屏命令格式:CLEAR功能:清除屏幕上的显示内容。一般用于程序开头。2.SETTALKON|OFF功能:用于设置一些非输出语句(如APPEND、SORT、GO等)是否显示命令的执行结果。ON为允许显示,OFF为不允许显示。一般在程序开始设置为OFF状态。11/19/202270第四章三、程序中两个常用命令11/10/20227第四章四、输入输出专用命令1.字符接收命令格式:ACCEPT[<提示信息>]TO<内存变量名>功能:将从键盘上接收的字符串存入指定的内存变量中。说明:执行此语句时,先在屏幕上显示<提示信息>,光标紧跟其后,然后暂停程序运行,等待用户从键盘上输入信息。例:ACCEPT“请输入姓名:”TOXM11/19/202271第四章四、输入输出专用命令11/10/20228第四章格式:INPUT[<提示信息>]TO<内存变量名>功能:用于接收从键盘上输入的表达式,并将计算结果存入指定的内存变量中。说明:INPUT语句与ACCEPT语句的执行过程相同,功能相似。INPUT语句与ACCEPT语句的区别是:ACCEPT命令只能接收字符串,而INPUT语句可以接收任意类型的数据;如果输入的是字符串,ACCEPT语句在接受数据时,不用使用字符型定界符;而INPUT接受字符型数据时,必须用定界符括起来。11/19/202272第四章格式:INPUT[<提示信息>]TO<内存变量名>113.输入一个字符语句格式:WAIT[<信息文本>][TO<内存变量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<数值表达式>]功能:暂停程序的运行,直到用户输入一个字符。也可只用于输出一条提示信息。例:WAIT“请检查输人内容!”WINDOW11/19/202273第四章3.输入一个字符语句11/10/202210第四章(二)定位输入输出命令格式:@<行,列>[SAY<表达式1>][GET<变量名>][DEFAULT<表达式2>]功能:在屏幕的指定行列输出SAY子句的表达式值,并可修改GET子句的变量值。说明:(1)<行,列>表示数据在窗口中显示的位置。(2)SAY子句用来输出数据,GET子句用来输入及编辑数据。11/19/202274第四章(二)定位输入输出命令11/10/202211第四章(3)GET子句中的变量必须具有初值,或用DEFAULT子句的<表达式2>指定初值。(4)GET子句的变量必须用READ命令来激活。例:@3,10SAY姓名@4,10SAY“成绩:”GETCJDEFAULT0READ11/19/202275第四章(3)GET子句中的变量必须具有初值,或用DEFAULT子句4.2.2程序的控制结构

1.顺序结构在程序执行时,按程序中命令的书写顺序依次执行。2.分支结构能根据指定条件的不同当前值,在两条或多条程序路径中选择一条执行。3.循环结构能使循环体中的语句(或命令)序列重复执行若干次。4.过程结构

11/19/202276第四章4.2.2程序的控制结构

1.顺序结构11/10/2024.2.3顺序结构

例4-1:从键盘随机输入某个表的文件名,要求打开并显示此表的内容。CLEARSETTALKOFFACCEPT“请输入表文件名”TOFILENAMEUSE(FILENAME)LISTUSE11/19/202277第四章4.2.3顺序结构

例4-1:从键盘随机输入某个表的文件名例:圆的面积计算程序为SETTALKOFFCLEARINPUT“请输入圆半径:”TORS=3.1416*R*R?“圆面积=”,S上述3条命令的先后次序不能颠倒:只有执行INPUT后才能计算S,随后才能输出S,否则会因变量找不到而无法继续下去。11/19/202278第四章例:圆的面积计算程序为11/10/202215第四章4.2.4分支结构

一、简单的条件语句语句格式:IF<逻辑表达式><语句序列>ENDIF功能:首先计算<逻辑表达式>的值,若其值为真,对IF与ENDIF之间的语句顺序执行,然后执行ENDIF后面的语句;若其值为假,直接执行ENDIF后面的语句。11/19/202279第四章4.2.4分支结构

一、简单的条件语句11/10/2022例4-3:将商品销售表.DBF中第一个单价在2500元以上的商品价格降低5%。USE商品销售表LOCATEFOR单价>2500IFFOUND()DISPLAY商品编号,单价REPLACE单价WITH单价*0.95DISPLAY商品编号,单价ENDIFUSERETURN11/19/202280第四章例4-3:将商品销售表.DBF中第一个单价在2500元以二、带ELSE的条件语句语句格式:IF<逻辑表达式><语句序列l>ELSE<语句序列2>ENDIF功能:若<逻辑表达式>值为真,先执行<语句序列1>,然后再执行ENDIF后面的语句;若其值为假,先执行<语句序列2>,然后再执行ENDIF后面的语句。11/19/202281第四章二、带ELSE的条件语句11/10/202218第四章例4-4:铁路托运行李,假设每张车票可按每千克0.5元托运50千克以内的行李,如果超过50千克时,超过部分每千克加价0.3元。计算公式和程序如下:

0.5*W(W<=50,W为行李重量)X=0.5*50+0.8*(W-50)(W>50)

11/19/202282第四章例4-4:铁路托运行李,假设每张车票可按每千克0.5元托运5SETTALKOFFINPUT“请输入行李的重量:”TOWIFW<=50X=0.5*WELSEX=0.5*50+0.8*(W-50)ENDIF?“行李重量为”+STR(W,6,2)+“千克,运费为”+STR(X,6,2)+“元”CANCEL11/19/202283第四章SETTALKOFF11/10/202220第四章语句格式:IF<条件表达式1><语句序列1>ELSEIF<条件表达式2><语句序列2>ELSE<语句序列3>ENDIFENDIF11/19/202284第四章语句格式:IF<条件表达式1>11/10/202221第例4-5:上例托运行李的计算公式改为:

0.5*W(W<=50)X=0.5*50+0.8*(W-50)(100>=W>50)0.5*50+0.8*50+1.0*(W-100)(W>100)11/19/202285第四章例4-5:上例托运行李的计算公式改为:11/10/20222STETALKOFFINPUT“输入行李重量”TOWIFW<=50X=0.5*WELSEIFW<=100X=0.5*50+0.8*(W-50)ELSEX=0.5*50+0.8*50+1.0*(W-100)ENDIFENDIF?“行李运费为:”,XCANCEL

11/19/202286第四章STETALKOFF11/10/202223第四章三、多分支语句

DOCASECASE<逻辑表达式1><语句序列l>CSAE<逻辑表达式2><语句序列2>…………CASE<逻辑表达式n><语句序列n>[OTHERWISE<语句序列n+l>]ENDCASE11/19/202287第四章三、多分支语句11/10/202224第四章功能:执行多分支语句时,系统将依次判断逻辑表达式值是否为真,若某个逻辑表达式值为真,则执行该CASE段的语句序列,然后执行ENDCASE后面的语句。在各逻辑表达式值均为假的情况下,若有OTHERWISE子句,就执行<语句序列n+1>,然后结束多分支语句,否则直接结束多分支语句。11/19/202288第四章功能:执行多分支语句时,系统将依次判断逻辑表达式值是否为真,我们用DOCASE语句来实现例4-5的计算,只要将IF语句的嵌套部分改为:DOCASECASEW<=50X=0.5*WCASEW<=100.AND.W>50X=0.5*50+0.8*(W-50)CASEW>100X=0.5*50+0.8*50+1.0*(W-100)ENDCASE11/19/202289第四章我们用DOCASE语句来实现例4-5的计算,只要将IF语句的例4-6:显示当前季节程序CLEARYue=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=“冬”ENDCASEWAITJJWINDOW11/19/202290第四章例4-6:显示当前季节程序11/10/202227第四章在构成分支结构时需注意:(1)条件语句中的IF和ENDIF必须配对出现;同样,多分支语句中的DOCASE和ENDCASE也须配对出现。(2)为使程序清晰易读,对分支、循环等结构应使用缩格书写方式,见上述例。(3)分支、循环的每种语句都不允许在一个命令行中输入完,必须按本书所示语句格式一行一个回车分行键人。由此可见,这些语句不能用于命令窗口中。11/19/202291第四章在构成分支结构时需注意:11/10/202228第四章4.2.4循环结构

一、条件循环语句格式:DOWHILE<逻辑表达式><语句序列>ENDDO功能:若DOWHILE子句的循环条件为假循环就结束,执行ENDDO子句后面的语句;条件为真则执行循环体,一旦遇到ENDDO就自动返回到DOWHILE重新判断循环条件是否成立,以决定是否继续循环。11/19/202292第四章4.2.4循环结构

一、条件循环11/10/202229第说明:1.语句格式中的<逻辑表达式>称为循环条件,<语句序列>称为循环体,循环体可以是一个语句或一组语句。2.ENDDO语句是循环终止语句,表示循环以此语句为终点。但执行到ENDDO语句时并不是直接退出循环,而是转到DOWHILE语句去判断<逻辑表达式>的值的真假。3.循环语句本身不会修改执行条件,因此循环体内一定要设置修改循环条件的语句。否则,可能出现死循环,无法退出循环。11/19/202293第四章说明:11/10/202230第四章例4-7:试编一程序,显示商品销售表.DBF中所有单价超过2000元的商品编号。CLEARUSE商品销售表DOWHILE.NOT.EOF()IF单价>2000?商品编号ENDIFSKIPENDDOUSE11/19/202294第四章例4-7:试编一程序,显示商品销售表.DBF中所有单价超过例4-8:STORE0TOK1,K2,K3ZS=1DOWHILEZS<=200ACCEPT“请输入选票代号”TOXPDOCASECASEXP=“1”K1=K1+1CASEXP=“2”K2=K2+lCASEXP=“3”K3=K3+1ENDCASEZS=ZS+1ENDDO?“甲得票数:”+STR(K1)?“乙得票数:”+STR(K2)?“丙得票数:”+STR(K3)RETURN11/19/202295第四章例4-8:STORE0TOK1,K2,K31二、步长循环语句格式:FOR<内存变量>=<数值表达式1>TO<数值表达式2>[SETP<数值表达式3>]<语句序列>ENDFOR|NEXT说明:语句格式中的<内存变量>称为循环变量,<数值表达式l>、<数值表达式2>、<数值表达式3>分别称为初值、终值、步长。步长的缺省时值为1。11/19/202296第四章二、步长循环11/10/202233第四章功能:语句执行时,通过比较循环变量值与终值来决定是否执行<语句序列>。步长为正数时,若循环变量值不大于终值就执行循环体;步长为负数时,若循环变量值不小于终值就执行循环体。执行一旦遇到ENDFOR或NEXT,循环变量值即加上步长,然后返回到FOR重新与终值比较。注意:循环体中不需要改变循环变量语句。因为,ENDFOR或NEXT语句会改变循环变量的值。这一点与DOWHILE…ENDDO语句不同。11/19/202297第四章功能:语句执行时,通过比较循环变量值与终值来决定是否执行<语例4-9:编写计算S=1+2+3+…+100的程序。SETTALKOFFCLEARS=0&&S为累加器,初值为0FORI=1TO100&&I为计数器,初值为1S=S十I&&累加NEXT?“S=”,SRETURN11/19/202298第四章例4-9:编写计算S=1+2+3+…+100的程序。1三、扫描循环语句格式:SCAN[〈范围〉][FOR〈逻辑表达式〉]〈语句序列〉ENDSCAN功能:SCAN循环针对当前表进行循环,〈范围〉子句表示记录范围,缺省值为ALL。语句执行时在〈范围〉中依次寻找满足FOR条件的记录,并对找到的记录执行〈语句序列〉。执行到ENDSCAN语句,指针就指向下一条满足条件的记录,继续执行循环体,直到所有的记录都执行完,就结束循环。11/19/202299第四章三、扫描循环11/10/202236第四章

例4-10:根据例4-7的要求,用扫描循环语句编程。CLEARUSE商品销售表SCANFOR单价>2000?商品编号ENDSCANUSE11/19/2022100第四章例4-10:根据例4-7的要求,用扫描循环语句编程。1四、循环辅助语句1.跳转语句格式:LOOP功能:该语句能中断本次循环体的执行,回到循环开始处,重新对条件表达式进行判断。说明:LOOP语句一定放在循环体内才有意义,2.出口语句格式:EXIT功能:终止正常循环,无条件地转到循环终止语句后去执行后续语句。11/19/2022101第四章四、循环辅助语句11/10/202238第四章例4-11:SETTALKOFFCLEARSTORE0TOI,S,TDOWHILEI<=100I=I+1S=S+I&&累加I值IFINT(I/2)=I/2LOOPENDIFT=T+I&&累加奇数ENDDO?“l+2+3+…+100=”,S?”1~100奇数和为:”,TRETURN11/19/2022102第四章例4-11:SETTALKOFF11/10/202例4-12:

@4,10SAY“请输入一自然数:”GETXDEFAULT0

READN=0DOWHILEN<=XIFINT(X/N)=X/NEXITENDIFN=N+1ENDDOIFN=X@6,10SAYSTR(X)+“为素数”ELSE@6,10SAYSTR(X)+“不为素数”ENDIF11/19/2022103第四章例4-12:11/10/202240第四章例4-13:编程修改商品表.DBF中的商品名称和生产单位,要求能修改多个商品。程序如下:CLEARUSE商品表DOWHILE.T.SPBH=SPACE(6)@4,10SAY“请输入要修改的商品编号:”GETSPBHREADLOCATEFOR商品编号=SPBH11/19/2022104第四章例4-13:编程修改商品表.DBF中的商品名称和生产单位,要IFFOUND()@6,10SAY“商品名称”GET商品名称@7,10SAY“生产单位”GET生产单位READELSE@6,10SAY“无此商品!”ENDIFWAIT“是否继续修改?”TOXGIFUPPER(XG)=“Y”LOOPELSEEXITENDIFENDDORETURN11/19/2022105第四章IFFOUND()11/10/202242第四章五、多重循环若一个循环语句的循环体内又包含其它循环,就构成了多重循环,也称为循环嵌套。较为复杂的问题往往要用多重循环来处理。例4-14:编一程序在屏幕上显示九九乘法表。11/19/2022106第四章五、多重循环11/10/202243第四章CLEARA=1DOWHILEA<=9B=1DOWHILEB<=AC=A*B??LTRIM(STR(A,2)),“*”,LTRIM(STR(B,2)),“=”,LTRM(STR(C,2)),“”B=B+1ENDDO?A=A+1ENDDORETURN11/19/2022107第四章CLEAR11/10/202244第四章4.3过程与函数

4.3.1子程序一、调用与返回对于两个具有调用关系的程序文件,常称调用程序为主程序,被调用程序为子程序。主程序执行时遇到DO命令,执行就转向子程序,称为调用子程序。子程序执行到RETURN语句(或缺省该语句),就会返回到主程序继续执行程序,称为从子程序返回,或简称返主。11/19/2022108第四章4.3过程与函数

4.3.1子程序11/10/2022二、带参数子程序的调用与返回DO<程序名l>[WITH<参数表>][IN<程序名2>]功能:带参数调用子程序。说明:(1)<参数表>中的参数可以是常量、变量或表达式,但若为内存变量必须具有初值。(2)当<程序名1>是IN子句<程序名2>中的一个过程时,DO命令调用该过程,请参阅以下过程部分内容。11/19/2022109第四章二、带参数子程序的调用与返回11/10/202246第四章调用子程序时参数表中的参数要传送给子程序,子程序中也必须设置相应的参数接收语句。PARAMETERS<参数表>功能:指定内存变量以接收DO命令发送的参数值,返主时把内存变量值回送给调用程序中相应的内存变量。说明:(l)PARAMETERS必须是被调用程序的第一个语句。(2)命令中的参数被默认为私有变量,返主时回送参数值后即被清除。(3)命令中的参数依次与调用命令WITH子句中的参数相对应,故两者参数个数必须相同,类型必须匹配。11/19/2022110第四章调用子程序时参数表中的参数要传送给子程序,子程序中也必须设置例4-15:设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。主程序:(文件名MAIN.PRG)CLEARYMJ=0@5,10SAY“请输人半径:”GETBJDEFAULT0READDOJSWITHBJ,YMJ?“YMJ=”,YMJ&&显示圆面积RETURN11/19/2022111第四章例4-15:设计一个计算圆面积的子程序,并要求在主程序中带子程序:文件名为JS.PRGPARAMETERSR,SS=PI()*R*R&&PI()函数返回3.14RETURN&&返主三、子程序嵌套主程序与子程序的概念是相对的,子程序还可调用它自己的子程序,即子程序可以嵌套调用。RETURN[TOMASTER|TO<程序文件名>]11/19/2022112第四章子程序:文件名为JS.PRG11/10/202249第四章4.3.2过程

一、过程文件及过程的概念VisualFoxPro6.0允许在一个.PRG文件中设置多个程序模块,将主程序以外的每个模块定义为一个过程。这种包含多个过程的文件称为“过程文件”。“过程文件”实质仍是命令文件,仍使用.PRG为扩展名。其建立的方法与一般命令文件一样用命令:MODIFYCOMMAND<过程文件名>11/19/2022113第四章4.3.2过程

一、过程文件及过程的概念11/10/202一个过程文件可包含128个过程。每个过程都有一个过程名进行标识。过程名的约定与内存变量名的约定一样。过程文件中的每一个过程结构如下:PROCEDURE<过程名><命令序列>[RETURN]注意:每一个过程能完成某一独立的功能,像子程序一样被其它程序调用。但过程不是一个独立的.PRG文件,它只是一个过程文件中的一段程序。而每一个子程序是一个独立的命令文件。因此,过程与过程文件不是同一概念,不可混淆。11/19

温馨提示

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

评论

0/150

提交评论