资源描述
*,.,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,目录,上页,下页,退出,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第四章结构化程序设计,1,.,第一节 程序文件,一、,Visual FoxPro,程序的几点说明,1注释语句,【格式1】*,【格式2】&,【功能】增强程序文件的易读性,2对话开关语句,【格式】,SET TALK OFF|ON,【,功能】关闭或打开命令执行时的对话开关,3命令的分行,Visual FoxPro,程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符“;”,再按回车键。,2,.,二、程序文件的建立、修改与执行,1建立或修改程序文件,1)命令方式:,MODIFY COMMAND,程序文件名,或,MODIFY FILE,程序文件名,2)菜单方式:,打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”,3,.,3)项目管理器:,选定项目管理器“代码”选项卡中的“程序”项,选择“新建”命令。,2保存程序文件,程序输入、编辑完毕,单击【文件】|【保存】菜单项,或按,Ctrl+W,复合键,在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”按钮保存程序文件并退出文本编辑器。程序文件的默认扩展名是.,PRG,。,4,.,3,执行程序文件,程序文件建立后,可以用多种方式、多次执行它。,下面是两种常用的方式。,1)菜单方式,单击【程序】|【运行】菜单项,打开“运行”对话框;,从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮,启动运行该程序文件,2)命令方式,【格式】,DO,【功能】执行指定、下的程序文件,当程序文件被执行时,文件中包含的命令将被依次执行,直到所有命令被执行完毕。,5,.,第二节程序的基本结构,由顺序、分支、循环三种基本结构构成。,(1)顺序结构,如图6-1所示,该结构先执行,A,操作,再执行,B,操作。,(2)分支结构:如图6-2所示,该结构中,P,代表一个条件,当条件,P,成立时执行,A,操作,否则执行,B,操作。,图6-1 顺序结构流程图 图6-2 分支结构流程图,6,.,(3)循环结构:循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。,7,.,三条输入命令的异同,ACCEPT ,TO ,ACCEPT,命令只能接受字符型数据,不需定界符,输入完毕按回车键结束。,WAIT,TO,WAIT,命令只能输入单个字符,且不需定界符,输入完毕不需按回车键。,INPUT ,TO ,INPUT,命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,如果是字符串,需用定界符,输入完毕按回车键结束。,8,.,分支结构形式有如下三种:,1单向分支,单向分支语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。,【,语句,格式】,IF,条件表达式,命令行序列,ENDIF,【,语句功能,】,该语句首先计算条件表达式的值,当条件表达式的值为真时,执行命令行序列;否则,执行,ENDIF,后面的第一条命令。,三、分支结构,9,.,【例6-9】求一元二次方程,AX,2,BXC0,的实根。程序文件名为,PROG9.PRG。,SET TALK OFF,CLEAR,INPUT TO A,INPUT TO B,INPUT TO C,ZB2-4*A*C,IF Z=0,X1=(-B+SQRT(Z)/(2*A),X2=(-B-SQRT(Z)/(2*A),?X1,X2,ENDIF,SET TALK ON,10,.,2双向分支,双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。,【,语句,格式】,IF,条件表达式,命令行序列1,ELSE,命令行序列2,ENDIF,【,语句功能,】,该语句首先计算条件表达式的值,当条件表达式的值为真时,执行命令行序列1中的命令;否则,执行命令行序列2中的命令;执行完命令行序列1或命令行序列2后都将执行,ENDIF,后面的第一条命令。,11,.,【例6-10】编写一密码校验程序(假设密码为,ABC)。,程序文件名为,PROG10.PRG。,SET TALK OFF,CLEAR,ACCEPT “,请输入您的密码:”,TO AAA,IF AAA=”ABC”,CLEAR,?”,欢迎使用本系统!”,ELSE,?”,密码错误!”,ENDIF,SET TALK ON,12,.,3多向分支,多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行。,【,语句,格式】,DO CASE,CASE,条件表达式1,命令行序列1,CASE,条件表达式2,命令行序列2,CASE,条件表达式,N,命令行序列,N,OTHERWISE,命令行序列,N+1,ENDCASE,13,.,【,语句功能,】,该语句根据给出的,N,个条件表达式的值,选择,N+1,个命令行序列中的一个执行。当所有,CASE,中条件表达式的值都是假时,如果有,OTHERWISE,项,则执行命令行序列,N+1,,再执行,ENDCASE,后面的第一条命令;否则,直接执行,ENDCASE,后面的第一条命令。,【例6-11】假设收入(,P),与税率(,R),的关系如下表,编程求税金。程序文件名为,PROG11.PRG。,0 P800,R=0.05 800 P2000,0.08 2000P5000,0.1 P5000,14,.,SET TALK OFF,CLEAR,INPUT “,请输入收入:”,TO P,DO CASE,CASE P800,R=0,CASE P2000,R=0.05,CASE P5000,R=0.08,OTHERWISE,R=0.1,ENDCASE,TAX=P*R,?”,税金为:”,TAX,SET TALK ON,15,.,四、循环结构,1,DO WHILE,循环语句,【格式1】,DO WHILE ,ENDDO,16,.,【格式2】,DO WHILE ,LOOP,EXIT,ENDDO,LOOP,语句:强行返回到循环开始语句。,EXIT,语句:强行跳出循环,接着执行,ENDDO,后的语句,17,.,【例6-12】编程求123100之和。程序文件名为,PROG12.PRG。,SET TALK OFF,CLEAR,S=0,I=1,DO WHILE I=100,S=S+I,I=I+1,ENDDO,?”123100”,S,SET TALK ON,18,.,【例6-13】逐条显示在,STUDENT,数据库的,STUD,表中性别为“男”的所有记录。程序文件名为,PROG13.PRG。,SET TALK OFF,CLEAR,CLOSE DATABASE ALL,OPEN DATABASE STUDENT,USE STUD,DO WHILE.NOT.EOF(),IF,性别=”男”,DISPLAY,ENDIF,SKIP,ENDDO,CLOSE DATABASE ALL,SET TALK ON,19,.,【例6-14】编程显示,STUDENT,数据库的,STUD,表中除“孙业”以外的所有记录。程序文件名为,PROG14.PRG。,SET TALK OFF,CLEAR,CLOSE DATABASE ALL,OPEN DATABASE STUDENT,USE STUD,DO WHILE.NOT.EOF(),IF,姓名=”孙业”,SKIP,LOOP,ENDIF,DISPLAY,SKIP,ENDDO,CLOSE DATABASE ALL,SET TALK ON,20,.,2,FOR,循环语句,【格式】,FOR=,TO ,STEP,LOOP,EXIT,ENDFOR/NEXT,FOR,语句的执行流程如右图所示。,21,.,使用,FOR,循环语句的有关说明:,省略,STEP,则步长为默认值1;,初值、终值和步长都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数;,EXIT,和,LOOP,命令可以出现在循环体内。执行,LOOP,命令时,结束本次循环,循环变量增加一个步长值,返回,FOR,循环头判断循环条件是否成立。执行,EXIT,命令时,程序跳出循环,执行循环尾后面的语句。,22,.,3“指针”型循环控制语句,“指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。,【,语句,格式】,SCAN,FOR,条件表达式,命令行序列,ENDSCAN,【,语句,功能】,该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数,EOF(),的值,若其值为“真”,则结束循环,否则,结合(条件表达式),执行(命令行序列),记录指针移到指定的范围和条件内的下一条记录,重新判断函数,EOF(),的值,直到函数,EOF(),的值为真时结束循环。,23,.,【例6-18】输出,STUDENT,数据库的,STUD,表中所有男生的姓名和地址。程序文件名为,PROG18.PRG。,SET TALK OFF,CLEAR,CLOSE DATABASE ALL,OPEN DATABASE STUDENT,USE STUD,SCAN FOR,性别=“男”,?姓名,地址,ENDSCAN,CLOSE DATABASE ALL,SET TALK ON,24,.,4使用循环语句时应注意的几点,(1),DO WHILE,和,ENDDO、FOR,和,ENDFOR、SCAN,和,ENDSCAN,必须配对使用。,(2)循环变量应是数值型的内存变量或数组元素。,(,3,),EXIT,和,LOOP,命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。,EXIT,的功能是跳出循环,转去执行,ENDDO、ENDFOR、ENDSCAN,后面的第一条命令;,LOOP,的功能是转回到循环的开始处,重新对“条件”进行判断。,25,.,第三节 过程的模块化,VFP,模块化在具体实现上提供三种形式,它们是子程序、过程和函数。,一,子程序,子程序也叫外部过程,是以程序文件(.,PRG),的形式单独存储在磁盘上。,子程序的结构与一般的程序文件一样,可以用,MODIFY COMMAND,命令来建立、修改、和存盘,扩展名也默认为.,PRG。,子程序与其他程序文件的唯一区别是其末尾或返回处必须有返回语句,RETURN。,子程序的调用:,DO,26,.,二、过程(内部),内部过程:把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。,过程文件格式为:,PROCEDURE,PARAMETER,RETURN,过程有两种存放方式:,(1)把所有的过程集中写入一个被称为过程文件(.,prg,文件)的磁盘文件中,(2)直接把过程写在调用它的主程序文件中,主程序被打开时,过程同时被调入内存(调用时可节省时间)。,(,3,)如果缺省,RETURN,,则在过程尾部自动执行一条隐含的,RETURN,命令,若不带,则返回逻辑值,.T.,。,27,.,【例6-22】建立如下程序文件,过程放在程序文件中。,*,MAIN.PRG,SET TALK OFF,?”,正在执行主程序”,DO SUB1,SET TALK ON,Procedure SUB1,?”,正在执行,SUB1”,RETURN,28,.,三、过程文件的建立,过程文件的建立方法与程序文件相同。可用,MODIFY COMMAND 命令或调用其他文字编辑软件来建立。,过程文件的结构一般为:,PROCEDURE,RETURN,PROCEDURE,RETURN,PROCEDURE,RETURN,29,.,1过程文件的调用,调用某过程文件中的过程时,必须先打开该过程文件,打开过程文件命令为:,【格式】,SET PROCEDURE TO,任何时候系统只能打开一个过程文件,当打开一个新的过程文件时,原已打开的过程文件自动关闭。,调用过程文件,DO ,WITH,参数表,2过程文件的关闭,关闭过程文件可用下列命令:,【格式一】,SET PROCEDURE TO,【,格式二】,CLOSE PROCEDURE,30,.,参数传递,当用主程序调过程时,可以将主程序中的参数传递给过程,在过程中经过处理后再返回到主程序。,调用程序的格式:,格式,1,:,DO WITH,格式,2,:,实参可以是常量、变量或表达式。,调用程序时将发送实参。,接收参数命令:,PARAMETERS,此时形参为私有变量。,L PARAMETERS,此时形参为局部变量。,31,.,规则,:,(1),当实参数量大于形参数量时,系统将提示出错。,(2),当实参数量等于形参数量时,实、形参数一一对应发、接参数。,(3),当实参数量小于形参数量时,多余的形参将被赋值为逻辑假,F,。,参数的两种传递方式:,(,1,)按值传递。形参变量值的改变不会影响实参变量的值。,(,2,)按地址(引用)传递。形参变量值的改变时,实参变量也随之改变。,两种方式的设置命令:,SET UDFPARMS TO VALUEREFERENCE,32,.,变量的作用域,变量的作用域指的是变量在什么范围内是有效,(,或能够被访问,),的。,内存变量可分为:公共、私有、局部三类。,1.,公共变量:在任何模块中都可使用的变量称为公共变量。,可用:,PUBLIC,建立,其初值被赋为逻辑假,.F.,。,2.,私有变量:可在本模块及其下属的各层模块中使用。,在程序中直接使用的变量,均为私有变量。一但建立它的模块程序运行结束,私有变量将自动清除。,3.,局部变量:只能在建立它的模块中使用,当建立它的模块程序结束时,局部变量自动释放。,可用:,LOCAL,建立,其初值被赋为逻辑假,.F.,。,33,.,结束,34,.,谢谢观看!,
展开阅读全文