1任务六学用VisualFoxPro的编程功能【学习目标】通过本章学习,应熟练掌握程序的建立、修改和运行方法;掌握基本的输入和输出命令,掌握程序的三种基本结构;理解和掌握主程序、子程序和过程的概念和编写;理解和掌握内存变量作用域的定义命令。【重点难点】重点:程序的三种基本结构;多模块结构难点:循环结构的使用;多模块结构中参数传递的两种方式;变量作用域本章主要介绍程序设计及其相关的一些内容,包括程序设计时使用的程序控制语句、程序的基本结构、程序设计调试等方面的内容。该章是开发基于VFP应用系统的基础,掌握学习时,要充分上机操作练习。第十一讲程序与程序的基本结构子任务一学习程序的概念程序是能够完成一定任务的命令的有序集合。采用程序方式有如下好处:可以利用编辑器,方便地输入、修改和保存程序。可以用多种方式、多次运行程序。可以在一个程序中调用另一个程序。例2.1假定学号的前两位为入学年份(如01代表2001年),第3、4位为专业代码。编写命令文件test1.prg,分别统计所有学生和2001年入学,专业代码为03的学生选修课程号为101课程的平均成绩。编写其程序如下:settalkoffclearopendatabasexsxkuse选课in0selectavg(成绩)from选课where课程号==101intoarraym1selectavg(成绩)from选课where课程号==101and;left(学号,2)=='01'andsubstr(学号,3,2)==03intoarraym2?所有学生的平均分:,m1(1,1)?指定学生的平均分:,m2(1,1)use选课closedatabasesettalkonreturn2子任务二建立与执行程序文件1.程序文件的建立程序文件的建立需要调用系统内置的文本编辑器来进行。有三种方法:⑴用“新建”对话框建立:程序文件的默认扩展名是.prg。⑵用命令modifycommand[文件名]来建立⑶用“项目管理器”来建立2.执行程序文件⑴打开程序文件后使用菜单命令或单击工具栏上的运行按钮。⑵用命令运行:do文件名⑶使用“项目管理器”运行在执行程序的过程中,执行以下命令之一可中止程序的运行:①cancel;②do命令;③return;④quit当用DO命令执行程序文件时,如果没有指定扩展名,系统将按下列顺序寻找该程序文件的源代码或某种目标代码文件执行:exe-app-fxp-prg。故如果要运行指定文件时扩展名不能省略。子任务三学用简单的输入输出命令1.input命令格式:input[提示信息]to内存变量名功能:等待从键盘输入表达式赋值给变量。说明:该命令可以输入任意类型的数据。在输入字符串时须加定界符,输入逻辑型常量时要用圆点定界,输入日期及日期时间型数据时要作大括号。不允许不输入任何内容直接按回车键。例2.2编写命令文件test2.prg,查找指定日期以后出生的学生。CLEAROPENDATABASEXSXKUSE学生INPUT请输入日期:TOMRQSELECT学号,姓名,出生日期FROM学生WHERE出生日期MRQCLOSEDATABASE2.accept命令格式:accept[提示信息]to内存变量名功能:等待从键盘输入字符串赋值给变量。说明:该命令只接受字符串,用户在输入字符串时不需要加定界符。如果不输入任何内容直接按回车,系统会把空串赋给指定的内存变量。例2.3检索通过键盘输入的学生的各门课程的成绩。OPENDATABASEXSXKCLEAR3accept请输入姓名:TOxmSELECT学生.学号,姓名,课程名,成绩FROM学生,选课,课程;WHERE学生.学号=选课.学号and课程.课程号=选课.课程号and姓名=xmCLOSEDATABASE3.wait格式:wait[提示信息][to内存变量名][window[at行,列]][nowait][clear|noclear][timeout秒数]例2.4wait命令使用示例。wait输入无效,请重新输入…windowstimeout54程序结构:是指程序中命令或语句执行的流程结构。有三种基本结构:顺序结构、选择结构、循环结构。子任务四学用选择结构有条件语句和分支语句两种。1.条件语句格式:if条件语句序列1[else语句序列2]endif功能:说明:⑴if和endif必须成对出现。⑵if语句可以嵌套。例2.5某地至北京的邮路里程为1043km,通过邮政局向北京城区寄交“特快专递”邮件,应在24小时到达,计费标准每克为0.05元,但超过100克后,超出数每克为0.02元,试编写程序test4.prg计算邮费。方法一:INPUT请输入邮件重量:TOWIFW=100F=W*0.05ELSEF=100*0.05+(W-100)*0.02ENDIF?邮费为:,F方法二:INPUT请输入邮件重量:TOWF=W*0.05条件语句序列1语句序列2endif后面的语句假真条件语句序列endif后面的语句假真5IFW100F=100*0.05+(W-100)*0.02ENDIF?邮费为:,F例2.6编写命令文件test5.prg,请用户输入待查学生的姓名,显示该学生的基本情况。CLEAROPENDATABASEXSXKACCEPT请输入待查学生姓名:TONAMELOCATEFOR姓名=NAMEIF.NOT.EOF()?姓名:+姓名?性别:+IIF(性别,男,女)?出生日期:+DTOC(出生日期,1)ELSE?查无此人!ENDIFCLOSEDATABASE2.分支语句格式:docasecase条件1语句序列1case条件2语句序列2……case条件n语句序列n[otherwise语句序列n+1]endcase功能:依次判断CASE后的条件是否成立,当发现某个CASE后面的条件成立时,就执行该CASE和下一个CASE之间的命令序列,然后执行ENDCASE后面的命令。如果所的有条件都不成立,则执行OTHERWISE与ENDCASE之间的命令序列,然后转向ENDCASE后面的语句。说明:不管有几个CASE条件成立,只有最先成立的那个CASE条件对应的命令序列被执行;如果所有的CASE条件都不成立,且没有OTHERWISE子句,则直接跳出本结构;DOCASE和ENDCASE必须成对出现。例2.6将学生成绩分为“不及格”、“及格”、“良好”和“优秀”等次。6clearinput输入学生成绩:toscoredocasecasescore=0andscore60?不及格casescore=60andscore70?及格casescore=70andscore85?良好casescore=85andscore=100?优秀otherwise?不合法的数据!endcase子任务五学用循环结构循环结构也称重复结构,是指程序在执行过程中,其中的某段代码被重复执行若干次。被重复执行的代码段,通常称之为循环体。VFP支持循环结构的语句有三种:dowhile–enddofor-endfor语句scan-endscan1.dowhile-enddo语句格式:dowhile条件语句序列1enddo功能:执行该语句时,首先判断DOWHILE处的循环条件是否成立,如果条件成立,条件循环体enddo后面的语句假真条件循环体enddo后面的语句假真loopexit7则执行DOWHILE和ENDDO之间的命令序列。当执行到ENDDO时,返回到DOWHILE,再次判断循环条件是否成立,以确定是否再次执行循环体。若条件为假,则结束该循环语句,执行ENDDO后面的语句。循环语句执行过程如上图所示。说明:如果第一次判断条件即为假,则循环体一次都不执行。如果循环体中包含LOOP命令,则遇到LOOP时,就结束循环体的本次执行,不再执行其后的语句,而是转回到DOWHILE重新判断条件。如果循环体中包含EXIT命令,则遇到EXIT时,就结束该语句的执行,转去执行ENDDO后面的语句。通常LOOP和EXIT出现在循环体内嵌套的选择语句中,根据条件决定是LOOP回去,还是EXIT出去。例2.7编写程序,计算S=1+2+…+100。S=0I=1DOWHILEI=100S=S+II=I+1ENDDO?S=,S例2.8求前100个自然数中的偶数和。s=0i=1dowhilei=100ifmod(I,2)=0s=s+ii=i+1elsei=i+1loopendifenddo?前100个自然数中的偶数和为:,sreturn2.for-endfor语句格式:for循环变量=初值to终值[step步长]循环体endfor|next功能:执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否大于(步8长大于0时)或小于(步长小于0时)循环变量终值,若结果为真,则退出循环;否则,执行循环后,循环变量自动按步长增加或减少。说明:该语句用循环计数器循环变量来控制循环体的执行次数。常用于实现循环次数已知情况下的结构。例2.9编写程序test9.prg,找出100~999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(153=13+53+33)CLEARFORI=100TO999A=INT(I/100)B=INT((I-A*100)/10)C=I-A*100-B*10IFI=A^3+B^3+C^3?IENDIFENDFORRETURN3.scan-endscan语句格式:scan[范围][for条件]循环体endscan功能:执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。说明:⑴范围的默认值是all。⑵exit和loop命令同样可以出现在该循环语句的循环体内。例2.10统计专业代码(学号的第3、4位)为03的男、女生人数。OPENDATABASEXSXKUSE学生STORE0TOM,WSCANFORSUBS(学号,3,2)=03IF性别=.T.M=M+1ELSEW=W+1ENDIFENDSCANCLEAR?男生人数:,M?女生人数:,W9CLOSEDATABASE编程举例例2.11计算T=1!+2!+…+10!cleart=0p=1fori=1to10p=p*it=t+pendfor?'t=',t例2.12编制一个查询学生情况的程序。要根据给定的学号找出并显示该学生的姓名及各门功课的成绩。opendatabasexsxkdowhile.t.clearaccept请输入学号:tomxhselect学生.学号,姓名,课程名,成绩from学生,选课,课程;where学生.学号=选课.学号and课程.课程号=选课.课程号;and学生.学号=mxhwait'继续查询?(y/n)'topifupper(p)'Y'useexitendifenddoclosedatabase10第十二讲多模块程序子任务一认识模块及其定义和调用模块可以是程序文件(命令文件),也可以是过程。过程的建立仍使用MODIFYCOMMAND命令,文件的默认扩展名是PRG。过程定义的语法格式如下:PROCEDURE|FUNCTION过程名命令序列[RETURN[表达式]][ENDPROC|ENDFUNC]PROCEDURE|FUNCTION命令表示一个过程的开始,并命名过程名.过程名必须以字母或下划线开头,可以包含字母、数字和下划线。ENDPROC|ENDFUNC命令表示一个过程的结束,如果缺省,过程结束于下一条PROCEDURE|FUNCTION命令或文件结尾处。当过程执行到RETURN命令时,控制将转回到调用程序(或命令窗口)并返回表达式的值。如果缺省RETURN命令,则在过程结束处自动执行一条隐含的RETURN命令。若RETURN语句不带表达式,则回逻辑真.T.。过程可以包含在程序文件中放在程序文件代码的后面,也可以放在称为过程文件的单独文件里。过程文件里只包含过程,这些