第七章VisualFoxPro7.0程序设计7.1程序文件的建立、修改与运行7.2简单的交互式输入输出命令7.3结构化程序设计7.4过程与过程调用VisualFoxPro的工作方式•所谓单命令方式,即输入一条命令,完成一个操作的工作方式。•所谓菜单方式,即通过打开不同的菜单选择并完成不同的操作。•所谓程序方式,即批命令方式,是把一系列有序的命令放到一个文件中,再执行该文件整体。建立程序文件有两种方法:一是命令方式,二是菜单方式。1、命令方式命令格式:ModifyCommand[程序文件名]Modifyfile[程序文件名.prg]2、菜单方式选择菜单【文件】|“新建”菜单项,打开【新建】对话框。|选中“程序”单选按钮。7.1.1建立程序文件7.1.2修改程序文件1、【文件】|【打开】,找到要修改的程序文件。2、命令方式:modifycommand[文件名]程序文件编辑完后,选择【文件】|【保存】选项按“CTRL+W”键,ctrl+S来保存程序,按ESC键放弃程序的编辑并返回命令窗口。7.1.3运行程序文件1、命令方式:DO程序文件名2、在菜单方式下运行【程序】|【运行】3、打开要运行的程序文件,并单击常用工具栏上的“运行”命令按钮(即),来运行该程序文件。4、快捷方式Ctrl+E表示运行打开的当前程序。1、非格式化的输入命令FoxPro提供了如下三个非格式化输入命令:(1)数据输入命令(重点)命令格式:Input[提示信息]To〈内存变量名〉功能:显示提示信息,暂停正在运行的程序,等待用户从键盘输入数据或表达式并按回车键后,将数据或表达式的值存入指定的内存变量中,再执行中断了的程序。7.2.1交互式输入命令7.2简单的交互式输入输出命令例1:从键盘随机输入一个正数,以该正数为半径,求圆的周长和面积。*L1.prgsettalkoffclearinput半径=torl=2*PI()*rs=PI()*r*r?圆周长=,l?圆面积=,ssettalkonreturn该程序可以无数次运行,从而求出无数个半径值不同的圆的周长和面积。思考:从键盘输入两个任意正数,编程求以两数为边长的长方形面积。SETTALKOFFCLEARINPUT“长方形一边的长为:”TOAINPUT“长方形另一边的长为:”TOBS=A*B?“长方形的面积为:”,SSETTALKONRETURN(2)字符串输入命令命令格式:Accept[提示信息]To〈内存变量名〉功能:将用户输入的字符串赋值给指定的内存变量。说明:①输入的任何数据均被当作字符型赋值给内存变量。②如输入字符串为非空格打头,则不需要输入定界符③输入字符串长度不超过254个字符④命令提示信息与INPUT相同。7.2.1交互式输入命令例2:重写例1题程序。*L2.prgsettalkoffclearaccept半径=torl=2*PI()*val(r)s=PI()*val(r)*val(r)?圆周长=,l?圆面积=,ssettalkonreturn程序运行结果同例题2。7.2.1交互式输入命令(3)输入单字符命令命令格式:Wait[〈提示信息〉][To〈内存变量名〉]功能:暂停程序执行,等待键入一个字符,继续执行。说明:①只能接受一个字符,输入完以后立即响应,不要按回车键。②如有TO语句,则输入字符保存到指定变量,否则不保存。③若该语句不带子句,则暂停程序运行,屏幕显示Pressanykeytocontinue……7.2.1交互式输入命令例3:重写例1题程序。*L3.prgsettalkoffclearinput半径=torl=2*PI()*val(r)s=PI()*val(r)*val(r)?圆周长=,lwait?圆面积=,ssettalkonreturn7.2.1交互式输入命令三条输入命令的异同:ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束。WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键。INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。FoxPro系统把屏幕横向分成70格,用0—79表示,每格能输出一个英文字符(一个汉字占2格);纵向分成25行,用0—24表示,每行能输出一行字符。命令格式:@行坐标,列坐标Say表达式Get变量Read功能:在指定位置输出表达式的值并在其后的位置输入变量的值。2、格式化输入命令Eg:建立程序文件,要求通过程序方式在“读者”表中添加一条新记录。CLEARUSE读者APPENDBLANK@2,7SAY读者基本情况输入界面:@4,10SAY读者编号:GET读者编号@6,10SAY读者姓名:GET姓名@7,10SAY读者性别:GET性别@10,10SAY出生日期:GET出生日期@12,10SAY少数民族否:GET少数民族否@14,10SAY籍贯GET籍贯READUSE编写程序文件,修改读者表中第三条记录的姓名和籍贯两个字段。SETTALKOFFUSE读者GO3@2,20SAY“姓名”GET姓名@4,20SAY籍贯GET籍贯READDISPLAYUSERETURN思考:若将上例中的要求改为对任意一条记录进行修改,程序该做何改动?ClearUse读者Input“要修改的记录号:”tonGon@2,20SAY“姓名”GET姓名@4,20SAY籍贯GET籍贯READDISPLAYUSERETURN行输出命令有两种使用方式,一种是将表达式结果输出到屏幕当前的光标位置,另一种方式则可以对表达式的输出结果进行格式化,而且可以输出到屏幕的指定位置。但无论是那种方式都可以输出表达式列表的结果。1、行输出命令(?|??)2、格式化输出命令@行坐标,列坐标SAY表达式行列坐标可以为数值型常量、变量、表达式,行坐标的取值为0—24,列坐标的取值为0—79;7.2.2交互式输出命令7.2.3其它功能性命令1、清屏命令命令格式:clear功能:清除屏幕或用户自定义的窗口2、显示文件内容命令命令格式:type文件名功能:在屏幕或打印机上输出指定文件的内容3、文本输出命令命令格式:text文本信息endtext功能:原样输出文本信息内容。4、终止执行命令命令格式:cancel功能:终止程序的执行,释放所有的内存变量,系统返回到命令窗口状态。5、注释命令命令格式1:note注释内容命令格式2:*注释内容命令格式3:&&注释内容功能:三个命令的功能相同,都是对程序做注释。7.3结构化程序设计结构化程序设计由若干结构组成,每一个基本结构可以包含一个或多个命令,它主要包括顺序结构、分支结构和循环结构三种。使用结构化程序设计有如下优点:1、可读性强:每个模块功能明确、模块间的关系简单、清晰。2、独立性好:每个模块内部的修改尽可能不影响其它模块。3、易验证:每个模块的正确性容易验证,各个模块连接起来后整个程序也就容易验证。7.3.1顺序结构程序设计顺序结构指计算机按程序语句的先后顺序依次逐条执行程序中各个语句,是程序中最基本、最简单的一种结构。顺序结构流程图如图7-5所示,该结构先执行A操作,再执行B操作,两者是顺序执行的关系。ABAB例10:从键盘输入一个大写字母,要求改用小写字母输出。*L10.PRGsettalkoffclearwait请输入一个大写字母:toax=asc(a)y=chr(x+32)?ysettalkonreturn思考:1、修改如下程序:clearS=0Input“请输入第一个数”toxS=s+xInput“请输入第二个数”toxS=s+xInput“请输入第三个数”toxS=s+x?x2、参看下例,为什么可以用这种方法交换两个变量的值。Input“a=”toaInput“b=”tob?“交换前a,b:”,a,bT=aA=bB=t?“交换后a,b:”,a,b7.3.2分支结构程序设计1、单分支结构语句格式:If〈条件表达式〉〈语句序列〉Endif功能:执行if语句时,首先判断条件表达式的值,若为.T.,则执行If到Endif之间的语句序列,再执行Endif后面的语句,若为.F.,则不执行If到Endif之间的语句,直接执行Endif后面的语句,程序执行过程就发生了跳转。If和Endif必须成对出现,缺一不可,语句序列可以是一条或多条语句。例13:输入两个实数,依其值由大到小输出这两个数*L13.PRGsettalkoffinputa=toainputb=tobifabt=aa=bb=tendif?a,bsettalkonreturn思考2:用if…endif结构判断用户输入的数能否同时被4和6整除。思考3:如何求解一元二次方程的实数解。思考1:若输入三个数由大小的顺序输出呢?2、选择分支结构语句格式:If〈条件表达式〉〈语句序列1〉Else〈语句序列2〉Endif功能:如条件表达式的值为.T.,则执行语句序列1,然后执行Endif后面的语句,否则执行语句序列2,然后执行Endif后的语句。其中〈条件表达式〉可以是各种表达式的组合,其值必须是逻辑值,可以是逻辑常量或变量。If、Else、Endif语句应单独占一行。思考:若要输出输入的三个数中最大的数(最小的数)?clearinput数据1:toainput数据2:tobinput数据3:tocifabt=aelset=bendififtcs=telses=cendif?sreturn思考:1、用双向分支结构编程输入一个数返回其绝对值。2、用双向分支求一元二次方程的实数解,有,则输出解的值,无解,输出“此方程无实数解!”3、多分支结构语句格式:DoCaseCase〈条件表达式1〉〈语句序列1〉Case〈条件表达式2〉〈语句序列2〉……Case〈条件表达式n〉〈语句序列n〉[Otherwise〈语句序列n+1〉]Endcase功能:系统依次检查每个Case的条件表达式,只要遇到第一个条件为.T.时,则执行该条件下的语句序列,之后不再判断其他条件,也不再执行其他语句序列,直接执行Endcase后的语句。若所有条件均不成立,如有选择项Otherwise语句,则执行它后面的语句,否则执行ENDCASE后面的语句。说明:(1)Docase结构中至少有一个case语句(2)Docase与第一个case之间的语句不会被执行。(3)如果有多个条件表达式为.T.,则只有第一个有效,其他case子句的条件不会被判断,其对应的语句序列也就不会被执行。7.3.2分支结构程序设计例16:CJ.DBF(成绩表)中,按学生XM(姓名)进行查询,如该生存在,判断其英语成绩ENGLISH是否为优(70分以上),中(70分到70分),及格(60分到70分),不及格(小于60分)。settalkoffclearusecjaccept请输入查看英语成绩的学生姓名:tonamelocateforxm=nameiffound()docasecaseenglish=70?优caseenglish=70?中caseenglish=60?及格otherwise?不及格endcaseelse?找不到该学生endifusesettalkonreturn例如:x=2.5Docasecasex1y=1casex2y=2endcase?y1例如:如何判定用户输入的分数是哪个级别?clearinput请输入分数:toscoreDocasecasescore100?输入错误!casescore=90?优秀!casescore=75?良好!casescore=60?及格!casescore=0?不及格!casescore0?输入错误!Endcaseclearinput请输入分数:toscoreDocasecasescore0?输入错误!casescore60?不及格!casescore75?及格!casescore90?良好!casescore