4讲至8讲第7章程序设计课件_第1页
4讲至8讲第7章程序设计课件_第2页
4讲至8讲第7章程序设计课件_第3页
4讲至8讲第7章程序设计课件_第4页
4讲至8讲第7章程序设计课件_第5页
已阅读5页,还剩225页未读 继续免费阅读

下载本文档

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

文档简介

第七章VisualFoxPro7.0程序设计7.1程序文件的建立、修改与运行7.2简单的交互式输入输出命令7.3结构化程序设计7.4过程与过程调用第七章7.1程序文件的建立、修改与运行VisualFoxPro的工作方式所谓单命令方式,即输入一条命令,完成一个操作的工作方式。所谓菜单方式,即通过打开不同的菜单选择并完成不同的操作。所谓程序方式,即批命令方式,是把一系列有序的命令放到一个文件中,再执行该文件整体。VisualFoxPro的工作方式所谓单命令方式,即输入一建立程序文件有两种方法:一是命令方式,二是菜单方式。1、命令方式命令格式:ModifyCommand[<程序文件名>]Modifyfile[<程序文件名.prg>]2、菜单方式选择菜单【文件】|“新建”菜单项,打开【新建】对话框。|选中“程序”单选按钮。7.1.1建立程序文件

建立程序文件有两种方法:一是命令方式,二是菜单方式。7.1.7.1.2修改程序文件

1、【文件】|【打开】,找到要修改的程序文件。2、命令方式:modifycommand[文件名]

程序文件编辑完后,选择【文件】|【保存】选项按“CTRL+W”键,ctrl+S来保存程序,按ESC键放弃程序的编辑并返回命令窗口。7.1.2修改程序文件1、【文件】|【打开】,找到要修改7.1.3运行程序文件

1、命令方式:DO<程序文件名>2、在菜单方式下运行【程序】|【运行】3、打开要运行的程序文件,并单击常用工具栏上的“运行”命令按钮(即),来运行该程序文件。

4、快捷方式

Ctrl+E表示运行打开的当前程序。7.1.3运行程序文件1、命令方式:DO1、非格式化的输入命令FoxPro提供了如下三个非格式化输入命令:(1)数据输入命令(重点)

命令格式:Input[<提示信息>]To〈内存变量名〉

功能:显示提示信息,暂停正在运行的程序,等待用户从键盘输入数据或表达式并按回车键后,将数据或表达式的值存入指定的内存变量中,再执行中断了的程序。

7.2.1交互式输入命令

7.2简单的交互式输入输出命令

1、非格式化的输入命令7.2.1交互式输入命令7.2简例1:从键盘随机输入一个正数,以该正数为半径,求圆的周长和面积。*L1.prgsettalkoffclearinput"半径="torl=2*PI()*rs=PI()*r*r?"圆周长=",l?"圆面积=",ssettalkonreturn

该程序可以无数次运行,从而求出无数个半径值不同的圆的周长和面积。

例1:从键盘随机输入一个正数,以该正数为半径,求圆的周长和面思考:从键盘输入两个任意正数,编程求以两数为边长的长方形面积。SETTALKOFFCLEARINPUT“长方形一边的长为:”TOAINPUT“长方形另一边的长为:”TOBS=A*B?“长方形的面积为:”,SSETTALKONRETURN思考:从键盘输入两个任意正数,编程求以两数为边长的长方形面积(2)字符串输入命令命令格式:Accept[<提示信息>]To〈内存变量名〉功能:将用户输入的字符串赋值给指定的内存变量。说明:①输入的任何数据均被当作字符型赋值给内存变量。②如输入字符串为非空格打头,则不需要输入定界符③输入字符串长度不超过254个字符④命令提示信息与INPUT相同。7.2.1交互式输入命令

(2)字符串输入命令7.2.1交互式输入命令例2:重写例1题程序。*L2.prgsettalkoffclearaccept"半径="torl=2*PI()*val(r)s=PI()*val(r)*val(r)?"圆周长=",l?"圆面积=",ssettalkonreturn程序运行结果同例题2。7.2.1交互式输入命令

例2:重写例1题程序。7.2.1交互式输入命令(3)输入单字符命令命令格式:Wait[〈提示信息〉][To〈内存变量名〉]功能:暂停程序执行,等待键入一个字符,继续执行。说明:①只能接受一个字符,输入完以后立即响应,不要按回车键。②如有TO语句,则输入字符保存到指定变量,否则不保存。③若该语句不带子句,则暂停程序运行,屏幕显示

Pressanykeytocontinue……

7.2.1交互式输入命令

(3)输入单字符命令7.2.1交互式输入命令例3:重写例1题程序。*L3.prgsettalkoffclearinput"半径="torl=2*PI()*val(r)s=PI()*val(r)*val(r)?"圆周长=",lwait?"圆面积=",ssettalkonreturn

7.2.1交互式输入命令

例3:重写例1题程序。7.2.1交互式输入命令三条输入命令的异同:

ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束。

WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键。

INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。三条输入命令的异同:

FoxPro系统把屏幕横向分成70格,用0—79表示,每格能输出一个英文字符(一个汉字占2格);纵向分成25行,用0—24表示,每行能输出一行字符。命令格式:@<行坐标>,<列坐标>Say<表达式>Get<变量>Read功能:在指定位置输出表达式的值并在其后的位置输入变量的值。

