第7章 结构化程序设计_第1页
第7章 结构化程序设计_第2页
第7章 结构化程序设计_第3页
第7章 结构化程序设计_第4页
第7章 结构化程序设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VisualFoxPro程序设计第7结构化程序设计近几年来,程序设计的方法正在逐步由面向过程的结构化程序设计转向面向对象的程序设计,但是在程序设计的过程中,往往将结构化程序设计与面向对象的程序设计结合起来,这样更有利于设计出功能强大、灵活多变的数据库应用系统。1第七章结构化程序设计7.1程序设计入门7.2顺序结构程序设计7.3分支结构程序设计7.4循环结构程序设计7.5用户自定义函数和过程27.1程序设计入门基本概念基本语句创建、修改、运行程序37.1.1程序的基本概念1.程序能够完成一定任务的命令的有序集合。程序文件扩展名:.prg2.程序设计为完成一个特定的任务而编写程序的过程。3.程序的基本结构顺序分支循环47.1.1程序的基本概念4.程序的基本构成规则(1)程序由若干程序行组成。(2)每一个程序行以回车键结束;若一个程序行在一行中写不完,则在行尾用分号(;)表示续行,然后在下一行继续书写完整。(3)程序尾部使用CANCEL、RETURN或QUIT等命令表示该程序结束。57.1.2程序的创建、修改与运行一、程序的建立项目管理器方式菜单方式命令方式:

MODIFYCOMMAND<程序文件名>

代码程序新建67.1.2程序的创建、修改与运行创建程序的步骤(1)打开程序编辑窗口。(2)在程序编辑窗口中逐条输入命令,并以回车键换行。(3)保存程序文件。(.prg)【例7-1】建立一个程序,输出半径是4的圆的面积。77.1.2程序的创建、修改与运行二、程序的修改在程序文件的编辑状态下完成。打开程序三种方法:项目管理器方式菜单方式命令方式:

MODIFYCOMMAND<程序文件名>87.1.2程序的创建、修改与运行三、程序的运行单击工具栏上的按钮。项目管理器方式:“运行”按钮。命令方式:DO<程序文件名>。97.1.3程序中常用的基本语句1、字符串输入语句ACCEPT[<信息提示>]TO<内存变量>字符串常量例:ACCEPT“请输入一个数:”TOx接收的数据作为字符型处理功能:在屏幕上显示[<提示信息>],并等待用户通过键盘输入内容,把输入内容作为字符串常量赋值给指定的<内存变量>。107.1.3程序中常用的基本语句【例7-2】从键盘上任意键入一个数,求其平方根。CLEARACCEPT"请输入一个数:"TOxy=SQRT(VAL(x))?x,"的平方根是:",yRETURNVal()函数:字符型转换成数值型117.1.3程序中常用的基本语句2、表达式输入语句INPUT[<信息提示>]TO<内存变量>字符串常量可接收任意类型数据,需加定界符功能:在屏幕上显示[<提示信息>],并等待用户通过键盘输入表达式,再把表达式的值赋给指定的<内存变量>。12例如:s=100inputtoa?"a=",a

执行上述命令若输入的内容为:s+20,则输出结果为:a=120这表明变量a接收的是表达式的值。13例如,把上例中的input改成accept:s=100accepttob?"b=",b执行上述命令,若输入的内容为s+20,则输出结果为:b=s+20这表明变量b接收的是字符串“s+20”。说明:这两个命令中的<提示信息>可以缺省。当提示信息缺省的时候,则直接等待用户输入。147.1.3程序中常用的基本语句【例7-3】在成绩表cj.dbf中,按学号查询学生的成绩情况。CLEARUSEcj.dbfINPUT“输入要查询的学号:”TOxh2DISPLAYFORxh=xh2USERETURN字符型数据加引号157.1.3程序中常用的基本语句3、单字符输入语句WAIT[<提示信息>][TO<内存变量>];

[WINDOW[AT<行>,<列>]];

[TIMEOUT<数值表达式>]

只接收一个字符提示窗口的位置最大等待时间提示信息出现在提示窗口功能:该命令的作用是暂停程序的执行,直到用户按任意键或单击鼠标或等待输入一个字符(可存入指定的内存变量)或在指定时间内继续程序的执行。16例如:WAIT"单字符输入语句测试"WINDOWAT15,22TIMEOUT5例如:若在主窗口的10行、20列处显示提示信息“输入无效,请等待重新输入…”,10秒钟后自动关闭提示窗口,程序继续执行。可使用命令:

