讲师:张勇E-mail:x_h_b@tom.comVisualFoxPro程序设计教程第5章程序设计基础VFP的工作方式:1)交互式工作方式是直接在命令窗口中执行命令或用菜单及工具栏按钮执行命令。2)自动化工作方式是用编写的程序或用各种生成器生成程序文件再执行。5.1程序文件的建立、修改、执行5.1.1程序程序是能够完成一定任务的命令集合。程序文件的扩展名为prg。5.1.2程序文件的建立和修改1)用界面方式建立和修改程序2)用命令方式建立和修改程序格式:MODIFYCOMMAND[文件名|?]功能:打开程序编辑器,用于建立或修改程序文件5.1.3程序文件的执行1)用界面方式执行程序文件2)用命令方式执行程序文件格式:DO程序名功能:执行程序名指定的程序5.1.4程序的书写规则一个程序是由若干行组成,每行由回车键结束1)命令行:一个命令可以写在一行也可以分多行书写,分行书写时应该在行尾加续行符“;”2)命令的注释:注释符有&&,*,NOTE三种格式1:&&[注释内容]格式2:*[注释内容]格式3:NOTE[注释内容]功能:程序注释说明:格式1为行尾注释,即可写在命令行的尾部。格式2与格式3为行首注释,即以*和NOTE开始的行都为注释例5.1在学生库中查找VFP与C的成绩大于90分的学生的学号,姓名以及课程VFP与C语言的成绩opendatabase学生&&打开学生数据库select学生.学号,学生.姓名,学生成绩.vfp,学生成绩f.c;where学生.学号=学生成绩.学号and学生.学号=学生成绩f.学号and;学生成绩.vfp=90AND学生成绩f.c=90;&&命令分行书写要加分号from学生,学生成绩,学生成绩f&&select命令结束closedatabaseall&&关闭数据库return5.1.5调试命令与辅助命令1、SETTALK命令格式:SETTALKON|OFF功能:设置是否显示命令在执行过程中的状态信息,ON为显示信息(默认值),OFF为不显示信息。如:命令copyfiles学生.*to学生1.*,若选ON,则显示复制过程中复制的几个文件的信息。若选OFF,则无信息。2、CANCEL命令格式:CANCEL功能:终止程序运行,清除所有私有变量,返回到命令窗口3、RETURN命令格式:RETURN功能:结束当前程序执行,返回到调用它的上级程序,若无上级调用程序,则返回到命令窗口4、QUIT命令格式:QUIT功能:退出VFP系统,返回WINDOWS操作系统5.2输入与输出命令5.2.1输入命令1)INPUT命令格式:INPUT[字符表达式]TO[内存变量]功能:从键盘输入数据,回车后将数据赋给内存变量说明:1)字符表达式为提示信息。2)输入的数据可为,常量,变量,表达式。3)输入C,L,D型常量时要用定界符。例5.2查找指定姓名对应学生的学号,性别和数学成绩。opendatabase学生input输入姓名:tonameselect学生.学号,学生.姓名,学生成绩.数学from学生,学生成绩;where学生.姓名=nameand学生成绩.学号=学生.学号closedatabaseallreturn2)ACCEPT命令格式:ACCEPT[字符表达式]TO[内存变量]功能:从键盘输入字符串数据,赋给内存变量说明:1)字符表达式为提示信息。2)输入的字符串不需加定界符,否则会将定界符作为字符串的一部分。3)若不输入数据直接按回车键,将空串赋给变量。3、WAIT命令格式:WAIT字符表达式]TO[内存变量][WINDOW[AT行,列][NOWAIT][CLEAR|NOCLEAR][TIMEOUT数值表达式]功能:暂停程序运行,字符表达式为提示信息,待从键盘输入一个字符赋给内存变量,程序继续执行。说明:1)省略[字符表达式],则显示默认信息,按任意键继续…。2)对于[TO内存变量],若直接回车,变量中内容为空串,省略此项,输入字符不保存。3)[[WINDOW[AT行,列]]设置信息窗口在屏幕上的位置,省略AT行,列信息将显示在屏幕的右上角。4)[NOWAIT]不等待输入直接往下执行。5)CLEAR清除提示信息窗口,NOCLEAR不清除提示信息窗口,直到执行一条WAITWINDOW命令或WAITCLEAR命令为止。6)[TIMEOUT数值表达式]由数值表达式指定等待输入的秒数。若超出秒数,则不等待自动往下执行。例5.3WAIT的应用wait继续?toxwindowtime105.2.2输出命令格式:@行,列[SAY表达式][GET变量名][DEFAULT表达式]功能:在屏幕指定行列输出表达式的值并修改内存变量的值。说明:1)行,列中行自上而下编号,列自左至右编号,编号从0开始,行列可以使用小数精确定位。2)省略SAY选项,GET变量值在行列指定位置开始显示。若选SAY选项,先显示表达式的值,然后再显示GET变量值。3)GET中的变量必须有初值或用[DEFAULT表达式]中的表达式命令定值。4)GET选项必须用READ命令激活。例5.4查找学生成绩大于等于指定成绩的或数学大于等于指定分数的学生学号,姓名,入学成绩,数学成绩。clearopendatabase学生@10,10say输入入学成绩:getrxcjdefault0@10,10say输入数学分数:getsxfsdefault0read@10,10say入学成绩为+str(rxcj)+“数学为+str(sxfs)select学生.学号,学生.姓名,学生.入学成绩,学生成绩.数学;from学生,学生成绩where学生.入学成绩=rxcjand学生成绩.数学=sxfs;and学生.学号=学生成绩.学号closedatabaseallreturn5.3程序的基本结构程序设计一般采用顺序,条件,循环这三种基本结构,这三种结构贯穿于整个程序的设计中。5.3.1三种基本结构1)顺序结构:程序是按语句排列的先后顺序来执行。2)选择结构:条件为真执行一部分语句,否则执行另一部分语句。3)循环结构:当条件为真执行循环体,否则结束循环。5.3.2顺序结构程序设计例5.7求圆面积s=0r=0input输入r:tors=3.14*r*r?s=,sreturn5.3.3选择结构程序设计1、二分支选择结构格式:IF条件命令行列1ELSE命令行列2ENDIF功能:当条件成立时执行命令序列1,否则执行命令序列2。当不包含ELSE时,条件成立执行命令序列1,否则执行ENDIF后的语句。说明:IF和ENDIF必须成对出现,此语句可以嵌套使用,条件是逻辑表达式例5.8当r=0时计算圆面积否则输出不合题意settalkoffs=0r=0input输入r:torifr0s=pi()*r*r?s=,selse?r0不合题意!endif?程序结束return例5.9输入学号,在学生表中查询学生姓名,学生入学成绩,若没有找到,输出无此学生clearopendatabase学生use学生input输入学号:toxhlocatefor学号=xhiffound()?学号:+学号+space(2)+姓名:+姓名+space(2)+str(入学成绩,3)else?无此学生endifclosedatabaseallreturn2、多分支选择结构格式:DOCASECASE条件1命令序列1……CASE条件n命令序列n[OTHERWISE]命令序列n+1ENDCASE功能:依次判断条件是否成立,若某个条件成立,则执行对应的语句序列,然后执行ENDCASE的后面语句,若所有条件都不成立,就执行OTHERWISE语句序列n+1。说明:1)条件为逻辑表达式。2)DOCASE与ENDCASE必须成对出现。例5.10输入学生姓名,成绩,给出成绩的等级,成绩为百分制,成绩的等级情况为90-100为优秀,70-89为良好,60-69为及格,0-59为不及格name=“”number=0grade=input输入学生姓名:tonameinput输入学生成绩:tonumberdocasecasenumber=90andnumber=100grade=优秀casenumber=70andnumber=89grade=良好casenumber=60andnumber=79grade=及格casenumber=0andnumber=59grade=不及格otherwisegrade=输入错误endcase?name,number,gradereturn5.3.4循环结构程序设计VFP有三种循环结构,它们是DOWHILE,FOR,SCAN。1、DOWHILE循环格式:DOWHILE条件命令序列1[LOOP]命令序列2[EXIT]命令序列3ENDDO功能:1)当条件成立时执行DOWHILE与ENDDO之间的命令,这些命令称为循环体。2)程序执行到ENDDO时自动返回到WHILE条件处重新判断条件是否成立,以决定是否循环。3)当条件不成立时,结束循环,执行ENDDO下面命令。说明:1)DOWhile与ENDDO必须成对出现。2)执行LOOP命令时结束本次循环,自动返回DOWHILE处重新判断循环条件。3)遇到EXIT命令时结束循环,执行ENDDO下面命令。例5.11求1+2+3+…+100的值sum=0n=1dowhilen=100sum=sum+nn=n+1enddo?s=,sreturn例5.12对100个任意数求和,正数求和,负数不求和,当输入0.001时停止输入sum=0n=1dowhilen=100inputx:toxn=n+1ifx0loopendififx=0.0001exitendifsum=sum+xenddo?“sum=,sumreturn2、FOR循环格式:FOR循环变量=初值TO终值[STEP步长]循环体ENDFOR|EXIT功能:先把初值赋给循环变量,再判断循环条件是否成立。若不成立就结束循环,执行循环后面的命令,若条件成立,就执行循环体,循环再执行一此,循环变量自动增加一个步长。再判断循环变量是否成立,以判断是否执行循环体。说明:1)循环变量为内存变量,初值,终值,步长为数值表达式。2)当步长为0时循环变量无增量,将死循环,步长默认值为1。3)在循环体内可以改变循环变量,但这会改变循环次数。4)在循环体内可以包括,LOOP和EXIT。当遇到LOOP时,本次循环结束,循环变量增加一个步长值,进入下一次循环,当遇到EXIT时,结束循环,执行下面的命令。例5.13求1+2+…+nsum=0input输入n:tonfori=1tonsum=sum+iendfor?s=,sreturn3、SCAN循环格式:SCAN[范围][FOR条件1][WHILE条件2]循环体ENDSCAN功能:在当前表的指定范围内记录指针自动移到满足条件1或条件2的记录上,执行循环体,然后再将记录指针自动移动到下一个满足条件1或条件2的记录上再一次执行循环体直至超出范围。默认范围为表中所有记录。说明:1)循环体内可包含LOOP与EXIT命令,当遇到LOOP命令时,结束本次循环返回到SCAN处进入下一次循环。当遇到EXIT时,结束循环,执行ENDSCAN后面的命令。例5.14逐条显示学生表中入学成绩大于等于490分的学生的学号,姓名,入学成绩,并统计人数clearn=0opendatabase学生use学生scanfor入学成绩=490dispplay学号,姓名,入学成绩n=n+1endscanclosedatabaseall?n=,nreturn4、循环的嵌套:在循环命令的循环体中包含了其他循环。循环嵌套就是指多重循环。例5.15输出乘法表:fori=1to9forj=1toi??str(j,2)+'*'+str(i,2)+