第七章 程序设计基础.docx

上传人:b****5 文档编号:4355569 上传时间:2022-11-30 格式:DOCX 页数:22 大小:52.74KB
下载 相关 举报
第七章 程序设计基础.docx_第1页
第1页 / 共22页
第七章 程序设计基础.docx_第2页
第2页 / 共22页
第七章 程序设计基础.docx_第3页
第3页 / 共22页
第七章 程序设计基础.docx_第4页
第4页 / 共22页
第七章 程序设计基础.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

第七章 程序设计基础.docx

《第七章 程序设计基础.docx》由会员分享,可在线阅读,更多相关《第七章 程序设计基础.docx(22页珍藏版)》请在冰豆网上搜索。

第七章 程序设计基础.docx

第七章程序设计基础

任务六学用VisualFoxPro的编程功能

【学习目标】

通过本章学习,应熟练掌握程序的建立、修改和运行方法;掌握基本的输入和输出命令,掌握程序的三种基本结构;理解和掌握主程序、子程序和过程的概念和编写;理解和掌握内存变量作用域的定义命令。

【重点难点】

重点:

程序的三种基本结构;多模块结构

难点:

循环结构的使用;多模块结构中参数传递的两种方式;变量作用域

本章主要介绍程序设计及其相关的一些内容,包括程序设计时使用的程序控制语句、程序的基本结构、程序设计调试等方面的内容。

该章是开发基于VFP应用系统的基础,掌握学习时,要充分上机操作练习。

第十一讲程序与程序的基本结构

子任务一学习程序的概念

程序是能够完成一定任务的命令的有序集合。

采用程序方式有如下好处:

●可以利用编辑器,方便地输入、修改和保存程序。

●可以用多种方式、多次运行程序。

●可以在一个程序中调用另一个程序。

例2.1假定学号的前两位为入学年份(如01代表2001年),第3、4位为专业代码。

编写命令文件test1.prg,分别统计所有学生和2001年入学,专业代码为03的学生选修课程号为101课程的平均成绩。

编写其程序如下:

settalkoff

clear

opendatabasexsxk

use选课in0

selectavg(成绩)from选课where课程号=="101"intoarraym1

selectavg(成绩)from选课where课程号=="101"and;

left(学号,2)=='01'andsubstr(学号,3,2)=="03"intoarraym2

?

"所有学生的平均分:

",m1(1,1)

?

"指定学生的平均分:

",m2(1,1)

use选课

closedatabase

settalkon

return

子任务二建立与执行程序文件

1.程序文件的建立

程序文件的建立需要调用系统内置的文本编辑器来进行。

有三种方法:

⑴用“新建”对话框建立:

程序文件的默认扩展名是.prg。

⑵用命令modifycommand[文件名]来建立

⑶用“项目管理器”来建立

2.执行程序文件

⑴打开程序文件后使用菜单命令或单击工具栏上的运行按钮。

⑵用命令运行:

do文件名

⑶使用“项目管理器”运行

在执行程序的过程中,执行以下命令之一可中止程序的运行:

①cancel;②do命令;③return;④quit

当用DO命令执行程序文件时,如果没有指定扩展名,系统将按下列顺序寻找该程序文件的源代码或某种目标代码文件执行:

exe->app->fxp->prg。

故如果要运行指定文件时扩展名不能省略。

子任务三学用简单的输入输出命令

1.input命令

格式:

input[提示信息]to内存变量名

功能:

等待从键盘输入表达式赋值给变量。

说明:

该命令可以输入任意类型的数据。

在输入字符串时须加定界符,输入逻辑型常量时要用圆点定界,输入日期及日期时间型数据时要作大括号。

不允许不输入任何内容直接按回车键。

例2.2编写命令文件test2.prg,查找指定日期以后出生的学生。

CLEAR

OPENDATABASEXSXK

USE学生

INPUT"请输入日期:

"TOMRQ

SELECT学号,姓名,出生日期FROM学生WHERE出生日期>MRQ

CLOSEDATABASE

2.accept命令

格式:

accept[提示信息]to内存变量名

功能:

等待从键盘输入字符串赋值给变量。

说明:

该命令只接受字符串,用户在输入字符串时不需要加定界符。

如果不输入任何内容直接按回车,系统会把空串赋给指定的内存变量。

例2.3检索通过键盘输入的学生的各门课程的成绩。

