第七章 程序设计基础Word文档格式.docx
《第七章 程序设计基础Word文档格式.docx》由会员分享,可在线阅读,更多相关《第七章 程序设计基础Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
⑴用“新建”对话框建立:
程序文件的默认扩展名是.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检索通过键盘输入的学生的各门课程的成绩。
accept"
请输入姓名:
TOxm
SELECT学生.学号,姓名,课程名,成绩FROM学生,选课,课程;
WHERE学生.学号=选课.学号and课程.课程号=选课.课程号and姓名=xm
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计算邮费。
方法一:
请输入邮件重量:
TOW
IFW<
=100
F=W*0.05
ELSE
F=100*0.05+(W-100)*0.02
ENDIF
邮费为:
F
方法二:
F=W*0.05
IFW>
100
例2.6编写命令文件test5.prg,请用户输入待查学生的姓名,显示该学生的基本情况。
ACCEPT"
请输入待查学生姓名:
TONAME
LOCATEFOR姓名=NAME
IF.NOT.EOF()
?
姓名:
+姓名
性别:
+IIF(性别,"
男"
"
女"
)
出生日期:
+DTOC(出生日期,1)
查无此人!
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
不及格"
=60andscore<
70
及格"
=70andscore<
85
良好"
=85andscore<
优秀"
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<
S=S+I
I=I+1
ENDDO
S="
S
例2.8求前100个自然数中的偶数和。
s=0
i=1
dowhilei<
ifmod(I,2)=0
s=s+i
i=i+1
else
loop
endif
enddo
前100个自然数中的偶数和为:
s
2.for-endfor语句
for循环变量=初值to终值[step步长]
循环体
endfor|next
执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否大于(步长大于0时)或小于(步长小于0时)循环变量终值,若结果为真,则退出循环;
否则,执行循环后,循环变量自动按步长增加或减少。
该语句用循环计数器<
循环变量>
来控制循环体的执行次数。
常用于实现循环次数已知情况下的结构。
例2.9编写程序test9.prg,找出100~999之间的所有“水仙花数”。
所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身(153=13+53+33)
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的男、女生人数。
STORE0TOM,W
SCANFORSUBS(学号,3,2)="
IF性别=.T.
M=M+1
ELSE
W=W+1
ENDSCAN
男生人数:
M
女生人数:
W
编程举例
例2.11计算T=1!
+2!
+…+10!
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
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
运行结果是:
a=5
子任务二使用参数传递来编程
模块程序可以接收调用程序传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理,从而提高模块程序功能设计的灵活性。
1.接受参数的命令
接收参数的命有如下两种格式:
PARAMETERS〈形参变量1〉[,〈形参变量2〉,…]
LPARAMETERS<
形参变量1>
形参变量2>
,…]
PARAMETERS命令声明的形参变量被看作是模块程序中建立的私有变量,LPARAMETERS命令声明的形参变量被看作是模块程序中建立的局部变量。
不管是PARAMETERS命令还是LPARAMETERS命令,都应是模块程序的第一条可执行命令。
2.调用模块程序的命令
DO〈文件名〉|〈过程名〉WITH〈实参1〉[,〈实参2〉,…]
〈文件名〉|〈过程名〉(〈实参1〉[,〈实参2〉,…])
实参可以是常量、变量,也可以是一般形式的表达式。
调用模块程序时,系统会自动把实参传递给对应的形参变量。
形参的数目不能少于实参的数目,否则系统会产生运行时错误;
如果形参的数目多于实参的数目,那么多余的形参取初值逻辑假(.f.)。
3.参数传递方式
●按值传递:
单向传递
采用格式1调用模块程序时,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值给相应的形参变量。
这种情形称为按值传递。
●按引用传递,也称地址传递
如果实参是变量,那么传递的将不是变量的值,而是变量的地址。
这时形参和实参实际上是同一个变量(尽管它们的名字可能不同),在模块程序中对形参变量的改变,同样是对实参的改变。
这种情形称为按引用传递。
●设置参数传递方式的命令
采用格式2调用模块程序时,默认情况是按值传递参数。
如果实参是变量可以通过调用命令SETUDFPARMS命令重新设置参数传递的方式。
该命令的格式如下:
SETUDFPARAMSTOVALUE|REFERENCE
TOVALUE:
按值传递。
形参变量值的改变不会影响实参变量的取值。
TOREFERENCE:
按引用传递。
形参变量值改变时,实参变量也随之改变。
例2.14按值传递和按引用传递示例。
STORE100TOX1,X2
SETUDFPARMSTOVALUE&
设置按值传递
DOP4WITHX1,(X2)&
x1按引用传递,(x2)按值传递
第一次:
X1,X2
P4(X1,(X2))&
x1、(x2)都按值传递
第二次:
SETUDFPARMSTOREFERENCE&
设置按引用传递
第三次:
P4(X1,(X2))&
第四次:
X1,X2
PROCEDUREP4&
过程P4
PARAMETERSX1,X2
STOREX1+1TOX1
STOREX2+2TOX2
ENDPROC
运行结果为:
第一次:
101100
第二次:
100100
第三次:
第四次:
(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
*过程P6
PROCEDUREP6
子程序中…"
开发应用程序时,主程序与子程序不一定由同一个人开发,这样就可能出现以下情形:
子程序中变量可能已经在主程序中建立(即与主程序中的变量同名),子程序的运行可能会更改主程序中变量的值。
为解决这一问题,可以在子程序中使用PRIVATE命令隐藏主程序中的同名变量,使得这些变量在子程序中暂时无效。
PRIVATE命令的语法格式为:
PRIVATE<
PRIVATEALL[LIKE<
通配符>
|EXCEPT<
]
该命令的功能是:
隐藏上层模块中的同名变量,使得这些变量在当前模块中暂时无效。
这样,这些变量名就可以用来命名在当前模块或其下属模块中的私有变量或局部变量,并且不会改变上层模块中的同名变量的取值。
一旦当前模块程序运行结束返回上层模块时,那些被隐藏的内存变量就自动恢复有效性,并保持原有的取值。
例2.16变量的隐藏示例。
SETTALKOFF
VAL1=10
VAL2=15
DOP7
VAL1,VAL2
*过程P7
PROCEDUREP7
PRIVATEVAL1
VAL1=50
VAL2=100
50100
10100
实际上,LOCAL命令在建立局部变量时,也具有隐藏在上层模块中建立的同名变量的作用。
但与PRIVATE不同,LOCAL命令只能在它所在的模块内隐藏些同名变量,一旦到了下层模块,这些同名变量就会重新出现。
例2.17LOCAL和PRIVATE命令的比较示例。
PUBLICX,Y
X=10
Y=100
DOP8
X,Y
*过程P8
PROCEDUREP8
PRIVATEX
X=50
LOCALY
DOP9
*过程P9
PROCEDUREP9
X="
AAA"
Y="
BBB"
AAA.F.
10BBB
实训二程序设计
一、实训目的
1.掌握程序中常用的输入输出语句的使用;
2.学会程序文件的创建、修改与运行;
3.理解程序的