第九章 结构化程序设计_第1页
第九章 结构化程序设计_第2页
第九章 结构化程序设计_第3页
第九章 结构化程序设计_第4页
第九章 结构化程序设计_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章 结构化程序设计9.1 程序文件的建立、执行和编译 Visual Foxpro数据库管理系统提供了交互执行和程序执行二种工作方式。 所谓程序执行方式,就是将实现某一功能的VFP命令序列,在编辑器中编成特定的程序文件,存放在磁盘中,其文件扩展名为Prg。当我们需要实现这一功能时,就执行该程序。一、 程序文件的建立 1命令方式 Modify Command 2菜单方式 单击系统菜单“文件”、“新建”,弹出“新 建”窗口。 在“新建”窗口中,选择“程序”、“新建文 件”,进入“程序文件编辑”窗口。 在“程序文件编辑”窗口中,逐条输入命令行。 结束后,单击系统菜单“文件”、“保存”,在 窗口的“

2、保存文档为:”对话框中,输入程序文 件名,默认的文件类型为*.Prg,单击“保存” 按钮,建立程序文件的操作结束。二、 程序文件的执行 程序文件保存在磁盘上,在需要运行时可从磁盘调入内存执行。 注意:程序运行后,会自动产生一个文件类型为.Fxp的同名的编译程序。1命令方式 Do程序文件名2菜单方式 单击系统菜单的“程序”、“运行”,在弹出的“运行”窗口中,选择路径、双击需要运行的程序名。二、 程序设计中的常用语句 程序设计中的常用语句包括输入语句、输出语句、终止程序执行语句、清屏与注释语句。1、 输入、输出语句 输入语句是程序运行时人机交互的界面,用于输入程序运行时所需要的数据。而输出语句是用

3、于输出程序运行的结果。1输入语句 输入语句提供了在程序运行的过程中暂停程序的执行,等待用户从键盘上输入数据,当用户以回车键结束输入时,系统将表达式的值存入指定的内存变量,程序继续运行。输入语句有非格式化输入命令和格式化输入命令两种。(1)非格式化输入命令 非格式化输入命令共有三条: Input、Accept和Wait。Input To内存变量Accept To内存变量Wait To内存变量参数说明: Input命令能接受除备注型、通用型以外的数据类型,但数据为字符型、日期型或逻辑型时应使用相应的定界符。 Accept命令只接受字符型数据。输入字符串时,不需要用定界符。 Wait To内存变量命

4、令只接受单个字符。如果执行不带任何参数的Wait命令会弹出“按任意键继续”的提示。 例:在学生档案表中,按姓名直接定位查询学生记录。 Use 学生档案表 Accept ”请输入查询学生的姓名:” To A1 Locate For 姓名=A1 Display例:在学生档案表中,按年龄顺序定位查询学生记录。 Use 学生档案表 Input “请输入查询学生的年龄:” To A2 Locate For 年龄=A2 Display Continue Display(2)屏幕格式输入语句 在指定行、列的位置,从键盘上为变量赋值。这个变量可以是内存变量,也可以是字段变量。 如果是内存变量,必须事先定义好。

5、如果是字段变量,必须事先打开相应的数据表。 Say Get 参数说明: Say:是作为被编辑的变量前面出现的提示, 一般都是用字符串表示。 Get:变量可以是内存变量,也可以是字段变量。 如果是内存变量必须在使用前先定义。如果是字段变量, 则要先打开相应的数据表。 数据类型可以是数值型、字符型、日期型、逻辑型或备注 型。 Get命令,必须用Read语句来激活才能完 成对数据的编辑。多个Get命令,可以用一个 READ语句来激活。例:用屏幕格式输入语句输入数值,计算公式C=2A+3B的值。 A=0 B=0 10,20 Say “请输入数值:” Get A 11,20 Say “请输入数值:” G