OPENDATABASEXSXK

CLEAR

accept"请输入姓名:

"TOxm

SELECT学生.学号,姓名,课程名,成绩FROM学生,选课,课程;

WHERE学生.学号=选课.学号and课程.课程号=选课.课程号and姓名=xm

CLOSEDATABASE

3.wait

格式:

wait[提示信息][to内存变量名][window[at行,列]]

[nowait][clear|noclear][timeout秒数]

例2.4wait命令使用示例。

wait"输入无效,请重新输入…"windowstimeout5

程序结构:

是指程序中命令或语句执行的流程结构。

有三种基本结构:

顺序结构、选择结构、循环结构。

子任务四学用选择结构

有条件语句和分支语句两种。

1.条件语句

格式:

if条件

语句序列1

[else

语句序列2]

endif

功能:

说明:

⑴if和endif必须成对出现。

⑵if语句可以嵌套。

例2.5某地至北京的邮路里程为1043km,通过邮政局向北京城区寄交“特快专递”邮件,应在24小时到达,计费标准每克为0.05元,但超过100克后,超出数每克为0.02 元,试编写程序test4.prg计算邮费。

方法一:

INPUT"请输入邮件重量:

"TOW

IFW<=100

F=W*0.05

ELSE

F=100*0.05+(W-100)*0.02

ENDIF

?

"邮费为:

",F

方法二:

INPUT"请输入邮件重量:

"TOW

F=W*0.05

IFW>100

F=100*0.05+(W-100)*0.02

ENDIF

?

"邮费为:

",F

例2.6编写命令文件test5.prg,请用户输入待查学生的姓名,显示该学生的基本情况。

CLEAR

OPENDATABASEXSXK

ACCEPT"请输入待查学生姓名:

"TONAME

LOCATEFOR姓名=NAME

IF.NOT.EOF()

?

"姓名:

"+姓名

?

"性别:

"+IIF(性别,"男","女")

?

"出生日期:

"+DTOC(出生日期,1)

ELSE

?

"查无此人!

"

ENDIF

CLOSEDATABASE

2.分支语句

格式:

docase

case条件1

语句序列1

case条件2

语句序列2

……

case条件n

语句序列n

[otherwise

语句序列n+1]

endcase

功能:

依次判断CASE后的条件是否成立,当发现某个CASE后面的条件成立时,就执行该CASE和下一个CASE之间的命令序列,然后执行ENDCASE后面的命令。

如果所的有条件都不成立,则执行OTHERWISE与ENDCASE之间的命令序列,然后转向ENDCASE后面的语句。

说明:

不管有几个CASE条件成立,只有最先成立的那个CASE条件对应的命令序列被执行;如果所有的CASE条件都不成立,且没有OTHERWISE子句,则直接跳出本结构;DOCASE和ENDCASE必须成对出现。

例2.6将学生成绩分为“不及格”、“及格”、“良好”和“优秀”等次。

clear

input"输入学生成绩:

"toscore

docase

casescore>=0andscore<60

?

"不及格"

casescore>=60andscore<70

?

"及格"

casescore>=70andscore<85

?

"良好"

casescore>=85andscore<=100

?

"优秀"

otherwise

?

"不合法的数据!

"

endcase

子任务五学用循环结构

循环结构也称重复结构,是指程序在执行过程中,其中的某段代码被重复执行若干次。

被重复执行的代码段,通常称之为循环体。

VFP支持循环结构的语句有三种:

●dowhile–enddo

●for-endfor语句

●scan-endscan

1.dowhile-enddo语句

格式:

dowhile<条件>

<语句序列1>

enddo

功能:

执行该语句时,首先判断DOWHILE处的循环条件是否成立,如果条件成立,则执行DOWHILE和ENDDO之间的命令序列。

当执行到ENDDO时,返回到DOWHILE,再次判断循环条件是否成立,以确定是否再次执行循环体。

若条件为假,则结束该循环语句,执行ENDDO后面的语句。

循环语句执行过程如上图所示。

说明:

●如果第一次判断条件即为假,则循环体一次都不执行。

●如果循环体中包含LOOP命令,则遇到LOOP时,就结束循环体的本次执行,不再执行其后的语句,而是转回到DOWHILE重新判断条件。

●如果循环体中包含EXIT命令,则遇到EXIT时,就结束该语句的执行,转去执行ENDDO后面的语句。