2、格式化输入命令2、格式化输入命令Eg:建立程序文件,要求通过程序方式在“读者”表中添加一条新记录。

CLEAR USE读者

APPENDBLANK @2,7SAY"读者基本情况输入界面:" @4,10SAY"读者编号:"GET读者编号

@6,10SAY"读者姓名:"GET姓名

@7,10SAY"读者性别:"GET性别

@10,10SAY"出生日期:"GET出生日期

@12,10SAY"少数民族否:"GET少数民族否

@14,10SAY"籍贯"GET籍贯

READ USEEg:建立程序文件,要求通过程序方式在“读者”表中添加一条新编写程序文件,修改读者表中第三条记录的姓名和籍贯两个字段。

SETTALKOFF USE读者

GO3 @2,20SAY“姓名”

GET姓名

@4,20SAY"籍贯"GET籍贯

READ DISPLAY USE RETURN编写程序文件,修改读者表中第三条记录的姓名和籍贯两个字段。思考:若将上例中的要求改为对任意一条记录进行修改,程序该做何改动?ClearUse读者Input“要修改的记录号:”

tonGon@2,20SAY“姓名”

GET姓名@4,20SAY"籍贯"GET籍贯READDISPLAYUSERETURN思考:若将上例中的要求改为对任意一条记录进行修改,程序该做何

行输出命令有两种使用方式,一种是将表达式结果输出到屏幕当前的光标位置,另一种方式则可以对表达式的输出结果进行格式化,而且可以输出到屏幕的指定位置。但无论是那种方式都可以输出表达式列表的结果。1、行输出命令(?|??)

2、格式化输出命令

@<行坐标>,<列坐标>SAY<表达式>

行列坐标可以为数值型常量、变量、表达式,行坐标的取值为0—24,列坐标的取值为0—79;

7.2.2交互式输出命令

行输出命令有两种使用方式,一种是将表达式结果输出到7.2.3其它功能性命令

1、清屏命令命令格式:clear功能:清除屏幕或用户自定义的窗口2、显示文件内容命令命令格式:type<文件名>功能:在屏幕或打印机上输出指定文件的内容3、文本输出命令命令格式:text<文本信息>endtext功能:原样输出<文本信息>内容。

7.2.3其它功能性命令1、清屏命令4、终止执行命令 命令格式:cancel

功能:终止程序的执行,释放所有的内存变量,系统返回到命令窗口状态。5、注释命令 命令格式1:note<注释内容>

命令格式2:*<注释内容>

命令格式3:&&<注释内容>

功能:三个命令的功能相同,都是对程序做注释。

4、终止执行命令7.3结构化程序设计

结构化程序设计由若干结构组成,每一个基本结构可以包含一个或多个命令,它主要包括顺序结构、分支结构和循环结构三种。使用结构化程序设计有如下优点:1、可读性强:每个模块功能明确、模块间的关系简单、清晰。2、独立性好:每个模块内部的修改尽可能不影响其它模块。3、易验证:每个模块的正确性容易验证,各个模块连接起来后整个程序也就容易验证。7.3结构化程序设计结构化程序设计由若干结构组成,7.3.1顺序结构程序设计

顺序结构指计算机按程序语句的先后顺序依次逐条执行程序中各个语句,是程序中最基本、最简单的一种结构。顺序结构流程图如图7-5所示,该结构先执行A操作,再执行B操作,两者是顺序执行的关系。ABAB7.3.1顺序结构程序设计顺序结构指计算机按程序语句的先例10:从键盘输入一个大写字母,要求改用小写字母输出。*L10.PRGsettalkoffclearwait"请输入一个大写字母:"toax=asc(a)y=chr(x+32)?ysettalkonreturn

例10:从键盘输入一个大写字母,要求改用小写字母输出。思考:1、修改如下程序:clearS=0Input“请输入第一个数”toxS=s+xInput“请输入第二个数”toxS=s+xInput“请输入第三个数”toxS=s+x?x2、参看下例,为什么可以用这种方法交换两个变量的值。Input“a=”toaInput“b=”tob?“交换前a,b:”,a,bT=aA=bB=t?“交换后a,b:”,a,b思考:1、修改如下程序:7.3.2分支结构程序设计1、单分支结构语句格式:If〈条件表达式〉〈语句序列〉Endif功能:执行if语句时,首先判断条件表达式的值,若为.T.,则执行If到Endif之间的语句序列,再执行Endif后面的语句,若为.F.,

则不执行If到Endif之间的语句,直接执行Endif后面的语句,程序执行过程就发生了跳转。If和Endif必须成对出现,缺一不可,语句序列可以是一条或多条语句。

7.3.2分支结构程序设计1、单分支结构例13:输入两个实数,依其值由大到小输出这两个数*L13.PRGsettalkoffinput"a="toainput"b="tobifa<bt=aa=bb=tendif?a,bsettalkonreturn例13:输入两个实数,依其值由大到小输出这两个数思考2:用if…endif结构判断用户输入的数能否同时被4和6整除。思考3:如何求解一元二次方程的实数解。思考1:若输入三个数由大小的顺序输出呢?思考2:用if…endif结构判断用户输入的数能否同时被4和2、选择分支结构语句格式:If〈条件表达式〉 〈语句序列1〉 Else〈语句序列2〉Endif

