第五篇-程序设计基础_第1页
第五篇-程序设计基础_第2页
第五篇-程序设计基础_第3页
第五篇-程序设计基础_第4页
第五篇-程序设计基础_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

第五章程序设计基础5.1程序设计概述5.2结构化程序设计5.3面向对象的程序设计基础6/27/20241程序设计的优点(与交互式相比)程序自动执行多条命令,省去了键入大量字符的麻烦,并且节约了宝贵的时间。程序可被修改并重新运行,且可多次运行.一个程序可调用其他程序。程序中可使用结构化程序设计命令来控制运算的流程。6/27/202425.1程序设计概述什么是程序设计?程序设计方法有哪些?程序设计是利用系统所提供的设计工具,按照程序设计语言的规范描述解决问题的算法并进行程序编写的过程。程序设计的方法主要有:结构化程序设计(SP)与面向对象的程序设计(OOP)。6/27/20243结构化程序设计方法SP程序的设计应遵循4条原则:自顶向下、逐步求精、模块化、限制使用转移语句。程序流程应使用3种控制结构:顺序、分支、循环结构化程序设计的本质是功能设计,其开发过程通常是从“做什么”到“如何做”。优点:系统结构性强,便于设计和理解缺点:用户需求一旦更改,系统在设计和实现阶段要作相应变动。功能分解模型难以与现实世界中的实际系统相吻合。6/27/20244面向对象的程序设计方法OOP基于问题对象的自底向上的功能综合,从内部结构上模拟客观世界,其开发过程是从“用什么做”到“要做什么”。OOP的基石是对象和类,基本机制是方法和消息。类是具有相同的结构、操作,并遵守相同规则的对象聚合在一起的对象。对象是基于某种类所创建的实例。OOP有三个重要的特性:封装性、继承性和多态性(Example:学生类与高中生类)优点:P137VisualFoxPro既支持结构化程序设计,也支持面向对象的程序设计,并提供了许多相关的可视化开发工具!6/27/202455.2结构化程序设计顺序(顺序结构由语句行组成,执行时语句顺序执行)分支(根据逻辑表达式的值执行不同的操作)循环(使得一组语句组重复执行若干次)子程序(过程/函数的调用)6/27/202465.2.1创建、修改和运行程序1.创建和修改程序文件程序是包含一系列命令的文本文件,文件扩展名为.PRG法一:主菜单命令“文件”“新建”,选择“程序”,单击“新建文件”按钮法二:“常用”工具栏中的“新建”按钮,…(同上)法三:项目管理器的“代码”选项卡中选择“程序”项,单击“新建”按钮法四:命令窗口中执行命令

MODIFYCOMMAND文件名(扩展名为.PRG)6/27/20247编辑和修改程序文件:项目管理器中选中被修改的程序文件,单击“修改”按钮或命令窗口利用MODIFYCOMMAND命令。对于已存在的程序文件,修改并保存后系统会将“上一版本”以.BAK文件保存!6/27/202482.运行程序法一:当程序文件处于编辑状态时,单击常用工具栏的“!”按钮法二:项目管理器窗口中选择程序文件,然后单击窗口中的“运行”按钮法三:命令窗口中执行命令

DOProgramName

[WITHParameterList]一旦运行程序文件,系统会自动地对程序文件(.prg)进行编译(包括对程序的词法检查、语法检查),生成“伪编译”程序(.fxp)。执行程序时,系统实质上是执行.fxp文件。6/27/20249Accept[<提示信息>]to<内存变量>功能:暂停程序的运行,等待用户键入一串字符赋给指定的内存变量Input[<提示信息>]to<内存变量>功能:暂停程序的运行,接受用户键入的表达式并将其值赋给指定的内存变量wait[<提示信息>][to<内存变量>]功能:等待单字符输入几个常用交互命令6/27/2024105.2.2顺序结构一条一条的按顺序依次执行逗号将不同类型的数据一起显示在屏幕例5.1

