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