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

下载本文档

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

文档简介

第3章程序设计基础3.1VFP应用程序设计3.2 程序文件的建立与执行3.3 程序设计基本语句3.4 程序控制的基本结构3.5 过程与过程文件3.6 综合程序设计范例第3章程序设计基础3.1VFP应用程序设计13.1VFP应用程序设计VFP的工作方式命令方式菜单方式程序方式VFP程序设计过程 VFP应用程序包括:一个或多个数据库、 设置系统环境的主程序、用户界面 (如表单、工具栏和菜单等),还可 以包括查询和报表。

3.1VFP应用程序设计VFP的工作方式2 设计数据库、确定功能需求|创建数据库、表、视图、关系 | / \方便用户使用帮助用户访问信息表单、菜单、工具栏查询、报表、图形\/|测试与调试|应用程序创建一个完整的VFP应用程序的全过程

设计数据库、确定功能需求创建一个完整的VFP应用程序的全3VFP程序设计方法

面向过程程序设计

自顶向下层层分解 子程序之间有严重顺序性和依赖性 软件稳定性、可修改性、扩充性、重用性差面向对象程序设计方法 继承 封装多态 各部件相对独立 稳定性、可修改性、维护性、可重用性高

3.1VFP应用程序设计(续)VFP程序设计方法3.1VFP应用程序设计(续)43.2程序文件的建立与执行

创建程序 ModifyCommand[文件名]保存程序修改程序 ModifyCommand<程序文件名>程序文件的调用 DO<程序文件名>3.2程序文件的建立与执行创建程序5程序结束:

文件的末尾(返回到调用行的下一行).

Return(返回到调用行的下一行)

Retry(返回到调用行本身,可以实现程序的 重复调用)

Cancel(中断,异常结束,并返回到命令窗口)Quit(返回到操作系统)命令文件(.prg)在运行时先自动编译生成目标程序(.fxp)再执行.3.2程序文件的建立与执行(续)

程序结束:3.2程序文件的建立与执行(续)63.3 程序设计基本语句1.程序注释: Note[<注释>]或:*[<注释>]2.语句注释 &&[<注释>]3.3.1程序注释语句3.3 程序设计基本语句1.程序注释:3.3.1程序注释语7中断语句 Cancel功能:中断程序的执行,返回到命令窗口挂起语句 Suspend功能:暂停当前程序的执行,并返回到系统命令窗口恢复执行语句 Resume功能:恢复被挂起的程序,使之从暂停的位置继续执行3.3.2程序调试语句中断语句3.3.2程序调试语句81.换行输出 ?[<表达式列表>]功能:分别计算表达式列表的值,并将其输出在当 前光标的下一行同行输出 ??[<表达式列表>]3.3.3简单的输出语句1.换行输出3.3.3简单的输出语句93.3.4简单的输入语句1.数据接收语句:Input[<提示信息>]To<内存变量>功能:将键盘输入的数据赋给指定的<内存变量>. <提示信息>将显示在屏幕上。数值型以外 的常量,必须输入其定界符.例: Input“请输入出生年月:”Tocsny Input“请输入奖学金:”Tojxj Input“请输入学号:”Toxh3.3.4简单的输入语句1.数据接收语句:102.字符串接收语句Accept[<提示信息>]To<内存变量>

从键盘输入的数据只能是字符型常量,且不需定界符.例: Accept"请输入姓名:"Toxm Accept"请输入学号:"Toxh3.3.4简单的输入语句(续)3.3.4简单的输入语句(续)113.单字符接受语句 Wait[<提示信息>][To<内存变量>] [Window[At<行坐标,列坐标>]] [Nowait][Noclear] [Timeout<秒数>]

从键盘输入的数据只能是单字符型常量.例:Wait“请检查输入内容”WindowAt10,403.3.4简单的输入语句(续)3.单字符接受语句3.3.4简单的输入语句(续)123.3.5环境设置语句Clear清屏SetTalkOn/Off 功能:打开/关闭对话开关SetDeleteOn/Off 功能:是否忽略有删除标记的纪录. SetExactOn/Off