WAIT“输入无效,请等待重新输入…”WINDOWTIMEOUT10AT10,20。177.1.3程序中常用的基本语句4、定位输入输出语句@<行>,<列>[SAY<表达式1>][GET<变量名>];[Default表达式2][<READ>]

在指定位置输出表达式1指定要输入或编辑数据的变量名为变量指定初始值可以为变量输入数据通常get和read配合使用,以便为变量输入值187.1.3程序中常用的基本语句【例7-5】从键盘上任意键入一个数,求其平方根。CLEARx=0@10,10SAY"请输入一个数:"GETxREADy=SQRT(x)@12,10SAY"其平方根是:"@12,22SAYyRETURN197.1.3程序中常用的基本语句5、程序结束语句(1)CANCEL语句功能:结束程序的执行,返回命令窗口,同时关闭所有打开文件。(2)RETURN语句功能:结束程序的执行。如果程序是被另一程序调用,则返回到调用程序,否则返回到命令窗口。(3)

QUIT语句功能:结束程序执行并退出VisualFoxPro系统,返回操作系统。20程序的基本结构

VisualFoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支(选择)、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。217.2顺序结构程序设计顺序结构是按照程序语句的书写顺序,逐条依次执行。【例7-6】从键盘输入半径,求圆的面积。r=0INPUT“请输入圆的半径:”TOrs=0s=3.14*r*r?”该圆的面积为:”,sRETURN227.3分支结构程序设计在分支结构中,程序根据判断条件是否成立来选择执行分支,每一个分支对应一个程序段。单分支结构双分支结构多分支结构237.3.1单分支结构单分支结构用于控制程序中的语句行序列的执行与否,它根据指定的条件表达式来进行判断。【语句格式】IF<条件表达式><语句行序列>ENDIF条件表达式语句行序列ENDIF后面的语句.T..F.24补充例题:若考试成绩大于等于60分,显示合格Input“请输入一个成绩:”toxIfx>=60?”成绩合格”Endif7.3.1单分支结构257.3.2双分支结构双分支结构根据指定的一个条件表达式的两种不同结果值来判断执行两个分支中的哪一个分支,从而得到两种不同的程序结果。【语句格式】IF<条件表达式><语句行序列1>ELSE<语句行序列2>ENDIF条件表达式语句行序列1语句行序列2.T..F.ENDIF后面的语句26补充例题:若考试成绩大于等于60分,显示合格,否则显示不合格

INPUT“请输入一个成绩:”toxIFx>=60?”成绩合格”

ELSE?”成绩不合格”

ENDIF7.3.2双分支结构277.3.2双分支结构【例7-10】假设托运50公斤以内的行李按每公斤0.8元计费,如果超过50公斤时,超过的部分每公斤加价0.4元,计算公式如下:(1)当x≤50公斤:y=0.8*x(2)当x>50公斤:y=0.8*50+(0.8+0.4)*(x-50)从键盘任意键入行李的重量,求该行李的托运费。编程如下:INPUT"请输入行李的重量:"TOxIFx<=50y=0.8*xELSEy=0.8*50+(0.8+0.4)*(x-50)ENDIF@10,30SAY"行李的重量为:"+STR(x,6,2)+"公斤,其托运费;为:"+STR(y,6,2)+"元"RETURN287.3.3多分支结构【语句格式】DOCASECASE<条件表达式1><语句行序列1>CASE<条件表达式2><语句行序列2>…………CASE<条件表达式n><语句行序列n>[OTHERWISE<语句行序列n+1>]ENDCASE297.3.3多分支结构条件表达式1.T.语句行序列1EDNCASE后面的语句条件表达式2.T.语句行序列2.F..F..F.条件表达式n语句行序列n.F.……语句行序列n+1.T.执行流程307.3.3多分支结构注意事项

