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

下载本文档

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

文档简介

第五章 程序设计基础5.1

程序设计概述5.2

结构化程序设计5.3

面向对象的程序设计基础110/2/2023程序设计的优点(与交互式相比)210/2/2023程序自动执行多条命令,省去了键入大量字符的麻烦,并且节约了宝贵的时间。程序可被修改并重新运行,且可多次运行.一个程序可调用其他程序。程序中可使用结构化程序设计命令来控制运算的流程。5.1程序设计概述310/2/2023什么是程序设计?程序设计方法有哪些?程序设计是利用系统所提供的设计工具,按照程序设计语言的规范描述解决问题的算法并进行程序编写的过程。程序设计的方法主要有:结构化程序设计(SP)与面向对象的程序设计(OOP)。结构化程序设计方法SP程序的设计应遵循4条原则:自顶向下、逐步求精、模块化、限制使用转移语句。程序流程应使用3种控制结构:顺序、分支、循环结构化程序设计的本质是功能设计,其开发过程通常是从“做什么”到“如何做”。优点:系统结构性强,便于设计和理解缺点:用户需求一旦更改,系统在设计和实现阶段要作相应变动。功能分解模型难以与现实世界中的实际系统相吻合。410/2/2023面向对象的程序设计方法OOP510/2/2023

基于问题对象的自底向上的功能综合,从内部结构上模拟客观世界,其开发过程是从“用什么做”到“要做什么”。OOP的基石是对象和类,基本机制是方法和消息。类是具有相同的结构、操作,并遵守相同规则的对象聚合在一起的对象。对象是基于某种类所创建的实例。OOP有三个重要的特性:封装性、继承性和多态性(Example:学生类与高中生类)优点:P137Visual

FoxPro既支持结构化程序设计,也支持面向对象的程序设计,并提供了许多相关的可视化开发工具!5.2结构化程序设计610/2/2023顺序(顺序结构由语句行组成,执行时语句顺序执行)分支(根据逻辑表达式的值执行不同的操作)循环(使得一组语句组重复执行若干次)子程序(过程/函数的调用)5.2.1创建、修改和运行程序710/2/2023创建和修改程序文件程序是包含一系列命令的文本文件,文件扩展名为.PRG法一:主菜单命令“文件”

“新建”,选择“程序”,单击“新建文件”按钮法二:“常用”工具栏中的“新建”按钮,…(同上)法三:项目管理器的“代码”选项卡中选择“程序”项,单击“新建”按钮法四:命令窗口中执行命令MODIFY

COMMAND

文件名(扩展名为.PRG)编辑和修改程序文件:项目管理器中选中被修改的程序文件,单击“修改”按钮或命令窗口利用MODIFY

COMMAND命令。对于已存在的程序文件,修改并保存后系统会将“上一版本”以.BAK文件保存!810/2/20232.运行程序法一:当程序文件处于编辑状态时,单击常用工具栏的“!”按钮法二:项目管理器窗口中选择程序文件,然后单击窗口中的“运行”按钮法三:命令窗口中执行命令DO

ProgramName