功能:字符串比较是否为精确比较SetCarryOn/Off 功能:向表中添加纪录时是否将上一条记 录的内容作为新纪录的默认值3.3.5环境设置语句Clear清屏13SetDefaultTo<路径>

功能:设置系统缺省路径.缺省为当前目录SetExclusiveOn/Off

功能:设置表打开方式为独占或共享SetEscapeOn/Off

功能:程序运行期间按Esc健是否可中断退出SetUdfparmsToValue/Reference

功能:调用自定义函数时参数的传递方式是 传值还是引用3.3.5环境设置语句(续)SetDefaultTo<路径>3.3.5环143.4程序控制的基本结构例1:求学生表中指定班级的全体学生的奖学金总额。3.4.1顺序结构ClearUse学生Input"请输入指定的班级:"TobjSum奖学金TojxjFor班级=bj?bj+"班全体学生的奖学金总额为:"+Str(jxj,5,2)Use3.4程序控制的基本结构例1:求学生表中指定班级的全体学153.4.2选择分支结构

二路选择分支结构:If…EndIf多路选择分支结构:DoCase…EndCase1.二路选择分支结构 If<条件表达式>[Then] <语句序列1> [Else <语句序列2>] EndIf3.4.2选择分支结构二路选择分支结构:If…EndI16ClearInput'a='TOaInput'b='TobInput"c="TocD=b*b-4*a*cP=-b/(2*a)IfD<0 ?"复根"Else IfD=0 ?"X1=x2=",P Else D1=sqrt(D) ?"X1=",(-b+D1)/(2*a) ?"X2=",(-b-D1)/(2*a) EndifEndif例2: 求一元二次方程aX2+bX+c=0的根。a,b,c由键盘输入。Clear例2: 求一元二次方程aX2+bX+c=0的根。172.多路选择分支结构

DoCase Case<条件表达1> <语句序列1> Case<条件表达2> <语句序列2> …… Case<条件表达n> <语句序列n> [Otherwise <语句序列n+1> Endcase3.4.2选择分支结构2.多路选择分支结构3.4.2选择分支结构18例3:从键盘输入学生的学号,在"成绩"表中计算该生的平均成绩,并给出成绩的档次.(优、良、中、及格、不及格),如果该生不在表中则提示相应的信息。

例3:从键盘输入学生的学号,在"成绩"表中计算该生的平均19UseChjAccept"请输入学生的学号:"ToxhLocateFor学号=xhIf!Found() ?"查无此人!"Else Average成绩To平均分For学号=xh DoCase Case平均分>=90 dc="优" Case平均分>=80 dc="良" Case平均分>=70 dc="中" Case平均分>=60 dc="及格" Otherwise dc="不及格" Endcase ?学号,姓名,平均分,dcEndifUseUseChj203.4.3循环结构三种循环语句:

DoWhile…EndDo

Scan…EndScanFor…EndFor1.DoWhile…EndDo DoWhile<条件表达式> <语句序列> [Exit] [Loop] EndDo3.4.3循环结构三种循环语句:211).对循环次数不确定的程序进行操作

DoWhile.T. <语句序列> If<条件表达式> Exit EndIf EndDo

例4:对多个学生成绩的查询

