您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第2章 Foxpro程序设计
2.1FOXPRO程序及命令文件一、FOXPRO程序设计简介FoxPro支持的三种工作方式:命令交互、程序执行、选单操作1、命令文件(程序文件):把完成某个任务的一批命令编成一个程序,作为文件存入磁盘。2.结构化程序设计:语句没有标号,程序走向由结构来控制FoxPro程序的四种控制结构:顺序结构、分支结构、循环结构及过程(子程序)。FoxPro程序支持基于模块化的自顶向下的结构化程序设计。建立命令程序就是把程序中所用到的命令依次写入文件,可以在FoxPro的编辑器,也可以用其他文本文件编辑器,调用FoxPro的编辑器有菜单操作和命令方式两种:菜单方式:文件新建(程序/文件)新建文件按钮如新建程序,文件扩展名默认为.PRG若新建文件,存盘时要自定义为.PRG文件命令方式:①MODIFYCOMMAND②MODIFYCOMMANDMAIN.PRG③MODIFYFILE④MODIFYFILEMAIN.PRG注:不加文件名的命令在生成时用程序1为文件名,存盘时用户给出文件名。CTRL+W或CTRL+END为存盘退出CTRL+Q或ESC键为取消操作或不存盘退出。命令方式:DO<程序文件标识>文件标识既可以是.PRG文件,也可以是.FXP文件(由源程序编译成的目标文件)菜单方式:程序运行,在对话框中选择要运行的程序开始运行,在输入框中输入程序标识例如:DOMAIN.PRG2.2程序设计的基本步骤1.处理模块划分2.设计合理的库表结构3.画流程图4.编写程序流程图基本图符:矩形框:叙述框,表示数据的各种输入输出及处理功能。菱形框:判断框,表示从两个可选路径中判断选择一路径。流向限与箭头:表示流程的方向和顺序。圆角框:表示流程的开始与结束。输入A,BAB输出A输出B结束YN例如:输入A、B两个数,将其中较大的值输出。MODICOMMA.PRGINPUT“输入A:”TOAINPUT“输入B:”TOBIFA>B?A,”和”,B,”中较大的为”,AELSE?A,”和”,B,”中较大的为”,BENDIFDOA.PRG2.3几条常用的命令1.控制结果输出传或不传送到屏幕:SETTALKON/OFF2.控制结果输出传或不传送到打印机:SETPRINTERON/OFF3.控制结果输出送到打印机还是屏幕:SETDEVICETOPRINTER|SCREEN4.TEXT:把字符原样显示命令格式:TEXT〈文本字符〉ENDTEXT5.清屏命令CLEAR6.注释命令NOTE、*、&&7.终止程序执行命令:CANCEL8.返回命令:RETURN9.挂起程序命令:SUSPEND10.恢复执行被挂起程序的命令:RESUME在屏幕上指定位置把数据按规定格式输出,也可以在指定位置上输入与修改数据,或对输入数据进行格式控制与值域检验。输入格式:@<行,列>SAY<表达式>在坐标点<行,列>上输出表达式的值。例如:@5,6SAY2*5输出格式:@<行,列>SAY<表达式>GET<变量>GET语句在指定位置上反相显示变量的值,如有READ语句则是激活GET语句,对变量进行编辑修改,给变量赋新值。例如:USEBR.DBF@6,6SAY“姓名:”GET姓名READ2.4顺序结构执行方式:按命令排列顺序,逐条执行。例1、求圆面积。输入半径R求面积输出结果结束MODICOMME541.PRGSETTALKOFFINPUT“请输入半径:”TORS=3.14*R*R?”半径为”,R,”的圆的面积为”,SSETTALKON例2、求正方形的面积和周长。输入边长A求面积周长输出结果结束MODICOMME542.PRGSETTALKOFFINPUT“请输入正方形的边长:”TOAS=A*AL=4*A?”边长为”,A,”的正方形的面积为”,S??“周长为:”,LSETTALKON2.5分支结构2.5.1单分支结构IF…ENDIF语句格式:IFL表达式〈语句序列〉ENDIF注:其中语句序列可由一条或多条语句组成,条件为真时执行语句序列,否则直接跳到ENDIF后面的语句执行。L表达式ENDIF后面的语句语句序列TF输入AA=0求平方根输出结果结束YN例1:输入一个数A,求其平方根。MODICOMME5511.PRGINPUT“输入A:”TOAIFA>=0Y=SQRT(A)?A,”的平方根是:”,YENDIFDOE5511.PRG输入A、BA+B=0输出结果结束YN例2:输入两个数A和B,判断是否为相反数,是输出。MODICOMME5512.PRGINPUT“输入A:”TOAINPUT“输入B:”TOBIFA+B=0?A,”和”,B,”互为相反数”ENDIFDOE5512.PRG2.5.2双分支语句IF…ELSE…ENDIF语句格式:IFL表达式〈语句序列1〉ELSE〈语句序列2〉ENDIF注:执行此程序,条件为真时执行语句序列1,然后跳过ELSE语句直接执行ENDIF后面的语句;否则跳过语句序列1,直接执行语句序列2,然后顺序执行ENDIF后面的语句。ENDIF后面的语句L表达式语句序列1语句序列2YN输入A、BA+B=0输出是结束YN例1:输入两个数A和B,判断是否为相反数,输出结果。MODICOMME5521.PRGINPUT“输入A:”TOAINPUT“输入B:”TOBIFA+B=0?A,”和”,B,”互为相反数!”ELSE?A,”和”,B,”不互为相反数!”ENDIFDOE5521.PRG输出否查询EOF()没有查到结束YN例2:编写查询程序,根据输入的姓名显示相应的记录。MODICOMME5522.PRGSETTALKOFFCLEARUSExs.DBFACCEPT“输入要查询的姓名:”TOALOCATEFOR姓名=AIF.NOT.EOF()DISPELSE?”没有查到此人!”ENDIFDOE5522.PRG显示记录输入姓名2.5.3IF语句嵌套使用语句格式:IFL表达式IFL表达式〈语句序列1〉ELSE〈语句序列2〉ENDIFELSE〈语句序列3〉ENDIF注:IF语句中还包含IF语句,在<语句序列3>的位置也可以换成IF…ELSE…ENDIF的格式。输入XX<=0Y=2X结束YN例1:求一个分段函数Y=X0<X<12XX>=1或X<=0。Y=X01Y=XY=2XY=2XX>=1YNMODICOMME5531A.PRGINPUT“输入X:”TOXIFX<=0.OR.X>=1Y=2*XELSEY=XENDIF?”Y=”,YDOE5521.PRGMODICOMME5531B.PRGINPUT“输入X:”TOXIFX<=0Y=2*XELSEIFX>=1Y=2*XELSEY=XENDIFENDIF?”Y=”,YDOE5521.PRG例2:假定有一收费站,对于载重小于2吨的车辆每一次收费2元;2吨起不足4吨收费5元;4吨起不足8吨收费10元;8吨以上收费20元,编写程序由吨位计算应交款数。28sf=5sf=10sf=24sf=20zz输入zzzz<2SF=2YNSF=5ZZ4YNZZ8SF=10YNSF=20输出MODICOMME5532.PRGINPUT“输入载重:”TOZZIFZZ<2SF=2ELSEIFZZ<4SF=5ELSEIFZZ<8SF=10ELSESF=20ENDIFENDIFENDIF?”载重=”,ZZ,”交费=”,SF2.5.4多分支语句—DOCASE…ENDCASEDOCASE[提示语句]CASEL表达式1语句序列1CASEL表达式2语句序列2…………CASEL表达式N语句序列N[OTHERWISE语句序列1]ENDCASE注:执行此程序,依次判断各条件,只要找到一条为真的执行相关命令序列,其余条件不再判断,有关命令也不执行,直接到ENDCASE后面的语句;若没有满足条件的,如果有OTHERWISE就执行其命令序列,否则直接跳到ENDCASE后面的语句执行。MODICOMME5541.PRGINPUT“输入载重:”TOZZDOCASECASEZZ<2SF=2CASEZZ<4SF=5CASEZZ<8SF=10OTHERWISESF=20ENDCASE?”载重=”,ZZ,”交费=”,SFDOE5541.PRG例2:输入学号查询,找到了显示记录菜单,选择相应的功能执行相应操作。MODICOMME5542.PRGCLEARSETTALKOFFUSEXS.DBFACCEPT“输入学号:”TOXHIFEOF()?查无此学号!ELSETEXT记录操作:1、显示记录2、删除记录3、修改记录ENDTEXTINPUT“选择功能:”TOADOCASECASEA=1DISPCASEA=2DELECASEA=3EDITRECORDRECNO()OTHERWISE?”输入功能超范围!”ENDCASEENDIFUSE2.6.1步长循环命令格式:FOR〈循环变量〉=N值表达式1TON值表达式2[STEPN值表达式3]循环体语句序列ENDFOR/NEXT注:循环变量由初值表达式1开始验证其是否超过终值表达式2的值,是结束,否则执行循环体,执行到ENDFOR时循环变量加一个步长再从头验证直到循环变量超过终值结束。步长可正可负,由初值和终值的大小来决定,步长为1时,STEP可以省略。2.6循环结构例1:求S=1+2+……+100。CLEARS=0FORI=1TO100S=S+IENDFOR?”S=1+2+……+100=”,SCLEARINPUT“请输入N值:”TONS=0FORI=1TONS=S+IENDFOR?”S=1+2+……+”,N,”=”,S例2:求M=1*2*……+20。CLEARM=1FORI=1TO20M=M*IENDFOR?”M=1*2*……*20=”,MCLEARINPUT“请输入N值:”TONM=1FORI=1TONM=M*IENDFOR?”M=1*2*……*”,N,”=”,M例3:求连续输入10个数字,求其中的正数之和。CLEARS=0N=0FORI=1TO10INPUT“请输入第”+str(I,2)+“个数字”TOXifx=0S=S+XN=N+1endifENDFOR?N,”个正数之和S=”,S2.6.2当型循环1.语句格式:DOWHILEL表达式循环体ENDDO注:DOWHILE是循环起始,而ENDDO是循环结束,循环体是由一条或多条语句组成的语句序列。执行过程是当遇到dowhile时判断表达式的值,为真的执行循环体到enddo时再回到起始语句中再次判断条件条件、执行循环体,反复执行直到条件为假时跳出循环执行enddo后面的语句。例5:计算N的阶乘。SettalkoffclearINPUT“数N:”tonIFN<=0MESSAGEBOX(“请输入一个正数!”)RETURNENDIFm=1I=1DowhileI<=Nm=m*II=I+1ENDDO?N,”的阶乘是:”,mSETTALKOFFdowhile.t.inputtonIFn=0y=MESSAGEBOX(“请输入一个正数!是否继续求阶乘?,4+32)IFy=7EXITELSELOOPENDIFENDIFm=1i=1dowhilei=nm=m*ii=i+1ENDDO?n,的阶乘是:,ma=MESSAGEBOX(是否继续求阶乘?,4+32)IFa=7EXITENDIFENDDOSETTALKON例4:求连续N个不是5的倍数的自然数之和,当和是55的倍数时显示N的值和和的值。CLEARSTORE0TON,SDOWHILE.T.N=N+1ifMOD(N,5)=0LOOPendifS=S+NIFMOD(S,55)=0EXITENDIFENDDO?”当和是55的倍数时N=”,N,“和S=”,S3遍历循环方法1:利用DOWHILE循环和SKIP相搭配。方法2:用SCAN……ENDSCAN语句语句格式:SCAN[范围][FORL表达式]循环体语句序列ENDSCAN注:按库中记录顺序,对它们进行逐条访问操作,称为数据库遍历。SCAN开始验
本文标题:第2章 Foxpro程序设计
链接地址:https://www.777doc.com/doc-3973703 .html