DOCASE语句只执行第一个条件表达式值为.T.的CASE语句下的语句行序列,之后便结束该多分支语句。假如各条件表达式的值均为.F.,若有OTHERWISE子句,则程序执行<语句行序列n+1>,之后结束该多分支语句;否则直接结束多分支语句。在构成多分支语句时,DOCASE和ENDCASE必须配对出现。在表达分支语句时,不允许在一个命令行中输入完,必须按照【语句格式】中规定的样式一行一个回车分行键入。317.3.3多分支结构【例7-11】从键盘上输入一个成绩值,判断出它所对应的等级。(85-100:优秀;75-84:良好;60-74:及格;0-59:不及格)CLEARINPUT"请输入一个成绩:"TOnxDOCASECASEnx>=85grade="优秀"CASEnx>=75grade="良好"CASEnx>=60grade="及格"OTHERWISEgrade="不及格"ENDCASE@10,29SAYSTR(nx)+"对应的成绩等级是:"+gradeRETURN327.3.3多分支结构【例7-12】判断随机给定的某一天是星期几。CLEARINPUT"请输入一个日期:"TOdx

x=DOW(dx)DOCASE CASEx=1 y="星期日" CASEx=2 y="星期一"……CASEx=7 y="星期六"ENDCASE@10,30SAYDTOC(dx)+"是:"+yRETURN

337.4循环结构程序设计循环结构是指从程序的某处开始有规律的重复执行某一程序段的程序结构。三种循环结构:DOWHILE循环FOR循环SCAN循环两个命令:EXITLOOP347.4.2FOR循环FOR循环根据循环变量的初值、终值和步长决定循环体的执行次数。适用条件:循环次数已知格式:FOR

<循环变量>=<初值>

TO

<终值>[STEP<步长>][LOOP][EXIT]ENDFOR/NEXT35执行流程循环变量在初值与终值之间?循环变量=初值语句行序列循环变量=循环变量+步长.T..F.ENDFOR后面的语句367.4.2FOR循环例1:计算S=1+2+……+100

S=0&&用于存放累加和

FORI=1TO100STEP1S=S+I

ENDFOR?S100以内的奇、偶数和?377.4.2FOR循环注意事项FOR与ENDFOR/NEXT必须成对出现,缺一不可步长可正可负可省略(缺省时为1)。当初值大于终值时,步长为负数例如:

FORi=10to1step-4??iENDFOR387.4.2FOR循环【例7-19】求1~100之间既非3的倍数也非5的倍数的所有奇数的和。CLEAs=0FORi=1TO100STEP2IFMOD(i,3)<>0andMOD(i,5)<>0s=s+i

ENDIFENDFOR?"1~100之间既非3的倍数也非5的倍数的所有奇数的和",sRETURN39关于LOOP和EXIT语句LOOP语句结束本次循环,它使得其后的语句在本次循环时不被执行,跳入下次循环EXIT语句结束整个循环,可放在循环中的任何位置,无条件的退出循环。407.4.2FOR循环【例7-19】求1~100之间既非3的倍数也非5的倍数的所有奇数的和。CLEAs=0FORi=1TO100STEP2IFMOD(i,3)=0ORMOD(i,5)=0

LOOPENDIFs=s+iENDFOR?"1~100之间既非3的倍数也非5的倍数的所有奇数的和",sRETURN417.4.2FOR循环【例7-20】判断从键盘上输入的一个数是否为素数。CLEAINPUT"请输入一个数N:"TOnklkey=.T.ni=2FORni=2TOnk-1IFMOD(nk,ni)=0

lkey=.F.

EXITENDIFENDFOR?"您输入的数:"+IIF(lkey,"是素数","不是素数")RETURN

427.4.1DOWHILE循环DOWHILE循环又称条件循环,是根据条件表达式的值来决定循环体的执行次数的一种循环结构。适用条件:循环次数未知格式:DOWHILE<条件表达式><语句行序列>[LOOP][EXIT]ENDDO循环体437.4.1DOWHILE循环执行流程条件表达式循环体.T..F.循环体中要有使得条件表达式最终为.F.的语句或通过EXIT强制退出ENDDO后面的语句447.4.1DOWHILE循环例1:计算S=1+2+……+100I=1S=0DOWHILE

I<=100

S=S+II=I+1ENDDO?S计算N!(N在0至10至间)457.4.1DOWHILE循环例2:将ASC字符组成的字符串反序显示变量c变量pabcdeffedcbaLEFT(c,1)SUBSTR(c,2)c=+pp=LEN(c)=0退出循环!循环条件?LEN(c)>0467.4.1DOWHILE循环Store"abcdef"tocP=space(0)DoWhile