[WITH ParameterList

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

计算圆的面积Store

4.12

to

pS=p*p*3.14?S

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

显示一个字符串在另一个字符串中的位置c=“Visual

FoxPro”cc=“Fox”?at(cc,c)

&&显示结果为81110/2/20235.2.3分支结构(1)单分支结构格式:IF

条件语句1ENDIF说明:当“条件”成立时执行“语句”,否则执行ENDIF后面的语句条件成立?语句1yNENDIF后面的语句例:n=5X=0IF

n<=3X=2ENDIF?X1210/2/2023(2)双分支结构IF

条件语句1ELSE语句2ENDIF说明:当“条件”成立时,执行“语句1”,否则执行“语句2”语句1语句2ENDIF后面的语句条件成立?YN例:X=3Y=1IF

X>2Y=0ELSEY=3ENDIF?

Y1310/2/2023例5.3

根据x的值决定y的值Input “请输入一个数值:

to

xIf

x>0y=1Elsey=-1Endif?

y1410/2/2023例:判断一年是否是闰年(若一年是闰年当且仅当年数可被400整除或能被4整除不能被100整除)**方法一clearInput

“请输入你想判断的年数:”

to

yearrn=IIF((year%4=0

and

year%100!=0

)

or;year%400=0,

"闰年",

"不是闰年")?rn1510/2/2023clearInput"请输入你想判断的年数:"to

yearif

year%4=0if

year%100=0if

year%400=0? "是闰年"else? "不是闰年"elseendif? "是闰年"endifelse? "不是闰年"endif**方法二

IF嵌套使用1610/2/2023(3)多分支结构CASEDO

CASECASE

条件1语句1条件2语句2………CASE

条件n语句nOTHERWISE语句n+1ENDCASE1710/2/20231810/2/2023例:X=80Y=space(0)Do

casecase

X>=90Y="优秀"case

X>=80Y="良好"case

X>=70Y="中等"case

X>=60Y="及格"otherwiseY="不及格"EndCase?Y说明:case

的个数与需要判断的情况有关1910/2/2023例5.5

解一元二次方程(P141)Parameters

a,b,cIf

a=0=messagebox("二次项系数不能为0!",48,"错误对话框")return&&计算根的判别式endifDelta=b*b-4*a*cDO

CASECASE

delta>0?"方程有两个不等的实数根:"??(-b+sqrt(delta))/(2*a)??(-b-sqrt(delta))/(2*a)CASE

delta=0?"方程有两个相等的实数根:"??–b/(2*a)CASE

delta<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在命令窗口输入:

Do

abc

with

1,-5,62010/2/20235.2.4循环结构一:使得一组语句重复执行若干次。2110/2/2023(1)

FOR语句的格式:(预先知道循环的次数)FOR

循环变量=初值

to

终值

[step

步长]循环体ENDFOR|next当步长为正数时,循环变量的初值要小于等于终值。当步长为负数时,循环变量的初值要大于等于终值。当步长为1时,[step

步长]可以省略。FOR语句的执行流程为:

1)将初值赋给循环变量2)判断循环变量是否超出终值,若超出则结束循环,否则执行循环体。3)计算循环变量的值:循环变量=循环变量+步长注意:循环变量加步长的操作是系统自动完成的不需要在循环体中再出现该操作。循环变量赋初值循环变量超出终值?执行循环体循环变量加步长ny2210/2/2023例5.6

计算100以内的奇数之和sum=0for

i=1

to

100

step

2sum=

sum+iEndfor?sum练习:请说出下面程序的功能及执行结果。a=11

step -2For

n=10

toa=n**2?aEndfor2310/2/2023例5.6

计算50的阶乘p=1for

i=1

to

50p=

p*iEndfor?"50的阶乘p=",p例5.7

计算1~100之间非3的倍数的所有2410/2/2023奇数之和.法二:

S=0FOR

I=1

TO

100IF

MOD(I,3)<>0

and

I%2=1S=S+IENDIFENDFOR?S例5.8

显示如图5-5所示的文字(循环嵌套)Clearc="金字大宝塔"n=len(c)/2for

i=1

ton

&&显示N行?

space(10-i)for

j=1toi&&每行第一个字位置

&&每行显示J个字??

substr(c,2*i-1,2)&&等待0.5秒=inkey(0.5)endforendfor2510/2/2023补充:请写出下面程序的输出内容

Clear?for

I=1

to

9??str(I,4)for

j=1

toI??str(I*j,4)endfor?endforreturn2610/2/20235.2.4循环结构二:使得一组语句重复执行若干次。(2)

DO

WHILE

条件循环体ENDDO注意:如果预先不能确定循环的次数,而是根据某一条件决定是否结束循环。当条件=

.T.时执行循环体,否则结束循环在循环体中要有改变循环条件的语句。条件成立?循环体ENDDO后面语句YES2710/2/2023NOWHILE循环流程例5.10

对于任意给定的字符串反序显示如:“abcdef”变成“fedcba”Store

"abcdef"

to

cP=space(0)Do

while

len(c)>0P=left(c,1)+Pc=substr(c,2)Enddo?p2810/2/2023例5.12统计字符串中大、小写英文字母的个数Clearc="Visual

FoxPro"Nmax=0Nmin=0Do

while

len(c)

>0do

casecase

asc(left(c,1))>64

andasc(left(c,1))<91Nmax

=

Nmax

+1case

asc(left(c,1))>96

andasc(left(c,1))<123Nmin

=

Nmin

+1endcasec=subs(c,2)EnddoWait

windows

