第7章 程序设计入门.docx
《第7章 程序设计入门.docx》由会员分享,可在线阅读,更多相关《第7章 程序设计入门.docx(17页珍藏版)》请在冰豆网上搜索。
![第7章 程序设计入门.docx](https://file1.bdocx.com/fileroot1/2023-1/3/d03eba35-ca79-409f-9b2a-25b2b2dd659e/d03eba35-ca79-409f-9b2a-25b2b2dd659e1.gif)
第7章程序设计入门
第7章VisualFoxPro程序设计入门
要求:
熟记:
程序定义、程序文件的建立和执行、简单的输入输出命令。
理解:
两种选择结构(重点运用IF-ENDIF)、三种循环结构(重点运用DO-ENDDO)
模块定义和调用、变量的作用域、参数的传递
7.1程序与程序文件
7.1.1程序的概念
1、程序:
2、程序的特点:
(1)利用编辑器,方便地输入、修改和保存程序代码
(2)调用另一个程序(命令行不可以)
(3)多次运行程序
[7-1]求圆周长的程序。
*功能说明:
求圆周长
clear
settalkoff
input"请输入圆的半径:
"toR&&请用户输入半径到R
L=2*pi()*R
?
"半径为:
"+allt(str(R))+"的圆,其周长=",L
settalkon
*程序结束
7.1.2程序文件的建立、修改与执行
7.1.3简单输入输出命令
1、ACCEPT命令
2、INPUT命令
3、WAIT命令
Wait“*******”toxtimeout5
[7-1a]
*功能说明:
wait用法演示
clear
wait"请选择今日是否为周末(Y/N)?
:
"toYN&&用户输入y或者n
ifuppe(YN)="Y"
?
"今天休息!
"
else
?
"今天工作!
"
endi
*程序结束
7.2程序的基本结构
7.2.1顺序结构
[7-2]
*功能说明:
求圆面积
clear
settalkoff
input"请输入圆的半径:
"toR&&请用户输入半径到R
S=pi()*R^2
?
"半径为:
"+allt(str(R))+"的圆,其面积=",S
settalkon
*程序结束
7.2.2选择结构
[7-3]
*功能说明:
判断输入数字是奇数还是偶数
clear
input"请输入数据:
"toNumber&&用户输入被测数据
ifNumber%2=0&&判断是否被整除
?
allt(str(number))+"为偶数"
else
?
allt(str(number))+"为奇数"
endi
*程序结束
[7-4]
*显示当前季节
M=month(date())
docase
casem>=3andm<=6
season="春"
casem>=6andm<=8
season="夏"
casem>=9andm<=11
season="秋"
otherwise
season="冬"
endc
?
"当前季节是:
"+season
7.2.3循环结构
1、DOWHILE语句
[7-5]
*显示student表中s_lesson1成绩大于等于85的同学
usestudent
dowhilenoteof()
ifs_lesson1>=85
display
endi
skip
endd
[7-5a]
*显示student表中s_lesson1成绩大于等于85的同学的前两位同学
clea
n=0
usestudent
dowhilenoteof()
ifs_lesson1>=85
n=n+1
display
ifn=2
exit
endi
endi
skip
endd
[7-5b]
*显示student表中s_lesson1和s_lesson3都大于等于85的同学
clea
usestudent
dowhilenoteof()
ifs_lesson1>=85
ifs_lesson3<85&&如果s_lesson3小于85则下行一条记录并返回循环条件
skip
loop
endi
display
endi
skip
endd
2、FOR语句(已知循环次数)
[7-6]
**求1-100中的偶数和,演示for循环功能
sum=0
fori=2to100step2&&循环开始,步长为2
sum=sum+i
endf&&循环结束
?
sum
3、SCAN语句(用于处理表中记录)
[7-7]
*显示表中两科成绩均在85分以上的同学,演示scan功能
clea
usestudent
scanfors_lesson1>=85ands_lesson3>=85
display
wait""timeout2&&结果在屏幕停留2秒
ends
7.3多模块程序
在编制一个较复杂的程序时,可按适当的原则把一个逻辑复杂、语句数量偏大的程序分解成多个功能相关又相对独立的语句规模较小的程序段——模块。
实际中的应用程序一般均为多模块程序。
模块功能单一、结构相对独立。
在VFP中,模块有子程序、过程两种形式。
子程序:
过程:
两者区别。
7.3.1模块的定义和调用
1、子程序的应用举例
这里用主程序7-7a调用子程序7-7b解释子程序的用法。
[7-7a]
*利用子程序调用技术求A!
+B!
+C!
的值,!
表示阶乘
settalkoff
clea
store0tos,t
input"请在这里输入A:
"tox
do7-7b
s=s+t
input"请在这里输入B:
"tox
do7-7b
s=s+t
input"请在这里输入C:
"tox
do7-7b
s=s+t
?
"A!
+B!
+C!
的值=",s
settalkon
[7-7b]
*主程序7-7a.prg的子程序
t=1
fori=1tox
t=t*i
endf
return
2、过程的应用举例
*利用子程序调用技术求A!
+B!
+C!
的值,!
表示阶乘
settalkoff
clea
store0tos,t
input"请在这里输入A:
"tox
dopp
s=s+t
input"请在这里输入B:
"tox
dopp
s=s+t
input"请在这里输入C:
"tox
dopp
s=s+t
?
"A!
+B!
+C!
的值=",s
settalkon
*过程
procedurepp
t=1
fori=1tox
t=t*i
endf
return
3、过程文件的建立、打开、调用与返回、关闭举例
将多个过程放在一个文件里,这个文件就叫做过程文件。
[7-7e]
*主程序调用“过程文件”计算A!
+B!
+C!
的值
settalkoff
clea
store0tos,t
setprocedureto77d
input"请在这里输入A:
"tox
do77d1
s=s+t
input"请在这里输入B:
"tox
do77d1
s=s+t
input"请在这里输入C:
"tox
do77d1
s=s+t
?
"A!
+B!
+C!
的值=",s
do77d2
settalkon
过程文件77d
*过程文件定义
procedure77d1
t=1
fori=1tox
t=t*i
endf
endproc
procedure77d2
?
""
?
'过程定义演示之过程2'
endproc
7.3.2变量的作用域
作用域:
起作用的范围。
公共变量、私有变量和局部变量三种。
表7-1变量作用域对比
名称
公共变量
私有变量
局部变量
关键字
Public
Private
Local
作用域
所有模块
本模块及下属模块
本模块
释放
Cleamemo/rele/quit
模块程序运行结束
模块程序运行结束
定义
事先定义
直接使用
事先定义,赋初值.F.
1、公共变量
2、私有变量
[7-8]
settalkoff
x=10
y=15
dop1
?
x,y
procp1
privx,y
x=50
y=100
?
x,y
retu
结果:
50,100
10,15
3、局部变量
[7-9]
settalkoff
clea
a=5&&私有变量,在本模块和下属模块均有效,此时值为5
?
a
dop2
?
a&&显示a中新的赋值,字符串"林业大学"
retu
procp2
locala,b
b=100
dop3
?
a&&此时a是local定义的,显示.f.
?
b
procp3
a="林业大学"&&过程p3中的a继续沿用主程序的私有变量a,其值由原来的5换成字符串"林业大学"
retu
7.3.3参数传递
1、参数传递的概念
格式
功能
参数类型
数据类型
取值
主程序:
do***with<实参表>
调用指定过程,并将参数表中的数据传递给被调过程
实参
内存变量/常量/表达式
内存变量必须有初值
过程:
Proc***
para<形参表>
接收上级模块传送过来的数据
形参
内存变量
使用方法:
(1)带参数的过程调用按实参与形参在参数表中的排列位置一一对应关系传递数据,因此对应位置必须具有相同数据类型;
(2)当实参个数>形参个数,系统报错;
当实参个数<形参个数,多余形参赋值为.f.;
2、参数传递方式
带参数的过程调用分两种方式,按值传递和按引用传递。
按值传递,过程中参数变化后的值不传回主程序;按引用传递,则过程中参数变化后的值要传回主程序。
使用值传递的变量要用小括号括起来,而按引用传递则不用。
常量和表达式只能用值传递,而内存变量可以使用两种方式。
[7-9a]
*参数传递程序举例
settalkoff
clea
x=1
y=3&&此时x=1,y=3
doppwithx,(y)&&此时x=a=7,(y)=y=3
?
x,y
doppwithx,y&&此时x=a=7,y=b=8
?
x,y
retu
procpp
paraa,b,c&&形参3个,多于实参2个
a=7
b=8
c=9
retu
输出结果:
73
78
[7-10]
*变换两个变量的值,练习两种传递类型
settalkoff
clea
x=10
y=20
doppwithx,(y)&&格式1的传递方式,内存变量x为引用传递,其值在过程中变换为b=y=20
?
x,y&&y是值传递,所以其结果仍为原值。
输出结果=20,20
x=10
y=20
setUDFPtorefe&&设置格式2的传递方式
pp((x),y)&&x按值传递,y受语句setUDFPtorefe影响,按引用传递
?
x,y&&结果应为10,10
x=10
y=20
setUDFPtovalue&&设置格式2的传递方式
pp((x),y)&&受语句setUDFPtovalue影响,x,y按值传递
?
x,y&&结果应为10,20
retu
procpp
paraa,b
tt=a
a=b
b=tt
retu
7.4程序调试
为了演示运用调试器进行程序调试的过程,编写了程序7-11。
[7-11]
*计算表中两科成绩均在85分以上的成绩之和并屏显该同学信息,以演示程序调试器功能
clea
r=0&&定义一个局部内存变量r,存放满足循环条件的记录数
usestudent
scanfors_lesson1>=80ands_lesson3>=80
r=r+1&&记录数加1
sum=s_lesson1+s_lesson3&&对两个成绩加和,目的是观察”调试输出值“
debugoutsum&&在调试器中输出sum
display&&屏显满足条件的学生信息
ends
7.4.1调试器界面
打开调试器可用菜单方式(主菜单[工具][调试器]),也可用命令方式(在命令窗口键入debug)。
本例通过键入debug打开调试器界面,如图7-1中所示。
图中用五种颜色标出调试器的5个窗口以及在工具栏上对应的打开/关闭窗口按钮。
图7-1VFP6.0调试器界面
7.4.2调试器工作过程
1、打开要调试的文件。
通过主菜单或者工具栏按钮打开文件(本例为7-11.prg),见图7-2所示。
2、单击工具栏中的跟踪按钮开始进行跟踪调试,见图7-3。
3、单击跟踪按钮3次,当运行到usestudent语句时,在“局部窗口”出现了刚刚进行了赋值(r=0)的r的值,见图7-4。
4、再单击跟踪按钮4次,当运行到debugoutsum语句时,在“局部窗口”出现了两个内存变量的值,见图7-5。
其中sum是第一位满足条件学生的两科分数和。
注意此时调试输出窗口并没有任何显示。
5、再单击跟踪按钮1次,当运行到display语句时,在“调试输出”出现了上条语句debugoutsum的运行结果,如图7-6。
6、就这样,一步一步,最后调试完毕,其界面如图7-7所示。
图7-2打开要调试的文件7-11.prg
图7-3对程序7-11.prg开始跟踪调试。
图7-4局部窗口出现r值的状况
图7-5局部窗口出现两个内存变量的状况
图7-6调试输出根据程序中的debugout语句有了结果
图7-7程序调试结束时的界面