计算圆的面积Store4.12topS=p*p*3.14?S

&&或者?“圆面积为”,S

例5.2

显示一个字符串在另一个字符串中的位置c=“VisualFoxPro”cc=“Fox”?at(cc,c)

&&显示结果为8

6/27/2024115.2.3分支结构(1)单分支结构格式:IF

条件语句1

ENDIF说明:当“条件”成立时执行“语句”,否则执行ENDIF后面的语句条件成立?语句1yNENDIF后面的语句例:n=5X=0IFn<=3X=2ENDIF?X6/27/202412(2)双分支结构

IF

条件语句1

ELSE语句2

ENDIF说明:当“条件”成立时,执行“语句1”,否则执行“语句2”条件成立?语句1语句2ENDIF后面的语句YN例:X=3Y=1IFX>2Y=0ELSEY=3ENDIF?Y6/27/202413例5.3根据x的值决定y的值Input

“请输入一个数值:”

to

xIfx>0 y=1Else y=-1Endif?y6/27/202414例:判断一年是否是闰年(若一年是闰年当且仅当年数可被400整除或能被4整除不能被100整除)

**方法一clearInput“请输入你想判断的年数:”toyearrn=IIF((year%4=0andyear%100!=0)or;year%400=0,"闰年","不是闰年")?rn

6/27/202415clearInput"请输入你想判断的年数:"

toyearif

year%4=0

ifyear%100=0

ifyear%400=0 ?

"是闰年"

else ?

"不是闰年"

endif

else ?

"是闰年"

endifelse ?

"不是闰年"endif

**方法二IF嵌套使用6/27/202416(3)多分支结构

DO

CASE

CASE

条件1语句1

CASE

条件2

语句2

………CASE

条件n

语句n

OTHERWISE

语句n+1

ENDCASE

6/27/2024176/27/202418例:X=80Y=space(0)Docase

caseX>=90Y="优秀"

caseX>=80Y="良好"

caseX>=70Y="中等"

caseX>=60Y="及格"

otherwiseY="不及格"EndCase?Y说明:case的个数与需要判断的情况有关6/27/202419例5.5解一元二次方程(P141)Parametersa,b,cIfa=0 =messagebox("二次项系数不能为0!",48,"错误对话框") returnendifDelta=b*b-4*a*c&&计算根的判别式DOCASE CASEdelta>0 ?"方程有两个不等的实数根:"??(-b+sqrt(delta))/(2*a)??(-b-sqrt(delta))/(2*a)CASEdelta=0 ?"方程有两个相等的实数根:"??–b/(2*a)CASEdelta<0 ?"方程有两个复根:"

real_part=-b/(2*a)&&实部

img_part=sqrt(-delta)/(2*a)&&虚部

?alltrim(str(real_part))+"+"+alltrim(str(img_part))+"I"?alltrim(str(real_part))+"-"+alltrim(str(img_part))+"I"ENDCASE将文件保存为abc.prg在命令窗口输入:Doabcwith1,-5,66/27/2024205.2.4循环结构一:使得一组语句重复执行若干次。(1)FOR语句的格式:(预先知道循环的次数)FOR循环变量=初值

to终值[step步长]

循环体ENDFOR|next当步长为正数时,循环变量的初值要小于等于终值。当步长为负数时,循环变量的初值要大于等于终值。当步长为1时,[step步长]可以省略。6/27/202421FOR语句的执行流程为:1)将初值赋给循环变量2)判断循环变量是否超出终值,若超出则结束循环,否则执行循环体。3)计算循环变量的值:循环变量=循环变量+步长注意:循环变量加步长的操作是系统自动完成的不需要在循环体中再出现该操作。循环变量赋初值循环变量超出终值?执行循环体循环变量加步长ny6/27/202422例5.6计算100以内的奇数之和sum=0fori=1to100step2 sum=sum+iEndfor?sum练习:请说出下面程序的功能及执行结果。