str(nMax,2)+str(nMin,4)2910/2/2023方法一:SET

TALK

OFFS=0

&&累加变量N=1

&&计数变量DO

WHILE

N<=100S=S+N&&修改循环条件N=N+1ENDDO?S方法二:Set

talk

offS=0FOR N=1

TO

100S=S+NENDFOR?S综合1:求1至100之间的整数和两种循环结构比较3010/2/2023方法一:SET

TALK

OFFS=0方法二:SET

TALK

OFFS=0FOR

N=0

TO 100

STEP

2S=S+NENDFOR?SN=0DO WHILE

N<=100IF

MOD(N,2)=0S=S+NENDIFN=N+2ENDDO?S综合2:求1至100之间的偶数和3110/2/2023两种循环结构比较在循环语句中两条重要的命令:LOOP:如果循环体中含有LOOP语句,则当执行到LOOP

语句时,将跳过

LOOP后面的所有语句,重新开始循环EXIT:如果循环体中含有EXIT语句,则当执行到EXIT

语句时,将跳过

EXIT后面的所有语句,强行退出循环循环体Loop语句Exit语句3210/2/2023补充:下面的例子随机产生一个70-80之间的数:3310/2/2023x=0DO

WHILE

.T.

&&循环条件始终满足X=RAND()*100IF

x>70

AND(1)______(2)ENDIFENDDO?XX<80EXITSum=0for

n=1

to

100Ifmod(n,

2)=0loop&&判断N如果是偶数

&&返回到FOR且使N=N+1endifSum=Sum+n&&判断是否已大于100If

Sum>=100Sum=Sum-n&&跳出FOR循环跳到?SUM语句exitendifEndfor?sum含loop

和exit

语句的例子:求连续奇数的和且和小于1003410/2/2023(3)SCAN

<条件><循环体>ENDSCAN注意:此语句仅限于处理表的记录3510/2/20235.2.4循环结构三:使得一组语句重复执行若干次。例5.14

显示所有籍贯为“江苏”的学生姓名和籍贯ClearUse

xsScan

for"江苏"$jg?xm,jgendscan例如,显示CJ表中所有成绩在60分以下的记录,显示一条画一条横线:3610/2/2023USE

CJSCAN

FOR

CJ<60?XH,

KCDH,

CJ?"

"ENDSCAN1、完善程序:下列程序用来求0~100偶数之和,请将它写完整3710/2/2023STORE

0

TO

N,SDOWHILE

.T.IFN>100_______ELSES=S+NENDIFN=N+2ENDDO练一练EXIT2、运行下列程序以后,显示运行结果的前二行:————————结果:—ABCDE

—、—BCDE

—SET

TALK

OFFS=“ABCDEF”N=LEN(S)K=1DO

WHILE

K<=N?SUBSTR(S,K,N-K)K=K+1ENDDO3810/2/20233、下列程序的功能是求100以内的偶数之和及奇数之和,根据要求完善程序。P=0Q=0FOR

N=1

TO

100IF______________P=P+NELSE_____________ENDIF_______________?“奇数和为”,QMod(n,2)=0Q=Q+nENDFOR?“偶数和为”,P3910/2/2023

4、完善下列程序:以实现通过字符串变量操作竖向显示“天长地久”、横向显示“地久天长”的功能。程序清单如下:4010/2/2023SET

TALK

OFFSTORE “天长地久”

TO

chCLEARN=1DO

WHILE

N<8?_________________N=N+2ENDDO?______________________??SUBSTR(ch,1,4)SUBSTR(Ch,N,2)SUBSTR(Ch,5)5、完善下列程序,使其如下图所示。CLEARFOR

i=1

TO

9FOR

j=1

TO

9++SPACE(2)IF

i<=j??STR(i,1)+"*"+STR(j,1)+"="ENDIFENDFORENDFORStr(i*j,2)?4110/2/2023例,求100之内的所有素数,存放在数组A中,并将素数按每

行10个显示。4210/2/2023综合应用例题dime

a(50)m=1a(1)=2for

i=3

to

99

step

2for

k=2

to

sqrt(i)if

mod(i,k)=0exitendifendforif

k>sqrt(i)m=m+1a(m)=Iendifendfork=0for

j=1