●通常LOOP和EXIT出现在循环体内嵌套的选择语句中,根据条件决定是LOOP回去,还是EXIT出去。

例2.7编写程序,计算S=1+2+…+100。

S=0

I=1

DOWHILEI<=100

S=S+I

I=I+1

ENDDO

?

"S=",S

例2.8求前100个自然数中的偶数和。

s=0

i=1

dowhilei<=100

ifmod(I,2)=0

s=s+i

i=i+1

else

i=i+1

loop

endif

enddo

?

"前100个自然数中的偶数和为:

",s

return

2.for-endfor语句

格式:

for循环变量=初值to终值[step步长]

循环体

endfor|next

功能:

执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否大于(步长大于0时)或小于(步长小于0时)循环变量终值,若结果为真,则退出循环;否则,执行循环后,循环变量自动按步长增加或减少。

说明:

该语句用循环计数器<循环变量>来控制循环体的执行次数。

常用于实现循环次数已知情况下的结构。

例2.9编写程序test9.prg,找出100~999之间的所有“水仙花数”。

所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(153=13+53+33)

CLEAR

FORI=100TO999

A=INT(I/100)

B=INT((I-A*100)/10)

C=I-A*100-B*10

IFI=A^3+B^3+C^3

?

I

ENDIF

ENDFOR

RETURN

3.scan-endscan语句

格式:

scan[范围][for条件]

循环体

endscan

功能:

执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。

说明:

⑴范围的默认值是all。

⑵exit和loop命令同样可以出现在该循环语句的循环体内。

例2.10统计专业代码(学号的第3、4位)为03的男、女生人数。

OPENDATABASEXSXK

USE学生

STORE0TOM,W

SCANFORSUBS(学号,3,2)="03"

IF性别=.T.

M=M+1

ELSE

W=W+1

ENDIF

ENDSCAN

CLEAR

?

"男生人数:

",M

?

"女生人数:

",W

CLOSEDATABASE

编程举例

例2.11计算T=1!

+2!

+…+10!

clear

t=0

p=1

fori=1to10

p=p*i

t=t+p

endfor

?

't=',t

例2.12编制一个查询学生情况的程序。

要根据给定的学号找出并显示该学生的姓名及各门功课的成绩。

opendatabasexsxk

dowhile.t.

clear

accept"请输入学号:

"tomxh

select学生.学号,姓名,课程名,成绩from学生,选课,课程;

where学生.学号=选课.学号and课程.课程号=选课.课程号;

and学生.学号=mxh

wait'继续查询?

(y/n)'top

ifupper(p)<>'Y'

use

exit

endif

enddo

closedatabase

第十二讲多模块程序

子任务一认识模块及其定义和调用

模块可以是程序文件(命令文件),也可以是过程。

过程的建立仍使用MODIFYCOMMAND命令,文件的默认扩展名是PRG。

过程定义的语法格式如下:

PROCEDURE|FUNCTION<过程名>

<命令序列>

[RETURN[<表达式>]]

[ENDPROC|ENDFUNC]

PROCEDURE|FUNCTION命令表示一个过程的开始,并命名过程名.过程名必须以字母或下划线开头,可以包含字母、数字和下划线。

ENDPROC|ENDFUNC命令表示一个过程的结束,如果缺省,过程结束于下一条PROCEDURE|FUNCTION命令或文件结尾处。

当过程执行到RETURN命令时,控制将转回到调用程序(或命令窗口)并返回表达式的值。

如果缺省RETURN命令,则在过程结束处自动执行一条隐含的RETURN命令。

若RETURN语句不带<表达式>,则回逻辑真.T.。

过程可以包含在程序文件中放在程序文件代码的后面,也可以放在称为过程文件的单独文件里。

过程文件里只包含过程,这些过程能被任何其它程序所调用。

但在调用过程文件中的过程之前首先要打开过程文件。

打开过程文件的命令格式为:

SETPROCEDURETO[<过程文件1>[,<过程文件2>,…]][ADDITIVE]

可以打开一个或多个过程文件.一旦一个过程文件被打开,那么该过程文件中的所有过程都可以被调用.如果选用ADDITIVE,那么在打开过程文件时,并不关闭原先打开的过程文件。

当使用不带任何文件名的SETPROCEDURETO命令,将关闭所有打开的过程文件。

如果不想一并关闭所有过程文件,而要关闭个别过程文件,可以用下面命令:

RELEASEPROCEDURE〈过程文件1〉[,〈过程文件2〉,…]

存放在命令文件里的过程主要被命令文件中的代码所调用,但也可以被其它程序所调用.当命令文件处于执行状态时,包含在其中的过程就可以被直接调用,如果命令文件不处于打开状态,那么要调用其中的过程,就要用SETPROCEDURE命令先打开此命令文件。

这与打开过程文件的道理是一样的。

总而言之,模块是指过程和命令文件里的代码。

而过程的调用需要它所在的文件处于打开状态。

模块调用的格式有两种:

格式1:

DO<文件名>|<过程名>

格式2:

<文件名>|<过程名>()

在上面两种格式里,如果模块是程序文件的代码,用〈文件名〉;否则用<过程名>。

格式2既可以作为命令使用(反回值被忽略),也可作为函数出现在表达式里。

这里的文件名不包括扩展名。

例2.13模块定义和调用的程序示例。

Clear

a=0

dop1&&调用过程P1

dop2&&调用过程P2

dop3&&调用过程P3

?

'a=',a

procp1&&过程P1

a=a+1

procp2&&过程P2

a=a*a

procp3&&过程P3

dop1

a=a*a+1

return

运行结果是:

a=5

子任务二使用参数传递来编程

模块程序可以接收调用程序传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理,从而提高模块程序功能设计的灵活性。

1.接受参数的命令

接收参数的命有如下两种格式:

格式1:

PARAMETERS〈形参变量1〉[,〈形参变量2〉,…]

格式2:

LPARAMETERS<形参变量1>[,<形参变量2>,…]

功能:

PARAMETERS命令声明的形参变量被看作是模块程序中建立的私有变量,LPARAMETERS命令声明的形参变量被看作是模块程序中建立的局部变量。

说明:

不管是PARAMETERS命令还是LPARAMETERS命令,都应是模块程序的第一条可执行命令。

2.调用模块程序的命令

格式1:

DO〈文件名〉|〈过程名〉WITH〈实参1〉[,〈实参2〉,…]

格式2:

〈文件名〉|〈过程名〉(〈实参1〉[,〈实参2〉,…])

功能:

实参可以是常量、变量,也可以是一般形式的表达式。

调用模块程序时,系统会自动把实参传递给对应的形参变量。

说明:

形参的数目不能少于实参的数目,否则系统会产生运行时错误;如果形参的数目多于实参的数目,那么多余的形参取初值逻辑假(.f.)。

3.参数传递方式

●按值传递:

单向传递

采用格式1调用模块程序时,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值给相应的形参变量。

这种情形称为按值传递。

●按引用传递,也称地址传递

如果实参是变量,那么传递的将不是变量的值,而是变量的地址。

这时形参和实参实际上是同一个变量(尽管它们的名字可能不同),在模块程序中对形参变量的改变,同样是对实参的改变。

这种情形称为按引用传递。

●设置参数传递方式的命令

采用格式2调用模块程序时,默认情况是按值传递参数。

如果实参是变量可以通过调用命令SETUDFPARMS命令重新设置参数传递的方式。

该命令的格式如下:

SETUDFPARAMSTOVALUE|REFERENCE

TOVALUE:

按值传递。

形参变量值的改变不会影响实参变量的取值。

TOREFERENCE:

按引用传递。

形参变量值改变时,实参变量也随之改变。

例2.14按值传递和按引用传递示例。

CLEAR

STORE100TOX1,X2

SETUDFPARMSTOVALUE&&设置按值传递

DOP4WITHX1,(X2)&&x1按引用传递,(x2)按值传递

?

"第一次:

",X1,X2

STORE100TOX1,X2

P4(X1,(X2))&&x1、(x2)都按值传递

?

"第二次:

",X1,X2

SETUDFPARMSTOREFERENCE&&设置按引用传递

DOP4WITHX1,(X2)&&x1按引用传递,(x2)按值传递

?

"第三次:

",X1,X2

STORE100TOX1,X2

P4(X1,(X2))&&x1按引用传递,(x2)按值传递

?

"第四次:

",X1,X2

PROCEDUREP4&&过程P4

PARAMETERSX1,X2

STOREX1+1TOX1

STOREX2+2TOX2

ENDPROC

运行结果为:

第一次:

101100

第二次:

100100

第三次:

101100