3.4.3循环结构1).对循环次数不确定的程序进行操作例4:对多个学生成绩的22UsechjDoWhile.T. Accept"请输入学生的学号:"Toxh LocateFor学号=xh If!Found() ?"查无此人!" Else Average成绩To平均分For学号=xh DoCase Case平均分>=90dc="优" Case平均分>=80dc="良" Case平均分>=70dc="中" Case平均分>=60dc="及格" Otherwisedc="不及格" Endcase ?学号,姓名,平均分,dc Endif Wait"还要查询吗?(y/n)"Toyn IfUpper(yn)='y‘Loop ElseExitEndifEnddoUseUsechj232).对文件的记录逐条进行操作。 DoWhile.Not.Eof()/Bof() <语句序列> Skip/Skip-1EndDo3.4.3循环结构2).对文件的记录逐条进行操作。3.4.3循环结构24SetTalkOffClearUse学生DoWhile.Not.Eof() If奖学金>0 ?姓名,奖学金 Endif SkipEnddoUseSetTalkOn例5:显示输出“学生”表中的获得奖学金的学生 姓名和奖学金数额.SetTalkOff例5:显示输出“学生”表中的获得25SetTalkOffClearUse学生LocateForYear(出生日期)<1978DoWhile!Eof() ?姓名,出生日期 ContinueEnddoUseSetTalkOn例6:输出学生表中1978年以前出生的学生姓名 和出生年月SetTalkOff例6:输出学生表中1978年以前出263).通过状态测试函数 DoWhile<状态测试函数> [<语句序列>] [<改变状态测试函数值的语句或 键盘动作>] EndDo3.4.3循环结构3).通过状态测试函数3.4.3循环结构27例7:利用状态测试函数Inkey(0)编写一段等待程序,对程序段进行循环操作控制,直到用户按回车键才继续执行其他操作。 SetTalkOff Clear ?”请在驱动器中插入软盘,准备好后按回车” DoWhileInkey(0)!=13 EndDo DirA:\ SetTalkOn例7:利用状态测试函数Inkey(0)编写一段等待程序,对程282.Scan…Endscan(指针型)Scan[范围][For<条件表达式1>][while<条件表达式2>]

<语句序列>Endscan功能:对当前打开的表文件在指定范围、满足条件的记录 中自上而下逐个扫描,随着记录指针的移动, SCAN循环对选中的每条记录执行相同的<语句序 列>。3.4.3循环结构2.Scan…Endscan(指针型)3.4.3循环结29SetTalkOffClearUse学生ScanFor奖学金>200.And.性别=.T. ?姓名,奖学金EndscanUseSetTalkOn例8:显示输出学生表中奖学金大于200元的男生 的姓名和奖学金数额.

SetTalkOff例8:显示输出学生表中奖学金大于2303.For…EndFor1)For循环变量=初值To终值[Step步长] <语句序列> EndFor/Next2)ForEach<变量>In<数组变量>/<集合> <语句序列> EndFor/Next[<变量>]

3.4.3循环结构3.For…EndFor3.4.3循环结构31SetTalkOffClearUse学生ForN=1ToFcount() ?Field(n)EndForUseSetTalkOn例9:显示学生表中的全部字段名。

SetTalkOff例9:显示学生表中的全部字段名。324.Exit语句格式: Exit功能:无条件跳出循环,转去执行EndDo、EndScan 或EndFor后面的语句。5.Loop语句格式: Loop功能:用在循环语句的循环体中。在执行循环体时如果遇到该语句,就立即转向循环语句头部,即返回到DoWhile、For或Scan。在For循环中返回会修改循环变量的值,在Scan循环中返回会移动记录指针,然后重新判断循环条件。3.4.3循环结构4.Exit语句3.4.3循环结构333.4.4多种结构的嵌套

例10:通过数组完成对学生表的数据录入工作(备注字段和通用字段忽略),当用户按ESC键时,结束录入操作.3.4.4多种结构的嵌套例10:通过数组完成对学生表的34SetEscapeOffUse学生r=0Fori=1ToFcount() Zdm=field(i) IfType(zdm)=“M".Or.Type(zdm)=“G“ r=r+1 EndIfEndForDimensionA(fcount()-r)DoWhile.T. j=0 Fori=1ToFcount()-r j=j+1 zdm=Field(j) DoWhileType(zdm)=“M".Or.Type(zdm)=“G" j=j+1 zdm=Field(j) Enddo Input"输入字段:"+Field(j)+",类型为:"+Type(zdm)ToA(i) EndFor AppendBlank GatherFromA IfInkey(0)=27 Exit EndifEnddoUseSetEscapeOnSetEscapeOff353.5过程与过程文件1.调用:Do<文件名>[With<参数列表>]返回:Return[ToMaster][<表达式>]子程序执行时遇到以下情况时,自动结束返回:ReturnRetryCancelQuit子程序末尾