LEN(c)>0P=LEFT(c,1)+Pc=SUBSTR(c,2)Enddo?P477.4.1DOWHILE循环【例7-13】将由任意字符(包括汉字)组成的字符串反序显示。CLEARSTORE"ab程序设计cd"TOc1,c2p=SPACE(0)48DOWHILELEN(c1)>0x=ASC(LEFT(c1,1))

IFx>127y=2ELSEy=1ENDIFp=LEFT(c1,y)+pc1=SUBSTR(c1,y+1)ENDDO?c2+"的反序列为:"+pRETURN497.4.1DOWHILE循环【例7-21】统计教师表中职称名称为教授、副教授、讲师、助教的各有多少人。CLEARUSEjs.dbfEXCLUSIVESTORE0TOt1,t2,t3,t4DOWHILE

.NOT.EOF()DOCASECASEzcmc="教授"t1=t1+1CASEzcmc="副教授"t2=t2+150

CASEzcmc="讲师"t3=t3+1OTHERWISEt4=t4+1ENDCASE

SKIPENDDO@8,30SAY"教授的人数:"+STR(t1)@10,30SAY"副教授的人数:"+STR(t2)@12,30SAY"讲师的人数:"+STR(t3)@14,30SAY"助教的人数:"+STR(t4)USERETURN517.4.1DOWHILE循环LOOP命令(短路语句):跳出本次循环返回到循环的开始处,重新对循环条件进行判断。【例7-15】将教师表(js.dbf)中基本工资小于800元的教师的基本工资增加200元。CLEARUSEjs.dbfEXCLUSIVEDOWHILE.NOT.EOF()IFjbgz>=800SKIP

LOOPENDIFREPLACEjbgzWITHjbgz+200SKIPENDDOUSERETURN

527.4.1DOWHILE循环EXIT命令(循环退出语句)【例7-20】要求产生一个在70~80之间的随机数。x=0DOWHILE.T.x=INT(RAND()*100)

IFx>70ANDx<80EXITENDIFENDDO@10,20SAYxRETURN537.4.3SCAN循环适用条件:仅用于处理表中的记录格式:

SCAN[<范围>][FOR<条件表达式1>][WHILE<条件表达式2>]<语句组>[LOOP][EXIT]ENDSCAN循环控制条件:EOF()的值SCAN循环又称数据表扫描型循环或者指针型循环,即根据表中的当前记录指针,决定循环体的执行次数。54EOF()?.F.在<范围>内.T..T..F.条件表达式2.T..F.条件表达式1.T.语句行序列记录指针自动下移.F.ENDSCAN后面的语句SKIP557.4.3SCAN循环【例7-22】将教师表(js.dbf)中职称是“助教”的基本工资增加500元,其他不变。CLEARUSEjs.dbfEXCLUSIVESCANALLFORzcmc="助教"REPLACEjbgzWITHjbgz+500ENDSCANUSERETURN56对比:DOWHILE循环将教师表(js.dbf)中基本工资小于800元的教师的基本工资增加200元。CLEARUSEjs.dbfEXCLUSIVEDOWHILE.NOT.EOF()IFjbgz>=800SKIPLOOPENDIFREPLACEjbgzWITHjbgz+200SKIPENDDOUSERETURN

577.4.3SCAN循环【例7-23】统计学生表中女生党员的人数。CLEARUSExs.dbfEXCLUSIVEx=0SCANALLFORxb="女".AND.dyf

x=x+1ENDSCAN@10,30SAY“女生党员的人数是:"@10,52SAYxUSERETURN

587.4.4循环嵌套循环嵌套在一个循环的循环体内又包含有其他循环。注意:(1)内层循环必须被完全包含在外层循环之中,不得交叉。(2)程序每执行一次外层循环,则其内层循环必须执行完所有的循环次数,之后才能进入到外层的下一次循环,依此类推。(3)当循环语句与分支语句嵌套使用时,也不能出现交叉。59【例7-24】编程计算s=1!+3!+5!+…+25!s=0p=1FORi=1TO25STEP2

FORj=1toip=p*j

ENDFOR

s=s+pENDFOR?sRETURN607.5用户自定义函数和过程在程序设计中,经常把完成一个特定功能的程序编写成一个函数或过程,作为一个独立的模块,以便在其他程序使用该功能时调用此模块。这种用以完成一个特定功能的程序,称为用户自定义函数或过程。必要性:同样功能的程序可以被多个程序所调用61返回处理结果时,使用RETURN。缺少RETURN语句或缺少RETURN后面的表达式时,返回值为.T.参数的意义:对不同的数据进行类似的处理,增加灵活性。过程定义