第四次:

101100

(x2)用一对圆括号将一个变量括起来使其变成一般形式的表达式,所以不管什么情况,总是按值传递。

从运行结果看,用格式1调用模块程序时的参数传递方式并不受UDFPARRMS值的设置影响。

子任务三理解变量的作用域

变量的作用域是指变量在什么范围内是有效的或能够被访问的。

在VFP里,若以变量的作用域来分,内存变量可分为公共变量、私有变量和局部变量三类。

1.公共变量

在任何模块中都可使用的变量称为公共变量。

公共变量要先建立后使用,公共变量可用PUBLIC命令建立:

PUBLIC<内存变量表>

该命令的功能是建立公共的内存变量,并为它们赋初值逻辑假。

例如,命令PUBLICX,Y,S(10)建立了三个公共内存变量:

简单内存变量X和Y以及一个含水量10个元素的数组S,它们的初值都是.F.。

公共变量一旦建立就一直有效,即使程序运行结束返回到命令窗口也不会消失。

只有当执行CLEARMEMORY、RELEASE、QUIT等后,公共内存变量才被释放。

在命令窗口中直接使用而由系统自动隐含建立的变量也是公共变量。

2.私有变量

在程序中使用(没有通过PUBLIC和LOCAL命令事先声明)而由系统自动隐含建立的变量都是私有变量。

私有变量的作用域是建立它的模块及其下属各层模块。

一旦建立它的模块程序运行结束,这些私有变量将自动清除。

3.局部变量

局部变量只能在建立它的模块中使用,不能在上层或下层模块中使用。

当建立它的模块程序运行结束时,局部变量自动释放。

局部变量用LOCAL命令建立:

LOCAL<内存变量表>

该命令建立指定的局部变量,并为它们赋初值逻辑假.F.。

由于LOCAL与LOCATE前四个字母相同,所以这条命令的命令动词不能缩写。

局部变量先建立后使用。

例2.15公共变量、私有变量、局部变量及其作用域示例。

PUBLICX1

LOCALX2

STORE"F"TOX3

DOP6

?

"主程序中..."

?

"X1=",X1

?

"X2=",X2

?

"X3=",X3

RETURN

*过程P6

PROCEDUREP6

?

"子程序中…"

?

"X1=",X1

?

"X3=",X3

RETURN

开发应用程序时,主程序与子程序不一定由同一个人开发,这样就可能出现以下情形:

子程序中变量可能已经在主程序中建立(即与主程序中的变量同名),子程序的运行可能会更改主程序中变量的值。

为解决这一问题,可以在子程序中使用PRIVATE命令隐藏主程序中的同名变量,使得这些变量在子程序中暂时无效。

PRIVATE命令的语法格式为:

PRIVATE<内存变量表>

PRIVATEALL[LIKE<通配符>|EXCEPT<通配符>]

该命令的功能是:

隐藏上层模块中的同名变量,使得这些变量在当前模块中暂时无效。

这样,这些变量名就可以用来命名在当前模块或其下属模块中的私有变量或局部变量,并且不会改变上层模块中的同名变量的取值。

一旦当前模块程序运行结束返回上层模块时,那些被隐藏的内存变量就自动恢复有效性,并保持原有的取值。

例2.16变量的隐藏示例。

SETTALKOFF

VAL1=10

VAL2=15

DOP7

?

VAL1,VAL2

*过程P7

PROCEDUREP7

PRIVATEVAL1

VAL1=50

VAL2=100

?

VAL1,VAL2

RETURN

运行结果为:

50100

10100

实际上,LOCAL命令在建立局部变量时,也具有隐藏在上层模块中建立的同名变量的作用。

但与PRIVATE不同,LOCAL命令只能在它所在的模块内隐藏些同名变量,一旦到了下层模块,这些同名变量就会重新出现。

例2.17LOCAL和PRIVATE命令的比较示例。

PUBLICX,Y

X=10

Y=100

DOP8

?

X,Y

*过程P8

PROCEDUREP8

PRIVATEX

X=50

LOCALY

DOP9

?

X,Y

*过程P9

PROCEDUREP9

X="AAA"

Y="BBB"

RETURN

运行结果为:

AAA.F.

10BBB

实训二程序设计

一、实训目的

1.掌握程序中常用的输入输出语句的使用;

2.学会程序文件的创建、修改与运行;

3.理解程序的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1