tomk=k+1??A(J)IFK%10=0?ENDIFENDFOR4310/2/20235.2.5过程与用户自定义函数4410/2/2023我们可以将经常执行的具有某一功能的一段代码独立出来,创建一个过程或用户自定义函数(UserDefined

Function,简称UDF)。如果需要多次用到该功能,就不必多次编写该代码,而只需调用这个过程或自定义函数。1.过程与自定义函数的定义过程的语法格式:PROCEDURE

过程名[PARAMETERS

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

函数名[PARAMETERS

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

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

F1PARAMETER…………ENDFUNC2.过程与自定义函数的调用4910/2/2023可以使用DO命令

当调用过程时:DOWITH过程名

实参表当调用函数时采用与系统函数同样的调用方法:函数名(实参表)实参表与虚参表应在个数、位置上一一对应。例:函数定义functionmyudf1parameters

rs=3.1415926*r*rreturn

sendfunc输入参数:r圆的半径?

Myudf1(3)例:函数调用函数的返回值是S,s为局部变量,存放圆的面积调用已定义的函数;3与r对应。返回函数值(圆的面积)在命令窗口中执行:5010/2/2023MODIFY

COMMAN

myudf1,接着输入代码。并将该函数保存为独立的程序文件myudf1.prg例:过程定义输入参数:r圆的半径输出参数:S圆的面积public

ss

&&须先定义变量do

myudf2

with

3,ss?'半径为3圆面积=',ss计算圆的面积;结果送SProcedure

myudf2parameters

r,ss=3.1415926*r*rendproc例:过程调用调用已定义的过程;3与r对应;ss与S对应5110/2/2023P147例5.15:定义一个函数ntoc(),当传递给一个0~9之间的数字时,返回一个中文的“零~九”FUNCTION

ntocPARAMETER

dLOCAL

sS="零一二三四五六七八九"RETURN

substr(s,d*2+1,2)ENDFUNC在命令窗口中执行:MODIFY

COMMAN

ntoc,接着输入代码。并将该函数保存为独立的程序文件ntoc.prg对该函数的调用:?

Ntoc(3) &&显示‘

三’5210/2/2023函数与过程的区别5310/2/20231、定义的区别procedurefunction函数要返回值2、调用的区别过程用DO

语句调用函数出现在表达式中,注意函数返回值的类型。注意:如果调用某过程文件中的过程和自定义函数,则在调用之前运行:5410/2/2023(过程或自定义)文件名SET

PROCEDURE

TO重点掌握:1、完善程序2、写出程序运行结果补充

下列定转换FUNCTION义的dtocc()函数将一个日期型数据年XX月XX日”的中文字符串。dtoccPara

deDate

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

(deDate),2)+”月”cDay=STR(DAY(deDate),2)+”日”________RETURNendfunccyear+cmonth+cday保存文件名为:dtocc5510/2/2023为形如”XXXX

调用函数过程:?dtocc(date())结果为:例5.16

下列程序计算S=1!+2!+3!+4!+5!s=0

&&主程序求和5610/2/2023&&自定义函数计算阶乘!For

I=1

to

5s=s+fjc(I)Endfor?sFUNCTION

fjcParameters

xp=1for

n=1

toxp=p*nendforreturn

pEndfunc作业5710/2/20231、计算

S=1/1!+1/2!+1/3!+……+1/20!2、计算并显示任意输入的整数的因子。5.3面向对象的程序设计基础类和对象概述类(class):具有相同的结构、操作,并遵守相同规则的对象聚合在一起的对象。对象:对象是基于某种类所创建的实例。类是静态概念,对象是动态概念。比如:我们把世界上的人通称为人类5810/2/2023每个对象都具有属性、事件和方法这三个要素。属性(Property):对象的特征或某一方面的行为。属性是可自定义的。事件(Event):由对象识别的一个动作(如单击鼠标),可以编写相应的代码对此动作进行响应。事件是不可自定义的。方法(Method):对象能够执行的一个操作。方法是可自定义的。每个对象都具有属性,以及与之相关的事件和方法,通过对象的属性、事件和方法来处理对象。5910/2/2023Visual

FoxPro中,面向对象程序设计主要体现在作为用户界面的表单(集)及其控件的设计。表单页框命令按钮复选框组合框微调框图像6010/2/2023容器编辑框列表框标签控件文本框组合框图像表单集微条框复选框形状表单表格选项按钮组线条工具栏标头*选项按钮*分隔符*自定义列*计时器命令按钮组页框OLE绑定型控件命令按钮页面*OLE容器控件6110/2/2023表5-1

VFP的常用基类注:*表示该类是容器的集成部分,在类设计器中不能基于它们创建子类5.3面向对象的程序设计基础6210/2/20235.3.2基类——类可以分成三大类基类(base

class):是VFP系统提供的内部定义的类,可用作其他用户自定义类的基础。子类(Subclass):是以其他类定义为起点,为某一种对象所建立的新类。父类(parent

class):子类所基于的类。用户自定义类(User-defined

Class):与VFP基类相似,但由用户定义,并且可用来派生子类。5.3.2基类——基类也可以分成两大类6310/2/2023容器类(Container

Classes):包容其他类的基类。VFP的容器类有:容器、工具栏、表单集、

表单、表格、表格列、页框、页面、命令按钮组、选项按钮组。如图5-2所示。控件类(Control

Classes):可以包含在容器类中的基类。容器类对象、控件类对象示例最外层容器对象次外层控件类对象次外层容器类对象次外层容器对象所包含的控件10/2/2023返回645.3.2基类P151最小属性集:Class、BaseClass、ClassLibrary、ParentClass最小事件集:Init、Destroy、Error6510/2/20235.3.3处理对象6610/2/20231.

引用对象——在引用对象时,首先要弄清该对象相对于容器层次的关系。引用对象的格式为:引用地址.对象名称绝对引用绝对引用是从最顶层对象开始,逐层引用,直到所指定的对象的方式。(绝对引用示例)相对引用相对引用是指在容器层次中相对于某个容器层次的引用。Form2对象图中的Text1对象的绝对引用最高层容器对象表单集的name属性Formset1.form2.Text1表单对象的name属性对象与对象之间用点号分隔6710/2/2023返回*相对引用通常用于某个事件处理代码或方法程序代码中对所包容的对象的引用,引用时可以直接使用其对象名。6810/2/2023ActiveForm当前活动表单Activepage当前活动表单中的活动页面ActiveControl当前活动表单中具有焦点的控件PARENT该对象的直接容器THIS该对象THISFORM包含该对象的表单THISFORMSET包含该对象的表单集相对引用示例表5-5

VFP中相对引用对象时所用的关键字_SCREEN.activeform &&表示当前活动的表单对该命令按钮组对象中的“上一条”按钮的引用,语句是:This.cmd1该命令按钮组该命令按钮组中的第一个按钮的name属性10/2/2023返回695.3.3处理对象2.设置对象属性——有两种方法在采用可视化的方法进行对象设计时,可以在属性窗口中对对象属性进行设置在程序代码中,可以使用如下的语法对对象属性进行设置:引用对象.属性名=属性值比如将命令按钮组中的第一个按纽(“上一条”)的前景色改为红色:This.cmd1.forecolor=rgb(255,0,0)该命令按钮组“上一条”按钮的name属性前景色属性绿色rgb(0,255,0)蓝色rg属b(0性,0,值255)白色rgb(255,255,255)黑色rgb(0,0,0)7010/2/20235.3.3处理对象7110/2/2023释放表单的语法:3.调用对象的方法程序方法程序是对象能够执行的一个操作,是和对象相联系的过程。调用方法程序的语法如下:引用对象.方法程序例如 刷新表单的语法:Thisform.refreshThisform.release5.3.3处理对象7210/2/20234.对事件的响应当对象的某个事件发生时,该事件的处理程序代码将被执行。如果事件没有与之相关联的处理程序,则当事件发生时不会发生任何操作比如

运动员踢足球,足球被踢出。在这个过程当中,对象是足球,事件是踢,足球被踢出是对踢事件的响应。比如

当用户单击某命令按钮时,该命令按钮的Click事件的程序代码将被执行。5.3.4事件模型7310/2/2023核心事件VFP

基类的事件集合是固定的,不能进行扩充。核心事件集见P155

表5-6

(注意:最小事件集Init、Destroy、Error)容器层次与类层次中的事件为控件写事件的处理代码时,应注意以下两条一般性的原则:

容器不处理与包含的控件相关联的事件。

如果没有与控件相关联的事件代码,VFP将在类层次的更高层上检查是否有与此事件相关联的控件代码5.3.4事件模型7410/

温馨提示

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

评论

0/150

提交评论