《VisualFoxPro程序设计教程课件06.ppt》由会员分享,可在线阅读,更多相关《VisualFoxPro程序设计教程课件06.ppt(45页珍藏版)》请在课桌文档上搜索。
1、第6章 Visual FoxPro的结构化程序设计,教学目的和要求 通过本章的学习,使学生掌握程序的概念,掌握结构化程序设计的三种基本结构及用法,能进行简单的程序设计。教学重点 1、掌握程序文件的建立与执行的方法,了解简单输入输出 命令的使用。2、掌握程序的三种结构。3、掌握多模块程序调用及参数传递。4、了解公共变量、私有变量及局部变量的区别。教学难点 1、几种输入输出命令的区别与联系。2、掌握循环语句的特点与应用。3、掌握在参数传递中,实参与形参的概念。,6.1 程序与程序文件,Visual FoxPro的工作方式交互工作方式:在命令窗口中输入命令并立即执行 利用菜单或工具按钮执行命令程序工
2、作方式:利用各种生成器生成程序或者编写 程序,然后执行程序。Visual FoxPro程序设计包括结构化程序设计和面向对象程序设计。结构化程序设计是面向对象程序设计的基础。,6.1.1 程序的概念,程序的概念 程序是能够完成一定任务的命令的有序集合。这组命令以文本的形式存放在文件中,称为程序文件或命令文件,默认文件扩展名为.PRG。程序方式的特点:可以利用编辑器,方便地输入、修改和保存程序;可以用多种方式、多次运行程序;还可以在一个程序中调用另一个程序。程序与交互操作的区别 交互操作一次只执行一条命令,而程序一次能运行多条命令 程序文件可长期保存并且可多次运行,而交互操作不能保存 程序可以完成
3、一些复杂的任务,而交互操作的功能是有限的,6.1.2 程序文件的建立与执行,1程序文件的建立与修改以命令方式建立、修改程序文件 MODIFY COMMAND|?MODIFY FILE|?说明:1、在编辑窗口输入一条条命令 2、w或关闭窗口存盘、q或者放弃存盘 3、程序文件的扩展名为.prg(或.txt等)以菜单方式建立、打开、编辑程序文件例6.1 编写一个计算半径为10米的圆的周长和面积的程序,程序文件名为LS1.prg。R=10 L=2*3.14*R S=3.14*R2?L,S,2运行程序文件,菜单方式运行命令方式运行格式:DO WITH 功能:DO命令默认运行.PRG程序,否则要给出文件扩
4、展名程序的执行过程和结束程序文件被执行时,文件中包含的命令将被依次执行。程序执行遇到以下情况时终止执行或改变执行顺序:程序中所有语句执行完成,返回命令窗口 CANCAL:终止运行,清除私有变量,返回命令窗口 DO:转去执行另一个程序。RETURN:结束当前程序执行,返回上级或命令窗口QUIT:退出Visual FoxPro系统,返回到操作系统。,6.1.3 简单的输入输出命令,1INPUT命令格式:INPUT TO 功能:等待用户从键盘输入数据,用户可以输入任意合法的 表达式。当以回车键结束输入时,系统将表达式的值 存入指定的内存变量,程序继续运行。说明:如果选用,那末系统会首先显示该表达式的
5、值,作为提示信息。输入的数据可以是常量、变量,也可以是一般的表达式。但不能不输入任何内容直接按回车键。输入字符串是必须加定界符,输入逻辑型常量是要用圆点定界符(如.T.,.F.),输入日期时间型常量是要用大括号(如2001-03-01)。,例6.3 编写一个能计算任意半径的圆的周长和面积的程序,程序文件名为LS2.prg。INPUT 请输入圆的半径:TO RL=2*3.14*RS=3.14*R2?半径为:+ALLTRIM(STR(R)+的圆的周长和面积如下:?L,S,2ACCEPT命令格式:ACCEPT TO 功能:等待用户从键盘输入字符串。当以回车键结束输入时 系统将该字符串存人指定的内容变
6、量,程序继续运行说明:如果选用,那么系统会首先显示该表达式的值,作为提示信息。该命令只能接收字符串。用户在输入字符串时不需要加定界符;否则,系统会把定界符作为字符串本身的一部分。如果不输入任何内容而直接按回车键,系统会把空串赋给指定的内存变量。,例6.4 输入姓名,在XSQK.DBF表中查询该姓名对应的学号程序文件名为cxxh.prg。USE“g:zlxsqk.dbf accept 请输入姓名:to xmlocat for 姓名=xm?姓名,学号use,3WAIT命令格式:WAITTO WINDOW功能:该命令显示字符表达式之值作为提示信息,暂 停程序的执行,直到用户按任意键或单击鼠标 时继续
7、程序的执行。说明:如果 值为空串,那么不会显示任何提示信息。如果没有指定,则显示默认的提示信息:“按任何键继续.”。用来保存用户键人的字符,其类型为字符型。无WINDOW参数时,提示信息显示在主窗口中,指定了WINDOW参数时,提示信息以窗口形式在主窗口右上角,例6.5 分屏显示男、女学生的情况,程序文件名为waitcx.prg。USE“g:zlxsqk.dbf“list for 性别=男wait“按任意键显示女学生的情况”window timeout 15list for 性别=女use,4、文本输出命令格式:TEXT ENDTEXT功能:将文本信息内容原样输出在屏幕上举例:用文本输出命令显
8、示系统名称(text.prg)cleartext学 生 管 理 系 统 设计者:王艳玲 endtext,6.2 程序的基本结构,程序的三种基本结构:顺序结构 选择结构 循环结构顺序结构 顺序结构程序的特点是按照语句排列的先后顺序依次执行,即从第一条语句执行到最后一条语句。右图是顺序结构流程图:,6.2.1 选择结构,选择结构的概念 选择结构也叫分支结构,程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的问题。例如判断数的奇偶性、正负,求多分支函数的值等。选择结构包括IF语句和多分支语句。1IF条件语句格式:IF ELSE ENDIF 说明:语句中的是一个逻辑表达式;I
9、F语句根据有无ELSE子句分为单分支结构和双分支结构,格式:IF ENDIF功能:条件成立,执行中各语句,否则直接转到ENDIF后面语句举例:求一个数的绝对值INPUT TO M IF M0 M=-M ENDIF?M?“的绝对值是:”,M,(1)单分支选择结构,(单分支结构流程图),(2)双分支选择结构,格式:IF ELSE ENDIF功能:成立,执行代码,然后转到ENDIF后面语句继续执行;不成立,执行代码,然后转到ENDIF后面语句继续执行,(双分支结构流程图),【例6.9】输入货物重量,计算该货物的托运费,记费标准每公斤为1元,当超过50公斤后,超出数为2元。分别用双分支选择及单分支选择
10、编写程序,程序文件名分别为YH1.prg及YH2.prg。,【例6.10】输入姓名,在XSQK.DBF表中查询该姓名对应的学号、身高及体重,输出结果。程序文件名为ifsay.prg,1、IF和ENDIF必须成对出现。IF是结构入口;ENDIF是结构出口2、条件语句可以嵌套,但不能出现交叉3、编写程序时,为使程序清晰,易于阅读,可按缩进格式书写 举例:从键盘输入一个数,判断是正数、负数、还是0input“请输入一个数据:”to xIF x=0 if x0?“输入的是正数”else?x,“输入的是0”endifELSE?“输入的是负数”ENDIF,选择结构的补充说明,DO CASE CASE CA
11、SE CASE ORTHERWISE ENDCASE功能:多分支语句实现一种扩展的选择结构,它可以根据 条件从多组命令中选择一组执行。,2多分支语句,use g:zlXSQKCLEARtext 1.添加 2.修改 3.打印endtextinput 请选择:to opDO CASE CASE OP=1 APPEND CASE OP=2 BROW CASE OP=3 WAIT“按任一键打印 LIST TO PRINT OTHERWISE?选择错!ENDCASEUSE,例6.11编写一个简单的菜单程序,提供“添加”、“修改”和“打印”三种功能选择并转入相应处理,程序文件名为MCASE.prg。,内容
12、总结,程序的概念程序文件的建立和运行简单输入输出语句INPUT语句、ACCEPT语句、WAIT语句程序的三种结构顺序结构、选择(分支)结构、循环结构分支结构IF语句、多分支语句,6.2.2 循环结构,循环结构的概念 循环结构也称为重复结构,是指程序在执行的过程中,程序中的某段代码被重复执行若干次。被重复执行的代码段,通常称之为循环体。Visual FoxPro 提供了多种循环结构。1条件循环 DO WHILE LOOP EXIT ENDDO,i=1Do while i=5?i i=i+1Enddo?i,循环语句的功能:,执行该语句时,先判断是否成立,如果条件为真,则执行循环体语句,当执行到En
13、dDo时,返回到Do While,再次判断循环条件是否为真,以确定是否再次执行循环体。若条件为假,则结束循环语句,执行EndDo后面的语句。如果第一次判断条件时,条件即为假,则循环体一次都不执行。控制循环的关键是选择一种合适的方法,使条件能由真变假.,循环语句的说明:,如果循环体包含LOOP命令,那么当遇到LOOP时,就结束循环体的本次执行,转到Do While处重新判断如果循环体包含EXIT命令,那么当遇到EXIT时,就结束循环体的执行,转去执行ENDDO后面的语句。通常LOOP或EXIT出现在循环体内嵌套的选择语句中,根据条件来决定是否执行LOOP或EXIT 语句。,【例6.12】编写一个
14、能多次计算任意半径圆的周长和面积的程序,当输入的半径小于或等于0时,程序停止运行。clearr=1do while r0 input请输入半径:to r if r=0 loop endif l=2*3.14*r s=3.14*r2?半径为:+alltrim(str(r)+的圆的周长和面积如下:?l,senddo?程序结束,input请输入半径:to rl=2*3.14*rs=3.14*r2?”周长为:”,l?”面积为:”,s,【例6.13】编写一个可以循环执行的菜单程序,提供“添加”、“修改”和“打印”三种功能选择并转入相应处理,DO CASE CASE OP=1 APPEND CASE OP
15、=2 BROW CASE OP=3 LIST CASE OP=4 EXIT OTHERWISE?选择错!ENDCASE,Use d:tmpxsqkR=1Do while r0 clear text?”?”?”?”endtext input“”to op-Enddouse,【例6.14】计算s=1+2+3+10000的和set talk offclearsum=0i=1do while i=10000 sum=sum+i i=i+1enddo?“s=,sumset talk on计算P=1*2*3*99的积,【例6.15】逐条输出身高大于1.75米的学生记录 clear use f:zlXSQK
16、 locate for 身高1.75 do while.not.eof()display wait continue enddo use,2步长循环格式:FOR=TO STEP ENDFOR|NEXT举例:for i=1 to 10 step 1?i endfor功能:执行该语句时,首先将初值赋给循环变量,然后判断循环条件是否成立(若步长为正值,循环条件为“循环变量=终值”)。若循环条件成立,则执行循环体,然后循环变量增加一个步长值,并再次判断循环条件是否成立,以确定是否再次执行循环体。若循环条件不成立,则结束该循环语句,执行ENDFOR后面的语句。,说明:的值可正可负,默认值为1。、和都可以
17、是数值表达式。但这些表达式仅在循环语句执行开始时被计算一次。在循环语句的执行过程中,初值、终值 和步长是不会改变的。可以在循环体内改变循环变量的值,但这会影响循环体的执行次数。EXIT和LOOP命令同样可以出现在该循环语句的循环体内。当执行到LOOP 命令时,结束循环体的本次执行,然后循环变量增加一个步长值,并再次判断循环条件是否成立,而EXIT则结束循环体的执行,转到ENDFOR后。,【例6.16】用步长循环编写计算s=1+2+10000的程序clears=0for i=1 to 10000 s=s+iendfor?s=:,s&编写s=1+3+5+9999,ClearS=0i=1Do whi
18、le i=10000 S=s+I i=i+1Enddo?“s=”,s,【例 6.17】从键盘输入10个数,找出其中的最大值和最小值 input请输入第一个数:to ami=ama=afor j=1 to 9 input请输入一个数:to a if maa mi=a endifendfor?最大值:,ma?最小值:,mi return,循环结构的复习,Do While 循环(条件型循环)格式:DO WHILE ENDDOFor 循环(步长型循环)格式:FOR=TO STEP ENDFOR|NEXT例1.求1到1000之间所有偶数的和例2.逐条输出XSQK表所有女团员的信息。,use d:tmpx
19、sqk do while not eof()if 性别=“女”and 团员=.t.displayendifskipenddo/n=reccount()for i=1 to nif 性别=“女”and 团员=.t.displayendifskipendforlocate all for 性别=“女”and 团员=.t.do while found()disp continueenddouse,i=2S=0Do while i=1000 s=s+i i=i+2Enddo?sS=0For i=2 to 1000 step 2 s=s+IEndfor?s,3表文件扫描循环格式:SCAN FORWHIL
20、E ENDSCAN功能:执行该语句时,记录指针在当前表的指定范围内自动从上往下依次移到满足条件的记录上,并对每一条记录执行循环体内的命令。说明:的默认值是ALL。当指针移到文件尾时,自动退出循环。EXIT和LOOP同样可出现在循环体内。举例:use xsqk scan all for 性别=“女”and 团员=.t.display endscanuse,【例6.15】用扫描循环编程,逐条输出身高大于1.75米的学生记录,clearuse G:zhang2006vf表xsqkscan for 身高1.75 disp wait endscanuse,4.多重循环 一个循环的循环体中又有另外一个循环
21、时,称为多重循环【例6.19】编程计算s=1!+2!+10!nns=0For n=1 to 10nn=1For I=1 to n nn=nn*IEndifnns=nns+nnEndfor?”nns=”,nnsreturn,上机题(教材习题),1、Use d:tmpxsqkscan 总分=平时*0.2+考试*0.8 do casecase 总分=90 等级=“优”case 总分=75 等级=“良”case 总分=60 等级=“及格”otherwise 等级=“及格”endcase replace 等级 with 等级Endscanuse,2、Use d:tmpxsqkAccept“请输入姓名”t
22、o opLocate for 姓名=opIf found()displayElse?”查无此人”EndifUse,3、Y=0For I=1 to 99y=y+II=I+1Endfor?y,4、Input“请输入整数”to NP=0For I=1 to np=p+I*2Endfor,5、Dimension a(10)For i=1 to 10 input“请输入一个数”to a(i)EndforMa=a(1)Mi=a(1)For I=2 to 10if a(i)ma ma=a(i)endifif a(i)mi mi=a(i)endifEndfor?”最大数:”,ma?”最小数:”,mi,6、In
23、put“请输入整数”to Nn1=alltrim(str(n)For I=q to ni1=alltrim(str(i,)?n1+”*”+i1+”=”?alltrim(str(I*n)endfor,7、For I=1 to 3clear?“请输入口令:x=p=Do while asc(x)0wait to xif asc(x)=0exitendifclear?“请输入口令+replicate(*,len(P)+1)p=p+xEnddoIf alltrim(p)=12345?“欢迎!exitendifEndforIf I=4?“抱歉!endif,8、P=0For I=1 to 10 r=1 fo
24、r j=1 to I r=r*j endfor p=p+1/rEndfor?p,9、ClearText1、添加2、修改3、浏览EndtextAccept“请选择:”to pDo casecase p=“1”appendcase p=“2”browsecase p=“3”listwaitEndcase,循环举例,1、统计XSQK表中姓张、王、李、刘和其他姓的学生的人数2、从键盘输入一个字符串,将其反序输出3、从键盘输入三个数,求出最大的数4、从键盘输入10个数,然后按从小到大输出5、从键盘输入一个数,判断其奇偶性6、求1100之间的所有素数,5、从键盘输入10个数,然后按从小到大输出Dimension a(10)For i=1 to 10input“请输入一个数:”to a(i)EndforFor i=1 to 9for j=i+1 to 10if a(i)a(j)a=a(i)a(i)=a(j)a(j)=aendifendforEndforFor i=1 to 10?a(i),“Endfor,7、求1100之间的所有素数for i=1 to 100flag=.t.for j=2 to i-1&或int(i/2)或int(sqrt(I)if i/j=int(i/j)flag=.f.exit&可省略该语句endifendforif flag=.t.?iendifendfor,