1、1,第六章,结构化程序设计,2,本章目录,第一节 程序文件 第二节 程序的基本结构 第三节 程序的模块化 第四节 程序调试,3,第一节 程序文件,VF中的程序设计 程序文件的建立 结构化程序设计基础 编程的几点说明,4,一、VF中的程序设计,VF的工作方式有两种: 交互操作方式(命令、菜单) 程序文件方式Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程
2、序控制流组成。,5,二、程序文件的建立,建立、修改程序文件Modify Command d:path程序文件名程序文件扩展名为.PRG 运行程序文件 Do d:path 程序文件名 With 参数表 程序文件名(参数表) 程序文件可被修改并重新运行,且可多次运行;一个程序可调用其他程序(子程序、过程),6,1原则和方法结构化程序设计是一种程序设计方法,其设计原则和方法是:自顶向下,逐步求精,程序结构模块化。2结构化程序的三种基本结构 顺序结构:在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。 选择结构:在程序执行时,根据不同的条件,选择执行不同的程序语句。 循环结构:使某些语句或程序
3、段重复执行若干次。 每一个基本结构可以包含一个或多个命令。 过程结构:如果一些程序段需要反复执行多次,但这些程序段不是集中在一个固定的位置上重复执行,就可把这些程序段独立出来形成一个过程或自定义函数。,三、结构化程序设计基础,7,图6-1 顺序结构流程图 图6-2 分支结构流程图,三、结构化程序设计基础,图6-3 当型循环结构流程图形 图6-4 直到型循环结构流程图,8,四、编程的几点说明,注释语句 以note、* 或 & 开头的代码行 命令后添加注释,则以&开头 命令如果分行书写,应在行尾加续行符; Quit:退出VF系统。 Wait语句Wait 提示符 windows at 行,列 Tim
4、eout 数值表达式 Set default to 默认路径 &设置默认路径 Set talk on|off &打开|关闭命令执行时的对话开关 Set century on | off &是否用四位表示年 Set fields to 字段名表 &设置字段筛选 Set filter to 条件 &设置记录筛选 Set sysmenu to default &恢复系统的默认菜单,9,第二节 程序的基本结构,顺序结构 选择结构 循环结构,10,一、顺序结构,顺序结构是指按程序书写的先后顺序执行。例:p1.prgset talk offset dafault to e:图书管理系统open datab
5、ase 学生管理学生管理wait “按任意键显示学生表的内容”select * from 学生 &显示学生表的内容close database all,11,二、分支结构,1.单向分支单向分支语句,即根据条件表达式的值,决定某一操作是否执行。If 条件命令行序列EndIf,12,2.双向分支双向分支语句,即根据条件表达式的值,选择两个操作中的一个来执行。IF 条件命令行序列1ELSE命令行序列2EndIf,二、分支结构,13,举例:闰年问题,输入一个年份,编程判断是否是闰年。一个年份满足以下条件之一即为闰年: 能被4整除且不能被100整除 能被400整除Input “请输入年份:” to ye
6、ar IF year%4=0 AND year%100!=0 or year%400=0? “是闰年“ELSE? “不是闰年“ENDIF,14,3.多向分支 Do CaseCase 条件1命令行序列1Case 条件2命令行序列2 Otherwise命令行序列n+1 EndCase举例:将求闰年问题改成多向分支结构,二、分支结构,15,举例:成绩判定,Input “请输入成绩:“ to 成绩 do casecase 成绩=85? “优秀“case 成绩=75? “良好“case 成绩=60? “及格“case 成绩=0? “不及格“otherwise? “成绩输入错误!“ENDcase,16,4
7、.使用分支语句应注意的几点 IfEndIf和Do CaseEndCase必须配对使用 条件可以是各种表达式或函数的组合,其值必须是逻辑值。 命令行序列:可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。 Do CaseEndCase命令中,若有多个Case的条件值为真时,只执行第一个条件值为真的,然后执行 EndCase的后面的第一条命令。,二、分支结构,17,三、循环结构,1.“当”型循环“当”型循环,即根据条件表达式的值决定循环体内语句的执行次数。Do While 条件命令行序列EndDo,18,举例:累加和累乘,求1+2+3+100 i=1 s=0 do while i=100
8、s=s+ii=i+1 enddo ? S思考:求10!程序怎样改?,求1!+2!+3!+10! n=1 sum=0 do while n=10i=1s=1do while i=ns=s*ii=i+1enddosum=sum+sn=n+1 enddo ? sum,19,2.“计数”型循环“计数”型循环,即根据循环变量的初值、终值和步长,决定循环体内语句的执行次数。For 循环变量=初值 To 终值 Step 步长命令行序列 EndForNext,三、循环结构,20,举例:累加和累乘,求1+2+3+100 s=0 for i=1 to 100 step 1s=s+i enddo ? S思考:求10
9、!程序怎样改?,求1!+2!+3!+10! sum=0 For n=1 to 10s=1for i=1 to n s=s*iendfor sum=sum+s endfor ? sum,21,3.“指针”型循环“指针”型循环,即根据表中的当前记录指针决定循环体内语句的执行次数。只适合于表循环。Scan 范围 For 条件命令行序列EndScan,三、循环结构,22,程序举例,求每门课程的前三名,包含课程号,学号和成绩,并将结果存放 在表result中。 select 课程号,学号,成绩 from 成绩 where .f. into dbf result select dist 课程号 from
10、成绩 into cursor kcID select kcid scan select 课程号,学号,成绩 from 成绩 where 成绩.课程号=kcid.课程号;order by 成绩 desc top 3 into array szinsert into result from array sz endscan,23,4.使用循环语句应注意的几点 Do While和EndDo、For和EndFor、Scan和EndScan必须配对使用。 命令行序列:可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。 循环变量:应是数值型的内存变量或数组元素。 Exit和Loop命令
11、嵌入在循环体内,可以改变循环次数,但是不能单独使用。 Exit:退出循环。 Loop:重新下一次循环。,三、循环结构,24,编程示例:随机产生x个09的随机整数,para xDIME A(x) FOR I=1 TO xA(I)=INT( 10*RAND() ) ? A(I) ENDFOR,25,编程示例:求水仙花数,for i=1 to 9 for j=0 to 9 for k=0 to 9if(i*3+j*3+k*3=i*100+j*10+k)? i*100+j*10+kendif endfor endfor endfor,for i=100 to 999x=i%10y=int(i/10)%
12、10z=int(i/100)%10if (x*3+y*3+z*3=i)? iendif endfor,26,编程示例:x元钱买x只鸡,*para x x=100 for cock=1 to int(x/5) for hen=1 to int(x/3) for chick=1 to x-2 if (cock+hen+chick=x and; cock*5+hen*3+chick/3=x)? Cock,hen,chick endif endfor endfor endfor,27,第二节 过程和过程文件,过程和过程文件 过程和过程文件的建立 过程和过程的使用 变量的作用域 参数传递,28,一、过程
13、与过程文件,过程是由一个或多个命令、语句构成的程序段。它以过程说明语句Proc开头,以返回语句Return结束。 过程文件可以存储多个过程。 打开一个过程文件后,就可以调用其中定义的每个过程。 使用过程时,通过过程名调用并执行。,29,1. 过程文件的建立modify command 过程文件名 2. 过程的定义(放在过程文件中)Proc 过程名Para 参数表 命令行序列Return 返回值EndProc,二、过程与过程文件的创建,function 过程名Para 参数表 命令行序列Return 返回值Endfunc,30,1. 过程文件的打开Set Proc to 过程文件名 2. 过程的
14、调用 Do 过程名 过程名() Do 过程名 with 实参表 过程名(实参表) 3. 过程文件的关闭 Set Proc to Close Proc,三、过程与过程文件的使用,31,4. 参数传递 Do 过程名 with 实参表 如果参数是常量或表达式,则按值传递; 如果参数是变量,则按引用传递(实参和形参是同一变量,尽管它们的名字可能不同)。 过程名(实参表) 默认为按值传递 使用命令可改变参数传递方式:set UDFP to value &设置成按值传递set UDFP to refe &设置成按引用传递,三、过程与过程文件的使用,32,Clear all X=100 ? XProc su
15、b1x=20 Endproc,函数参数传递举例,Clear all X=100 ? XProc sub1local xx=20 Endproc,Clear all X=100 ? XProc sub1private xx=20 Endproc,33,VF中的内存变量按作用域可分为三类:公共变量、私有变量和局部变量 1. 公共变量:在任何模块中都可使用的变量。Public 内存变量表 2. 私有变量:在建立它的模块及其下属各层模块中使用的变量。 3. 局部变量:只在建立它的模块中使用的变量。Local 内存变量表 4. 变量的隐藏private 内存变量表功能:隐藏上层模块中可能存在的同名内存变
16、量。说明: 1. 程序中没有说明的内存变量,均为私有变量。 2. 命令窗口中建立的内存变量,均为公共变量。 3. 用Para说明的形参为私有变量,用Lpara说明的则为局部变量。,四、变量的作用域,34,Clear all mx=“Visual Foxpro“ my=“二级“ Do sub1 with mx ? my+mx ReturnProc sub1 Para my Local mx mx=“Visual Foxpro DBMS 考试“ my=“计算机等级“+my Return,变量作用域举例,结果为:二级计算机等级Visual Foxpro,如果将para my 替换成:para mx1,则结果为:计算机等级二级Visual Foxpro,