3.5.1子程序3.5过程与过程文件1.调用:Do<文件名>[Wit36**p1.prg**…DoP2…Return**p2.prg**…DoP3…Return**p3.prg**………Return**p1.prg**…DoP2…Return**p2.prg**…DoP3…Return**p3.prg**………ReturnToMaster图1图2**p1.prg**…**p2.prg**…**p3.prg37****P1.Prg*** ***P2.Prg****SetTalkOff ?"早上好!"Clear DoP3?“同学们!” ?"下午好!"DoP2 Return?“晚上好!”Return***P3.Prg****?"中午好!"Return例11:****P1.Prg*** ***382.主程序用with语句向子程序传递参数例12:

*****cfx.prg***** a=4 b=6 s=0 DoCfx-1With4,a+b,s ?“s=”,s

***cfx-1.prg*** Parameters长,宽,面积 面积=长*宽 ?“面积=”,面积 Return2.主程序用with语句向子程序传递参数393.5.2过程程序设计

1.过程定义:Procedure<过程名> [<语句序列>] EndProc2.过程文件的建立**P1.Prg**ProcP11*过程代码……EndprocProcP12*过程代码……Endproc**P2.Prg***主程序代码…………ProcP21*过程代码……Endproc**P3.Prg**ProcP31*过程代码……Endproc3.5.2过程程序设计1.过程定义:Procedure40

3.过程文件的调用

调用过程文件中的过程之前必须先打开过程 文件,调用结束后要关闭过程文件.打开: SetProcedureTo<过程文件名>关闭: SetProcedureTo或:CloseProcedure调用:Do<过程名>[With<参数表达式列表>]3.5.2过程程序设计

3.过程文件的调用3.5.2过程程序设计41例13:程序p-13.prg和过程文件prc1.prg ****p-13.prg**** SetProcToPrc1 SetTalkOff Clear ?"同学们!" DoP2 ?"晚上好!" Return3.5.2过程程序设计

例13:程序p-13.prg和过程文件prc1.prg3.42****过程文件prc1.prg**** ProcP2 ?"早上好!" DoP3 Endproc

ProcP3 ?"中午好!" Endproc程序的执行:Setproceduretoprc1 Dop-13****过程文件prc1.prg****程序的执行:Set433.5.3参数传递及作用域

利用内存变量的作用域属性

利用Do…With…

3.5.3参数传递及作用域利用内存变量的作用域属性44一.利用内存变量作用域属性传递参数自然属性

公用属性私有属性本地属性一.利用内存变量作用域属性传递参数自然属性451.自然属性

(1)定义格式:无特别声明(2)作用范围:该程序及其调用的下属子程序。(3)传递方向:单向(由主程序到子程序)。在主程序中出现的自然属性的内存变量在其调用的下属子程序中可以直接使用,并且可以改变其值。当调用结束返回到主程序中时,主程序中自然属性的内存变量的值为最近一次被改变后的值。但在主程序中没有出现而在子程序中出现的自然属性的内存变量,在其上属主程序中则不可以直接使用。

(4)变量寿命:所在程序运行结束后被自动清除。

1.自然属性46例14:运行下列程序,并分析运行结果。****p-14.prg***SetProcedureToProc2ClearSetTalkOffA=1B="good" ?”P1:”ListMemoLike?WaitDoP2?”P1:”ListMemoLike?Wait例14:运行下列程序,并分析运行结果。47**过程文件proc2.prg**ProcP2c=5 a=a+cb=date()?”P2:”ListMemoLike?WaitDoP3?”P2:”ListMemoLike?WaitEndproc

**过程文件proc2.prg**48ProcP3a="12345"b=Year(b)c=Str(c,1)d=56 ?”P3:” ListMemoLike?WaitEndprocProcP349ppt课件VisualFoxpro第3章程序设计基础502.公用属性(1)定义格式:Public<内存变量列表> 用Public定义过的变量的初值为逻辑假.f.(2)作用范围:整个系统的所有程序(3)传递方向:双向(可以由主程序到子程序, 也可以由子程序到主程序)(4)变量寿命:程序运行结束后,内存中依 然保留该内存变量.

2.公用属性51例15:运行下列程序,并分析运行结果。****p-15.prg****SetProcedureToProc3ClearPublica,ba=1b="good"?”p1:”ListMemoLike?WaitDoP2?”p1:”ListMemoLike?Wait例15:运行下列程序,并分析运行结果。52***过程文件proc3.prg***ProcP2Publiccc=aStoreDate()Toa,b?”p2:”ListMemoLike?WaitDoP3?”p2:”ListMemoLike?WaitEndproc***过程文件proc3.prg***53ProcP3a="12345"b=Year(b)c=Str(c,1)Publicdd=56?”p3:”ListMemoLike?WaitEndprocProcP354ppt课件VisualFoxpro第3章程序设计基础553.私有属性

类似自然属性,能在其下属的所有子程序中使用,而并不被所有程序共享.当出现私有属性内存变量与上级主程序中的一些内存变量同名时,上级主程序中的同名内存变量将被隐藏起来,保持原有的值,而不受下属程序中同名私有内存变量值的影响.必须先声明后使用.3.私有属性56(1)声明格式: Private<内存变量列表>

或 PrivateAll[Like/Except<通配符>](2)作用范围:该程序及其下属子程序(同自然属性变量)(3)传递方向:单向(由主程序到子程序,同自然属性变量)(4)变量寿命:程序运行结束后自动被删除,同自然属性 变量)(5)特殊作用:可屏蔽上级程序中与当前程序同名的变量,即对当前程序中私有属性变量的操作,不影响上级程序中与当前程序同名的变量值.(1)声明格式:57例16:运行下列程序,并分析运行结果。****p-16.prg***SetProcToProc4ClearPublica,ba=1b="good“?”p1:”ListMemoLike?WaitDoP2?”p1:”ListMemoLike?Wait例16:运行下列程序,并分析运行结果。58**过程文件proc4.Prg**ProcP2Privateac=12StoreDate()Toa,b?”p2:”ListMemoLike?WaitDoP3?”p2:”ListMemoLike?WaitEndproc**过程文件proc4.Prg**59ProcP3a="12345"b=Year(b)c=Str(c,2)PrivatecStore5Toa,b,c?”p3:”ListMemoLike?WaitEndprocProcP360ppt课件VisualFoxpro第3章程序设计基础614.本地属性