PROCEDURE<过程名>[PARAMETERS<形式参数表>]<语句行序列>[RETURN[表达式]]

ENDPROC7.5用户自定义函数和过程62函数定义

FUNCTION<用户自定义函数名>[PARAMETERS<形式参数表>]<语句行序列>[RETURN[<表达式>]]

ENDFUNC返回处理结果时,使用RETURN。缺少RETURN语句或缺少RETURN后面的表达式时,返回值为.T.参数的意义:对不同的数据进行类似的处理,增加灵活性。7.5用户自定义函数和过程63函数和过程的调用DO<函数名或过程名>[WITH<参数表>]函数名或过程名([<参数表>])7.5用户自定义函数和过程64函数与过程的区别

从实现功能来说,两者相同,函数与过程均可。通常:需要返回计算的值则应使用函数,不需要返回值的使用过程。7.5用户自定义函数和过程65PROCEDURE示例M=5?jc(m)PROCEDUREjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

RETURNpENDPROCFUNCTION示例(将过程改为函数)M=5?jc(m)FUNCTIONjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

RETURNpENDFUNC输出结果都是:1207.5用户自定义函数和过程66PROCEDURE示例M=5dojcwithmPROCEDUREjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

?pENDPROCFUNCTION示例(将过程改为函数)M=5dojcwithmFUNCTIONjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

?pENDFUNC输出结果都是:1207.5用户自定义函数和过程67过程与函数的创建方法放在程序文件的后面过程文件:存储了一个或多个过程或函数的文件。独立程序:只存储了一个过程或函数的文件,文件名必须与过程名或函数名相同,它可以作为过程或函数使用。7.5用户自定义函数和过程实验指导书7-3:168【例7-27】利用用户自定义函数求x!+y!,要求x和y从键盘上随机输入。代码如下:CLEARINPUT"请输入x的值:"TOxs1=fJC(x)&&调用函数fJCINPUT"请输入y的值:"TOys2=fJC(y)&&调用函数fJC?STR(x,4),"!+",STR(y,4),"!=",STR(s1+s2,8)RETURN放在程序文件的后面举例69*函数fJC的定义FUNCTION

fJC

PARAMETERSns=1

IFn>=1

FORi=1TOns=s*i

ENDFOR

ENDIFRETURN(s)70【例7-28】创建一个用户自定义函数CCDOW()。功能是:返回一个日期是星期几,如:CCDOW({^1999/3/1})的返回值是“星期一”。代码如下:CLEARcx={}@4,20SAY"请输入一个字符型日期:"GET

cxREAD@8,20SAY"输入的日期是:"??CCDOW(cx)RETURN放在程序文件的后面举例71FUNCTION

CCDOW(cx)

dx=DOW(cx)

DOCASE

CASEdx=1 title1="星期日"

CASEdx=2title1="星期一"……

CASEdx=7title1="星期六"

ENDCASE

RETURN(title1)ENDFUNC72【例7-29】创建一个用户自定义函数CCDOW()。功能是:返回一个日期是星期几,如:CCDOW({^1999/3/1})的返回值是“星期一”。(1)主程序文件,文件名为MAIN.PRGCLEARcx={}@4,20SAY"请输入一个字符型日期:"GET

cxREAD@8,20SAY"输入的日期是:"??CCDOW(cx)RETURN独立程序形式举例:73(2)用户自定义函数文件,文件名为CCDOW.prgFUNCTION

CCDOW(cx)

dx=DOW(cx)

DOCASE

CASEdx=1 title1="星期日"

CASEdx=2title1="星期一"……

CASEdx=7title1="星期六"

ENDCASE

RETURN(title1)ENDFUNC74过程文件:多个函数或过程存放在一个文件中。(1)过程文件的建立与修改

方法同程序文件的建立与修改。可使用命令:【格式】MODIFYCOMMAND<过程文件名>(2)过程文件的打开对于过程文件在调用之前必须先打开【格式】SETPROCEDURETO<过程文件名>(3)过程文件的关闭【格式】CLOSEPROCEDURE75调用函数和过程时的查找顺序在本文件中查找在已打开的过程文件中查找在默认目录中的独立程序中查找76参数传递的两种方式按数值传递按引用传递(传递地址)传递方式的设置:setudfparmstovalue时,默认设置:

do函数过程名with变量名

---

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论