第6章程序设计内容.ppt_第1页
第6章程序设计内容.ppt_第2页
第6章程序设计内容.ppt_第3页
第6章程序设计内容.ppt_第4页
第6章程序设计内容.ppt_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

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

文档简介

6.9顺序结构程序设计,一、顺序结构:根据程序中语句的书写顺序依次逐条执行。流程图如下:,例6.1查找某个学生信息(lz1)Opendatabase教学管理Use学生Accept“请输入学生姓名:”tonameLocatefor姓名=nameDisplayUsereturn,分类:简单分支语句(IFENDIF)选择分支语句(IFELSEENDIF)结构分支(docase-endcase,6.10分支结构,1简单分支语句(Lz1)格式:IFENDIF,IF.T.,ENDIF,.F.,单向IF语句流程图,功能:计算条件表达式的值,若为真(.T.),则执行语句块中的语句;若为假(.F.),不执行语句块。无论执行还是不执行,程序都将转向ENDIF下一条语句继续执行。说明:(1)IF和ENDIF必须配对出现,且分两行书写。(2)条件表达式可以是关系表达式或逻辑表达式。,例6.2Opendatabase教学管理(lz2)Use学生Accept“请输入学生姓名:”tonameLocatefor姓名=nameIffound()DisplayEndif?“结束”Usereturn,例6.3Usezgda(lz3)Locatefor基本工资50公斤SettalkoffInput“请输入行李的重量为:”towIfw2.5PAY=(X-2.5)*1.2+6ELSEPAY=6ENDIF?应付费,ROUND(PAY,0),元CANCEL,例6.5在学生信息.DBF中查找某人,若找到,显示该记录;若找不到,显示“查无此人!”。(lz6)*PROG7.PRGSETTALKOFFUSE学生ACCEPT输入待查找人的姓名:TONAMELOCATEFOR姓名=NAMEIFFOUND()DISPELSE?查无此人!ENDIFUSESETTALKONCANCEL,有学生成绩表:现要统计60分以下有多少人,60到69分的有多少人,70-89分的有多少人,90分以上的有多少人。,3IF语句的嵌套IF-ELSE-ENDIF语句中的语句块里可以包含任何合法的语句,也可以包含另一条IF语句,这就构成了IF语句的嵌套。嵌套IF语句可以解决一入口,三分支甚至更多分支的问题。嵌套形式可以是多种多样的,以下是其中的一种:IFELSEIFELSEENDIFENDIF,If大学英语=90a=a+1ElseIf大学英语=70b=b+1elseIf大学英语=60c=c+1elsed=d+1endifEndifendif,If大学英语60d=d+1ElseIf大学英语70c=c+1elseIf大学英语90b=b+1elsea=a+1endifEndifendif,这样可以不可以?,4结构分支语句格式:DOCASECASECASECASEOTHERWISEENDCASE,功能:依次检测条件表达式的值,一旦某一条件满足,执行相应语句块,然后转到ENDCASE下一条语句。如果所有条件表达式的值都为假,倘若无OTHERWISE子句,则不执行任何语句,直接转到ENDCASE下一条语句;如若有OTHERWISE子句,则无条件执行OTHERWISE与ENDCASE之间的语句块,然后转到ENDCASE下一条语句。说明:(1)如果有两个或两个以上的条件为真,则只执行第一个条件表达式为真的CASE后的语句组,之后即转去执行ENDCASE之后的语句而不会再去判断下一个CASE中的条件。,Docasecase大学英语=90a=a+1case大学英语=70.and.大学英语=60c=c+1otherwised=d+1endcase,也可以这样做Docasecase大学英语60d=d+1case大学英语=70b=b+1case大学英语=90c=c+1otherwised=d+1emdcase,结果是什么?,1当型循环语句格式:DOWHILEENDDO,6.11循环结构,功能:当的值为真(.T.)时,执行循环体中的语句,一旦的值为假(.F.),程序跳出循环体,转到ENDDO下一条语句继续执行。说明:(1)如果条件永远成立,形成死循环。为了避免死循环,在循环体中必须要有语句能够改变条件表达式的值。(2)当循环次数事先未知时,使用DOWHILE-ENDDO语句。(3)循环体中,可以出现LOOP语句。遇到LOOP语句时,程序立即转向DOWHILE循环起始语句,而不再执行LOOP下面的循环体语句。,(4)循环体中,可以出现EXIT语句。遇到EXIT语句时,程序立即跳出本层循环,转向逻辑上的下一条语句继续执行。设置EXIT语句,也是防止死循环的一种方法。DOWHILE语句的流程图,例6.11ClearLZ7use学生成绩store0toa,b,c,ddowhile.not.eof()Docasecase大学英语=90a=a+1case大学英语=70b=b+1case大学英语=60c=c+1otherwised=d+1endcaseskipenddo?a,b,c,d,STORE0TOC,W(LZ8)(用IF语句改写)USEZGDADOWHILE.NOT.EOF()DOCASECASE(年龄45).AND.职称=讲师W=W+1CASE(年龄45).AND.职称=副教授C=C+1ENDCASESKIPENDDO?“45岁以下的讲师人数为:,W?“45岁以下的副教授人数为:,CSETTALKONCANCEL,例6.12统计职工表中,职称是”讲师”和副教授,年龄在45岁以下的教师人数.,例6.3求N!=123N(lzn)inputn=tons=1i=1dowhilei=1979-01-01DISPN=N+1如果已创建的数组元素个数比字段个数少,则自动扩展数组,使得数组元素个数与字段个数相等.2.数组内容复制到当前记录命令格式:Gatherfromfields将数组中的数据复制到当前记录.,第一个数组元素复制到第一个字段,第二个数组元素复制到第二个字段,依次类推,各个数组元素与对应字段的数据类型必须一致.如果数组元素个数比字段个数少,多出的字段保持原值,如果数组元素个数比字段个数多,多出的数组元素不复制.,两条记录换位置use学生lz20listdimensiona(1),b(1)x=Ydowhileupper(x)=Yinput第一条记录tominput第二条记录tongom,scattertoagonscattertobgatherfromagomgatherfrombwait继续吗(Y/N?)toxenddo,例:现有数据库DD.DBF,其结构如下:订单号N(3,0),客户号C(3),签单日期D,金额N(6,2)。数据库TJ2.DBF结构如下:月份N(2,0),数量N(2,0),总金额N(8,2)编程序统计出各个月份所签订单的数量及其总金额,并将结果按月份的升序放在库文件TJ2.DBF。(vf5),settalkoffdimea(12,2)a=0usedddowhile.not.eof()a(month(签单日期),1)=a(month(签单日期),1)+1a(month(签单日期),2)=a(month(签单日期),2)+金额skipenddo,i=1usetj1dowhilei0appeblankrepl月份withi,数量witha(i,1),金额witha(i,2)endifi=i+1enddolistsorton金额totj2usetj2list,现有数据库学生成绩.dbf,有如下结构:lz21学号(c,8),姓名(c,8),大学英语(n,4),语文(n,4),数学(n,4)。编程序统计出每10分间隔的三门功课的人数,并以下列形式显示:分数段大学英语人数语文人数数学人数09*1019*2029*.90100*(vf11),use学生成绩dimes(10,3)s=0dowhile.not.eof()s(int(大学英语/10)+1,1)=s(int(大学英语/10)+1,1)+1s(int(语文/10)+1,2)=s(int(语文/10)+1,2)+1s(int(数学/10)+1,3)=s(int(数学/10)+1,3)+1skipenddoclear,?分数段英语人数语文人数数学人数i=1dowhilei=10?str(i-1)*10,2)+-+str(i*10-1,3)j=1dowhilejN也可以放在一个文件内,此时,在子程序的开头要有Procedure,6.12子程序,三、子程序调用语句调用语句格式:DOWITH说明:WITH是可选项,用于主程序与子程序之间的参数传递。实参表中的各项可以是常量,变量或一般表达式,互相用逗号分开。四、子程序返回语句返回语句格式:RETURNTOMASTER说明:执行子程序时,遇到RETURN命令,就返回到上一级子程序或主程序中的子程序调用命令的下一条语句继续执行。遇到RETURNMASTER命令,就径直返回主程序。通常子程序的最后一条语句是RETURN。如果缺省RETURN,程序执行到最后,自动执行RETURN语句功能,返回主调程序。,下图6-37是子程序嵌套调用时的程序执行过程示意图。,Sub1.prg,Sub2.prg,sub3,Main.prg,例6.32求3!+5!+8!*lz26.PRG(P、N必须在主程序中定义STORE0TOSUM,PN=3DOJC&调用子程序JC.PRGSUM=SUM+P&Sum的值是3!N=5DOJC&再次调用子程序JC.PRGSUM=SUM+PN=8DOJC&第三次调用子程序JC.PRGSUM=SUM+P?3!+5!+8!=,SUMCANCEL,ProcedurejcP=1FORI=1TONP=P*IENDFORRETURN,JC.PRG(子程序)P=1FORI=1TONP=P*IENDFORRETURN注:主程序负责三次调用子程序以及计算总和,子程序负责计算N!。主程序每次调用子程序时都给定N的值,子程序对给定的N值求N!,结果存入变量S。主程序执行时,遇到DOJC语句,程序转入子程序。执行子程序语句时,遇到RETURN语句,程序又返回到主程序DOJC的下一条语句继续执行。,例:main.prgwait“下面调用子程序”dosub1“00000”wait“又返回到主程序”retusub1.prg?1111111dosub2?1111111Retusub2.prg?2222222retu注意:sub11sub2必须是单独的文件。,例:main.prgwait“下面调用子程序”dosub1wait“又返回到主程序”retuproceduresub1?1111111dosub2?1111111RetuProceduresub2?2222222retu注意:主程序和子程序可以放在一个文件内。若把sub2.prg中的retu改成retutomaster,结果是什么?,五、子程序的参数传递格式一:dowith,,格式二:(,)子程序中格式:parameters,(,)注意:parameters必须是被调用程序的第一条语句,而且参数的个数和数据类型必须和被调用语句的参数相一致。调用语句中参数可以是常量、已赋值的变量、或表达式。在调用时参数传递关系如下:,(1)按值传递方式:实参的值只能传递给形参变量,而形参变量的值不会传递给实参变量,当形参变量的值改变时,不会影响实参变量的值,实参和形参占用不同的内存空间。过程名(,)括号不能省过程名(,)parameters(,)(2)引用传递方式:传递实参变量的内存地址,实参变量和形参变量实际上为同一个内存单元,尽管变量名可以不同,如果形参变量的值改变,那么实参变量的值也会跟着改变。引用传递属于双向传递。,do过程名with,过程名(,)parameters(,)(1)如果某个实参变量用一对圆括号括起来,不管采用哪种调用格式,这个实参变量总是按值传递.(2)实参是表达式或者常量时是按值传递。(3)在两种调用格式下,对应的实参变量和形参变量的名字可以相同,也可以不相同.,例:settalkoff(vf12)a=10b=15doswapwitha,b?”主程序:“,a,bswap.prgparametersx,y?子程序,x,yt=xx=yy=tretu,cleara=10b=20Swap1(a,b)?A1=,a,B1=,ba=10b=20doSwap1witha,b?A1=,a,B1=,breturnprocSwap1(x,y)t=xx=yy=tretu,例:编程求1!+2!+N!*jch.prgparas,ts=1i=1dowhilei=ts=s*Ii=i+1enddoreturn*vf13.prg,settalkoffinput“n=“tonw=0p=0j=1dowhilej=ndojchwithp,jw=w+pj=j+1enddo?”w=”,w,STORE100TOX,Ylz27PP(X,Y)?按值传递方式:,x,ydoppwith(x),(y)?按值传递方式:,x,ydoppwithx+5,y+5?按值传递方式:,x,ydoppwithx,y?引用传递方式:,x,ydoppwithx,(y)?两种传递方式:,x,y,procpp(x,y)x=x+100y=y+50?计算结果:,x,yendproc,procpp(x,y)x=x+100y=y+50?计算结果:,x,yendproc,内存变量在程序中起作用的范围称为内存变量的作用域。根据作用域的不同,内存变量分为三类:局部变量、私有变量和全局变量。(1)局部变量(本地变量)格式:LOCAL功能:将中的变量定义为局部变量,其作用域仅在本模块中,不能在上层或下层模块中使用。在物理上,本地变量一经定义,就临时分配了存储单元;一旦离开了本模块,局部变量所占的存储单元被释放,局部变量变成无定义,从而不能再被引用。说明:LOCAL命令与LOCATE命令前四个字符相同,因此不可以缩写为LOCALOCAL命令可以定义局部内存变量和局部数组,且它们的初值皆为.F.例如:LOCALA,B,C(4)&不必再用DIMENSION语句定义C数组?A,B,C(2)结果为.F.F.F.,3内存变量的作用域,(2)私有变量格式:PRIVATE功能:将中的变量定义为私有变量,其作用域在本模块及下属模块中。说明:PRIVATE命令可以定义私有内存变量和私有数组,且它们的初值皆为.F.系统默认,凡在程序中没作任何说明的变量均为私有变量。它在本程序及其被调子程序中有效。一般情况下,私有变量不必用PRIVATE命令作显式说明。当被调子程序与主调程序中有同名变量时,可在被调子程序中对该变量作显式说明,使主调程序中的同名变量在被调子程序中暂时无效。返回主调程序后,主调程序中的同名变量原来的值仍然保留,且变量有效,而被调子程序中的变量变成无效,所占存储单元也被释放。另外,在多人开发程序时为防止主程序与各子程序之间因变量同名而互相影响,可在各自开发的子程序中定义私有变量,以屏蔽主调程序中的同名变量。,(3)全局变量(公共变量)格式:PUBLIC功能:将中的变量定义为全局变量,其作用域涵盖所有程序说明:PUBLIC命令可以定义全局内存变量和全局数组,且初值皆为.F.在命令窗口中建立的变量和数组均为全局变量和全局数组,但这些全局变量和全局数组不能在程序中引用。用PUBLIC定义的全局变量和数组在整个程序运行过程中始终有效,始终占有存储单元。即使程序运行结束,系统也不会自动释放全局变量。删除全局变量只能用RELEASE或CLEARALL等命令。若同一模块中有同名的各种变量,则优先次序为:本地变量私有变量全局变量,求n到m的和clearlz29Input“m=”tomInput“n=“tonDosum1?”M+N的值为:”,sProceduresum1S=0Fori=ntoms=s+IEndfor?”中间结果:”,sReturn,S是在子程序中开辟的变量,有效范围仅在子程序,返回到主程序时,已经从内存中消失。,()同名变量被隐藏某级程序中使用的局部变量,有可能和上级程序中的局部变量同名,为了避免混淆,可在子程序中用private命令定义本级程序专用的局部变量。用private命令定义的变量,能把上级同名的变量暂时隐藏起来,彼此互不影响,子程序运行结束后,在本级程序建立的同名变量即被清除,而被隐藏的上级程序中的同名变量即被恢复出来,而且保留原值不变。命令格式:private,例:settalkoffa=1b=2dosub?”主程序:”,a,bretuprocsubprivateba=100b=200?”子程序:”,a,bretu,settalkoffpublicaaaa=10.2bb=23dofx25withbb?aa,bbretufx25.prgparaccprivateaaaa=20.3cc=aa*2Retu,settalkoffpublica1,b1store1toa1,b1c1=10dos1witha1+b1,c1,a1?a1,b1,c1retuprocs1parax1,x2,x3x2=x1+x3c1=x2+x3b1=b1+1privateb1b1=c1*x2return,1内部过程定义格式:PROCEDUREPARAMETERS|LPARAMETERRETURNENDPROC调用语句格式:DOWITH说明:(1)内部过程是作为程序中的一个独立单位出现的。它可以完成某种操作或某种运算,通常安排在本程序的后面,供本程序调用。(2)若定义中有PARAMETERS|LPARAMETER,称为有参过程,否则称为无参过程。有参过程的PARAMETER命令必须是第一条可执行命令,其形参(也叫虚参)最多27个。为了使过程的功能更强大,适应性更广,过程中应多使用形参。,6.3.2过程,(3)用PARAMETERS声明的形参变量被视为私有变量;用LPARAMETERS声明的形参变量被视为局部变量。(4)实参表中的各项可以是常量,变量或一般表达式,互相用逗号分开。形参表中只能是内存变量,称为形参变量。(5)RETURN语句表示控制返回到调用语句的下一条继续执行。后跟表达式,同时返回表达式的值;不跟表达式,则返回逻辑值.T.。若缺省RETURN,则在过程结束处自动执行一条隐含的RETURN语句。(6)PROCEDURE为过程起始语句,ENDPROC为过程结束语句。若省略ENDPROC,过程结束于下一条PROCEDURE语句或程序文件尾。(7)有关参数传递调用过程时,靠虚实结合进行参数传递。每个实参的值按次序一一传送给虚参变量。虚实结合是按次序而不是按名称逐一结合的。通常实参个数与虚参个数相等,形参个数多于实参个数,多余的形参取初值.F.。虚实结合时,如果实参为常量或表达式,按值单向传送;如果实参为变量,按地址传递。若用内存变量作实参但又不要值的回传,则可将实参变量放在一对圆括号内,使之成为表达式。,例6.34在程序中多次调用内部过程LINE,画一条由30个“-”组成的直线。USEXSDADOLINEFORI=1TO3DISPFIEL学号,姓名,性别,住校否OFFDOLINESKIPENDFORUSECANCELPROCEDURELINEFORJ=1TO30&不能使用I作为循环变量?-ENDFORRETURNENDPROC,例6.35为使上述过程LINE的功能更强,适应性更广,可以增加两个虚参。FORI=1TO3WAIT输入一个字符:TOCINPUT输入字符的个数TONDOLINEWITHC,NENDFORCANCELPROCEDURELINEPARAMETERSCH,MFORJ=1TOM?CHENDFOR?RETURNENDPROC,例6.36利用内部过程计算多边形的面积。S=0&实参S必须有确定的值AREA=0DOTRIANGLEWITH6.1,6.2,8.6,SAREA=AREA+SDOTRIANGLEWITH8.6,7.8,2.4,SAREA=AREA+SDOTRIANGLEWITH7.8,4,4.5,SAREA=AREA+S?多边形的面积为,STR(AREA,6,2)CANCELPROCTRIANGLE&完成已知三边求面积的计算功能PARAX,Y,Z,S&利用形参变量S回传三角形面积L=(X+Y+Z)/2S=SQRT(L*(L-X)*(L-Y)*(L-Z)RETURNENDPROC,多边形面积,A,B,C,D,6.1,6.2,8.6,2.4,4.5,4.0,E,2外部过程内部过程只能被本程序中的调用语句调用。外部过程是将一个过程写成一个程序文件,任何程序都可以通过调用语句对它进行调用,通用性强。外部过程的过程名实际上就是被调用的文件主名。程序文件中的第一条语句是PROCEDURE,这里的必须与文件主名相同,也不能省略,否则出错。PROCEDURE这条语句可以省略,于是形式上就与前面说的子程序吻合了。如果内部过程的过程名与外部过程的文件主名相同,调用时系统执行的是内部过程。,3过程文件外部过程的通用性是强了,但当一个大型应用程序要调用多个外部过程时,要进行多次读盘操作,速度受影响,效率降低。另外,系统允许同时打开的文件数是有限制的。过程文件可以很好地解决这个问题。过程文件中包含多个过程,其建立方法与一般程序文件的建立方法相同,扩展名也是.PRG。过程文件不能运行,只能打开。一旦打开,其中的所有过程均成为内部过程,供程序调用。命令格式:SETPROCEDURETO,,ADDITIVE功能:打开过程文件,使其中的所有过程可供调用。说明:(1)可以同时打开多个过程文件。如果命令中带有ADDITIVE子句,则以前打

温馨提示

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

评论

0/150

提交评论