6、et B Read ? ”C=2A+2B=”+Str(2*A+2*B) 例:请编辑一个程序,能根据学号和课程名称来修改成绩。 CLEAR Xh=Space(7) Kcdm=Space(3) Use 学生成绩表 Excl 10,20 Say 请输入要修改成绩的学号 Get xh 12,20 Say 请输入要修改成绩的课程代码 Get kcdm Read Locate For 学号=Xh.And.课程代码=Kcdm 12,20 Say 请输入修改成绩 Get 成绩 Read2输出语句(1)非格式化输出命令 格式:?表达式表 格式2:?表达式表 格式3:?表达式表 计算表达式的值并输出。参数说明:

7、“?”表示在当前行的下一行的首位输出,”?”表示在当前行光标处输出,”?”表示向打印机输出。 如果是字符、日期、逻辑常量应使用定界符。 如果是一个表达式,则各部分的数据类型必须一致。 如果是,各表达式之间用逗号“,”分隔。例: 显示当前的日期和时间与表达式的值。 ? 今天的日期是:,DATE(), 时间是:,TIME() &如果用“+”连接该如何表达 A=10 B=20 ? A*10-B=,Str(A*10-B),Space(2) ? “A*20-B=”+Str(A*20-B,4)例:显示字符型表达式的值。 ? 祝贺+北京申奥+成功 &字符串的连接(2)屏幕格式输出命令 SAY

8、 在指定行、列位置上输出表达式的值。参数说明: Say:表达式可以是常量(字符、日期、逻辑常量需要使用相应的定界符)、内存变量、字段变量以及由它们组成的表达式。表达式只能是一个,而且,表达式的各部分的数据类型必须一致。例:显示字符串常数。 3,5 Say 这是一个显示字符串常数的例子 “例:显示学生档案表的第四条记录的字段内容。 Use 学生档案表 Goto 4 6,6 Say 学号::+学号 7,6 Say 姓名::+姓名 9,6 Say 年龄:+Str(年龄,2) &数据类型必须一致 10,6 Say 出生日期:+Dtoc(出生日期)二、 清屏与注释语句1清屏语句 Clear 清除

9、屏幕上所有显示的内容。2注释语句 Note * & Note和“*”注释语句在程序中单独作为一行,作为程序的注释。 &注释语句一般写在命令的后面,作为该命令的注释。三、 终止程序执行语句1Return 或Cancel 终止程序的执行,关闭打开的命令文件,返回到 Foxpro系统的命令窗口。2Quit 终止程序的执行,关闭打开的命令文件,返回到windows操作系统状态。3Retry 终止程序的执行,返回到调用行本身,可以实现程序的重复调用。8-3 结构化程序设计概述 所谓结构化,就是指程序或算法的控制结构必须并且只能由顺序结构,分支结构和循环结构所构成,程序的执行是由这三种结构

10、来控制的。 这三大基本程序结构可以设计任何复杂问题的程序。一、 顺序结构程序设计 顺序结构是最基本、最普通的结构形式。运行时,也是按照命令书写时的先后次序来执行,在程序执行的过程中不改变命令执行次序的一种结构。例: 编写一个求梯形面积的程序。 Input 请输入梯形的上底: To M Input 请输入梯形的下底: To N Input 请输入梯形的高: To H ? 梯形面积=,Str(M+N)*H/2,10,2) Return例:编写一个在“学生档案表”中查询年龄大于18岁的98级浙江籍的学生记录的程序(注意:假设数据表字段中只有出生日期而无年龄字段、学号前二位为年级)。ClearUse