只能在其所处的程序中使用,而不被上级程序或下属子程序共享.当本地属性内存变量与上级主程序中的一些内存变量同名时,上级主程序中的同名内存变量将被屏蔽起来,保持原有的值,而不受同名本地属性的内存变量的影响.而当本地属性的内存变量与下属子程序中的一些内存变量同名时,该本地属性的内存变量保持原有的值,而不受下属子程序中同名内存变量值的影响.必须先定义后使用.

4.本地属性62((1)定义格式: Local<内存变量列表> 用Local定义过的变量的初值为逻辑假.f.。(2)作用范围:该程序本身。(3)传递方向:无。(4)变量寿命:程序运行结束后,被自动删除。(5)特殊作用:可屏蔽上级程序中与当前程序同名的变量,即对当前程序中变量的操作,不影响上级程序中与当前程序同名的变量值。同时也不受下属子程序中同名内存变量值的影响。

((1)定义格式:63例:运行下列程序,并分析运行结果。****P-17.prg***SetProcedureToProc5ClearPublica,ba=1b="good“?”p1:”ListMemoLike?WaitDoP2?”p1:”ListMemoLike?WaitReturn例:运行下列程序,并分析运行结果。64**过程文件proc5.prg**ProcP2LocalaC=12StoreDate()Toa,bListMemoLike?WaitDoP3ListMemoLike?WaitEndproc

**过程文件proc5.prg**65ProcP3a="12345"b=Year(b)c=Str(c,2)LocalcStore5Toa,b,cListMemoLike?WaitEndprocProcP366二、利用DO…WITH…传递参数传递参数 Do<文件名>With<参数表达式列表>接收参数

Parameters<变量列表>规则 1) 传递参数命令可以出现在调用程序(主程序)中的任何位置,接收参数命令必须出现在被调用程序(子程序)中的第一行

2)参数传递方式:引用、传值二、利用DO…WITH…传递参数传递参数67引用方式 <参数表达式列表>是内存变量列表每个内存变量的值传给Parameters中对应变量,而该调用程序(主程序)中的内存变量被隐含起来(即不受被调用程序中同名变量的影响),但其值随着传给被调用程序(子程序)中的接收参数值的变化而变化.引用方式68传值方式 <参数表达式列表>是内存变量表达式(由常量、变量、函数和运算符组成)列表或单个内存变量用圆括号括起来 每个内存变量表达式的值传给Parameters中对应变量,而该调用程序(主程序)中的出现在表达式中的变量不被隐含(即受被调用程序中同名变量的影响),其值不随着传给被调用程序(子程序)中的接收参数的值的变化而变化。这种参数传递方式称为传值。传值方式69例:参数传递的引用方式。SetProcToproc6ClearSetTalkOffa=1b="good"ListMemoLike?WaitDoP2Witha,bListMemoLike?WaitReturn

