第7章结构化程序设计基础7.1VisualFoxPro程序控制结构7.1.1顺序结构顺序程序设计就是根据事物的处理顺序要求,将相应的指令按照它们所完成的功能,有机地结合起来的一个指令序列,这些指令的执行是按它们的排列顺序一条接一条的来执行例:该程序完成将一个数据库表打开,并显示该数据库表的数据结构SETTALKOFFUSEschool.DBFDISPLAYSTRUCTUREWAIT''请按下任一键返回''CLEARSETTALKONRETURN输入命令命令命令命令格式输入命令激活GET变量清除GET变量1.INPUT命令格式:INPUT[提示信息]TO内存变量功能:用于接受多种数据类型的数据到一个变量中。它可以接收字符型数据,还可以接收数值型、日期型和逻辑型表达式的值。2.ACCEPT命令格式:ACCEPT[提示信息]TO内存变量功能:ACCEPT命令根据接收命令显示提示信息,等待用户从键盘输入一个字符串并按回车键后,存入指定的内存变量中3.WAIT命令格式:WAIT[提示信息][TO内存变量]功能:WAIT命令是单个字符接收命令,命令暂停程序执行,等待用户键入任何一个字符后继续4.格式输入命令格式:@行,列[SAY提示信息]GET变量READ[SAVE][CYCLE][TIMEOUT等待时间]功能:格式输入命令是指在输入数据时按照一定的格式进行输入5.激活GET变量激活GET变量是指使该变量进入编辑状态,让光标自动跳到该变量值所在位置上等待编辑修改。若有多个GET变量,则它们将依次被激活(其中无须修改的变量可按回车键越过),直至最后一个GET变量处理结束后,READ命令的作用才终止。6.清除GET变量一般说来,已被激活过的GET变量便被清除,但若在READ命令中带有可选项SAVE,就不做清除工作,当遇到下一个READ命令时,这些GET变量将被再一次激活。例:在学生表中,需要按学号查询学生的基本信息CLEARSETTALKOFFUSEstudentACCEPT请输入待查学生的学生编号号:TObh1LOCATEFORs_number=bh1WAITDISPs_number,s_name,s_sex,s_birthdayUSESETTALKONRETURN常用的输出命令1.?|??命令格式:?|??表达式表功能:该命令依次计算并显示各表达式的值2.格式输出命令格式:@行,列SAY表达式功能:命令在指定位置输出表达式的值。行,列指定了输出的位置例:编写顺序结构程序,计算方程ax2+bx+c=0的两个根(不考虑虚根的情况)SETTALKOFFINPUT'请输入系数a:'TOaINPUT'请输入系数b:'TObINPUT'请输入系数c:'TOcdelt=SQRT(b*b-4*a*c)x1=(-b+delt)/(2*a)x2=(-b-delt)/(2*a)?x1?x2SETTALKON程序运行后:请输入系数a:1请输入系数b:4请输入系数c:4运行结果为:-2.0000:-2.0000请读者把语句“?x1”和“?x2”自行修改为“@……SAY……”语句格式,观察结果。有关“@……SAY……”语句格式的应用在后续章节实例中有所体现状态设置命令1.置会话状态命令格式:SETTALKON|OFF功能:通常,VisualFoxPro在执行命令时会向用户反馈大量信息,当会话状态为开通时,不仅会减慢程序的运行速度,而且还会与程序本身的输出相互夹杂,引起混淆。所以程序调试时,一般置“会话”于开通状态,而在执行程序时则通常要求置“会话”于断开状态2.置打印状态命令格式:SETPRINTON|OFF功能:设置打印的输出方向,系统默认打印机置于断开状态,就是说命令的执行结果只送到屏幕,不送往打印机。若设置打印机为接通状态,则在屏幕上显示的执行结果被同时打印3.置屏幕状态命令格式:SETCONSOLEON|OFF功能:在系统的默认状态下,用户从键盘输入的内容都在屏幕上显示。如果有时要求键入的内容保密而不被显示,这只需使用命令SETCONSOLEOFF便可4.置缺省驱动器和目录命令格式:SETDEFAULTTO[盘符:][路径]功能:用于设置进行输入输出操作时的缺省驱动器和缺省目录注释命令1.第一种格式:NOTE|*[注释]功能:命令在程序中加注释行信息。执行程序文件时,不执行以NOTE或*开头的行。如果要在下一行继续注释,可在本注释行尾加上一个分号“;”,或者直接回车再另用一个注释命令2.第二种格式:&&[注释]功能:命令在命令语句的尾部加注释信息例:以下程序使用了一些设置命令和注释CLEAR&&清屏(1)设置默认工作目录SETDEFAULTTOD:\(2)显示当前状态信息DISPLAYSTATUSWAIT(3)恢复原默认工作目录SETDEFAULTTO(4)关闭所有打开的文件,退出VFPQUIT程序的执行后,将显示当前系统的状态7.1.2分支结构简单判断语句选择判断结构多重选择多分支(选择)结构1.简单判断语句格式:IF(条件表达式)命令组ENDIF功能:(条件表达式)可以是各种表达式的组合,但表达式的返回值必须是逻辑值,“.T.”或“.F.”。当条件表达式的值为真时,执行命令组;当条件表达式的值为假时,则执行ENDIF语句后的指令序列。例:比较两个数的大小,并按值由大到小的次序输出结果SETTALKOFFCLEARX=0Y=0Z=0@2,5SAY''请输入第一个数:''GETX@4,5SAY''请输入第二个数:''GETYREADIFXYZ=XX=YY=ZENDIF@6,5SAY''这两个数排序结果为:''@8,5SAYX@8,15SAYYSETTALKONRETURN执行以上程序后,若输入第一个数为9,第二个数为12,则结果将显示12和9例:在学生表中,根据某个学生的姓名,查询某个学生的信息SETTALKOFFUSEstudentname=SPACE(8)@2,5SAY''请输入学生姓名:''GETs_nameREADLOCATEFORs_name=nameIFFOUND()DISPLAYENDIFSETTALKONUSERETURN2.选择判断结构格式:IF(条件表达式)命令序列1ELSE命令序列2ENDIF功能:根据给定条件的真、假,判断所要执行命令组例:比较两个数的大小,并输出较大的数的值CLEARX=0Y=0Z=0@2,5SAY''请输入第一个数''GETX@4,5SAY''请输入第二个数''GETYREADIFXY@6,5SAY''这两个数中较大的数为:''@8,5SAYXELSE@6,5SAY''这两个数中较大的数为:''@6,15SAYYENDIFRETURN执行以上程序后,若输入第一个数为9,第二个数为12,则输出结果为123.多重选择在实际应用中,经常有不止一种条件比较简单的问题,而面对的是很复杂的实际问题,要对这些问题做复杂的判断,这就引出了通过使用IF语句嵌套来进行判断的问题。我们以实例来说明嵌套的使用例:求三个数中的最大、最小两个数,并输出结果CLEARX=0Y=0Z=0@1,5SAY请输入X的值GETX@2,5SAY请输入Y的值GETY@3,5SAY请输入Z的值GETZREADMAX1=XMIN1=ZIFZYIFZXMAX1=ZIFYXMIN1=XELSEMIN1=YENDIFENDIFELSEIFYXMAX1=YIFZXMIN1=XENDIFENDIFENDIF@5,5SAY这三个数中较大的数为:@5,25SAYMAX1@7,5SAY这三个数中较小的数为:@7,25SAYMIN1RETURN若对x,y,z分别输入5,6,7,则程序的运行结果为:这三个数中较大的数为:7这三个数中较小的数为:54.多分支(选择)结构格式:DOCASECASE条件1命令组1CASE条件2命令组2…CASE条件n命令组n[OTHERWISE命令组n+1]ENDCASE功能:在执行DOCASE语句时,依次判断各条件是否满足,若条件满足,就执行该条件后的命令组,直到遇到下一个CASE、OTHERWISE或ENDCASE7.1.3循环结构循环结构循环结构(计数循环结构)循环(扫描循环)DOWHILE循环结构格式:DOWHILE条件命令组[EXIT][LOOP]ENDDO功能:当条件满足为真时,总是会反复地执行循环体语句,直到条件不满足时从ENDDO语句跳出循环例:编写程序计算x=1×3×5×7×……×n的值,并输出计算结果CLEARi=1n=0x=1@15,25say请任意输入一个大于1的奇数GETnREADDOWHILE.T.x=i*xi=i+2IFinEXITENDIFENDDO?x=,xRETURN如果输入n的值为9,则最后输出结果为:945例:求1~100之间全部奇数之和STORE0TOx,yDOWHILE.T.x=x+1DOCASECASEINT(x/2)=x/2&&如果x是数,则进行下一次循环LOOPCASEx=100&&如果x大于100,则退出循环EXITOTHERWISE&&否则累加y=y+xENDCASEENDDO?0~100之间的奇数之和为:,yRETURN程序运行后,输出的结果为:2500本程序只是为了说明LOOP和EXIT两语句的作用。程序中的循环条件永远为真,故称为永真循环。显然当x的值大于等于100时,执行EXIT语句即跳出循环体。当x为偶数时直接进行下一次循环例:逐条输出学生表中1988年出生的学生的记录CLEARUSEstudentINDEXONYEAR(出生日期)TAGcsrqsySEEK1988DOWHILEYEAR(出生日期)=1988DISPLAYSKIPENDDOUSERETURN程序中采用索引查询定位的方法查询1988年出生的学生的记录FOR循环结构(计数循环结构)格式:FOR循环变量=初值TO终值[STEP步长值]命令组[EXIT][LOOP]ENDFOR|NEXT功能:语句执行时,首先计算初值、终值和步长值,并将初值赋给循环变量,再将循环变量的值与终值比较,如果循环变量的值在初值与终值范围内,则执行FOR与ENDFOR之间的命令,然后循环变量按步长值增加或减小,再重新比较,直到循环变量的值不在初值与终值范围内,结束循环,转去执行ENDFOR后面的第一条命令例:所谓水仙花数是指一个数,比如一个三位数,其各位数字的立方和等于该数本身(如153=13+53+33)。求所有的水仙花数CLEARFORm=100TO999a=INT(m/100)&&百位数字b=INT(MOD(m,100)/10)&&十位数字c=m%10&&个位数字IFm=a^3+b^3+c^3?mENDIFENDFORRETURN程序运行结果为153370371401例:从键盘输入10个数,编程找出其中的最大值和最小值CLEARa=0INPUT请从键盘输入一个数:TOaSTOREaTOmax1,min1FORi=2TO10INPUT请从键盘输入一个数:TOaIFmax1a&&如果输入的数比当前的最大值大,则替换当前最大值max1=aENDIFIFmin1a&&如果输入的数比当前的最小值小,则替换当前最小值min1=aENDIFENDFOR?最大值为:,max1?最小值为:,min1RETURN如果任意输入10个数,则程序会输出其中的最大最小值例:用嵌套循环编写程序,输出右边图形:命令程序如下:CLEARFORi=1TO5@i,9-iFORj=1TO2*i-1??*ENDFORENDFORRETURNSCAN循环(扫描循环)SCAN语句按表文件记录的顺序在指定范围内从头到尾扫描每一条记录,每扫描一次就执行一次循环体语句,直到扫描完毕退出循环7.2子程序、过程和函数7.2.1子程序子程序的构成子程序的调用主程序1.子程序的构成格式:RETURN[TOMASTER|TO程序文件名|