11、学生档案表List For Year(Date()-Year(出生日期)23.And.Subs(学号,1,2)=98.And.籍贯=浙江UseReturn二、 分支选择结构 编写顺序结构程序虽然简单,但在实际应用中,经常需要对事物做出一定的判断,并依据判断的结果采取不同的处理行为。 例如:求圆的面积,对半径要做处判断,是否大于0,如果是才能参加运算,否则不能运算,输出参数错误信息。 分支结构有三种基本格式:单分支选择、二分支选择(选择函数)和多分支选择。1单分支选择 If Endif Return参数说明: 单分支选择结构是当条件表达式为真时,执行,然后,再执行EndIf后面的。如果 条件表达

12、式为假,则直接执行EndIf后面的。 IF和EndIf必须成对出现,缺一不可。 可以是表达式或表达式的逻辑组合,表 达式的值必须是逻辑值。例:从键盘上输入一个数,若是偶数,则输出。 Input “请输入数据:” To X If Int(X/2)=X/2 ? X,”为偶数” Endif Return例: 在学生档案表中,查询王启明的籍贯是否为“江西”。如果是,则输出本记录的姓名、学号、班级和年龄。 Clear Use 学生档案表 Locate For 姓名=王斌 &定位姓名为王启明的记录 If 籍贯=江西 ? 姓名:,姓名, 学号:,学号, 班级:,班级, 年龄:,年龄 Endif Us

13、e 在上程序并不完善,即当条件不满足时,程序中不能做出进一步的处理。这就说明单分支的功能是有限的,不能完善地解决分支处理问题。而二分支选择结构就可以处理好这个问题。2二分支选择结构 If条件表达式 A系列命令 Else B系列命令 Endif D系列命令Return 二分支选择结构,首先判断条件表达式的逻辑值,若条件为“真”时,执行A系列命令。然后,再执行ENDIF后面的D系列命令。若条件为“假”时,执行Else后面的B系列命令。然后,再执行ENDIF后面的D系列命令。例:当行李重量W20KG时,其超过部分则加倍计算收费。 Input “请输入行李重量:” To W If WC .And. B

14、+CA .And. C+AB P=(A+B+C)/2 S=Sqrt(P*(P-A)*(P-B)*(P-C) ? 三角形的面积为:,S Else ? 输入的边长有错,无法构成三角形! Endif Return3IIF( )选择函数 IIF()函数是双分支选择语句IfElseEndif的简单形式。 在某些情况下,可以用IIF()函数代替IfElseEndif语句,从而简化条件描述,提高程序的执行速度。IIF(,)参数说明: 若的值为真,则函数返回的值。否则,返回的值。返回值的类型可以是字符型、日期型、数值型和逻辑型。 与的数据类型必须是一致。例: 在工资管理数据表中,如果基本工资小于700时,将基

15、本工资加150。否则,加120。 Use 工资管理数据表 Repl All 基本工资 With 基本工资+Iif(基本工资 Max(A,B)? C,Max(A,B),Min(A,B)Else If CMin(A,B) ? Max(A,B),Min(A,B),C Else ? Max(A,B),C,Min(A,B)EndifEndif5多重分支选择结构 虽然可用IF语句嵌套的方式解决多分支选择问题。但是,如果选择的分支很多,则编写的程序可读性差且易出错。这时,一般使用DO CASE-ENDCASE多重分支选择结构来解决。参数说明: 执行多重分支选择结构时,会依次判断至的逻辑值,只要一遇到条件表达

16、式为真时,就执行该条件表达式下面的语句序列。执行结束后,立即转向执行Endcase之后的语句。其余的Case语句,即使条件成立,也不执行判断。 当所有的Case语句条件都不成立时,如果有Otherwise选项,则执行Otherwise选项下面的语句。否则,转向执行Endcase之后的语句。 Do CaseEndcase必须配套。 Do Case与第一个Case之间不允许插入任何可执行语句。例:用多分支选择结构改写上例程序。ClearInput 请输入第一个数: To AInput 请输入第二个数: To BInput 请输入第三个数: To CDo Case Case CMax(A,B) ?

17、C,Max(A,B),Min(A,B) Case C10 Y=2*X+5 Case X15 And X20 Y=X+5 Otherwise Y=10*X-5EndCase? Y &请问当X=18时,结果是多少?例:利用Do Case Endcase语句实现菜单选择。对于一般的数据库应用系统,总是先编一个主控模块,也叫主菜单,它反映了这个系统的几个主要功能,展现在用户的面前,供用户选择所要完成的工作。以下程序是学生管理系统的主菜单。 Use 学生档案表 6,6 Say *显示主菜单* 7,6 Say 1.退出系统 8,6 Say 2.学生数据录入 9,6 Say 3.学生数据修改 10,

18、6 Say 4.学生数据查询 Accept请选择功能码(1-4)? To OkDo CaseCase Ok =1CancelCase Ok =2Append &执行学生数据录入Case Ok=3 Accept 请输入修改数据的学号 To Xh Locate For 学号=XhEditCase Ok =4Accept 请输入查询的学号 To Xh Locate For 学号=XhDisplayOtherwise? 输入数字错误 Endcase三、条件循环结构 重复循环操作,特别是若根据条件来决定是否重复执行某段程序,那么顺序结构和分支结构显然是无能为力。 Vfp提供的循环结构程序设计就可

19、以解决这一问题。事实上70%以上的实际问题的处理过程都需要使用循环结构。 循环结构是当条件满足时,反复执行循环体内的命令系列,一直到条件为假时,才退出循环,执行循环体外的系列命令。 在Vfp中,循环结构有三种形式:条件循环Do WhileEnddo、计数循环ForEndfor和库文件扫描循环ScanEndscan。1简单的条件循环结构(1)简单条件循环结构的基本形式 Do While条件表达式 实现功能的语句系列 Loop 循环体语句 Exit Enddo 重复判断条件表达式的逻辑值,当其值为“真”时,反复执行Do While与Enddo之间的循环体语句。直到条件表达式的逻辑值为“假”时,结束

20、循环,执行Enddo后面的语句。 在循环体中如遇到Loop短路语句,就不执行Loop与Enddo之间的所有语句,直接返回Do While循环起始语句,继续进行下一轮的循环判断。 在循环体中如遇到Exit命令,就强行退出循环,即不执行Exit与Enddo之间的所有语句,直接转向执行Enddo语句后面的命令,结束循环。(2)条件循环结构程序一般由四个主要部分组成 1)循环的初始部分 常写在循环程序的起始语句前,给循环变量赋初值。 2)循环的起始语句(控制语句) 它表示循环由此开始并判断本次循环是否执行。当条件表达式其值为“真”时,则进入循环体执行一次循环。 然后,通过执行Enddo循环的终端语句,

21、自动返回到Do While 循环起始语句,进行下一次的循环判断。 若条件表达式的逻辑值为“假”时,就结束循环,执行Enddo后面的语句。(3)循环体语句 功能的实现部分 它是循环程序中被反复执行的循环体的一部分,完成循环程序的主要的操作,实现程序功能。它一般由实现功能的命令系列组成。 循环变量的修改部分 为防止死循环,在循环体中,必须修改循环变量的值。它保证在循环的过程中,使循环变量的值按一定的规律变化来修改。从而,实现退出循环。(4)循环的终端语句 返回循环的起始语句,进行下一次循环判断。(3)While 的三种基本形式 1)随机次数的循环 Do While .T. 随机次数的循环也称“永真

