Download presentation
Presentation is loading. Please wait.
1
第七章 程序设计基础 信息工程系 李希敏
2
本章的主要内容 程序的建立、修改和执行方法;基本输入/输出命令 程序的三种基本的控制结构 主程序、子程序、过程和自定义函数的概念和编写
理解和掌握内存变量作用域的定义命令 对简单的应用系统的总体设计和应用程序编写
3
重点 难点 程序的三种基本结构 多模块结构 顺序结构、选择结构和循环结构 模块的定义和调用、参数传递和变量的作用域
循环结构的使用、多模块结构中参数传递的两种方式、变量作用域
4
7.1 程序与程序文件 程序与程序文件的概念 程序文件的建立和执行 简单的输入输出命令
5
7.1.1 程序与程序文件 程序 程序文件 程序是能够完成一定任务的命令的有序集合。
程序与程序文件 程序 程序是能够完成一定任务的命令的有序集合。 程序文件 程序文件(或命令文件)以文本文件的形式存在,扩展名为.prg。
6
7.1.2 程序文件的建立和执行 一、程序文件的建立 通过“文件”菜单中的“新建”命令建立
程序文件的建立和执行 一、程序文件的建立 通过“文件”菜单中的“新建”命令建立 通过命令方式建立:modi comm <命令文件名> 二、程序文件的运行 格式:Do 应用程序名.prg 注意: 执行程序文件时最好能加上扩展名,因为如果没有指定扩展名,系统将按下列程序执行:.exe(可执行文件)→.app(应用程序文件)→.fxp(编译文件)→.prg(命令文件)
7
7.1.3 简单的输入输出命令 一、输入命令 二、无格式输出命令 INPUT 命令 可以输入各种类型的表达式 ACCEPT命令 WAIT命令
简单的输入输出命令 一、输入命令 INPUT 命令 可以输入各种类型的表达式 N C(必须加定界符) L(加.定界,如.t.,.f.) D(采用严格的日期格式输入,如{^05/17/2005}) ACCEPT命令 将输入的内容自动加上定界符,故输入字符型数据常用 WAIT命令 只能输入单个字符 二、无格式输出命令 ?/?? <表达式列表> ?为换行输出,??不换行输出
8
INPUT命令应用示例 例1、求通过键盘输入的任一数值的绝对值并输出。 clear input "输入任一数值:" to x
if x<0 x=-x endif ?'X的绝对值是:',x return
9
ACCEPT命令应用示例 set talk off clear accept "请输入任一字符串:" to x y=upper(x)
例2、将小写字母转换成大写字母的命令文件aaa.prg。 set talk off clear accept "请输入任一字符串:" to x y=upper(x) ?"转换的结果是:",y set talk on return
10
7.2 程序的基本结构 有三种基本的控制结构 顺序结构 选择结构 循环结构
11
7.2.1 顺序结构 例3、编程输出每个仓库的平均工资(pjgz.prg) clear open database 订货管理
顺序结构 例3、编程输出每个仓库的平均工资(pjgz.prg) clear open database 订货管理 select 仓库号,avg(工资) as 平均工资 from 职工; group by 仓库号 into table pjgz use pjgz browse close all return
12
7.2.2 选择结构 分为条件语句和分支语句 条件语句 分支语句 If…endif 结构 If…else…endif 结构
选择结构 分为条件语句和分支语句 条件语句 If…endif 结构 If…else…endif 结构 分支语句 Do case…endcase 结构
13
选择结构举例 例1、求任一个数的绝对值并输出。 clear input "请输入任一个数值:" to x if x<0 x=-x
endif ?"该数的绝对值是:",x return
14
例2、利用海伦公式求三角形的面积。 clear input 'a=' to a input 'b=' to b
input 'c=' to c if a+b>c and b+c>a and a+c>b s=(a+b+c)/2 area=sqrt(s*(s-a)*(s-b)*(s-c)) ?'面积为:',area else ?‘该三角形不存在!' endif return
15
分支结构示例 例3、将学生成绩分为 “不及格”、“及格”、“良好”和“优秀”等次。 clear
input "输入学生成绩:" to score do case case score>=0 and score<60 ?"不及格" case score>=60 and score<70 ?"及格" case score>=70 and score<85 ?"良好" case score>=85 and score<=100 ?"优秀" otherwise ?"不合法的数据!" endcase
16
7.2.3 循环结构 也称“重复处理”结构,当满足某个指定条件时,反复执行某段程序代码。被重复执行的程序段通常称之为“循环体”
循环结构 也称“重复处理”结构,当满足某个指定条件时,反复执行某段程序代码。被重复执行的程序段通常称之为“循环体” VFP支持三种格式的循环控制语句: do while … enddo(当型循环) for … endfor(“计数型”循环) scan … endscan(“扫描型”或“指针型”循环)
17
一、Do while …enddo循环 该循环的语句格式及执行过程如下: Do while <条件> <语句序列1>
[loop] <语句序列2> [exit] <语句序列3> enddo 假 条件 循环体 真 ENDDO后面的语句 LOOP EXIT
18
循环结构示例 例1、求前100个自然数中的偶数和。 方法一(使用DO循环) : Clear s=0 i=2
do while i<=100 s=s+i i=i+2 enddo ?“前100个自然数中的偶数和为:",s return
19
循环的嵌套示例 例2:输出九九乘法口诀表。 clear i=1 do while i<10 j=1 do while j<=i
s=i*j ??str(j,1)+'*'+str(i,1)+'='+str(s,2)+' ' j=j+1 enddo i=i+1 ? Enddo return
20
二、For…endfor(计数式循环) 该语句用循环计数器<循环变量>来控制循环体的执行次数。常用于实现循环次数已知情况下的结构
执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否大于(步长大于0时)或小于(步长小于0时)循环变量终值,若结果为真,则退出循环;否则,执行循环后,循环变量自动按步长增加或减少,如下图所示。 N Y 循环变量>=变量终值 (步长大于0时) 循环变量=循环变量初值 执行循环体后,循环变量自动按步长增加 Endfor的后继语句 N Y 循环变量<=变量终值 (步长小于0时) 循环变量=循环变量初值 执行循环体后,循环变量自动按步长减少 Endfor的后继语句
21
FOR循环示例 例3、求前100个自然数中的偶数和。 clear s=0 for I=2 to 100 step 2 s=s+i
endfor ?“前100个自然数中的偶数和是:",s return
22
三、Scan … endscan(扫描型循环)
例4、统计职工表中工资大于1230元的职工人数。 clear use 职工 n=0 scan for 工资>1230 n=n+1 endscan ?‘工资大于1230的职工人数:’,n use return
23
使用循环语句时应注意 do while和enddo、for和endfor、scan和endscan必须配对使用。
循环体可以是任何VFP命令或语句。 循环变量应是数值型的内存变量或数组。 exit和loop命令可以嵌入循环体内,改变循环次数,但不能单独使用。 exit命令的作用是跳出循环, loop命令的作用是转回循环的开始处,重新对条件进行判断。
24
7.3 多模块程序 一、模块的定义和调用 在VFP中,模块可以是命令文件,还可以是过程。
命令文件的定义:modify command <命令文件名> 过程是以过程说明语句开始,以返回命令结束的独立程序段,使用时用户通过过程名调用并执行。 一个过程文件中可以包含多个过程,调用一个过程文件后,就可以调用执行其中的每个过程,这样就减少了打开文件的个数。 使用过程文件必须遵循“打开—调用—关闭”的步骤。 与过程有关的操作语句有如下几种:
25
与过程有关的操作语句: 过程说明语句 打开过程文件语句 过程调用语句 过程返回语句 关闭过程文件语句
Procedure <过程名> <命令行序列> Endproc 打开过程文件语句 Set procedure to [<过程文件名>] 过程调用语句 Do <过程文件名> 或者 <过程名>() 过程返回语句 Return [to master|to <过程名>] 关闭过程文件语句 Close procedure
26
例1:在主程序main.prg中调用过程文件sub.prg。
方法1: (不带参数的调用) *主程序main.prg set proc to sub a=0 do p1 do p2 do p3 ?'a=',a close proc
27
过程文件sub.prg proc p1 a=a+1 return proc p2 a=a*a proc p3 do p1 a=a*a+1
28
方法2:也可以写成一个文件的形式 Clear a=0 do p1 do p2 do p3 ?'a=',a proc p1 a=a+1
a=a*a proc p3 a=a*a+1 return
29
二、带参数的过程调用示例1 clear for m=3 to 100 if ssh(m) ??m endif endfor
procedure ssh para x for k=2 to x-1 if mod(x,k)=0 return .f. return .t.
30
示例2: clear x=10 m=2 n=3 do ss with m,n proc ss para a,b,c,d x=10+a
?x,a,b,c,d return
31
示例3(方法1) s=0 for i=1 to 5 s=s+jc(i) endfor ?s proc jc para x p=1
for j=1 to x p=p*j return p
32
方法2 clear s=0 for i=1 to 5 do jc with i s=s+p endfor ?s proc jc para x
public p p=1 for j=1 to x p=p*j 方法2
33
三、变量的作用域 在VFP中,以变量的作用域来分,可将内存变量分为公共变量、私有变量和局部变量。 公共变量:必须先定义后使用。
Public <内存变量表> 局部变量:必须先定义后使用。 Local <内存变量表> 私有变量 没有用上面两个命令事先声明并在程序中直接使用的变量。 Private命令的使用 在使用该命令可以屏蔽上级程序中存在的同名变量。
34
请注意: 公共变量在所有的模块中起作用,一旦定义就一直有效,除非执行了清除内存变量的操作或者退出了VFP。
私有变量在建立它的模块及其下属模块中有效,直到该模块程序运行结束,则自动清除。 局部变量只能在建立它的模块中有效,不能在上层或下层模块中使用。
35
变量作用域示例1 clear public x1 x1=3 local x2 x2=date() x3='abcd' Do p1
?x1,x2,x3 Return Proc p1 ?x1,x3
36
示例2: clear all x='visual foxpro' y='二级' do p1 ?y+x set talk on Proc p1
local x x='visual foxpro dbms考试' y='计算机等级'+y return
37
Private命令使用示例 X=10 Y=20 Do p2 ?x,y Procedure p2 Private x X=50 Y=100
Return 运行结果:
Similar presentations