第7章结构化程序设计基础主要内容7.1程序设计基础7.2程序的基本结构7.3子程序技术复习思考题7.1程序设计基础7.1.1程序文件的创建例7.1创建程序文件名为STUDENT.PRG的程序。①在命令窗口中输入:MODICOMMSTUDENT.PRG打开程序编辑器窗口。②输入如下程序语句:USEXSDADISPFOR“王”$姓名WAIT*按Ctrl+W键存盘。2.菜单方式7.1程序设计基础3.项目管理器方式4.程序代码的输入与编辑7.1.2程序文件的运行1.命令方式命令格式:DO程序文件名功能:在命令窗口中直按输入命令执行程序,或者在程序中调用另一个程序运行。例7.2执行程序文件名为STUDENT.PRG的程序。DOSTUDENT.PRG7.1程序设计基础3.项目管理器方式4.程序代码的输入与编辑7.1.2程序文件的运行1.命令方式命令格式:DO程序文件名功能:在命令窗口中直按输入命令执行程序,或者在程序中调用另一个程序运行。例7.2执行程序文件名为STUDENT.PRG的程序。DOSTUDENT.PRG2.菜单方式3.项目管理器方式4.在工具栏上单击执行程序的命令按钮执行程序7.1程序设计基础7.1.3程序文件的修改1.命令方式MODIFYCOMMAND[程序文件名]2.菜单方式3.项目管理器方式7.1程序设计基础7.1.4程序中常用的操作命令1.人机交互式命令(1)字符串输入命令ACCEPT命令格式:ACCEPT[提示信息]TO内存变量功能:该命令等待用户从键盘输入字符串。当用户以回车键结束输入时,系统将该字符串存入指定的内存变量,程序继续运行7.1程序设计基础(2)等待命令WAIT命令格式:WAIT[提示信息][TO内存变量]功能:该命令显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标时继续程序的执行(3)数据输入命令INPUT命令格式:INPUT[提示信息]TO内存变量功能:从屏幕当前光标处开始显示提示信息,同时暂停程序运行,等待用户从键盘输入一个数据,并将其存入指定的内存变量,接着继续运行程序。7.1程序设计基础例7.4编写程序,由键盘输入一个球半径,计算机自动计算并输出球的体积。运行该程序,若输入的球半径为10,则屏幕显示如图7.6所示。CLEAR&&清除屏幕显示INPUT“请输入球的半径:”TOqAREA=3.14*q*q*q?"球的体积=",AREARETURN7.1程序设计基础2.非格式化输出命令命令格式:?|??[表达式列表=[AT列数]功能:输出信息。3.格式输入输出命令格式1:@行,列[SAY表达式[PICTURE“模式符”][FUNCTION“功能符”]][GET变量名[PICTURE“模式符”][FUNCTION“功能符”][DEFAULT表达式]][RANGE[表达式l][,表达式2]][SIZE表达式l,表达式2][VALID表达式l[ERROR提示信息]][WHEN表达式2][FONT“字体名”[,字号][STYLE“风格符”]]格式2:READ[SAVE][CYCLE][TIMEOUT秒]功能:输入输出信息。7.1程序设计基础例7.6格式输入输出举例NA=“”@2,10SAY“请输入姓名:”GETNA@2,10SAY“请输入姓名:”GETNAMEDEFA“”@2,10SAY“请输入姓名:”GETNAMEFUNC“A”@3,10SAY“请输入年龄:”GETNLDEFA18RANGE16,26@3,10SAY“请输入年龄:”GETNLSIZE6,8@3,10SAY“年龄”GETNLVALIDNL=16ANDNL=26ERROR″错误!″@3,10SAY“请输入年龄:”GETNLDEFA18WHENNOTNL=18READ&&向变量输入数据7.1程序设计基础4.辅助命令(1)结束程序运行的命令①返回调用程序命令--RETURN②结束程序命令--CANCLE系统执行到该语句时,结束本程序的运行,清除所有的私有变量,关闭所有已打开的文件,直接返回到命令窗口或Windows系统。③退出系统命令--QUIT系统执行到该语句时,结束本程序的运行,清除所有的私有变量,关闭所有已打开的文件,退出VFP6系统,返回Windows系统。④INKEY函数命令格式:INKEY([<数值表达式>],[,<功能字符>])功能:等待用户按键或鼠标输入,等待时间由数值表达式值确定(单位为秒),返回由按键而产生的一个整数值。7.1程序设计基础(2)注释命令用于在程序中插入注释内容,以提高程序的可读性。其格式有三种形式:命令格式1:*注释内容命令格式2:NOTE注释内容命令格式3:&&注释内容(3)清屏命令:用于清除VFP6主窗口内容,并将光标置于VFP6主窗口的左上角。命令格式:CLEAR7.1程序设计基础5.环境设置命令7.1程序设计基础7.1程序设计基础7.1.5编写程序的格式及步骤1.格式要求程序中的每个命令行都以回车键结尾,一行只能包含一条命令。若一条命令在一行写不下,也可分行书写,但需在分行处加上续行符“;”。2.编写步骤例7.7求梯形面积的方法:S=(上底A+下底B)*高H/2。编写程序就是根据任务要求,将其分解成一个个子任务,用相应的数据库命令描述出来,即写出相应的命令序列。以计算梯形面积为例,给出编写程序的通常步骤:(1)分析任务,确定方法。对所提出的任务认真分析,确定解决任务的模型或方法。(2)分解任务,描述算法。对任务进行算法描述,通常可用流程图描述处理步骤,把算法思想表达清楚,比较简单的问题可直接进入编写程序。7.1程序设计基础(3)编写程序,认真检查。根据语法要求将处理思想写成命令语句,编写程序中要认真检查,发现问题,及时纠正。SETTALKOFFA=4.5B=8H=5S=(A+B)*H/2?SRETURN(4)上机调试,纠正错误。在VFP6系统中运行调试,动态发现程序有错,查清原因,必要时重复步骤1~4步,直至得到正确的结果为止。7.1程序设计基础7.1.6调试程序1.程序错误的分类程序中出现的错误,一般可分为三类:语法错误、系统错误和逻辑错误。2.调试的方法(1)用手工调试:用程序编写器打开源程序,人工查找程序中的错误并修改。(2)用“调试器”调试:先打开调试器,再运行程序,由“调试器”跟踪程序运行且查错,并报告错误,由人工修改所报告错误。3.调试器的构成打开程序调试器有如下方法①在主菜单的“工具”下拉菜单中,单击“调试器”选项。②在命令窗口中执行命令DEBUG,打开调试器。7.2程序的基本结构7.2.1程序流程图7.2.2顺序结构顺序结构是指命令语句的执行顺序是按照命令在程序文件中排列的先后顺序依次执行的一段程序。例7.9USEKCGOTO5DISPLAY7.2程序的基本结构例7.10在学生数据库文件STUDENT.DBF中,对给定学生的学号项进行修改。SETTALKOFFUSESTUDENT&&打开STUDENT数据库表NAME=SPACE(8)XH=SPACE(8)**在10行10列显示请输入姓名的提示并将输入内容置入姓名@10,10SAY″请输入姓名″GETXM@10,50SAY″请输入学号″GETXHREADLOCATEFOR姓名=XM&&定位库中的相应记录REPLACE学号WITHXHDISPLAYUSE7.2程序的基本结构7.2.3分支结构1.单分支的结构形式单分支即根据用户设置的条件表达式的值,决定某一操作是否执行。命令格式:IF表达式命令行序列ENDIF7.2程序的基本结构例7.11查询学生情况,如果查到了就显示学生信息,查不到就什么也不显示。CLEARUSESTUDENTXH=SPACE(8)@10,4SAY″请输入要查询学生的学号:″GETXHREADLOCATEFOR学号=ALLTRIM(XH)IFNOTEOF()@2,10SAY″学号是″+学号+″的学生情况如下:″?姓名,性别,出生日期,专业ENDIFUSE7.2程序的基本结构2.双分支的结构形式双分支即根据用户设置的条件表达式的值,选择两个命令行序列中的一个来执行。命令格式:IF表达式命令行序列1ELSE命令行序列2ENDIF7.2程序的基本结构例7.12测试记录指针是否指向库文件尾。USESTUDENT&&打开数据库表STUDENTIFEOF()&&若库结束标志为真,显示文件结束?“文件结束”ELSE&&若库结束标志为假,库当前指针往下跳一个SKIPENDIF7.2程序的基本结构例7.13键盘输入X的值,当X0时,Y为X的2倍;当X≤0时,Y为X的一半。Y=2*x.F..T.y=x/2X0?开始输入一个数存入变量X输出变量Y的值结束图7.16流程图SETTALKOFFCLEAR&&清屏INPUT″输入x的值″TOx&&输入xIFx0&&当x0时,Y为2xY=2*xELSE&&y=x/2y=x/2ENDIF?“y=”,y7.2程序的基本结构3.多分支的结构命令格式:DOCASECASE条件1命令序列1CASE条件2命令序列2……CASE条件n命令序列n[OTHERWISE]命令序列n+1ENDCASE7.2程序的基本结构例7.13编写一个选择菜单程序。SETTALKOFFCLEARTEXT*******************1.增加**2.删除**3.修改**4.退出*******************ENDTEXTINPUT″请按功能输入选择编号″TONDOCASECASEN=1DOINSEPROCASEN=2DODELEPROCASEN=3DOUPDPROCASEN=4CANCEL&&终止运行,返回命令窗口ENDCASE7.2程序的基本结构例7.14根据用户要购书的单价和册数,计算出货款。CLEARINPUT″输入要买书单价:″TOPriceINPUT″输入要买多少册的书:″TOCountDiscount=折优惠,货款总计:″DOCASECASECount=5@10,10SAY″不打折,书款总计:″+STR(Price*Count,9,2)CASECount=10Sum=95@10,10SAYSum+Discount+STR(Price*Count*0.95,9,2)CASECount=50Sum=90@10,10SAYSum+Discount+STR(Price*Count*0.9,9,2)CASECount=100Sum=85@10,10SAYSum+Discount+STR(Price*Count*0.85,9,2)OTHERWISESum=80@10,10SAYSum+Discount+STR(Price*Count*0.8,9,2)ENDCASE7.2程序的基本结构3.IF的嵌套结构例7.15用IF的嵌套结构完成例7.14CLEARINPUT″输入要买书单价:″TOPRICEINPUT″输入要买多少册的书:″TOCOUNTDISCOUNT=折优惠,货款总计:″IFCOUNT5@10,10SAY″不打折,书款总计:″+STR(PRICE*COUNT,9,2)ELSEIFCOUNT=10SUM=95@10,10SAYSUM+DISCOUNT+STR(PRICE*COUNT*0.95,9,2)ELSEIFCOUNT=50SUM=90@10,10SAYSUM+DISCOUNT+STR(PRICE*COUNT*0.9,9,2)ELSEIFCOUNT=100SUM=85@10,10SAYSUM+DISCOUNT+STR(PRICE*COUNT*0.85,9,2)ELSESUM=80@10,10SAYSUM+DISCOUNT+STR(PRICE*COUNT*0.8,9,2)ENDIFENDIFENDIFENDIF7.2程序的基本结构7.2.4循环结构1.条件循环结构命令格式:DOWHILE条件<命令行序列1