22、”循环是用于进行随机次数的循环场合。它适合在数据库中,进行任意次数的查询、修改、增加、删除记录的操作。“永真”循环通常由操作者在需要时,用Exit命令来强制退出循环。 Use数据表名 Do While .T. 循环体语句 Wait 还继续吗(YN)? To A1 If Upper(A)N Exit &强制退出循环 Endif Enddo例:在学生档案表中,按姓名查找某一学生。找到后,用格式化命令输出该同学的姓名、班级、年龄、出生日期。否则,输出“查无此学生”。要求进行多次查找,直到用户不再想查找时结束。 Use 学生档案表 Do While .T. Accep请输入姓名:: To Xm

23、 Locate For 姓名=XmIf Found() 6,12 Say “姓名”+姓名 6,28 Say “班级”+班级 7,12 Say “年龄”+Str(年龄,2,0) 7,28 Say “出生日期”+Dtoc(出生日期Else ? 查无此学生EndifWait 是否继续查询(Y/N) To AaIf Upper(Aa)=N Exit &强制退出循环命令EndifEnddoReturn2)库扫描循环(未知循环次数)Do While Not.Eof() 用于未知循环次数的场合,适合在数据表中进行统计。 如果用Locate直接定位,则Locate命令必须写在循环体的外面,循环体内用C

