第6章程序设计基础.ppt_第1页
第6章程序设计基础.ppt_第2页
第6章程序设计基础.ppt_第3页
第6章程序设计基础.ppt_第4页
第6章程序设计基础.ppt_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、第6章 程序设计基础,本章重点和难点,分支机构程序设计 循环机构程序时机 过程与自定义函数 变量的作用域,主要内容,学会建立程序文件及相关常用命令的使用; 熟练掌握程序的基本结构; 掌握过程与子程序的基本知识; 了解多模块程序设计的相关内容; 了解程序调试的基本知识,在前面的章节中,介绍了数据库的基本知识和对数据库的基本操作和使用。这些都是用人机对话的方式来实现的。但是,单纯的命令交互式操作在复杂的应用中往往显得力不从心,而且执行过程也不能保存,为此,本章将介绍一种更常用和更高效的程序方式。 所谓程序,就是为了完成某一具体任务而编写的一系列命令或语句。程序被保存在程序文件(扩展名为.PRG)中

2、,当发出调用命令后,Visual FoxPro就会自动执行该文件中的命令和语句。,6.1 概述,把面向对象的程序设计与结构化程序设计结合在一起,用户可以方便地在Visual FoxPro上开发一个数据库应用系统。在下一章,将详细介绍如何利用Visual FoxPro的辅助开发工具进行面向对象的程序设计。 只有学好本章,才能在面向对象的程序设计中为对象编写出正确的事件和方法控制流程,并最终设计出让用户满意的数据库应用系统。,【例6.1】在XSB表中查找学号为05021003的学生的信息。 通过手工执行一系列操作来实现。 在“文件”菜单中选择“打开”命令; 在“文件类型”列表框中选择“数据库”;

3、进入“学生成绩管理data”子目录,在文件列表中双击学生成绩管理.dbc; 选择“xsb”,并在“数据库”菜单中选择“浏览”命令; 滚动浏览表,查找“学号”字段为“05021003”的记录。,如果要通过编程实现上述目的,可书写如下命令序列: OPEN DATABASE 学生成绩管理data学生成绩管理 USE XSB LOCATE FOR ZKZH= 05021003 DISPLAY 这一命令序列称为一段程序,将其保存在称为程序文件(扩展名为“.PRG”)的文件中,可反复执行。,【例6.2】把所有上机成绩超过80分的考生的笔试成绩都提高3%。 这一工作用人工方式来做,不但费时费力,而且还很容易

4、出错。解决此类问题的更好办法是编写一个可执行的程序文件,该文件可以轻松无误地完成这一工作如下。 *程序文件为:tgbscj.prg,OPEN DATABASE 等考管理dataJSJDJKS ”,然后按回车键。 2、命令注释 程序中可插入注释,以提高程序的可读性。 注释行以“*”号开头,命令后以“&”开头。,一个程序一般都包含数据输入、数据处理和数据输出3个部分。数据的输入和输出代码设计是编写许多程序都要面临的工作。这里介绍的输入和输出命令,在练习编写小程序时是非常有用的。 1. INPUT命令 【格式】 INPUT TO 【功能】 等待用户从键盘输入数据,用户可以输入任意合法的表达式。当用户

5、以Enter键结束输入时,系统将表达式的值存入指定的内存变量中,程序继续运行。,6.3 基本命令,【说明】 如果选用,那么系统会首先显示该提示信息。 输入的数据可以是常量、变量,也可以是一般的表达式。但不能不输入任何内容直接按Enter键。 输入字符串时必须加定界符,输入逻辑型常量时要用圆点定界(如 .T.、.F.),输入日期时间型常量时要用大括号(如2001-03-01)。,【例6.3】 INPUT 请输入姓名: TO name INPUT 定货数量: TO QTY 执行第一条语句后,屏幕显示:“请输入姓名:”,等待用户输入姓名,用户键入姓名并按Enter键后(所输入的字符串须用引号括起来)

6、,系统将键入的姓名作为字符串存入变量name。执行第二条语句后,屏幕显示“订货数量:”,等待用户输入一数值后,该数值便存入变量QTY。注意输入的数值不能用引号括起来,否则将变成字符串。,2. ACCEPT命令 【格式】 ACCEPT TO 【功能】 该命令等待用户从键盘输入字符串,当用户以Enter键结束输入时,系统将该字符串存入指定的内存变量,程序继续运行。 【说明】 如果选用,那么系统会首先显示该提示信息。, 该命令只能接收字符串。用户在输入字符串时,不需要加定界符,否则系统会把它当作字符串的一部分。 如果不输入任何内容而直接按Enter键,系统会把空串赋给指定的内存变量。 【例6.4】