a=1For

n=10to1step-2 a=n**2?a

Endfor6/27/202423例5.6计算50的阶乘p=1fori=1to50 p=p*iEndfor?"50的阶乘p=",p例5.7

计算1~100之间非3的倍数的所有奇数之和.法二:S=0FORI=1TO100

IFMOD(I,3)<>0andI%2=1 S=S+I

ENDIFENDFOR?S6/27/202424例5.8显示如图5-5所示的文字(循环嵌套)Clearc="金字大宝塔"n=len(c)/2fori=1ton

&&显示N行

?space(10-i)&&每行第一个字位置

forj=1toi

&&每行显示J个字

??substr(c,2*i-1,2) =inkey(0.5)

&&等待0.5秒

endforendfor6/27/202425补充:请写出下面程序的输出内容Clear?forI=1to9 ??str(I,4)

forj=1toI??str(I*j,4)

endfor?endforreturn6/27/2024265.2.4循环结构二:使得一组语句重复执行若干次。(2)DO

WHILE

条件循环体

ENDDO注意:1.如果预先不能确定循环的次数,而是根据某一条件决定是否结束循环。2.当条件=.T.时执行循环体,否则结束循环3.在循环体中要有改变循环条件的语句。条件成立?循环体ENDDO后面语句YESNOWHILE循环流程6/27/202427例5.10对于任意给定的字符串反序显示如:“abcdef”变成“fedcba”Store"abcdef"tocP=space(0)Dowhilelen(c)>0P=left(c,1)+Pc=substr(c,2)Enddo?p6/27/202428例5.12统计字符串中大、小写英文字母的个数Clearc="VisualFoxPro"Nmax=0Nmin=0Dowhile

len(c)>0

docase

caseasc(left(c,1))>64andasc(left(c,1))<91

Nmax=Nmax+1

caseasc(left(c,1))>96andasc(left(c,1))<123

Nmin=Nmin+1

endcasec=subs(c,2)EnddoWaitwindowsstr(nMax,2)+str(nMin,4)6/27/202429方法一:SETTALKOFFS=0&&累加变量N=1&&计数变量DOWHILEN<=100S=S+N

N=N+1&&修改循环条件ENDDO?S方法二:SettalkoffS=0FORN=1TO100S=S+NENDFOR?S综合1:求1至100之间的整数和两种循环结构比较6/27/202430方法一:

方法二:SETTALKOFFSETTALKOFFS=0S=0N=0DOWHILEN<=100FORN=0TO100STEP2

IFMOD(N,2)=0S=S+NS=S+NENDFOR

ENDIF

N=N+2?SENDDO?S综合2:求1至100之间的偶数和两种循环结构比较6/27/202431在循环语句中两条重要的命令:LOOP:如果循环体中含有LOOP语句,则当执行到LOOP语句时,将跳过LOOP后面的所有语句,重新开始循环EXIT:如果循环体中含有EXIT语句,则当执行到EXIT语句时,将跳过EXIT后面的所有语句,强行退出循环循环体Loop语句Exit语句6/27/202432补充:下面的例子随机产生一个70-80之间的数:x=0DOWHILE.T.&&循环条件始终满足

X=RAND()*100 IFx>70AND

(1)

______(2) ENDIFENDDO?XX<80EXIT6/27/202433Sum=0forn=1to100

Ifmod(n,2)=0

&&判断N如果是偶数

loop

&&返回到FOR且使N=N+1

endifSum=Sum+n

IfSum>=100

&&判断是否已大于100 Sum=Sum-n

exit

&&跳出FOR循环跳到?SUM语句

endif

Endfor?sum含loop和exit语句的例子:求连续奇数的和且和小于1006/27/202434(3)SCAN

<条件>

<循环体>