例:参数传递的引用方式。70*****过程文件proc6.prg**** ProcP2 Parametersx,y y=y+“morning!” x=date()+x a=100 b=“ok!” ListMemoLike? Wait Endproc*****过程文件proc6.prg****71例:参数传递的传值方式SetProcToproc7ClearSetTalkOffa=1b="good"ListMemoLike?WaitDoP2Witha+9,(b)ListMemoLike?WaitReturn例:参数传递的传值方式72***过程文件proc7.prg***ProcP2Parametersx,yy=y+“morning!”x=date()+xa=100b=”ok!”ListMemoLike?WaitEndproc

***过程文件proc7.prg***733.5.4用户自定义函数

1.自定义函数的设计(1)定义:自定义函数是一个子程序(.PRG),它 可以返回一个值到调用程序.(2)建立:与一般命令文件的建立方法相同. 存在形式: FUNCTION自定义函数名 [语句序列] ENDFUNC3.5.4用户自定义函数1.自定义函数的设计74 (3)特点: 首条命令: Parameters<变量列表> 尾条命令: Return<表达式>2.自定义函数调用与参数传送(1)调用 不能用DO命令调用,只能出现在表达式中。(2)参数传送:传值,引用 如果在<参数表达式列表>中以表达式的形式出现,那么是传值的方式;如果在参数变量前冠以@,那么将采用引用的方式. (3)特点:75例:编写一个函数,判断给定的正整数是奇数还是偶数.是偶数返回.T.,是奇数返回.F. ********jos.prg********FunctionjosParametersxIfInt(x/2)=x/2 Return.T.Else Return.F. Endif调用:?JOS(8)结果:.T.例:编写一个函数,判断给定的正整数是奇数还是偶数.是偶76例:编写一个函数,计算给定的三条边(三个正数)所构成的三角形的面积.如果给定的三条边能构成一个三角形,则返回面积值,否则返回数值0.FunctionTareaParametersA,b,cIfA+b>cAndB+c>aAndA+c>b S=(a+b+c)/2 Area=sqrt(s*(s-a)*(s-b)*(s-c)) ReturnAreaElse Return0Endif调用:?TAREA(3,4,5)结果:

温馨提示

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

评论

0/150

提交评论