功能:如条件表达式的值为.T.,则执行语句序列1,然后执行Endif后面的语句,否则执行语句序列2,然后执行Endif后的语句。其中〈条件表达式〉可以是各种表达式的组合,其值必须是逻辑值,可以是逻辑常量或变量。If、Else、Endif语句应单独占一行。2、选择分支结构思考:若要输出输入的三个数中最大的数(最小的数)?clearinput"数据1:"toainput"数据2:"tobinput"数据3:"tocifa>bt=aelset=bendifift>cs=telses=cendif?sreturn思考:若要输出输入的三个数中最大的数(最小的数)?clear思考:1、用双向分支结构编程输入一个数返回其绝对值。2、用双向分支求一元二次方程的实数解,有,则输出解的值,无解,输出“此方程无实数解!”思考:1、用双向分支结构编程输入一个数返回其绝对值。3、多分支结构语句格式:DoCaseCase〈条件表达式1〉〈语句序列1〉Case〈条件表达式2〉〈语句序列2〉……Case〈条件表达式n〉〈语句序列n〉[Otherwise〈语句序列n+1〉]Endcase3、多分支结构

功能:系统依次检查每个Case的条件表达式,只要遇到第一个条件为.T.时,则执行该条件下的语句序列,之后不再判断其他条件,也不再执行其他语句序列,直接执行Endcase后的语句。若所有条件均不成立,如有选择项Otherwise语句,则执行它后面的语句,否则执行ENDCASE后面的语句。说明:(1)Docase结构中至少有一个case语句(2)Docase与第一个case之间的语句不会被执行。(3)如果有多个条件表达式为.T.,则只有第一个有效,其他case子句的条件不会被判断,其对应的语句序列也就不会被执行。7.3.2分支结构程序设计功能:系统依次检查每个Case的条件表达式,只要遇到第一个例16:CJ.DBF(成绩表)中,按学生XM(姓名)进行查询,如该生存在,判断其英语成绩ENGLISH是否为优(70分以上),中(70分到70分),及格(60分到70分),不及格(小于60分)。

settalkoffclearusecjaccept"请输入查看英语成绩的学生姓名:"tonamelocateforxm=nameiffound()docase caseenglish>=70?"优" caseenglish>=70?"中"

例16:CJ.DBF(成绩表)中,按学生XM(姓名)进行查询caseenglish>=60?"及格" otherwise?"不及格"endcaseelse?"找不到该学生"endifusesettalkonreturncaseenglish>=60例如:

x=2.5Docasecasex>1y=1casex>2y=2endcase?y1例如:1例如:如何判定用户输入的分数是哪个级别?clearinput"请输入分数:"toscoreDocasecasescore>100?"输入错误!"casescore>=90?"优秀!"casescore>=75?"良好!"casescore>=60?"及格!"casescore>=0?"不及格!"casescore<0?"输入错误!"Endcase例如:如何判定用户输入的分数是哪个级别?casescorclearinput"请输入分数:"toscoreDocasecasescore<0?"输入错误!"casescore<60?"不及格!"casescore<75?"及格!"casescore<90?"良好!"casescore=<100?"优秀!"casescore>100?"输入错误!"Endcase思考:若将上例题的分数由低到高显示判断,程序该做何改动?clearcasescore<75思考:若将上例题的分数由练习:假设收入(P)与税率(R)的关系如下表,编程求税金。

0 P<700R=0.05 700≤P<20000.07 2000≤P<50000.1 P≥5000

练习:假设收入(P)与税率(R)的关系如CLEARINPUT“请输入收入:”TOPDOCASECASEP<700tax=0CASEP<2000tax=0.05*(P-700)CASEP<5000tax=1400*0.05+(p-2000)*0.07OTHERWISEtax=1400*0.05+3000*0.07+(p-5000)*0.1ENDCASE?“你要缴纳的税金为:”,TAXRETURNCLEAR7.3.3循环结构程序设计

1、条件循环语句格式:DoWhile〈条件表达式〉语句序列(又称为循环体,其中可以使用Loop、Exit等强制退出语句)

Enddo功能:重复判断〈条件表达式〉的值,其值为.T.时,重复执行DoWhile和Enddo之间的语句,直到〈条件表达式〉的值是.F.时结束。7.3.3循环结构程序设计1、条件循环语句7.3.3循环结构程序设计

1.DOWHILE循环语句(适用于任何循环情况)【格式1】DOWHILE<条件表达式><语句序列>

ENDDO

一个循环结构一般应具备如下的条件:(1)循环的初始条件:一般为给循环控制变量赋初值;(2)循环头:循环语句的起始,设置、判断循环条件;(3)循环尾:循环语句的结尾;(4)循环体:位于循环头和循环尾之间、循环控制重复执行的语句序列。

