第7章结构化程序设计一、程序与程序文件1、何谓程序?程序设计就是为了使计算机能够完成某一具体任务而编写一序列指令的过程。VFP程序就是一序列VFP命令的有序集合,按一定的结构顺序存放在被称为程序文件或命令文件的文本文件中。例:编写程序,从键盘输入圆的半径,求其面积。2、程序文件的建立、修改和执行(1)建立新程序1)文件——新建2)MODIFYCOMMAND程序文件名(2)修改旧程序1)文件——打开(选取程序文件)2)MODIFYCOMMAND程序文件名(3)执行程序1)程序——运行2)DO程序文件名(可以不带扩展名prg)3、简单的输入输出命令(1)字符串输入ACCEPT字符表达式TO内存变量例:查询student表中某院系学生的信息(2)表达式输入INPUT字符表达式TO内存变量例:求指定半径的圆的面积两者的区别:INPUT可以输入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,如果输入的是字符型数据,则需要加定界符;ACCEPT该命令只接受字符型数据,输入的字符串不需要加定界符(3)单字符输入语句:WAIT提示信息TO内存变量WINDOWSAT行,列TIMEOUT数(4)命令注释以NOTE或*开头的代码为注释行,命令后也可以加注视行,以符号&&开头。二、分支结构程序设计——顺序结构、分支结构和循环结构1、顺序结构自始至终按照语句序列的排列顺序,依次逐条执行的简单程序。例:2、分支结构(1)简单分支程序IF条件表达式命令组ENDIF例:在VisualFoxPro中,运行下面程序后,屏幕显示的结果为____。X=4Y=5-X*2IFXYT=XX=YY=TENDIF?X,YRETURNA)45B)-34C)34D)43例:有如下程序:INPUTTOaIFa=10s=0ENDIFs=1?s假定从键盘输入的a的值一定是数值型,那么上面条件选择程序的执行结果是()。A)0B)1C)由a的值决定D)程序出错(2)分支条件语句IF条件表达式命令组1ELSE命令组2ENDIF例:计算变量VAR的绝对值并存入变量ABSVAR。例:从键盘输入一个数,判断是奇数还是偶数。例:判断某一年是否是闰年。闰年的条件是:年份能被400整除,或者年份能被4整除但不能同时被100整除。(3)分支语句的嵌套例求X(X=2)S=X2(-2=X2)|x|(x-2)input“请输入一个数:”TOXIFX=2ELSEIFS=X*XELSEENDIF【例7.10】教材P165(4)多分支语句DOCASECASE条件1语句序列1CASE条件2语句序列2…CASE条件n语句序列n[OTHERWISE语句序列n+1]ENDCASE从DOCASE入口顺序判断各个CASE子句的条件,执行最先满足条件的CASE语句序列。执行完成后,无论后面的条件是否为真,都直接跳出ENDCASE语句序列,直接执行ENDCASE后面的语句。如果任何条件都不满足,则执行OTHERWISE下的语句序列,然后执行ENDCASE后面的语句,如果没有OTHERWISE子句,则直接跳出本结构。例:上题利用DOCASE来实现。例:以下程序段执行的结果是X=85DOCASECASEX60?”及格”CASEX80?”良好”OTHERWISE?”不及格”ENDCASE三、循环结构概念:循环结构也称重复结构,是指程序在执行的过程中,其中的某段代码被重复执行若干次。被重复执行的代码段,通常称为循环体。VisualFoxPro支持循环结构的语句包括:DOWHILE—ENDDO、FOR—ENDFOR和SCAN—ENDSCAN(一)DOWHILE—ENDDO语句格式:DOWHILE条件语句序列1[LOOP]语句序列2[EXIT]语句序列3ENDDO说明:程序的走向(???)条件真循环体ENDDO后面的语句假先判断DOWHILE处的循环条件是否成立,如果条件为真,则执行循环体,当执行到ENDDO时,返回到DOWHILE,再次判断循环条件是否为真,若为真再次执行循环体.若条件为假,则结束该循环语句,执行ENDDO后面的语句.循环变量(体外赋初始值,体内修改)例:编写程序:输出1+2+3+……100的结果提示:引进内存变量S和i。S用来保存累加的结果,初值为0;i作为控制循环条件是否成立的变量,初值为1;重复执行命令S=S+i和i=i+1拓展:求s=1*2*3*4……100求S=1+3+5+7+……101例:编写程序TEST3:逐条显示SC表中成绩高于75分的所有记录预备知识:EOF()函数,LOCATE的使用。CLEARUSESCDOWHILENOTEOF()if成绩75DISPLAYWAIT按任意键继续!endifSKIPENDDO特例:循环控制子句:LOOP,EXIT在循环体中遇到LOOP时终止本次循环,直接转回到DOWHILE处重新判断循环条件。在循环体中遇到EXIT时直接退出循环而去执行ENDDO后面的语句。例:在STUDENT表中可以反复查询不同院系的学生的信息。usestudentdowhile.t.accept请输入待查询的院系号:toxlocatefor院系号=xiffound()select*fromstudentwhere院系号=xelse?对不起,找不到你要查询的院系号!endifwait还查询其他的院系吗?toyifupper(y)=Yloopelseexitendifenddocloseall例:在DOWHILE…ENDDO循环结构中,LOOP命令的作用是()A)退出过程,返回程序开始处B)转移到DOWHILE语句行,开始下一个判断和循环C)终止循环,将控制转移到本循环结构ENDDO后面的第一条语句继续执行D)终止程序执行例:在DOWHILE……ENDDO循环结构中,EXIT命令的作用是()A)退出过程,返回程序开始处B)转移到DOWHILE语句行,开始下一个判断和循环C)终止循环,将控制转移到本循环结构ENDDO后面的第一条语句继续执行D)终止程序执行(二)FOR—ENDDO步长循环格式:FOR内存变量=初值TO终值[STEP步长值]语句序列//循环体ENDFOR注解:1、内存变量称为循环变量,初值、终值和步长值都是数值型表达式;2、如果没有STEP子句,则步长为1;3、执行该语句时,先将初值赋值给循环变量,通过比较循环变量值与终值来决定是否执行语句序列。如果循环变量的值没有超出终值范围,则执行语句序列。执行到ENDFOR,循环变量值按步长值自动增加或减少(当步长值为负数时),然后返回到FOR重新与终值比较。如果循环变量的值大于终值,执行ENDFOR后面的语句。例:求10!思考:循环变量?初值,终值,步长值?循环条件?程序结束时,I的值等于多少?例:有如下程序:FORI=1TO10?II=I+1ENDFOR该程序的结果?执行这个程序时,循环体共执行了多少次?(三)SCAN—ENDSCANSCAN[范围][FOR条件]语句序列ENDSCANSCAN循环针对当前表进行循环,范围子句表示记录范围,缺省值为ALL。执行时在范围中依次寻找满足FOR条件的记录,并对找到的记录执行语句序列。例在STUDENT表中,显示与第一条记录具有相同院系号的全部学生信息。CLEARUSESTUDENTYXH=院系号SKIPSCANRESTFOR院系号=YXHDISPLAYENDSCANUSE