结构化程序设计讲义(PPT 72页).ppt_第1页
结构化程序设计讲义(PPT 72页).ppt_第2页
结构化程序设计讲义(PPT 72页).ppt_第3页
结构化程序设计讲义(PPT 72页).ppt_第4页
结构化程序设计讲义(PPT 72页).ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构化程序设计,VisualFoxPro程序设计,主讲教师:高骏Emil:704098395,本章要求:1.掌握VFP程序的建立、修改、运行。2.掌握程序的三种基本结构。3.了解过程和过程文件。本章要点:程序的三种控制结构。学时安排:6学时(理论)+6学时(实践),课程要求,结束,作业,第8章程序设计基础,8.1程序文件及其编辑环境8.2程序中几种常用命令8.3程序的基本控制结构8.4过程和用户自定义函数,8.1程序文件及其编辑环境,在ViusalFoxPro中,程序是由一系列ViusalFoxPro可以理解的命令、函数和操作组成的,这些命令和函数可以在ViusalFoxPro中的命令窗口和以人工方式逐一执行,也可以把它们放在一个程序文件中,以文件的形式来执行。【8.1】假定学号的前四位为入学年份,第5,6位为专业代码.编写命令文件test.prg,分别统计所有学生和2010年入学,专业代码为03的学生选修课程号为101课程的平均成绩.,SETTALKOFFSETDEFAULTTOd:学生管理OPENDATA学生管理SELECTAVG(成绩)FROM成绩WHERE;课程号=“101”INTOARRAYm1SELECTAVG(成绩)FROM成绩WHERE;课程号=“101”ANDLEFT(学号,4)=“2010”;ANDSUBS(学号,5,2)=“03”INTOARRAYm2CLEAR?”所有学生的平均成绩:”font“宋体”,20,m1(1)font“宋体”?”指定学生的平均成绩:”font“宋体”,20,m2(1),font“宋体”CLOSEDATASESETTALKONRETURN,(1)以命令方式建立、修改程序文件,ModifyCommand,格式:,功能:,创建、编辑以“程序文件名”为名的程序文件,说明:,1.在编辑窗口输入一条条命令。2.w或关闭窗口存盘、q或者放弃存盘3.程序文件的扩展名为.prg,可以省略。,(2)以菜单方式建立、修改程序文件,文件,新建,文件,打开,已有的程序文件,.prg,8.1.1程序文件的建立和运行,1程序文件的建立,(2)命令方式,(1)菜单方式,程序,运行,Do,格式:,功能:,运行程序文件,程序文件建立后,可以用多种方式、多次执行它。下面是两种常用的方式。,选中,运行,2.程序文件的运行、调用,8.1.2VisualFoxPro编程特点,1.变量不区分大小写,建议的变量命名约定,2.变量不需预先声明,当把一个值保存到某一变量而该变量原先不存在时,VisualFoxPro系统会隐含地声明它,并有初始值存在。用户在变量里放什么数据,变量就是什么类型。,3.命令分行,程序中每条命令都以回车键结尾,一行只能写一条命令。若需分行书写,可以使用分号“;”表示续行。,4.添加注释,VisualFoxPro系统对整行注释和行中部分注释有不同的格式。整行注释使用“*”引导,行中部分注释使用“where职称=zc,【例8.3】输入姓名,在人才档案表中查询某编号对应的姓名,【例8.4】编写程序,浏览专业特长表中不同职称的记录集。,Do8.4请输入职称:教授,Do8.3请输入编号:sh01001Sh01001金银桥,输入字符串时不加定界符,3.Input命令,InputTo,格式:,功能:,(1)如果选用,那么系统会首先显示该提示信息的值,作为提示信息。(2)输入的数据可以是常量、变量,也可以是一般的表达式。但不能不输入任何内容直接按回车键。(3)输入字符串是必须加定界符“”,输入逻辑型常量要用圆点定界符(如.T.,.F.),输入日期时间型常量是要用大括号(如2012-03-01)。,说明:,等待用户从键盘输入数据,用户可以输入任意合法的表达式。当以回车键结束输入时,系统将表达式的值存入指定的内存变量,程序继续运行。,【例8.5】编写命令文件test1.prg,查找指定日期以后出生的学生SETDEFAULTTOd:学生管理OPENDATABASE学生管理INPUT输入日期:TOmrqSELECT学号,姓名,出生日期FROM学生;WHERE出生日期mrq;NOWAITCLOSEDATABASERETURN,Dotest1输入日期:1993-01-01,ClearInput“长方形一边的长为:”TOAInput“长方形另一边的长为:”TOBS=A*B?长方形的面积为:,S,【例8.6】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。程序文件名为8.6.prg,在命令窗口中输入:ModifyCommand8.6,Do8.6长方形一边的长为:5长方形另一边的长为:6运行结果:长方形的面积为:30,屏幕显示,键盘输入,Setdefaulttod:人才管理Input请输入要删除的人的出生日期:toCsrqDeletefrom人才档案where出生日期=CsrqSelect人才档案BrowClosedata,【例8.7】编写程序,将人才档案表中指定的出生日期的记录逻辑删除。,请输入要删除的人的出生日期:1969-02-03,4.格式输入语句,格式:,SaygetSayget.Read,功能:,在指定的行、列位置输入一个常量,当执行到Read语句时,将常量赋值给指定的变量。,说明:,1、多个语句可以配置一个Read语句。但是中间不能有别的语句。2、Get后面的变量要先赋值。,ClearSetdefaulttod:人才管理Use专业特长ExclusiveAccept请输入职称:tozcLocateAllFor职称=zc2,10Say编号Get编号3,10Say专业Get专业4,10Say毕业学校Get毕业学校5,10Say专业年限Get专业年限6,10Say“职称”Get职称ReadClosedata,【例8.8】编写程序,在指定的位置显示修改“专业特长”表中指定职称的记录。,SayPicture,格式:,功能:,(1)在指定的行、列输出表达式的值。(2)格式描述符用来限定数据输出的类型、长度及格式。,8.2.2基本输出语句,1.格式输出语句,常用格式描述符的功能,Use人才档案ExclusiveAccept请输入编号:tobhLocatFor编号=bh13,20Say编号Picture!14,20Say姓名PicturexxxxxxxxxUse,【例8.9】输入编号,在人才档案表中查询某编号对应的姓名。,字符转换成大写,任意字符,x1=Messagebox(您真的要退出系统吗?,4+16+0,退出系统)Ifx1=6ReturnEndif,Messagebox(,),格式:,功能:,在屏幕上弹出一个指定格式的对话框。,说明:,对话框类型是由“按钮个数+显示图标+默认按钮”组成。,提示信息,对话框标题,提示信息,对话框标题,对话框类型,按钮个数,显示图标,默认按钮,2.对话框MessageBox函数,P67,按钮个数代码,显示图标代码,默认焦点按钮的代码,单击对话框按钮的返回值,4+16+0,单击“否”,返回7,返回值送到x1,如果x1=“是”,返回系统,单击“是”,返回6,8.2.3程序结尾命令,1、程序的末尾可以使用Return命令,能使程序执行结束,并返回到调用它的上级程序继续执行,若无上级程序则返回到命令窗口。2、使用另一条命令为Cancel,它可以中止程序运行,并返回到命令窗口。3、使用Quit命令可以结束程序运行退出VisualFoxPro系统,8.3程序的基本控制结构,常见的控制结构如下:1顺序结构顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。VisualFoxPro系统中的大多数命令都可以作为顺序结构中的语句。2分支结构分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。3循环结构循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。,8.3.1顺序结构,顺序结构是一种线性结构。是程序设计中最简单同时也是最基本的结构。它要求顺序地执行每一个基本的加工处理单位。,【例8.10】计算圆的周长和面积。,ClearInput请输入圆的半径:Tor&输入半径c=2*3.14*r&计算圆的周长s=3.14*r*r&计算圆的面积?圆的周长:,c&输出周长?“圆的面积:”,s&输出面积Return,8.3程序的基本控制结构,分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句。,IfEndIf,格式:,功能:,首先计算条件表达式的值,当条件表达式的值为真时,执行语句序列;否则,执行EndIf后面的第一条语句。,1.简单的条件语句,8.3.2条件分支结构,ClearInputX=TOxInputY=TOyIfx/3=Int(x/3)y=y+xEndIf?Y=,y,【例8.11】编写程序:先从键盘接收两个数x和y,然后判断x能否被3整除。如果x能被3整除,那么y的值增加x;否则y的值不变。,Ifmod(X,3)=0,【例8.12】编写程序:修改“专业特长”表中的数据,把编号为“zj01002”的职称从“副教授”改为“教授”。,ClearUse专业特长ExclusiveLocateFor编号=zj01002If职称=副教授Replace职称With教授EndIfBrowseLast,2.带Else的条件语句,If条件表达式语句序列1Else语句序列2EndIf,格式:,功能:,该语句首先计算条件表达式的值,当条件表达式的值为真时,执行语句序列1中的命令;否则,执行语句序列2中的命令;执行完命令行序列1或命令行序列2后都将执行EndIf后面的第一条语句。,【例8.13】输入一个姓名,在“学生”表中查找该姓名的学生,如果找到,显示该记录的姓名、性别和出生日期,否则显示“查无此人!”,程序名为test2.prg,SETDEFAULTTOd:学生管理OPENDATABASE学生管理USE学生IN0SELECT学生ACCEPT“请输入待查学生姓名:”TONAMELOCATEFOR姓名=NAMEIFEOF()=.F.?”姓名:”+姓名FONT“宋体”,20?”性别:”+IIF(性别=.t.,“男”,”女”)FONT“宋体”,20?”出生日期:”+DTOC(出生日期,1)FONT“宋体”,20ELSE?”查无此人!”FONT“宋体”,20ENDIFCLOSEDATABASERETURN,messagebox(“查无此人!”,0+48+0,”例8.13”),语句执行时,依次判断Case后面的条件是否成立。当发现某个Case后面的条件成立时,就执行该Case和下一个Case之间的语句序列,然后执行EndCase后面的语句令。如果所有的条件都不成立,则执行Otherwise与EndCase之间的语句序列,然后转向EndCase后面的语句。,3.多分支语句,DoCaseCase条件表达式1语句序列1Case条件表达式2语句序列2Case条件表达式N语句序列NOtherwise语句序列N+1EndCase,格式:,功能:,不管有几个Case条件成立,只有最先成立的那个Case条件的对应命令序列被执行。如果所有的Case条件都不成立,且没有Otherwise子句,则直接跳出本结构。DoCase和EndCase必须配对使用,DoCase是本结构的入口,EndCase是本结构的出口。DoCase和第一个Case子句之间不能插入任何命令。,说明:,DoCaseCase条件表达式1命令行序列1Case条件表达式2命令行序列2Case条件表达式N命令行序列NOtherwise命令行序列N+1EndCase,Input请输入考试成绩:ToxDoCaseCasex60?不及格Casex70?及格Casex80?中等Casex90?良好Otherwise?优秀EndCase,【例8.13】显示当前季节。程序文件如下。,ClearYue=Month(Date()DoCaseCaseyue4jj=春Caseyue7jj=夏Caseyue6500,ClearInput请输入收入:ToPDoCaseCaseP=3500R=0CasePct=a,a=cc=tEndifIfbct=bb=cc=tEndif?“排序后,a,b,c,a,b排序,a,c排序,B,c排序,8.4循环结构程序,循环结构也称为重复结构,是指程序在执行的过程中,程序中的某段代码被重复执行若干次。被重复执行的代码段,通常称之为循环体。,1.条件循环,根据条件表达式的值决定循环体内语句的执行次数。,格式1:,功能:,DoWhileEndDo,首先计算条件表达式的值,当条件表达式的值为真时,执行循环;否则,执行EndDo后面的第一条命令。如果第一次判断条件为假,一次也不循环。,【例8.17】统计“人才档案”表中工资超过7000元的人数。,ClearSetdefaulttod:人才管理Use人才档案ExclusiveGoTopRc=0DoWhileEof()=.f.If工资现状7000rc=rc+1EndIfSkipEndDo2,30Say工资在7000元以上的人2,60SayrcUse,ClearSetdefaulttod:人才管理Use人才档案ExclusiveLocatefor工资7000Rc=0DoWhileEof()=.f.rc=rc+1continueEndDo?工资在7000元以上的人“,rcUse,ClearS=0I=1DoWhileI=170?参加模特比赛!C=C+1else?参加健美操比赛!D=D+1EndifEndIfSUM=SUM-1EndDo?参加篮球比赛的人数,A?参加足球比赛的人数,B?参加模特比赛的人数,C?参加健美操比赛的人数,D,A=0B=0C=0D=0Sum=50DoWhileSUM0Acce请输入你的性别TO性别Input请输入你的身高TO身高If性别=男“if身高=180?参加篮球比赛!A=A+1,2.步长循环,步长循环控制语句,即根据循环变量的初值、终值和步长,决定循环体内语句的执行次数。,For=ToStepEndFor|Next,格式:,功能:,首先将初值赋给循环变量,然后判断循环条件是否成立(若步长为正值,循环条件为“循环变量=终值”)。若循环条件成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件是否成立,以确定是否再次执行循环体。若循环条件不成立,则结束该循环语句,执行EndFor后面的语句。,1、省略Step步长,则步长为默认值1;2、初值、终值和步长都可以是数值表达式,当初值小于终值,步长必须为正,当初值大于终值,步长必须为负才可以循环;3、可以在循环体内改变循环变量的值,但会改变循环执行次数;4、Exit和Loop命令可以出现在循环体内。执行Loop命令时,结束本次循环,循环变量增加一个步长值,返回For循环头判断循环条件是否成立。执行Exit命令时,程序跳出循环,执行循环尾后面的语句,说明:,注意:,1、循环终止的条件是:“循环变量的值超出终值”,而不是循环变量的值等于终值。2、超出的含义:当为正时,检查是否大于当为负时,检查是否小于当步长为0时,循环永不终止。,For=ToStepEndFor|Next,For=ToStepEndFor|Next,ClearS=1I=1DoWhileI=180?参加篮球比赛!A=A+1else?参加足球比赛!B=B+1EndifElseif身高=170?参加模特比赛!C=C+1,【例8.24】输入任意10个整数,将所有正整数显示出来。,ClearFori=1to10Input“输入一个整数”ToaIfa0?aElseLoopEndifEndFor,在For循环语句中执行Loop语句,将会先修改循环变量的值,然后转向循环语句头部。,3扫描循环,扫描循环控制语句,即根据表中的当前记录指针决定循环体内语句的执行次数,扫描当前表中满足表中的记录。,ScanForWhileEndScan,格式:,功能:,执行该语句时,记录指针在当前表的指定范围内自动从上往下依次移到满足条件的记录上,并对每一条记录执行循环体内的命令。,(1)的默认值是All。(2)当指针移到文件尾时,自动退出循环。,说明:,【例8.25】用扫描循环控制语句,统计人才档案数据表中男同学的人数。,clearRc=0Use人才档案ExclusiveScanallfor性别=“男”rc=rc+1EndScan?“男同学的人数为,rcUse,【例8.26】用扫描循环控制语句,显示人才档案数据表中年龄大于等于25的记录。,clearUse人才档案ExclusiveScanallforyear(date()-year(出生日期)=25display编号,姓名EndScanUse,练习:下列程序段执行后,输出结果是:,记录号名称1男子排球2女子排球3男子足球4女子足球5男乒乓球,Use运动员表ExclusiveGo2ScanNext4ForLeft(名称,2)=“男IfRight(名称,2)=“球ExitEndifEndscan?名称,男子足球,4.多重循环,如果在一个循环内包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。下面是几种常见的二重嵌套形式:,1.ForI=.ForJ=.NextJ.NextI,2.FORI=.DOWHILE.ENDDO.NEXTI,3.DOWHILEL.DOWHILE.ENDDO.enddo,对于循环的嵌套,要注意以下事项:(1)内循环变量与外循环变量不能同名;(2)外循环必须完全包含内循环,不能交叉;(3)不能从循环体外转向循环体内,也不能从外循环转向内循环。,ForAForBForCNextCNextBNextA,ForAForBForCNextBNextANextC,不能交叉,正确的嵌套,错误的嵌套,【例8.27】分析下面程序的运行结果:,clearFori=1To3Forj=5To7?I,jNextjNextiReturn,151617252627353637,对于两个具有调用关系的程序文件,常称调用程序为主程序,被调用程序为子程序。子程序的建立和一般命令文件的建立方法相同,都是ModifyCommand,文件默认的扩展名还是Prg。调用方法是在主程序中用Do命令。,8.4.1主程序和子程序,Do子程序文件名,ModifyCommand过程文件名,文件格式:,与程序一样,主程序调用:,返回主程序:,ReturnToMaster,建立子程序:,没有可选项,返回到调用处,有可选项,返回到调用的最高一级。,1.子程序的调用和返回,8.4过程和用户自定义函数,【例8.28】分析下面程序的运行结果:,&MAIN.PRGClearDoJADoJBDoJCReturn,&JA.RPG?*DoJBDoJCReturn,&JB.RPG?#Return,&JC.RPG?*ReturnToMaster,【例8.29】利用子程序计算圆的面积:,*主程序:DoWhile.T.ClearWait“是否要计算圆的面积(Y/N)?”TojaIfUpper(ja)=“Y”&为“N”时结束程序Dozcx1.prgElseExitEndifEnddoReturn,*子程序zcx1:ClearInput输入圆的半径:tobjS=3.14*bj*2?圆的面积为:,sReturn,2.带参数的子程序调用,调用子程序时参数表中的参数要传送给子程序,子程序也必须设置相应的参数接受语句。Parameters可以完成此项功能,但是必须是子程序的第一条语句。,主程序调用:,子程序接收:,Do,Parameters,各种各类型的常数、有具体值的变量,没有具体指的变量,个数、位置和类型要和主程序的实际参数一样,但是名字可以不一样。,例如:,主程序:DozcxWith“张三”,89,性别子程序:Parametersa,b,c,变量姓名必须是赋过值的,变量没有具体值,【例8.30】利用子程序计算圆的面积:,*主程序:Clearymj=0&初始化用于接收圆面积的变量Input“请输入圆的半径:“TobjDozcx2Withbj,ymj&带参数调用子程序7,10Say圆的面积为:+Str(ymj,10,2)Return,*子程序zcx2:Parameterscj,sS=3.14*cj*2Return,变量bj初始值为0,计算后的面积,函数名(实际参数表),3.自定义函数,自定义函数与子程序的区别在于自定义函数必须返回一个函数值,而子程序则无此限制。,主程序调用格式:,FunctionParameters命令序列Return,如果是单独的程序,就可以省略这一句,如果自定义函数和主程序是一个程序,不能省略。,从表达式返回函数值到主程序,自定义函数格式:,例如:,主程序:?a1(bb)自定义函数:ParametersbbReturnbb,【例8.31】利用自定义函数计算圆的面积:,*主程序:clearInput“请输入圆的半径:“Tobj7,10Say圆的面积为:+str(zcx3(bj),10,2)Return,带参数调用自定义函数zcx3,*自定义函数zcx3:ParametersrS=3.14*r*2Returns,调用时bj是半径,返回时,bj是面积,*主程序:clearInput“请输入圆的半径:“Tobj7,10Say圆的面积为:+str(zcx3(bj),10,2)Return*自定义函数Functionzcx3ParametersrS=3.14*r*2Returns,如果主程序和自定义函数放在一个文件中,那么一定要加上这么一句。,8.4.2过程文件,多个过程可以保存在一个过程文件中。过程文件打开后,其中的过程能被任何其它程序调用。称为内部过程调用。要调用内部过程,需在主程序中首先打开过程文件,然后再调用过程文件中的过程。,打开过程文件:,调用过程:,关闭过程文件:,SetProcedureTo,Dowit

温馨提示

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

评论

0/150

提交评论