7.3.3循环结构程序设计1.DOWHILE循环语句(适【格式2】DOWHILE<条件表达式><语句序列1>[LOOP]<语句序列2>[EXIT]<语句序列3>ENDDOLOOP语句:强行返回到循环开始语句。EXIT语句:强行跳出循环,接着执行ENDDO后的语句【格式2】DOWHILE<条件表达式>LOO编程求1+2+3+……+100之和。SETTALKOFFCLEARS=0j=1

&&循环变量的初值(循环的初始条件)DOWHILEj<=100

&&循环头

S=S+jj=j+1

&&循环体ENDDO

&&循环尾?”1+2+3+……+100=”,SSETTALKONRETURN编程求1+2+3+……+100之和。【例如】用DoWhile的第二种格式编程求1到100之内所有奇数的和。CLEARS=0I=0DOWHILEI<100I=I+1ifint(I/2)=I/2loopelseS=S+IendifENDDO?"1+3+5+……+99=",SRETURN【例如】用DoWhile的第二种格式编程求1到100之内思考将上例题用格式一完成程序,1到100之内所有奇数的和。SETTALKOFFCLEARS=0

I=1DOWHILEI<=100

S=S+I

I=I+2ENDDO?"1+3+5+……+99=",SSETTALKONRETURN思考将上例题用格式一完成程序,1到100之内所有奇数的和。S编程求出1*2*3*….,当积大于720时退出。

cleari=1s=1dowhile.t.s=s*ii=i+1ifs>720exitendifenddo?s,ireturncleari=1s=1dowhiles<=720s=s*ii=i+1enddo?s,ireturn编程求出1*2*3*….,当积大于720时退出。clear思考:用Dowhile循环编写程序求100到999内水仙花数的个数?n=0x=100dowhilex<=999a=int(x/100)b=int(mod(x,100)/10)c=mod(x,10)ifa^3+b^3+c^3=xn=n+1endifx=x+1enddo?nreturn思考:用Dowhile循环编写程序求100到999内水仙

2.FOR循环语句

(比较适用于已知循环次数的时候)【格式】

FOR<循环变量>=<初值>TO<终值>[STEP<步长>]

<语句序列1>

[LOOP]

<语句序列2>

[EXIT]

<语句序列3>ENDFOR/NEXTFOR语句的执行流程如右图所示。

2.FOR循环语句(比较适用于已知循环次数的时候)使用FOR循环语句的有关说明:①省略STEP<步长>,则〈步长〉为默认值1;②〈初值〉、〈终值〉和〈步长〉都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数;③可以在循环体内改变循环变量的值,但会改变循环执行次数;④EXIT和LOOP命令可以出现在循环体内。执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。执行EXIT命令时,程序跳出循环,执行循环尾后面的语句。使用FOR循环语句的有关说明:【例如】从键盘输入10个数,编程找出其中的最大值和最小值。CLEARINPUT"请从键盘输入一个数做为初始值:"TOBSTOREBTOMAX,MINFORI=2TO10&&或者写成forI=1to9表示9次循环即可

INPUT"请从键盘输入一个数:"TOAIFMAX<AMAX=AENDIFIFMIN>AMIN=AENDIFENDFOR?"最大值为:",MAX?"最小值为:",MINSETTALKONRETURN【例如】从键盘输入10个数,编程找出其中的最大值和最小值。也可以用如下方法:CLEARMax=0Min=100000FORI=1TO10&&表示10次循环即可

INPUT"请从键盘输入一个数:"TOAIFMAX<AMAX=AENDIFIFMIN>AMIN=AENDIFENDFOR?"最大值为:",MAX?"最小值为:",MINSETTALKONRETURN&&给最大值的变量赋一个较小的初值&&给最小值的变量赋一个较大的初值也可以用如下方法:CLEAR&&给最大值的变量赋一个较小的初【例如】编程判断一个数是否素数。(非常重要)1)做什么2)怎样做(算法问题):根据素数的定义来做。方法一:SETTALKOFFCLEARINPUT"请输入一个数:"TOxFORi=2TOx-1IFMod(x,i)=0EXITENDIFENDFORIFi>=x?STR(X)+"是素数"ELSE

?STR(X)+"不是素数"ENDIF

【例如】编程判断一个数是否素数。(非常重要)方法一:方法二:ClearInput"请输入数:"toxFlag=1&&标准变量ForI=2tox-1ifmod(x,i)=0flag=2&&此处的flag只要不等于原来的1就可以

exit&&此程序中最有用的一条命令。

endifEndforIfflag=1?str(x)+"是素数"Else?str(x)+"不是素数"Endifreturn方法二:方法三:CLEARINPUT"请输入数:"TOxFORi=2TOINT(SQRT(x))IFMod(x,i)=0EXITENDIFENDFORIFi>=int(SQRT(x))+1?STR(X)+"是素数"ELSE

?STR(X)+"不是素数"ENDIFRETURN方法三:从键盘输入任意的10个数,按从大到小的顺序依次输出。

dimea(10)ForI=1to10INPUT"请输入一个数"TOa(i)?a(i)ENDFORFORi=1TO9FORj=1TO10-iIFa(j)<a(j+1)t=a(j)a(j)=a(j+1)a(j+1)=tENDIFENDFORENDFORfori=1to10??a(i)endfor思考将最后一个输出的For循环去掉可不可以,若可以,应做何改动?从键盘输入任意的10个数,按从大到小的顺序依次输出。思

3.“指针”型循环控制语句“指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环的次数。[终止的条件]:记录指针指向表尾时结束循环。【语句格式】

SCAN[〈范围〉][FOR〈条件表达式1〉[WHILE〈条件表达式2〉]]

〈命令行序列〉ENDSCAN【语句功能】

该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合(条件表达式1)或(条件表达式2),执行(命令行序列),记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。3.“指针”型循环控制语句输出STUDENT数据库的STUD表中所有团员的姓名和地址。SETTALKOFFCLEAROPENDATABASESTUDENTUSESTUDSCANFOR是否团员

