《程序的三种基本控制结构分析.doc》由会员分享,可在线阅读,更多相关《程序的三种基本控制结构分析.doc(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#+ 程序的三种基本控制结构顺序结构 选择结构 循环结构一、 顺序结构:顺序语句由语句序列组成,程序执行时,按照语句的顺序,从上而下,一条一条地顺序执行如:store Visual FoxPro to nameAge = 4? My name is + name + , I am ;+ str(Age) + years old一、二、选择结构:分支语句根据一定的条件决定执行哪一部分的语句序列。二、1、 单分支结构 格式: if endif 例程1:clear use sb wait 是否打印?(y/n) to a if upper(a)=Y wait 请接好打印机!按任意键后打印 list t
2、o print endif2、 双分支选择格式: if else endif例程2: clearset talk offaccept 请输入密码: to mmif mmabc?你无权使用本系统quitelse?欢迎使用本系统endifset talk onif语句的嵌套:在一个if语句中包含另一个语句的程序结构例程3:根据输入的x值,计算下面分段函数的值,并显示结果。 2x-5 (x1) Y= 2x (1=x=10) input 请输入x的值: to x if x1 y=2*x-5 else if x=90 ?成绩优秀 case nscore=80 ?成绩良好 case nscore=70 ?
3、成绩中等 case nscore=60 ?成绩较差 case nscore=0 ?成绩不及格 otherwise ?成绩应大于0,数据有错 endcase ?程序执行完毕 set talk on三、循环结构:循环语句使同一个语句组根据一定的条件执行若干次。l有三种循环语句:DO WHILEFOR语句组表达式假.f.真.t.SCAN1、do while 循环语句1. do while 循环l语句格式1DO WHILE 逻辑表达式ENDDO例程1:计算1+2+3100set talk offclears=0I=1Do while I=100s=s+II=I+1Enddo?1100的和为:,s re
4、turn语句格式2:DO WHILE 逻辑表达式 命令序列1loopexitENDDOLoop语句是循环短路语句,当程序执行到loop语句时,被迫结束本次循环,不再执行loop后面至enddo之间的语句序列,而是返回do while处重新判断条件 Exit语句是循环断路语句。当程序执行到exit语句时,被迫中断循环,转去执行enddo语句后的语句。例程2:循环输入学生姓名,查找并显示该学生的情况,直到用户停止输入。Set talk offClearStore y to ynUse 学生Do while .t.Accept 请输入学生姓名:to nameLocate for 姓名=nameIf
5、found()?学号+学号?姓名+姓名else?没有+name+这个学生endifwait 是否继续查找(y/n)?to ynif upper(yn)=Y?loopelseexitendifenddo?程序结束useset talk onreturn读程练习:1、set talk offuse 学生name=space(8)10,5 say 请输入学生姓名get namereadlocate for 姓名=nameif found()dispelse12,5 say 该单位无此人endifset talk onusereturn2、统计学生表中男女学生人数set talk offclearus
6、e 学生store 0 to nman,nwomando while !eof()if 性别=男nman=nman+1elsenowman=nwoman+1endifskipenddo?男生人数为:+str(nman)?女生人数为:+str(nwoman)useset talk onreturn3、逐条输出学生表中1984年出生的学生记录clearuse 学生index on year(出生日期) tag csrqseek 1984do while year(出生日期)=1984dispskipenddousereturn4 1100之间全部奇数之和set talk offstore 0 to
7、 x,ydo while .t.x=x+1do casecase int(x/2)=x/2loopcase x=100exitotherwisey=y+xendcaseenddo?0100之间的奇数之和为:,yset talk onreturn作业:1、使用do while语句逐条显示学生表中的每一条记录 2、算出1100之间的所有偶数的和 3、从键盘输入一个整数,求出此整数的阶乘2、for循环语句 do while语句适用于循环次数未知的循环 for语句适用于循环次数已知的循环 l语句格式FOR 循环变量 = 初值 TO 终值 STEP 步长 语句组ENDFOR/NEXT能循环结构的执行过程
8、是:先为循环变量设置初值(该变量一般为数值型内存变量),然后判断其值是否超过终值。若没超过,执行循环体,遇到endfor时使循环变量增加一个步长值(步长省略,则默认为1),然后返回到for语句处,将循环变量的当前值与循环终值比较,没有超过,继续执行循环体,直至循环变量的当前值超过终值或执行到exit语句,程序才退出循环,执行enddo后面的语句。说明:1、FOR语句适用于循环次数已知的情况2、如果没有给出步长,步长缺省为13、步长可以是正数、负数当STEP0,变量=终值时,语句组执行当STEP=终值时,语句组执行例程1:for I=1 to 10?Iendfor结果为:1 2 3 4 5 6
9、7 8 9 10例程2:for I=10 to 1 step 4?Iendfor结果为:10 6 2例程3:计算1+2+3100s=0for I=1 to 100s=s+Iendfor?s例程4:求所有的水仙花数(153=13+53+33)clearfor m=100 to 999a=int(m/100)b=int(mod(m,100)/10)c=m%10if m=a3+b3+c3?mendifendforreturn例程5 从键盘输入10个数,编程找出其中的最大值和最小值set talk offclearinput “请输入一个数:” to astore a to max,min for I
10、=2 to 10 input “请输入一个数:” to a if maxa min=a endifendfor?”最大值为:”,max?”最小值为:”,minset talk on程序练习:1、设有如下程序set talk offclearuse gzdo while !eof() if 基本工资=800 skip loop endif disp skipenddouse return该程序实现的功能是:2、执行下列程序:set talk offstore 0 to x,ydo while x=1a(k)=a(k)-a(k+1)k=k-1enddo?a(2),a(4),a(6)set talk
11、 on return4、程序如下s=0I=1Do while Izf=0do while not eof()m-zf=m-zf+zfskipenddo?m-zfreturn6、执行如下程序:store “ ” to ansdo while .t.clear3,10 say “1.添加 2.删除 3.修改 4.退出”5,15 say “请输入选择:” get ansreadif val(ans)=1prog=”prog”+ans+”.prg”do &progendifquitenddo如果在屏幕显示“请输入选择:”时,输入4,则系统将()7、在下列程序中,如果要使程序继续循环,变量m的输入值应为
12、()do while .t. wait m=to m if upper(m)$yn exit endifenddo8、下列程序执行时,在键盘上输入9,则屏幕上的显示结果是()input “x=”to xdo casecase x10?”ok1”case x20?”ok2”otherwise?”ok3”endcase3、scan循环语句语句格式:SCAN 范围FOR 逻辑表达式WHILE 逻辑表达式语句组ENDSCAN说明:范围省略时,默认是all格式1:scan 范围 FOR 逻辑表达式从范围内的第一条记录开始,计算逻辑表达式,对逻辑表达式结果为.t.的记录进行操作。如果没有FOR子句,相当于
13、FOR .t.格式2:scan 范围 WHILE 逻辑表达式从指定范围内第一条记录开始,计算逻辑表达式,如果结果为.t.,继续循环,如果结果为.f.时,立即结束循环。如果没有指定WHILE部分,相当于:WHILE .t.例1use 学生scan dispendscanuse这里的SCAN部分与下面的语句等价:go topdo while not eof()dispskipenddo例2:use 学生scan rest for 学号3 dispendscanuse与下面的语句等价:use 学生DO WHILE not eof()IF 学号3DISPENDIFSKIPENDDO例3、对学生表,分别
14、统计少数民族男、女学生的人数。clearstore 0 to x,yuse 学生scan for 少数民族否 if 性别=男 x=x+1 else y=y+1 endifendscan?”少数民族男生有”+str(x,2)+人?”少数民族女生有”+str(y,2)+人use return循环嵌套:当在一个循环程序段的循环体内完整的包含另一个循环程序段时称为循环嵌套。形式如下:1、do while do while enddoenddo2、FOR 循环变量 = 初值 TO 终值 STEP 步长FOR 循环变量 = 初值 TO 终值 STEP 步长 语句组ENDFOR/NEXTENDFOR3、 d
15、o while FOR 循环变量 = 初值 TO 终值 STEP 步长 语句组ENDFOR/NEXT能 enddo4、 FOR 循环变量 = 初值 TO 终值 STEP 步长 do while enddoENDFOR/NEXT能5、do while scan endscan enddo等等例程1、写出程序的运行结果clearfor I=1 to 9?str(I,3)next?replicate(=,30)?for I=1 to 9 for j=1 to 9 ?str(I*j,3) next?next程序结果为:例程2、打印九九乘法口诀表for x=1 to 9y=1 do while y=x
16、z=x*y ?str(y,1)+*+str(x,1)+=+str(z,2)+ y=y+1 enddo? endfor程序的执行结果:1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81例程3:输入10个数,并将它们按由大到小的顺序输出。 ClearDimen data10Store 0 to dataFor I=1 to 10I,5 say 请输入第+str(I,2)+”个数” get dataIendforreadfor I=1 to 9 for j=I+1
17、 to 10 if dataIdataj temp=dataI dataI=dataj dataj=temp endif endforendfor12,5 say 10个数由大到小的排列顺序为:14,5 say for I=1 to 10?dataIendfor三种语句结构总结:1、都是单入口、单出口2、IF/ELSE/ENDIF、DO CASE/ENDCASE、DO WHILE/ENDDO、FOR/ENDFOR、SCAN/ENDSCAN必须配对使用,都不能在交互方式下使用(命令窗口方式)3、可以相互嵌套使用,语句结构中的语句组中可以包含任何语句结构。如果省略 RETURN 命令,在程序结束处
18、自动隐含执行 RETURN 命令。 9.5程序的模块化子程序:可以完成一个特定功能的小程序,特点是总是被其他程序调用一般不单独执行(编一次,重复用) 子程序的建立、修改和存盘与一般的程序文件一样,其扩展名也为.prg 过程 无返回值子程序 自定义函数 有返回值?这是子程序waitreturnSet talk offClear?这是主程序do bb?主程序执行完毕主程序aa 子程序bb子程序b 主程序 子程序a.returnDo bdo creturndo a子程序c.return to master一、过程过程的一般格式:procedure parameters returnendproc说明
19、:1、当一个过程单独保存在一个命令文件中,proc 和endproc可以省略,该过程的名称就是命令文件名。 2、parameters 写在proceduer下面的第一行。如省略则该过程为无参过程。 调用无参过程的格式为:do 过程名 调用有参过程的格式为:do 过程名 with 参数表参数按传递的方式分为:值传递方式:当一个值在被调用过程中更改时,新值不传回,调用程序中相关的变量或数组的值不变引用传递方式(地址传递方式)当一个值在被调用过程中更改时,新值传递回调用程序中相关的变量或数组默认情况下,调用过程时实参以引用传递方式向过程传递。在 DO . WITH 语句的参数列表中用括号把变量或数组
20、括起来,将按值方式传递。例程1: area=0store .t. to repdo while rep clearinput 请输入第一边大小: to xinput 请输入第二边大小: to yinput 请输入第三边大小: to zif x=0.or.y=0.or.z=0.or.x+y=z.or.y+z=x.or.x+z=y?不能构成一个三角形,请重新输入!loopendifrep=.f.enddodo sub with x,y,z,area (实参)?area=+str(area,6,2)return proc subpara a,b,c,s (形参)p=(a+b+c)/2s=sqrt(p
21、*(p-a)*(p-b)*(p-c)return例程2:利用带参调用方法求3项阶乘之和:x!+y!+z!clearstore 0 to tinput x= to xinput y= to yinput z= to zdo sub with x,tnsum1=tdo sub with y,tnsum2=tdo sub with z,tnsum3=tnsum=nsum1+ nsum2+ nsum3?str(x)+”!+”+ str(x)+”!+”+str(x)+”!=”+str(nsum)cancelproc subpara n,kk=1for I=1 to nk=k*Iendforreturne
22、ndproc运行程序结果为:x=2y=3z=42!+3!+4!=32过程文件:将多个过程存放在一个程序文件中,此程序文件就是一个过程文件。扩展名为.prg过程文件的建立: modi comm. 过程文件的基本结构如下: proc endprocproc endprocproc endproc过程文件的打开和关闭:过程文件中只包含过程,这些过程能被其他程序调用。但在调用过程文件中的过程之前,必须先打开过程文件。命令格式:set proc to 过程文件使用之后,应将其关闭,关闭过程文件的命令是:格式1:close proc格式2:set proc to 例程: 程序14.prg 内容如下 set
23、 proc to subclear?-过程调用-wait 现在调用过程1do sub1wait 现在调用过程2do sub2?-过程调用结束close proccancel过程文件sub.prg内容如下proc sub1wait 现在运行过程1returnendprocproc sub2wait 现在运行过程2returnendproc二、自定义函数:用户除了可以使用vfp提供的内部函数外,还可根据自己的需要定义进行某种运算或操作的函数,这些函数被称为自定义函数。定义格式:FUNCTION 函数名PARAMETERS 参数列表RETURN 表达式 (指出函数的返回值)endfunc说明:1、当
24、函数单独存放在一个命令文件中时,语句func 函数名和endfunc可以省略。2、如果return后的表达式省略,则返回.t.3、默认情况下,以值传递方式向用户自定义函数传递参数。用 SET UDFPARMS TO REFERENCE 命令以引用传递方式向用户自定义函数传递变量。强制指定:(变量):值方式传递变量:引用方式传递自定义函数的调用格式: 函数名(参数表)例程:定义一个判断n是否是一个素数的函数,然后调用该函数求2100内的全部素数。 素数是大于1的整数,且除了1和它本身以外,不能被其他任何整数整除。为了判断某数n是否为素数。一个简单的办法是用2,3n-1这些数逐个去除n,看能否除尽
25、,如果全部都除不尽,则n是一个素数,否则,只要其中一个数除尽了,则n不是素数。为了减少除的次数,可以使用另外一种算法,除到即可。Prime.prg程序内容如下 (判断n是否是素数的函数)Para nFlag=.t.K=int(sqrt(n)J=2Do while j=k.and.flagIf mod(n,j)=0Flag=.f.Endifj=j+1enddoreturn flagmain.prg 调用该函数求2100内的全部素数for m=2 to 1000if prime(m)?mendifendfor作业:1、利自定义函数的方法求3项阶乘之和:x!+y!+z! 2、 12223333344
26、44444555555555变量的作用域:(内存变量在什么范围内是有效的)按作用域的不同将内存变量分为3种1、全局变量格式:public public (,说明:(1)全局变量定义后,系统自动赋初值为.f. (2)全局变量产生后,在任何模块中都可以使用,并在程序运行期间始终有效,程序运行完毕也不会从内存中自动释放,必须用clear memory或release等命令予以消除或者执行quit命令退出vfp应用系统 (3)在vfp命令窗口中建立的内存变量为全局变量2、局部变量格式:local local (,说明:(1)局部变量定义后,初始值为.f. (2)只在定义它的程序中有效,一旦该程序运行完毕,局部变量自动清除3、私有变量没有通过public和local定义而在程序中直接使用的变量私有变量在定义它的程序以及该程序的下属子程序中有效,一旦建立它的程序运行结束,这些私有变量自动清除。局部变量和私有变量的比较:r=100 r=100p=0 local pdo sub p=0return do subproc sub return?p proc subreturn ?p结果:0 return 结果:出现错误提示-找不到p变量