ENDSCAN注意:此语句仅限于处理表的记录5.2.4循环结构三:使得一组语句重复执行若干次。6/27/202435例5.14显示所有籍贯为“江苏”的学生姓名和籍贯ClearUsexsScanfor"江苏"$jg ?xm,jgendscan例如,显示CJ表中所有成绩在60分以下的记录,显示一条画一条横线:

USECJ

SCANFORCJ<60

?XH,KCDH,CJ?""

ENDSCAN6/27/2024361、完善程序:下列程序用来求0~100偶数之和,请将它写完整STORE0TON,SDOWHILE.T.IFN>100_______ELSES=S+NENDIFN=N+2ENDDO练一练EXIT6/27/2024372、运行下列程序以后,显示运行结果的前二行:结果:——————、——————SETTALKOFFS=“ABCDEF”N=LEN(S)K=1DOWHILEK<=N?SUBSTR(S,K,N-K)K=K+1ENDDOABCDEBCDE6/27/2024383、下列程序的功能是求100以内的偶数之和及奇数之和,根据要求完善程序。P=0Q=0FORN=1TO100 IF______________ P=P+N ELSE _____________ ENDIF___________________?“偶数和为”,P?“奇数和为”,QMod(n,2)=0Q=Q+nENDFOR6/27/2024394、完善下列程序:以实现通过字符串变量操作竖向显示“天长地久”、横向显示“地久天长”的功能。程序清单如下:

SETTALKOFFSTORE“天长地久”TOchCLEARN=1DOWHILEN<8?_________________N=N+2ENDDO?______________________??SUBSTR(ch,1,4)SUBSTR(Ch,N,2)SUBSTR(Ch,5)6/27/2024405、完善下列程序,使其如下图所示。

CLEARFORi=1TO9FORj=1TO9IFi<=j??STR(i,1)+"*"+STR(j,1)+"="+

+SPACE(2)ENDIFENDFOR

ENDFORStr(i*j,2)?6/27/202441例,求100之内的所有素数,存放在数组A中,并将素数按每行10个显示。综合应用例题6/27/202442dimea(50)m=1a(1)=2

fori=3to99step2

fork=2tosqrt(i)

ifmod(i,k)=0

exit

endif

endfor

ifk>sqrt(i)

m=m+1 a(m)=I

endif

endfor

k=0

forj=1tom

k=k+1

??A(J)

IFK%10=0

?

ENDIF

ENDFOR6/27/2024435.2.5过程与用户自定义函数

我们可以将经常执行的具有某一功能的一段代码独立出来,创建一个过程或用户自定义函数(UserDefinedFunction,简称UDF)。如果需要多次用到该功能,就不必多次编写该代码,而只需调用这个过程或自定义函数。6/27/2024441.过程与自定义函数的定义过程的语法格式:PROCEDURE

过程名

[PARAMETERS参数列表]

过程体

[RETURN[返回值]]ENDPROC注意:当缺省RETURN时,返回值为.T.用户自定义函数的语法格式:FUNCTION

函数名

[PARAMETERS参数列表]

函数体

[RETURN[返回值]]ENDFUNC6/27/2024451、过程或函数可以放在一般程序的后边,不能把可执行的主程序代码放在过程或函数之后;2、将过程或自定义函数保存为独立的程序文件;3、建立包含多个过程和自定义函数的过程文件;4、过程或函数可以保存在数据库的存储过程中。过程或函数的存放6/27/202446向过程或函数传递参数为了使过程或函数具有一定的灵活性,可以向过程或自定义函数传递参数。参数语句格式为:

PARAMETERS参数表注意:如果有参数语句,则该语句必须为PROCEDURE或FUNCTION命令后的第一条语句。6/27/202447参数表也称为虚参,最多可允许27个参数,参数之间用逗号分开。例如:

FUNCTIONF1

PARAMETERK1,K2,K3…………ENDFUNC6/27/2024482.过程与自定义函数的调用可以使用DO命令当调用过程时:DO过程名

WITH实参表当调用函数时采用与系统函数同样的调用方法:

函数名(实参表)实参表与虚参表应在个数、位置上一一对应。6/27/202449例:函数定义functionmyudf1 parametersr

s=3.1415926*r*r returnsendfunc输入参数:r圆的半径?

Myudf1(3)例:函数调用函数的返回值是S,

s为局部变量,存放圆的面积调用已定义的函数;

3与r对应。返回函数值(圆的面积)在命令窗口中执行:MODIFYCOMMANmyudf1,接着输入代码。并将该函数保存为独立的程序文件myudf1.prg6/27/202450例:过程定义Proceduremyudf2 parametersr,s s=3.1415926*r*rendproc输入参数:r圆的半径

输出参数:S圆的面积publicss

&&须先定义变量domyudf2

with3,ss?'半径为3圆面积=',ss例:过程调用计算圆的面积;结果送S调用已定义的过程;

3与r对应;ss与S对应6/27/202451P147例5.15:定义一个函数ntoc(),当传递给一个0~9之间的数字时,返回一个中文的“零~九”FUNCTIONntoc PARAMETERd LOCALs S="零一二三四五六七八九" RETURNsubstr(s,d*2+1,2)ENDFUNC在命令窗口中执行:MODIFYCOMMANntoc,接着输入代码。并将该函数保存为独立的程序文件ntoc.prg对该函数的调用:?Ntoc(3)&&显示‘三’6/27/202452函数与过程的区别1、定义的区别procedurefunction函数要返回值2、调用的区别过程用DO语句调用函数出现在表达式中,注意函数返回值的类型。6/27/202453注意:如果调用某过程文件中的过程和自定义函数,则在调用之前运行:

SETPROCEDURETO(过程或自定义)文件名重点掌握:1、完善程序2、写出程序运行结果6/27/202454补充下列定义的dtocc()函数将一个日期型数据转换为形如”XXXX年XX月XX日”的中文字符串。FUNCTIONdtocc Para___

deDate

______

cYear=STR(YEAR(deDate),4)+”年”

cMonth=STR(Month

(deDate),2)+”月”

cDay=STR(DAY(deDate),2)+”日”

RETURN________endfunccyear+cmonth+cday保存文件名为:dtocc调用函数过程:?dtocc(date())结果为:6/27/202455例5.16下列程序计算S=1!+2!+3!+4!+5!s=0&&主程序求和ForI=1to5 s=s+fjc(I)Endfor?sFUNCTIONfjc

&&自定义函数计算阶乘!

Parametersx p=1

forn=1tox p=p*n

endfor returnpEndfunc6/27/202456作业1、计算S=1/1!+1/2!+1/3!+……+1/20!2、计算并显示任意输入的整数的因子。6/27/2024575.3面向对象的程序设计基础5.3.1类和对象概述类(class):具有相同的结构、操作,并遵守相同规则的对象聚合在一起的对象。对象:对象是基于某种类所创建的实例。类是静态概念,对象是动态概念。比如:我们把世界上的人通称为人类6/27/202458 每个对象都具有属性、事件和方法这三个要素。

属性(Property):对象的特征或某一方面的行为。属性是可自定义的。

事件(Event):由对象识别的一个动作(如单击鼠标),可以编写相应的代码对此动作进行响应。事件是不可自定义的。

方法(Method):对象能够执行的一个操作。方法是可自定义的。每个对象都具有属性,以及与之相关的事件和方法,通过对象的属性、事件和方法来处理对象。6/27/202459VisualFoxPro中,面向对象程序设计主要体现在作为用户界面的表单(集)及其控件的设计。表单页框命令按钮复选框组合框微调框图像6/27/202460容器编辑框列表框标签控件文本框组合框图像表单集微条框复选框形状表单表格选项按钮组线条工具栏标头*选项按钮*分隔符*自定义列*计时器命令按钮组页框OLE绑定型控件命令按钮页面*OLE容器控件表5-1VFP的常用基类注:*表示该类是容器的集成部分,在类设计器中不能基于它们创建子类6/27/2024615.3面向对象的程序设计基础5.3.2基类——类可以分成三大类