?姓名,地址ENDSCANCLOSEDATABASESETTALKONRETURN输出STUDENT数据库的STUD表中所有团员的姓名和地址。

4.使用循环语句时应注意的几点(1)DOWHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必须配对使用。(2)〈命令行序列〉可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。(3)〈循环变量〉应是数值型的内存变量或数组元素。(4)EXIT和LOOP命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改变〈命令行序列〉中部分命令的执行次数。EXIT、LOOP可以出现在〈命令行序列〉的任意位置。4.使用循环语句时应注意的几点5.多重循环

多重循环即循环的嵌套,是在一个循环结构的循环体中又包含另一个循环。我们称外层循环为外循环,被包含的循环为内循环。嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉。第一种正确的嵌套关系如:

DOWHILE<条件表达式1><语句序列11>DOWHILE<条件表达式2><语句序列21>DOWHILE<条件表达式3><语句序列31>ENDDO<语句行序列22>ENDDO<语句行序列12>ENDDO5.多重循环第二种正确的嵌套关系如:

for<循环条件1>&&外层循环

for<循环条件2>&&内层循环

for<循环条件3>&&最内层循环

<语句行序列1>endfor<语句行序列2>endfor<语句行序列3>endfor注意:1、不同的循环之间可以嵌套使用。

2、内层循环变量的值的变化速度比外层循环变量的值的变化速度要快。第二种正确的嵌套关系如:【例6-19】编程输出如下下三角形乘法口诀表。程序文件名为“乘法表.PRG”。【例6-19】编程输出如下下三角形乘法口诀表。程序文件名为“方法一:用DOwhile循环来做SETTALKOFFCLEARX=1DOWHILEX<=9Y=1DOWHILEY<=XS=X*Y??STR(Y,1)+"*"+STR(X,1)+"="+STR(S,2)+""Y=Y+1ENDDO?&&仅仅用于换行输出

X=X+1ENDDOSETTALKONRETURN方法一:用DOwhile循环来做方法二:以for循环来解决SETTALKOFFCLEARforx=1to9fory=1toxS=X*Y??STR(Y,1)+"*"+STR(X,1)+"="+STR(S,2)+""next?&&仅仅用于换行输出

nextSETTALKONRETURN方法二:以for循环来解决编程序求出2+4+7+16+32+…这样的数之和。如果累加和大于500时,则程序终止并输出结果。clears=0n=2DOwhiles<=500s=s+nn=n*2enddo?sreturn

clears=0forj=1to500I=2^js=s+iifs>500exitendifendfor?sreturn5、两种循环的比较使用:编程序求出2+4+7+16+32+…这样的数之和。如果累加典型程序实例实例1、计算1!+2!+……+10!思路:先计算出n!,之后再求和。如先计算10!方法:10!=1*2*3*4……*10,实质上就是求数的累乘。P=1&&变量p用来存放10!的结果。ForI=1to10p=p*IEndfor典型程序实例实例1、计算1!+2!+……+10!P=1再在原来的基础上求和,方法有两种:一、直接在循环内进行累加

P=1S=0ForI=1to10p=p*IS=s+pEndfor?sreturnP=1ForI=1to10p=p*IEndfor再在原来的基础上求和,方法有两种:P=1二、运用两重循环,内层执行求某个数的阶乘,外层执行累加

S=0forn=1to10p=1forI=1tonp=p*IEndfors=s+pEndfor?sreturn二、运用两重循环,内层执行求某个数的阶乘,外层执行累加S思考:编写程序求出14!+15!+……17!clearS=0forn=14to17p=1forI=1tonp=p*IEndfors=s+pEndfor?sreturn思考:编写程序求出14!+15!+……17!clear实例2:可以用数组来完成程序的例子方法一:settalkoffcleara=1b=1c=2dowhilec<10000000a=bb=cc=a+benddo?"10000000以内最大的斐波那契数为:",bsettalkon斐波那契数列的前两项是1,1,其后每一项都是前两项之和,求10000000以内最大的斐波那契数?实例2:可以用数组来完成程序的例子方法一:a=b斐波那方法2:用数组解决上例的程序:cleardimea(1000)a(1)=1a(2)=1forn=3to1000a(n)=a(n-1)+a(n-2)ifa(n)>=10000000exitendifendfor?a(n-1)方法2:用数组解决上例的程序:方法1:cleara=1b=1s=0&&s是表示个数的变量forn=3to1000c=(n-1)*b+(n-2)*aa=bb=c数列:e(1)=e(2)=1,e(n)=(n-1)*e(n-1)+(n-2)*e(n-2)n>2每个e(n)称为E数,求[1,30000]之内E数的个数?ifc>=1andc<=30000s=s+1endifendfor?s+2Return方法1:数列:e(1)=e(2)=1,e(n)=(n-1)*方法2:cleardimensione(30000)s=0e(1)=1e(2)=1forn=3to30000e(n)=(n-1)*e(n-1)+(n-2)*e(n-2)ife(n)>=1ande(n)<=30000s=s+1endifendfor?s+2return