7、ACCEPT数据库文件名: TO dbname 执行此命令后屏幕提示:“数据库文件名:”,等待用户输入,用户输入后,系统将输入的字符串(数据库文件名)存入变量dbname。,例6.5 根据“xsb.dbf”,从简输入要查找人的姓名,查找并显示其基本情况。,clear *set default to e:vf set talk off use xsb accept 请输入学生姓名: to name * input 请输入学生姓名: to name locate for 姓名=name wait display use set talk on return,例6.6 根据入学成绩先是学生姓名、班级

8、,set talk off use xsb input 请输入学生的入学成绩: to cj wait locate for 入学成绩=cj display 姓名,班级 use set talk on return,3. WAIT命令 【格式】 WAIT TO WINDOW ATNOWAIT CLEAR | NOCLEAR TIMEOUT nSeconds 【功能】 显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标时继续程序的执行。 【说明】 如果值为空,那么不会显示任何提示信息;如果没有指定,则显示默认的信息“按任意键继续”。, 用来保存用户键入的单个字符,其类型为字

9、符型。若用户按的是Enter键或单击了鼠标,那么中保存的将是空串。若不选TO 短语,输入的单字符不保留。 一般情况下,提示信息被显示在Visual FoxPro主窗口或当前用户自定义窗口里。如果指定了WINDOW子句,则会出现一个WAIT提示窗口,用以显示提示信息。提示窗口一般位于主窗口的右上角,也可用AT短语指定其在主窗口中的位置。 若选用NOWAIT短语,系统将不等待用户按键,直接往下执行下一条命令。, 若选用NOCLEAR短语,则不关闭提示窗口,直到用户执行下一条WAIT WINDOW命令或WAIT CLEA命令为止。 TIMEOUT子句用来设定等待时间(秒数)。一旦超时就不再等待用户按

10、键,自动往下执行。 【例6.7】WAIT命令使用示例。 将“输入无效,请重新输入”提示信息显示在位于第10行、第20列窗口中并等待用户按键或单击鼠标响应,若5秒内用户不响应,程序继续进行。,WAIT 输入无效,请重新输入 WINDOW AT 10,20 TIME 5 将“输入无效,请重新输入”提示信息在屏幕上显示,等待用户输入一字符到内存变量a,若5秒内用户不响应,程序继续进行。 WAIT 输入无效,请重新输入 TO a TIME 5 等待用户按任意键或单击鼠标响应,若5秒内用户不响应,程序继续进行。 WAIT TIME 5,4 定位输入输出命令,【格式】 saygetdefault 【功能】

11、在屏幕的指定行列输出say子句的表达式值,并可修改get子句的变量值。 【说明】 (1) 表示数据在窗口中显示的位置,编号均从0开始,可用小数精确定位。 (2)say子句用来输出数据,get子句用来输入及编辑数据。,4 定位输入输出命令,(3)get子句中的变量必须具有初值,或用default子句的指定初值。初值一旦指定,该变量的类在编辑期间就不能改变,字符型变量的宽度与数值型变量的小数位也无法再变。 (4)get子句的变量必须用read子句激活。也就是说,在若干带有get子句的定位输入/输出命令后,必须遇到READ命令才能编辑get变量。当光标移出这些get变量组成的区域时,READ命令执行

12、结束。,例6.8: *li.prg 2,10 say请输入整数x的值: get x default 25 5,10 say请输入字符串str1的值: get str1 default computer Read 8,10 sayx:+str(x)+space(10) + str1:+str1 return,例6.9: *cjin.prg clea Dime a(3) A(1)=space(12) A(2)=space(4) A(3)=space(6) 2,10 say 请输入学号: get a(1) 4,10 say 请输入课程号: get a(2) 6,10 say 请输入成绩: get a

13、(3) Read *set default to e:vf Use cjb Append blank Gather from a display,程序结构是指程序中命令或语句执行的流程结构。顺序结构、分支结构和循环结构是程序的基本结构。前面讲过的顺序结构是程序中最基本最普遍的形式,其特点是语句按执行的先后顺序排列,程序在执行时从命令文件的第1条语句到最后1条语句一条不漏地顺序执行。,6.4 程序流程控制,6.4.1 顺序结构程序设计,顺序结构是最简单也是最基本的结构形式,其特点是程序运行时按照语句的排列顺序,一条接一条地依次执行。 其流程可用右图表示。,1. 条件语句(两种形式) 【格式1】I