24、ontinue继续定位,来移动记录指针。 如果用Seek、Find索引定位,则Seek、Find命令必须写在循环体内,用Skip命令来移动记录指针。 库扫描循环用文件尾函数控制循环。当函数Eof()的值为.F.时,执行循环体。当Eof()的值为.T.时,终止循环。 Use数据表名 Do While .Not. Eof() 循环体语句 Skip(Continue) Enddo例:在学生档案表中按籍贯统计学生人数及平均入学年龄。(1)用Locate直接定位 N1=0 &设置初值,存放记录个数 S1=0 &设置初值,存放年龄总和 Use 学生档案表 Accept “请输入要统计的籍贯

25、:” To Jg Locate For 籍贯=Jg Do While .Not. Eof() N1=N1+1 S1=S1+入学年龄 Continue Enddo ? Jg+的学生人数:+Str(N1,4)+人 ? Jg+ “学生的平均入学年龄:”+Str(S1/N1,2,0)+”岁” Use Return(2)用索引定位 N1=0 &设置初值,存放记录个数 S1=0 &设置初值,存放年龄总和 Use 学生档案表 Index on 籍贯 to jg Accept “请输入要统计的籍贯:” To A Seek A Do While .Not. Eof() N1=N1+1 S1=S1

26、+入学年龄 Skip Enddo ? A+的学生人数:+Str(N1,4)+人 ? A+ “学生的平均入学年龄:”+Str(S1/N1,2,0)+”岁” UseReturn3)有限循环do While K=N 用于已知循环次数的场合,常用于数值计算和图形显示。 固定次数的循环在程序开始时,确定一个内存变量用来控制循环的次数,称为循环变量。 首先为循环变量赋一个初值。在Do While语句后面以循环变量与循环变量终值的逻辑关系为表达式,也就是说规定了当循环变量达到某一个数值时循环终止。由于循环变量的值在程序中通常是不能够自动增加或者减少的。所以,通常用K=K+1来修改循环变量值,强迫循环变量随循

27、环次数的增加而改变,以达到退出循环的值,控制循环。Input 请输入n的值 To NK=1 &置k的初始值Do While K=N循环体语句K=K+1 &修改循环变量值Enddo例:任意输入20个自然数,编程求其和及平均值。分析:用循环控制输入20个自然数并求和,故设置一个累加器sum和循环计数器k。 Sum=0 K=1 &设置循环条件初值 Do While K=20 &循环控制的起始语句 Input 请输入自然数: To X Sum=Sum+X &循环体语句 K=K+1 &用来修改循环条件 Enddo &循环结束语句 ? 20个自然数的

28、总和为:,SUM,平均值为:,SUM/20Return例9-32 求1到100之间的奇数和。分析:判断某一数N是否为奇数,只要Int(N/2)N2,即该数除以2的商与取整后的结果一致,该数为偶数,否则为奇数。通过计数器N=N+1产生0100之间的数据,逐一进行判断,当为偶数时,用Loop语句返回Do While起始循环,当为奇数时进行累加求和。其程序如下:ClearS=0N=1Do While N=100 If Int(N/2)=N/2 N=N+1 &用来修改循环条件 Loop Else S=S+N N=N+1 &用来修改循环条件 EndifEnddo? 1到100的奇数和,S

29、Return2循环结构的嵌套 在循环结构中,当内部需要进行分支处理时,就需要嵌套分支或多重选择结构。当内部需要进行多重条件循环时,就需要循环结构的嵌套。 图9-11例:求1到100之间的奇数和。分析:判断某一数N是否为奇数,只要Int(N/2)N2,即该数除以2的商与取整后的结果一致,该数为偶数,否则为奇数。通过计数器N=N+1产生0100之间的数据,逐一进行判断,当为偶数时,用Loop语句返回Do While起始循环,当为奇数时进行累加求和。ClearS=0N=1Do While N=100If Int(N/2)=N/2N=N+1 &用来修改循环条件LoopElseS=S+NN=N+1 &用来修改循环条件EndifEnddo? 1到100的奇数和,SReturn例: 在学生档案表中,查找籍贯为“江西”、籍贯为“浙江”以及籍贯为其

温馨提示

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

评论

0/150

提交评论