方法2:思考:f(0)=f(1)=1,f(2)=0,f(n)=f(n-1)-2*f(n-2)+f(n-3)(n>2),求f(0)到f(50)中最大值。597325思考:f(0)=f(1)=1,f(2)=0,f(n)=f(n思考:已知:f(n)=f(n-1)+2*f(n-2)-5*f(n-3),

f(0)=1,f(1)=2,f(2)=3,求f(0)+f(1)+……f(30)cleardimef(31)s=6f(1)=1f(2)=2f(3)=3forn=4to31f(n)=f(n-1)+2*f(n-2)-5*f(n-3)s=s+f(n)endfor?sreturn思考:已知:f(n)=f(n-1)+2*f(n-2)-5*f百马驮百瓦问题(与此类似的还有百钱买百鸡)大马、小马和马驹共100匹,大马一驮三,小马一驮二,马驹二驮一,共100片瓦一次驮完,三种马都驮,共有多少种组合?clears=0dm=1dowhiledm<=100/3xm=1dowhilexm<=(100-dm*3)/2mj=100-dm-xm

ifdm*3+xm*2+mj*(1/2)=100s=s+1endifxm=xm+1enddodm=dm+1enddo?sreturn百马驮百瓦问题(与此类似的还有百钱买百鸡)大马、小马和马驹共综合练习:1、用一元纸币兑换一分、两分和五分的硬币,要求兑换硬币的总数为60枚,问共有多少种换法?(注:在兑换中一分、两分或五分的硬币数可以为0枚) 11

settalkoffclearn=0foryi=0to100forer=0to50forwu=0to20ifyi+er+wu=60andyi+2*er+5*wu=100n=n+1endifendforendforendfor?nsettalkonreturn综合练习:1、用一元纸币兑换一分、两分和五分的硬币,要求兑换2、编程序求出100到200之间同时满足除3余2和除5余3条件的数的个数。6settalkoffclearn=0forx=100to200ifmod(x,3)=2andmod(x,5)=3n=n+1endifendfor?nsettalkonreturn2、编程序求出100到200之间同时满足除3余2和除5余3条3、编写程序,求四位数的奇数中,所有各位数字之积(且不为0)是125的倍数的数的和。 161095方法一:

settalkoffclearn=0fori=1000to9999a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(i,2)=1andmod(a*b*c*d,125)=0anda!=0andb!=0andc!=0andd!=0n=n+iendifendfor?nsettalkonreturn3、编写程序,求四位数的奇数中,所有各位数字之积(且不为0)

方法二:settalkoffclearn=0fori=1001to9999step2a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(a*b*c*d,125)=0andat("0",str(i,4))=0n=n+iendifendfor?nsettalkonreturn方法二:方法三:settalkoffclearn=0fori=1001to9999step2a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(a*b*c*d,125)=0andat(“0”,str(i,4))=0或用occurs()函数

n=n+iendifendfor?nsettalkonreturn方法三:4、编程序求出2+4+6+7+10+…这样的数之和。如果累加数大于500时,则程序终止并输出结果。510clears=0n=2DOwhiles<=500s=s+nn=n+2enddo?sreturn

clears=0fori=2to500step2s=s+iifs>500exitendifendfor?sreturn4、编程序求出2+4+6+7+10+…这样的数之和。如果累7.4程序的模块化

结构化程序设计方法要求将一个大的系统分解成若干个子系统,每个子系统就构成一个程序模块。模块是一个相对独立的程序段,它可以为其他模块所调用,也可以去调用其他模块。将一个应用程序划分成一个个功能相对简单、单一的模块程序,不仅有利于程序的开发,也有利于程序的阅读和维护。VFP模块化在具体实现上提供三种形式,它们是子程序、过程和函数。

主程序与子程序调用关系示意图

7.4程序的模块化结构化程序设计方法要求将一个大的系一、子程序

子程序也叫外部过程,是以程序文件(.PRG)的形式单独存储在磁盘上。子程序只需录入一次,就可反复被调用执行。1.子程序的结构在VFP中,子程序的结构与一般的程序文件一样,可以用MODIFYCOMMAND命令来建立、修改、和存盘,扩展名也默认为.PRG。子程序与其他程序文件的唯一区别是其末尾或返回处必须有返回语句RETURN。【语句格式】

RETURN[TOMASTER|TO程序文件名|表达式]【语句功能】该命令中止一个程序、过程、或用户自定义函数的执行,返回上一级调用程序、最高级调用程序、另外一个程序或命令窗口。一、子程序子程序也叫外部过程,是以程序文件(.PR【语句说明】(1)通常程序执行到RETURN时,会自动返回到上级调用程序调用语句的下一条语句继续执行。如果是在最高一级主程序中,则返回命令窗口。(2)选用TOMASTER子句时,则返回最高一级调用程序,即在命令窗口下,调用的第一个主程序。(3)TO程序文件名表示程序将转向到指定的程序。(4)如选用表达式,表示将表达式的值返回调用程序,通常用于自定义函数。(5)在程序最后,如果没有RETURN命令,则程序运行完毕后,将自动默认执行一个RETURN命令,但过程文件除外。【语句说明】2.子程序的调用:【语句格式】

DO<程序文件名>|<过程名>[WITH参数表]

【语句功能】执行以<程序文件名>或<过程名>为名的过程。

【语句说明】WITH参数表子句用来指定传递到程序或过程的参数,在参数表中列出的参数可以是表达式、内存变量、常量、字段名或用户自定义函数,各参数间用逗号分隔。

【例6-20】分别建立如下程序文件。

*MAIN.PRGSETTALKOFF?”正在执行主程序”DOSUB1SETTALKON

*SUB1.PRG?”正在执行SUB1”RETURN2.子程序的调用:【例】利用子程序方法求M!/(N!*(M-N)!)(M>N)

*main.prg*子程序sub.prgclearinput"M:"tominput"N:"tons=0x=mdosubs2=sx=ndosubs3=sx=m-ndosubs4=ss1=s2/(s3*s4)?s1s=1fori=1toxs=s*iendforreturns【例】利用子程序方法求M!/(N!*(M-N)!)(M>N)二、过程(内部过程)

内部过程:把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。

VisualFoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。其格式为:

PROCEDURE<过程名>[PARAMETER<参数表>]<命令序列>[RETURN[<表达式>]]

过程有两种存放方式:(1)把所有的过程集中写入一个被称为过程文件(.prg文件)的磁盘文件中(2)直接把过程写在调用它的主程序文件中,主程序被打开时,过程同时被调入内存。

二、过程(内部过程)内部过程:把多个过程组织在一1.过程与主程序写在同一个程序文件里 主程序与过程的相互关系如下图所示。过程和子程序都是用DO<文件名>来调用,当出现了同名的过程和子程序时,调用的顺序首先从过程与主程序在同一文件中调用,其次从过程文件中调用,最后从子程序中调用。1.过程与主程序写在同一个程序文件里2.过程写在过程文件里主程序与过程的相互关系如下图所示。调用过程之前,首先要打开存放该过程的过程文件,任何时候只能打开一个过程文件。打开过程文件的命令:

SET

PROCEDURE

TO

<过程文件名>关闭过程文件的命令:

SET

PROCEDURE

TO

或用:CLOSE

PROCEDURE

2.过程写在过程文件里三、过程文件的建立

过程文件的建立方法与程序文件相同。可用MODIFYCOMMAND<过程文件名>命令或调用其他文字编辑软件来建立。过程文件的结构一般为:PROCEDURE<过程名1><命令序列1>RETURN

PROCEDURE<过程名2><命令序列2>RETURN…PROCEDURE<过程名N><命令序列N>RETURN三、过程文件的建立过程文件的建立方法与程序1.过程文件的调用

调用某过程文件中的过程时,必须先打开该过程文件,打开过程文件命令为:【格式】SETPROCEDURETO<过程文件名>任何时候系统只能打开一个过程文件,当打开一个新的过程文件时,原已打开的过程文件自动关闭。2.过程文件的关闭关闭过程文件可用下列命令:【格式一】SETPROCEDURETO【格式二】CLOSEPROCEDURE

1.过程文件的调用【例】请考察下述程序运行流向,求出正确运行结果。*prog2.prgCLEARSTORE2TOI,C,TDOWHILEI<=4DOPR?"F("+STR(I,1)+")="+STR(C,2)I=I+1ENDDO?"T="+STR(T,2)RETURNPROCEDUREPRC=C+2T=T+CRETURN【例】请考察下述程序运行流向,求出正确运行结果。四、自定义函数自定义函数和过程一样,可以以独立的程序文件形式单独存储在磁盘上,也可以放在过程文件或直接放在程序文件中。自定义函数具有如下语法结构:

FUNCTION<函数名>

PARAMETER<参数表><函数体命令序列>

RETURN<表达式>自定义函数的调用语法与系统函数的调用相同。和过程一样,自定义函数可以是常规程序文件的一部分,也可以是独立的程序文件。不同的是调用过程或子程序使用DO命令,调用函数名称后面加上括号。注意:函数不是命令,函数调用只能出现在表达式中。四、自定义函数自定义函数和过程一样,可以以独立的程序文【例】计算圆面积*PROG24.PRGSETTALKOFFCLEARINPUT”请输入圆的半径:”TOR?”圆的面积为:”,AREA(R)SETTALKONFUNCTIONAREA &&计算面积的函数PARAMETERX &&形参说明RETURN(3.1416*X**2)【例】计算圆面积思考:使用自定义函数完成:用户输入矩形的长和宽,求出对应的面积。SETTALKOFFCLEARINPUT"请输入矩形一边的长:"TOaINPUT"请输入矩形另外一边的长:"TOb?"矩形的面积为:",AREA(a,b)SETTALKONFUNCTIONAREA &&计算面积的函数PARAMETERx,y &&形参说明RETURN(x*y)思考:使用自定义函数完成:用户输入矩形的长和宽,求出对应的面五、变量的作用域

1.公共(全局)变量公共变量是指在所有程序模块中都有效的内存变量。在程序或过程中定义公共变量的语句为:【格式】PUBLIC<内存变量表>该命令的功能是建立公共变量,并为它们赋初值为逻辑假.F.例如,PUBLICa,b,c(5)建立了三个公共内存变量,它们的初值都是.F.

在命令窗口直接使用的内存变量(不必用PUBLIC定义)都是全局变量。五、变量的作用域1.公共(全局)变量【说明】(1)当定义多个变量时,各变量名之间用逗号隔开;(2)用PUBLIC语句定义过的内存变量,在程序执行期间可以在任何层次的程序模块中使用;(3)变量定义语句要放在使用此变量的语句之前,否则会出错;(4)任何已经定义为全局变量的变量,可以用PUBLIC语句再定义,但不允许重新定义为局部变量;(5)使用全局变量可以增强模块间的通信,但会降低模块间的独立性。【说明】2.私有变量

在程序中直接使用(没有通过PUBLIC和LOCAL命令事先声明)而由系统自动隐含建立的变量都是私有变量。私有变量的作用域是建立它的模块及其下属各层模块,一旦建立它的模块运行结束,这些私有变量将自动清除。

3.局部变量

局部变量只能在定义它的模块中使用,不能在上层或下层模块中使用。当定义它的模块运行结束时,局部变量自动释放。局部变量用LOCAL命令建立:【格式】LOCAL<内存变量表>【功能】该命令建立指定的局部内存变量,并为它们赋初值为逻辑假.F.。2.私有变量【例如】分析下面程序中变量的作用域*prog27.prgclearPUBLICx1&&建立公共变量X1LOCALx2&&建立局部变量X2STORE"f"TOx3&&建立私有变量X3DOproc1?"主程序中--"&&三个变量在主程序中都可使用?"x1=",x1?"x2=",x2?"x3=",x3RETURNPROCEDUREproc1 ?"子程序中--"&&公共变量和私有变量在子程序中可以使用?"x1=",x1?"x3=",x3RETURN【例如】分析下面程序中变量的作用域4.变量的隐藏根据结构化程序设计方法,将应用程序分成若干层不同的模块,有可能在各层模块中有变量同名的情况。为了解决此问题,可以在子程序中使用PRIVATE命令隐藏主程序中可能存在的变量,使得这些变量在子程序中暂时无效。其语法格式为:PRIVATE内存变量表|ALL[LIKE通配符][EXCEPT通配符]该命令并不建立内存变量,它的作用是:隐藏指定的上层模块中可能已经存在的内存变量,使得这些变量在当前模块程序中暂时无效。于是这些变量名就可以用来命名在当前模块或其下属模块中需要的私有变量或局部变量,并且不会改变上层模块中同名变量的取值。4.变量的隐藏【例】变量的隐藏示例。*prog29.prg*过程PSETTALKOFFPROCEDUREpx=10PRIVATExy=15x=50DOpy=100?x,y?x,yRETURN运行结果:5010010100【例】变量的隐藏示例。Local与Private的比较:(

补充)Local只隐藏上层与所在模块,而不影响下层。Private隐藏建立它的模块及下层模块。Local与Private的比较:(补充)【例】LOCAL和PRIVATE命令的比较示例*prog30.prgPUBLICx,yX=10Y=100DOp1?x,y&&显示10bbb*过程P1PROCEDUREp1PRIVATEx&&隐藏上层模块中的变量xx=5&&建立私有变量x,并赋值5LOCALy&&建立局部变量y,并隐藏同名变量DOp2?x,y&&显示aaa.F.*过程P2PROCEDUREP2x="aaa"&&x是在P1中建立的内存变量y="bbb"&&y是在主程序中建立的公共变量RETURN【例】LOCAL和PRIVATE命令的比较示例九、参数传递1、接收参数Parameters<形式参数表>(最常使用的方式)Lparameters<形式参数表>2、发送参数格式1:do<文件名>|<过程名>with<实参表>格式2:<文件名>|<过程名>(实参表)九、参数传递1、接收参数1、采用格式1调用时:

a、如果实参是常量或表达式,传递的方式是按值传递。

b、如果实参是变量,传递的方式是按地址传递。(即引用传递)。

c、如果实参是用括号()括起来的,传递方式属于按值传递。2、采用格式2调用时:

a、默认方式为按值传递。

b、可用setudfparmstovalue|reference来设置传递的方式。

1、采用格式1调用时:例如:clearstore10tox1,x2setudfparmstovaluedopwithx1,(x2)?"第一次:",x1,x2store10tox1,x2p(x1,(x2))?"第二次:",x1,x2setudfparmstoreferencedopwithx1,(x2)?"第三次:",x1,x2store10tox1,x2p(x1,(x2))?"第四次:",x1,x2procpparax1,x2x1=x1+1x2=x2+1return例如:clearsetudfparmstorefere练习:分析程序的结果。1、store0ton,sDowhile.t.n=n+1s=s+nIfn>=5exitEndifEnddo?”s=”+str(s,2)练习:分析程序的结果。1、store0ton,s2、*main.prg

clear

s=0

dosub1with10,s

?s

return

*sub1.prg

procsub1

parametersd1,d2

d1=d1+d1

d2=d1*2

return2、*main.prg

clear

s=0

dosub13、store.t.toxStore0toyDowhilexY=y+1Ifint(y/5)=y/5??yElseLoopEndifIfy>15Store.f.toxEndifenddo3、store.t.tox4、clearDimensiona(6)Fork=1to6A(k)=20-2*kEndforK=5Dowhilek>=2a(k)=a(k)-a(k-1)K=k-1Enddo?a(1),a(3),a(5)4、clear5、x=9Y=13Z=fu(x,y)?zFunctionfuParametersa,bA=a*bReturn(a)5、x=96、x=15Y=7Dosubwithx,(y)?x,yReturnProceduresubParametera,bA=a+bB=a-breturn6、x=157、clearstore2tox1,x2,x3X1=x1+1Doz1?x1+x2+x3Return*z1.prgX2=x2+1Doz2X1=x1+1ReturnZ2.prgX3=x3+1Returntomaster7、clear8、填空完成:通过字符串操作竖向显示“伟大祖国”,横向显示“祖国伟大”。ClearStore“伟大祖国”

温馨提示

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

评论

0/150

提交评论