14、F ENDIF 【格式2】 IF ELSE ENDIF 两种条件语句的含义可用图5.1(a),(b)表示,6.4.2 分支程序设计,图5.1 条件语句的语义,【例6.6】计算表达式,IF AB Z=A*B ELSE Z=A+B ENDIF,Z=A+B IF AB Z=A*B ENDIF,或,2. 逻辑判断函数 【格式】 IIF(,的值,否则返回的值。 【例5.7】【例5.6】中的计算问题可使用如下命令实现。 Z=IIF(AB,A*B,A+B),3. 分情况语句(多分支判断) 【格式】 DO CASE CASE CASE CASE OTHERWISE ENDCASE,【功能】 该命令从开始依次检

15、查,若有某一个为真,则执行,然后继续执行ENDCASE后面的命令;若N个条件表达式均不为真,如果有OTHERWISE则执行,若无OTHERWISE选项,则直接执行ENDCASE后面的命令,如图5.2所示。 【说明】 条件语句或分情况语句中允许多重嵌套,即IF语句或DO CASE语句中的命令序列仍可是IF语句或DO CASE语句。,图6.2 带OTHERWISE选项的分情况语句,n, IF语句中,IF和ENDIF必须成对出现,缺一不可。DO CASE语句中,DO CASE和ENDCASE也必须成对出现。 【例6.10】将某学生的成绩X由百分制分数转换成优、良、中、及格与不及格5级中的某一级。假定

16、X90为优,80X90为良,70X80为中,60X70为及格,X60为不及格。,DO CASE CASE X=90 grade=优 & grade为转换后的成绩 CASE X=80 grade=良 CASE X=70 grade=中 CASE X=60 grade=及格 OTHERWISE grade=不及格 ENDCASE,1. 条件循环DO WHILE 【格式】 DO WHILE IF LOOP ENDIF IF EXIT ENDIF ENDDO,5.4.2 循环程序设计,【功能】 其中LOOP选项是循环短路语句,一旦执行到LOOP便不再执行循环体中其余语句,立即回到循环起始处。EXIT选

17、项是循环退出语句,一旦执行到EXIT便强制退出循环,然后执行ENDDO之后的命令。图5.3给出了3种情况下循环语句的执行流程。应注意图5.3(c)中可以没有“修改条件表达式1”的语句。,循环语句的执行流程,【说明】 在循环体中,必须具有修改“条件表达式1”或“条件表达式3”的语句,以免陷入死循环。 循环体中又可以包含循环语句,即所谓多重循环或嵌套循环。 循环结构和分支结构可以相互嵌套,但嵌套时,IF和ENDIF,DO CASE和ENDCASE,DO WHILE和ENDDO必须严格配对,嵌套中只允许每种语句作为整体而被包含,而不允许交叉割裂,否则将产生不可预料的结果。,【例6.11】求0100之

18、间奇数之和。 该程序使用循环结构,解题的思路归纳为两点。 引进变量S和I。S用来保存累加的结果,初值为0;I的初值为1,作用有三:作为被累加的数据;作为判定是否是奇数的量;也作为控制循环条件是否成立的变量。 重复执行命令I=I+1和IF语句,直到I的值超过100。每一次执行,I的值增加1。,SET TALK OFF CLEAR I=0 S=0 DO WHILE I100 I=I+1& 修改循环条件 IF MOD(I,2)=0 LOOP& 若为偶数则回到DO WHILE重新开始下一循环 ELSE S=S+I ENDIF ENDDO ? 0100之间的奇数之和为:,S RETURN,【例6.12

19、】编程实现1+2+3+?和大于50停止。 X=1 S=0 Do while .T. s=s+x If s50 exit Endif x=x+1 Enddo ?”x=“,x,”s=“,s,2. 步长循环FOR-ENDFOR 【格式】 FOR = TO STEP EXIT LOOP ENDFOR | NEXT 【功能】 内存变量从初始值开始,每增加一个步长(当步长为正数时)或减少一个步长(当步长为负数时),就循环一次,一直循环到内存变量变为终值为止,或者循环到执行EXIT语句为止。,【说明】 若省略步长,则默认值步长为1。 初始值、终止值和步长都可以是数值表达式,但这些表达式只在循环语句执行开始时

20、被计算一次。在循环语句的执行过程中,它们是不会改变的。 EXIT和LOOP命令同样可以出现在该循环语句的循环体内。当执行到LOOP命令时,结束循环体的本次执行,然后循环变量变化一个步长值,并再次判断循环条件是否成立。 该语句通常用于实现循环次数固定情况下的循环结构。,【例6.13】求1100中奇数平方之和。 程序为: S=0 FOR I=1 TO 100 STEP 2 S=S+I2 ENDFOR 或者为: S=0 FOR I=99 TO 1 STEP -2 S=S+I2 ENDFOR,例6.14输入十个数,按从小到大的顺序输出。,CLEAR SET TALK OFF DIMENSION A(1

21、0) ? 请输入10个数: ? FOR I=1 TO 10 INPUT 输入第+STR(I,2)+个数: TO A(I) ENDFOR FOR I=1 TO 10-1 FOR J=1 TO 10-i IF A(J)A(J+1) X=A(J) A(J)=A(J+1) A(J+1)=X ENDIF ENDFOR ENDFOR FOR I=1 TO 10 ? A(I) ENDFOR SET TALK ON RETURN,3. 表扫描循环SCAN 【格式】 SCAN FOR WHILE LOOP EXIT ENDSCAN 【功能】 基于数据库表的循环语句,它从指定的内逐条扫描记录,每扫描一条记录,FO

22、R 和WHILE 子句用于筛选希望扫描的记录。,【说明】 若省略范围,则默认为ALL。 循环体内其他语句的用法与前面的循环语句相同。 该循环语句一般用于处理表中记录。语句可指明需处理的记录范围及应满足的条件。 【例6.15】在考生成绩表中顺序查看笔试成绩大于80分的考生成绩,第1次遇到上机成绩为100分时就终止查看。,程序为: SET TALK OFF CLEAR USE T_CJB SCAN FOR BSCJ80 DISP WAIT按任意键继续 IF SJCJ=100 EXIT ENDIF ENDSCAN USE,一个典型的应用程序通常包含数据的输入、修改、查询和打印报表等若干功能相对独立的

23、程序段,这些程序段在结构化程序设计中称为“模块”。把一个应用程序模块化不仅便于程序的开发,也有利于程序的调试和维护。,6.3 过程与自定义函数及变量的作用域,6.3.1 过程 把一个复杂的规模较大的程序系统划分为若干个功能相关又相对独立的较小的模块,再把这些模块划分为更小的用几十行语句实现的简单模块。将一个应用程序划分成一个个功能简单、单一的模块程序,不仅便于程序的开发,也利于程序的阅读和维护。 如果一个程序段在程序中多次使用,那就应该把它独立出来作为一个模块,需要时就拿来使用,而不是每一次都去书写相同的程序段。模块是可以命名的程序文件,扩展名也是.PRG。前面介绍的用于执行文件的DO命令,实

24、际上也是执行模块程序的命令。,对于具有调用关系的程序文件,习惯上称调用其它程序的程序为主程序,被其它程序调用的程序称为子程序。实际上,主程序和子程序是相对的,在一定情况下,主程序可作为子程序,反之亦然。 组织应用程序有两种方法:第一种方法是将主程序和多个子程序放在一个文件里;第二种方法是把所有子程序放在一个单独的文件中,其中每个子程序作为一个模块完成应用程序的一个过程。因此把这个文件称为过程文件,从这个角度来说,可以将子程序称为过程。,6.3.2 过程调用 1. 过程定义 【格式】 PROCEDURE PARAMETERS RETURN TO MASTER 【说明】 PROCEDURE表示过程

25、的开始,RETURN表示控制的返回。一般来说,一个过程至少应有一条返回语句RETURN。不含选择项的RETURN语句,默认控制返回到调用该过程的程序中的下一条从工作命令处。若用户直接调用该过程,则控制返回命令窗口。,带有TO MASTER的返回语句一般在过程嵌套中使用,控制返回到最高一级主程序。 含有PROCEDURE的过程,称为有参过程,否则称为无参过程。形参表中的各个参数需用逗号分开。形参表可以是输入参数,也可以是输出参数。当调用一个有参过程时,主调程序将实在参数传递给被调用过程的形参;过程执行完后,也可以通过输出参数将执行结果传递给主调程序的某个内存变量。注意:有的形参也可能是输入参数和

26、输出参数,即在过程一开始接收主程序传来的一个实际值,在过程中又被赋予新值代回到主调程序。,2. 过程文件 【格式】 PROCEDURE RETURN PROCEDURE RETURN PROCEDURE RETURN,3. 过程文件的打开与关闭 过程可以放置在程序文件代码的后面,也可以保存在称为过程文件的单独文件里。过程文件的建立仍使用MODIFYCOMMAND命令,文件的默认扩展名还是 .PRG。过程文件里只包含过程,这些过程能被任何其他程序所调用。在调用过程文件之前首先要打开过程文件。打开过程文件的命令格式为: 【格式】 SET PROCEDURE TO ADDITIVE,【说明】 打开一

27、个或多个过程文件。一旦一个过程文件被打开,那么该过程文件中的所有过程都可以被调用。如果选用ADDITIVE,那么在打开过程文件时,并不关闭原先已打开的过程文件。当使用不带任何文件名的SET PROCEDURE TO命令,将关闭所有打开的过程文件。 如果不想关闭所有过程文件,只关闭个别过程文件,可用如下格式的命令: 【格式】 RELEASE PROCEDURE , ,存放在命令文件里的过程主要被命令文件中的代码所调用,但也可以被其他程序所调用。当命令文件处于执行(打开)状态时,包含在其中的过程就可以被直接调用,如果命令文件不处于打开状态,那么要调用其中的过程,就需要用SET PROCEDURE命

28、令先打开此命令文件,这与打开过程文件的道理是一样的。 总而言之,这里讨论的模块主要是指过程和命令文件里的代码,而过程的调用需要它所在的文件处于打开状态。,4.过程的调用 【格式】 DO WITH 【功能】含有WITH的DO命令,被调过程必须是有参过程,向有参过程传递参数。这里的实参应该与被调过程中的形参在数目、次序和类型上一一对应,如果形参是输入参数,则对应的变量可以是常量或表达式,调用时先计算表达式的值,然后替换对应的形参。如果形参是输出参数,则对应的实参必须是已定义的内存变量;如果形参兼有输入输出的特点,那么该形参对应的实参只能是已赋值的内存变量。 省略WITH的DO命令,被调过程必须是无

29、参过程,此时不存在参数传递问题。,Return to master,Return,sub1,Return to sub1,【例6.16】通过建立计算阶乘的过程计算组合C(M,N)=M!/(N!*(M-N)!)的值,其中的M,N通过键盘输入。 *CCM.PRG* *主程序CCM.PRG通过调用过程CP.PRG计算组合C(M,N) SET TALK OFF CLEAR INPUT 请输入组合元素个数M: TO M INPUT 请输入组合选取个数N: TO N X=M-N Y=1 Z=1 W=1,DO CP WITH M,Y& 调用后,Y中返回M!的值 DO CP WITH N,Z& 调用后,Z中返

30、回N!的值 DO CP WITH X,W & 调用后,W中返回(M-N)!的值 MC=Y/(Z*W) ?C(M,N)=,MC SET TALK ON RETURN PROCEDURE CP PARAMETERS P,R J=1 DO WHILE J=P R=R*J,J=J+1 ENDDO RETURN 可以将过程CP改成递归调用,过程如下: PROC CP PARAMETERS P,R IF P1 DO CP WITH P-1,R& 返回(P-1)! R=R*P& 计算P*(P-1)! ENDIF RETURN,1. 函数定义 用户自定义函数是根据用户需要而编写的函数,语法格式如下: 【格式】

31、 FUNCTION PARAMETERS RETURN ENDFUNC,6.3.3 自定义函数,【说明】 FUNCTION表示一个函数定义开始,同时给函数命名。函数名必须以字母或下划线开头,可包含字母、数字和下划线。 第2行参数说明部分与过程的参数说明部分类同,另外,Visual FoxPro规定参数说明也可以放在函数名后的括号内。 函数体是用户编写的命令序列。 RETURN给出函数的返回值,可以放在函数定义中的任何地方。RETURN省略时,函数返回.T.。 ENDFUNC表示函数定义结束。,2. 函数调用 用户自定义函数的调用有3种形式,一是可以像系统函数一样把函数放在表达式中,函数所需的参

32、数放在函数名后的括号内,函数的返回值参与表达式的计算。函数允许递归调用。另两种调用形式用于函数没有返回值的场合,调用形式为: () 或 DO WITH 【例6.17】用自定义函数改写【例5.13】中的程序。,*主程序CC.PRG通过调用自定义函数CF计算组合C(M,N) SET TALK OFF CLEAR INPUT 请输入组合元素个数M: TO M INPUT 请输入组合选取个数N: TO N X=M-N MC=CF(M)/(CF(N)*CF(X) ?C(M,N)=,MC SET TALK ON RETURN,*自定义函数CF根据参数P返回P!计算值 FUNCTION CF PARA P I=1 Z=1 DO WHILE I=P Z=Z*I I=I+1 ENDDO RETURN Z,例6.18 编程求200至300之间的素数。,clear for i=200 to 300 flag =.t. for j=2 to i-1 if i%j=0 flag=.f. exit endif endfor if flag=.t. ? i endi endfor Return 想一想:如果要求3以上(含3)的任意两个自然数之间的素数,怎么做?,程序设计离不开变量。

温馨提示

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

评论

0/150

提交评论