基类(baseclass):是VFP系统提供的内部定义的类,可用作其他用户自定义类的基础。

子类(Subclass):是以其他类定义为起点,为某一种对象所建立的新类。

用户自定义类(User-definedClass):与VFP基类相似,但由用户定义,并且可用来派生子类。

父类(parentclass):子类所基于的类。6/27/2024625.3.2基类——基类也可以分成两大类

容器类(ContainerClasses):包容其他类的基类。

VFP的容器类有:容器、工具栏、表单集、表单、表格、表格列、页框、页面、命令按钮组、选项按钮组。如图5-2所示。

控件类(ControlClasses):可以包含在容器类中的基类。容器类对象、控件类对象示例6/27/202463最外层容器对象次外层控件类对象次外层容器类对象次外层容器对象所包含的控件返回6/27/2024645.3.2基类P151最小属性集:Class、BaseClass、ClassLibrary、ParentClass最小事件集:Init、Destroy、Error6/27/2024655.3.3处理对象1.引用对象——在引用对象时,首先要弄清该对象相对于容器层次的关系。引用对象的格式为:引用地址.对象名称(1)绝对引用

绝对引用是从最顶层对象开始,逐层引用,直到所指定的对象的方式。(绝对引用示例)(2)相对引用

相对引用是指在容器层次中相对于某个容器层次的引用。6/27/202466图中的Text1对象的绝对引用Form2对象Formset1.form2.Text1最高层容器对象表单集的name属性表单对象的name属性对象与对象之间用点号分隔返回6/27/202467*相对引用通常用于某个事件处理代码或方法程序代码中对所包容的对象的引用,引用时可以直接使用其对象名。包含该对象的表单集THISFORMSET包含该对象的表单THISFORM该对象THIS该对象的直接容器PARENT当前活动表单中具有焦点的控件ActiveControl当前活动表单中的活动页面Activepage当前活动表单ActiveForm表5-5VFP中相对引用对象时所用的关键字相对引用示例_SCREEN.activeform&&表示当前活动的表单6/27/202468对该命令按钮组对象中的“上一条”按钮的引用,语句是:This.cmd1该命令按钮组该命令按钮组中的第一个按钮的name属性返回6/27/2024695.3.3处理对象2.设置对象属性——有两种方法在采用可视化的方法进行对象设计时,可以在属性窗口中对对象属性进行设置在程序代码中,可以使用如下的语法对对象属性进行设置:

引用对象.属性名=属性值比如将命令按钮组中的第一个按纽(“上一条”)的前景色改为红色:This.cmd1.forecolor=rgb(255,0,0)该命令按钮组“上一条”按钮的name属性前景色属性属性值绿色rgb(0,255,0)蓝色rgb(0,0,255)白色rgb(255,255,255)黑色rgb(0,0,0)6/27/2024705.3.3处理对象3.调用对象的方法程序方法程序是对象能够执行的一个操作,是和对象相联系的过程。调用方法程序的语法如下:引用对象.方法程序例如刷新表单的语法:释放表单的语法:Thisform.refreshThisform.release6/27/2024715.3.3处理对象4.对事件的响应

当对象的某个事件发生时,该事件的处理程序代码将被执行。如果事件没有与之相关联的处理程序,则当事件发生时不会发生任何操作比如

当用户单击某命令按钮时,该命令按钮的Click事件的程序代码将被执行。比如

运动员踢足球,足球被踢出。

在这个过程当中,对象是足球,事件是踢,足球被踢出是对踢事件的响应。6/27/2024725.3.4事件模型1.核心事件VFP基类的事件集合是固定的,不能进行扩充。核心事件集见P155表5-6(注意:最小

温馨提示

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

评论

0/150

提交评论