340 likes | 452 Views
任务六 学用 visualfoxpro 的编程功能. 内容提要: 程序和程序文件 程序的基本结构 多模块程序 程序调试 学习目的与要求: 了解程序的概念,多模块的概念 熟悉程序的基本结构,模块的调用、参数传递和变 量的作用域 掌握 条件语句、循环语句的使用及程序的分析方法 重点 : 掌握程序的结构及程序结构的使用 难点 : 程序的编写及参数传递. 任务六 学用 visualfoxpro 的编程功能. 程序概述及结构. 第一讲. 选择和循环结构. 第二讲. 多模块程序. stop. 第三讲. 程序设计. 实训二.
E N D
任务六 学用visualfoxpro的编程功能 • 内容提要: 程序和程序文件 程序的基本结构 多模块程序 程序调试 • 学习目的与要求: 了解程序的概念,多模块的概念 熟悉程序的基本结构,模块的调用、参数传递和变 量的作用域 掌握条件语句、循环语句的使用及程序的分析方法 • 重点:掌握程序的结构及程序结构的使用 • 难点:程序的编写及参数传递
任务六 学用visualfoxpro的编程功能 程序概述及结构 第一讲 选择和循环结构 第二讲 多模块程序 stop 第三讲 程序设计 实训二 多模块程序及参数传递 实训三
第一讲 程序概述及结构 • 授课内容: 程序的概念 程序文件的建立和执行 输入输出命令 程序的结构 • 学习目的: 了解程序的概念,程序文件的建立和执行 熟悉输入输出命令及程序的结构 掌握读程序的方法及编程方法 • 重点:程序的结构及读程序 • 难点:掌握编写程序的方法
6.1 程序概述 一、概念 • 程序 程序是能够完成一定任务的命令的有序集合。 • 程序文件 程序文件(或命令文件)以文本文件的形式存在,扩展名为.prg。 二、程序文件的建立 • 通过“文件”菜单中的“新建”命令建立 • 通过命令方式建立:modify comm <命令文件名> 三、程序文件的运行 格式:Do 应用程序名.prg 注意: 执行程序文件时最好能加上扩展名,因为如果没有指定扩展名,系统将按下列程序执行:.exe(可执行文件)→.app(应用程序文件)→.fxp(编译文件)→.prg(命令文件)
四、简单的输入输出命令 1、输入命令 INPUT [<字符表达式>] to <内存变量> 功能:显示<字符表达式>的值作为提示信息,暂停程序执行,等待用户从键盘输入一个任意合法的表达式,输入完成后,用户应按回车键,系统将该表达式的值存入指定的内存变量,程序继续执行 注:1) 若选择<字符表达式>,则系统会显示该表达式的值作为提示信息,在提示信息后出现光标等待用户输入一个表达式,否则只有光标提示 2)用户键入一个表达式后必须按回车键,否则该命令被反复执行 3)用户输入表达式必须加相应的定界符 ACCEPT命令 功能:等待用户输入字符型数据,若不键入字符串直接回车,则系统将空串赋给内存变量
WAIT [<字符表达式>] [ to <内存变量>] [windows [at <行,列>]][timeout<数值表达式>] 功能:显示<字符表达式>的值作为提示信息,暂停程序执行,等待用户从键盘输入单个字符或单击鼠标后继续程序的执行 注:1)若不指定字符表达式,则显示默认的提示信息“按任意键继续……” 2)若有可选项to <内存变量>,则<内存变量>用来保存用户键入的字符,其类型为字符型,否则输入的字符不保留。 3)若指定了windows子句,则在主窗口出现一个wait提示窗,用来显示提示信息,at <行,列>指定窗口在主窗口显示的位置,默认显示在主窗口右上角 4)timeout<数值表达式>设定等待时间单位是秒。。。
INPUT命令应用示例 例1、求通过键盘输入的任一数值的绝对值并输出。 clear input "输入任一数值:" to x if x<0 x=-x endif ?'X的绝对值是:',x return
ACCEPT命令应用示例 例2、将小写字母转换成大写字母的命令文件aaa.prg set talk off clear accept "请输入任一字符串:" to x y=upper(x) ?"转换的结果是:",y set talk on return
五、程序的基本结构 有三种基本的控制结构:顺序结构、选择结构、循环结构 1)顺序结构 例、编程输出每个仓库的平均工资(pjgz.prg) clear open database 订货管理 select 仓库号,avg(工资) as 平均工资 from 职工; group by 仓库号 into table pjgz use pjgz browse close all return 返回 结束
第二讲 选择结构和循环结构 • 授课内容: 选择结构及举例 循环结构及举例 • 学习目的: 熟悉选择、循环结构的语句格式及特点 掌握读程序的方法及选择、循环结构程序的编写方法 • 重点:掌握读程序的方法 • 难点:程序的编写
一、选择结构 1、若条件成立,则执行<语句序列>,然后执行endif的下一条语句,否则转向endif的下一条语句执行 2、If和endif必须成对出现 分为条件语句和分支语句 • 条件语句 (1) If <条件> <语句序列> endif (2) If <条件> <语句序列1> else <语句序列2> endif 1、若条件成立,则执行<语句序列1>,否则执行<语句序列2>然后执行endif的下一条语句 2、If和endif必须成对出现
选择结构举例 例1、求任一个数的绝对值并输出 clear input "请输入任一个数值:" to x if x<0 x=-x endif ?"该数的绝对值是:",x return
例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
1、系统自上而下逐个判断条件,遇到第一个case条件为真时则执行该子句中的语句序列然后执行endcase的下一条语句,若case子句条件均为假,看是否有otherwise子句,若有则执行语句序列n+1,否则执行endcase的下一条语句1、系统自上而下逐个判断条件,遇到第一个case条件为真时则执行该子句中的语句序列然后执行endcase的下一条语句,若case子句条件均为假,看是否有otherwise子句,若有则执行语句序列n+1,否则执行endcase的下一条语句 2、docase和endcase成对出现 • 分支结构 Do case case <条件1> <语句序列1> …… case <条件n> <语句序列n> [otherwise] <语句序列n+1>] endcase
分支结构 例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(“扫描型”或“指针型”循环)
假 条件 真 循环体 LOOP EXIT ENDDO后面的语句 1、Do while …enddo循环 该循环的语句格式及执行过程如下: Do while <条件> <语句序列1> [loop] <语句序列2> [exit] <语句序列3> enddo • loop命令的作用是转回循环的开始处,重新对条件进行判断。 exit命令的作用是跳出循环
循环结构示例 例1、求前100个自然数中的偶数和。(使用DO循环) 方法一: Clear s=0 i=2 do while i<=100 s=s+i i=i+2 enddo ?“前100个自然数中的偶数和为:",s return
方法二: s=0 i=1 do while i<=100 if mod(I,2)=0 s=s+i i=i+1 else i=i+1 loop endif 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时) N N Y Y 执行循环体后,循环变量自动按步长增加 执行循环体后,循环变量自动按步长减少 Endfor的后继语句 Endfor的后继语句 2、For…endfor(计数式循环) • 该语句用循环计数器<循环变量>来控制循环体的执行次数。常用于实现循环次数已知情况下的结构 • 执行时,首先将循环变量初值赋予循环变量,然后判断循环变量是否不大于(步长大于0时)或不小于(步长小于0)循环变量终值,若循环条件为真,则执行循环体,然后循环变量增加或减少一个步长值,并再次判断循环条件是否为真,以确定是否再次执行循环体,直到循环条件为假,则执行endfor后面的语句
FOR循环示例 例3、求前100个自然数中的偶数和。 clear s=0 for I=2 to 100 step 2 s=s+i endfor ?“前100个自然数中的偶数和是:",s return
3、Scan … endscan(扫描型循环) 例4、统计职工表中工资大于1230元的职工人数。 clear use 职工 n=0 scan for 工资>1230 n=n+1 endscan ?‘工资大于1230的职工人数:’,n use return
使用循环语句时应注意 • do while和enddo、for和endfor、scan和endscan必须配对使用。 • 循环体可以是任何VFP命令或语句。 • 循环变量应是数值型的内存变量或数组。 • exit和loop命令可以嵌入循环体内,改变循环次数,但不能单独使用。 exit命令的作用是跳出循环, loop命令的作用是转回循环的开始处,重新对条件进行判断。 返回 结束
第三讲 多模块程序 • 授课内容: 模块的定义和调用 参数传递 变量作用域 • 学习目的: 了解模块的含义和定义及参数传递规则 熟悉模块调用规则及变量作用域 掌握读多模块程序的方法 • 重点:熟悉模块调用规则及变量作用域 • 难点:理解模块的含义及读多模块程序
模块是一个相对独立的程序段,它可以被其他模块所调用,也可以去调用其他的模块。模块是一个相对独立的程序段,它可以被其他模块所调用,也可以去调用其他的模块。 • 子程序:被其他模块调用的模块;主程序:调用其他模块而没有被其他程序调用的模块。在vf中模块可以是命令文件,也可以是过程。 • 一、模块的定义和调用 • (一)过程定义:procdure|function <过程名> • <命令序列> • [return [<表达式>]] • [endproc|endfunc] • 注释:(1) procdure|function表示一个过程的开始,并命名过程名,过程名必须以字母或下划线开头,可以包含字母、数字和下划线 • (2) endproc|endfunc表示一个过程的结束
(3)档过程执行到return时,控制将转会到调用程序或命令窗口,并返回表达式的值。如果缺省则在过程结束处自动执行一条隐含的return命令,若return不带表达式则返回逻辑真.t.(3)档过程执行到return时,控制将转会到调用程序或命令窗口,并返回表达式的值。如果缺省则在过程结束处自动执行一条隐含的return命令,若return不带表达式则返回逻辑真.t. • (二)过程文件的建立 • 过程可以放在程序文件代码的后面,也可以保存在称为过程文件的单独文件里。过程文件的建立仍使用modify command • (三)过程文件的打开 • 过程文件里只包含过程,这些过程能被任何其他程序所调用,但在调用过程文件中的过程之前,首先要打开过程文件,打开过程文件的命令: • Set procedure to [<过程文件1>[,<过程文件2>,……]][additive] • (四)关闭过程文件 • 1、set procedure to关闭所有打开的过程文件 • 2、release procedure <过程文件1>[,<过程文件2>……]
(五)模块调用格式 • 格式1:do <文件名>|<过程名> • 格式2: <文件名>|<过程名>()该格式即可以作为命令使用,也可以作为函数出现在表达式里。这里两种格式里的文件名不能包含扩展名 • 例: • 二、模块调用中的参数传递 • 模块程序可以接受调用程序传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理 • (一)接收参数的命令 • Parameters <形参变量1>[,<形参变量2>,……] • lparameters <形参变量1>[,<形参变量2>,……] • Parameters声明的形参变量被看作模块中建立的私有变量 • lparameters 声明的形参变量被看作模块中建立的局部变量
(二)调用模块程序的格式 • 格式1 : do <文件名>|<过程名> with <实参1>[,<实参2>……] • 格式2:<文件名>|<过程名> with <实参1>[,<实参2>……] • 注释:1、实参可以是常量、变量、也可以是一般形式的表达式,调用模块程序时,系统会自动把实参传递给形参。 • 2、形参的数目不能少于实参数目,如果形参数目多于实参数目,那么多于的形参取初值.f. • 3、采用格式1,如果实参是常量或一般形式的表达式,系统会计算出实参的值,并把它们赋值给相应的形参变量——按值传递;如果实参是变量,那么传递的将不是变量的值,而是变量的地址,这时形参和实参实际上是同一个变量,在模块程序中对形参变量的值的改变同样是对实参变量值的改变——按引用传递 • 4、采用格式2调用模块程序时,默认情况下都以按值方式传递,如果实参是变量,可以通过:set udfparms重新设置参数传递的方式: set udfparms to value|reference
(三)数组传递 • 实参是数组元素:按值传递元素值 • 按值传递:传递数组的第一个元素 • 实参是数组名: • 按引用传递:传递整个数组 • 例: • 三、变量的作用域 • 变量的作用域指变量在什么范围内有效或能被访问,在vf中,以变量的作用域来分,内存变量可分为公共变量、私有变量和局部变量 • (一)公共变量 • 1、在任何模块中都可使用的变量 • 2、公共变量的建立:public <内存变量> 1、为变量赋初值,.f. 2、一旦建立一直有效清除用clear, memory, release,quite
(二)私有变量 • 1、在程序中直接使用,系统自动隐含建立的变量 • 2、私有变量的作用域是建立他的模块及其下层的各层模块,一旦建立他的模块程序运行结束,这些私有变量将自动清除 • (三)局部变量 • 1、局部变量只能在建立他的模块中使用,不能在上层或下层模块中使用,当建立他的模块程序运行结束时,局部变量自动释放 • 2、局部变量的建立:local <内存变量表> 该命令建立指定的局部内存变量,并为他们赋初值.f. • 举例: • (四)private命令 • 主要作用是在子程序中隐藏主程序中可能存在的同名变量,使这些变量在子程序中暂时无效,回到上层程序时又恢复原值 • Private <内存变量表>|private all [like <通配符>|except<通配符>]
注释:1、该命令不建立内存变量 • 2、隐藏指定的在上层模块中可能已经存在的内存变量,使这些变量在当前模块中暂时无效,并且不改变该变量在上层的值 • 3、一旦当前模块运行结束返回上层模块时,被隐藏的内存变量就自动恢复原值 • 4、local 在建立局部变量的同时,也具有隐藏上层模块中建立的同名变量的作用,但local只在他所在的模块内隐藏这些同名变量,一旦出了本模块,这些变量恢复原值。 返回 结束
实训二 程序设计 一、实训目的 • 理解程序的三种基本结构 • 熟悉程序文件的创建、修改与运行 • 掌握程序中常用的输入输出语句的使用 二、实训内容 • 编一名为guss.prg的程序,实现如下功能:自己心想一个自然数(1-1024),让计算机猜。程序运行时计算机只问用户10个问题便知用户心想之数并输出 • 用循环结构编一名为统计.prg的程序,实现如下功能:1)统计表文件学生.dbf中的男女人数,2)统计表文件学生.dbf中各系人数并输出 三、实训步骤 • 参照实训书 返回 结束
实训三 多模块程序及参数传递 一、实训目的 • 理解多模块程序中内存变量的作用域 • 掌握程序调用中的参数传递 二、实训内容 • 通过实例验证关于内存变量作用域的结论:如过程中的公共变量,在程序执行器件和终止后始终有效;在过程中用private声明的内存变量为私有变量,它与主程序中的同名变量无关;在过程中内存变量被定义为局部变量,则它与上层主程序及其下属子程序中的同名变量无关等 • 利用公式c=m!/(n!(m-n))用带参数的内部过程编程计算组和Cm(m≥n) 三、实训步骤 • 参照实训书 n 返回 结束