《程序设计基础》PPT课件.ppt_第1页
《程序设计基础》PPT课件.ppt_第2页
《程序设计基础》PPT课件.ppt_第3页
《程序设计基础》PPT课件.ppt_第4页
《程序设计基础》PPT课件.ppt_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019/6/9,1,程序设计基础,2019/6/9,2,本章主要内容,程序设计的基本概念 程序文件建立与运行 三种程序控制结构 多模块程序 程序调试,2019/6/9,3,程序设计的基本概念,一、VFP的工作方式 命令工作方式(或交互工作方式) 通过菜单选择的方法或在命令窗口中逐条输入命令的方法来执行的。 程序工作方式 根据解决实际问题的需要,将一系列符合Visual FoxPro要求的命令按一定的逻辑结构编排成一个完整的应用程序,然后输入到计算机内自动地、连续地加以执行。,2019/6/9,4,程序设计的基本概念,二、 VFP的编程方式 面向过程编程方式 用结构化编程语言来编写结构化的程序,它把一个复杂的程序分成较小的过程,每个过程可以单独进行调试。 面向对象编程方式 用面向对象的技术编程,它把编程工作主要集中在描述的对象上,程序是事件驱动的,在执行过程中,等待的是一个事件。,对于制作简单短小的应用程序,使用过程编程方式比较容易,同时,这也是面向对象编程方式的基础。本章重点介绍面向过程的程序设计。,2019/6/9,5,程序设计的基本概念,三、程序设计的步骤 分析问题或任务,总结或抽象出问题的数学模型 根据数学模型确定解决问题的算法思想 确定要建立的数据表或数据库的基本结构及其数据表之间的关系 画出程序流程图 编写程序,实现功能要求,并在计算机上调试通过 用典型数据对所编写的程序进行测试,验证程序的可靠性 编写使用说明书,整理有关资料,进行总结,2019/6/9,6,6.1 程序文件建立与运行,程序文件 程序是由命令组成的ASCII码文本文件,所以程序文件也称为命令文件。该文件可用任何文本编辑器或字处理软件来建立。 程序文件扩展名 源文件的扩展名是.PRG,程序在运行时,会产生主文件名与.PRG程序主文件名相同,扩展名为.FXP的目标文件。,2019/6/9,7,6.1.1 程序文件建立,建立程序最简单的方法是用系统本身提供的编辑器。 VFP有2种方式进入程序编辑器窗口:菜单方式和命令方式,2019/6/9,8,菜单方式建立程序文件,用菜单建立程序的步骤为: 单击菜单“文件”“新建”命令或者单击常用工具栏的“新建”按钮,打开“新建”对话框。,打开“程序1”的程序编辑新窗口。,2019/6/9,9,命令方式建立程序文件,格式:MODIFY COMMAND |? 功能:打开程序编辑窗口,从中可以修改或 创建程序文件。 几点说明: :指定修改或创建的程序文件名。 如果用MODIFY COMMAND ?,则出现“打开”对话框,如图所示。,2019/6/9,10,命令方式建立程序文件,在用命令建立程序文件时,最好在命令后加上程序文件名,这样可以直接创建或修改用户给出的程序文件。 建好的文件将保存在“默认目录”指定的文件夹下,默认的扩展名是.PRG。如果需要保存在其它文件夹下,还可在命令中指定路径。如: MODI COMM D:excerciseexample,2019/6/9,11,程序输入与保存,例 6-1 在程序编辑窗口输入如下6条命令。 CLEAR &将屏幕输出窗口内容清空 a=12 &将数值12赋值给变量a b=18 &将数值18赋值给变量b c=a+b &将变量a与b和计算出来,赋值给变量c ?a,b,c &输出变量a、b、c的值 RETURN &表示程序结束,2019/6/9,12,程序输入与保存,在输入一个程序时,请用户注意以下几点: 一个命令语句中只能有一个命令动词。 每输入完一个语句按回车键表示该语句结束。 程序中用到的所有作为“分隔符号”的标点符号一律用英文半角符号。 输入或修改结束按“Ctrl+W”存盘,“Ctrl+Q”取消本次输入或修改结果。还可使用“文件”“另存为”命令将编辑好的程序以另外的名称存盘。,2019/6/9,13,6.1.2 程序运行,菜单方式运行程序 单击菜单“程序”“运行”命令,打开“运行”对话框。选定定要执行的程序文件,如选择:cx1 ,单击“运行”按钮,即可运行程序。,14,6.1.2 程序运行,命令方式运行程序 格式:DO 功能:将指定的程序文件调入内存并运行。 如在命令窗口里输入:DO cx1 将在屏幕输出程序计算结果: 12 18 30,2019/6/9,15,6.1.2 程序运行,单击常用工具栏上“!”命令按钮执行该程序 在程序打开并且为当前程序的情况下,单击常用工具栏上“!”命令按钮可执行该程序。,2019/6/9,16,6.1.2 程序运行,程序错误对话框 在程序执行过程中,如果程序出现运行错误或用户按下了“Esc”键,将弹出“程序错误”对话框,如图所示。,单击“取消”按钮可取消程序的执行。,单击“挂起”按钮,可暂时停止程序的运行,可在命令窗口里输入命令:RESUME,或单击菜单“程序”“继续执行”命令可继续执行程序 。,单击“忽略”命令按钮忽略程序的错误继续执行程序 。,单击“帮助”命令按钮可提示相关帮助信息。,2019/6/9,17,6.1.3 程序辅助命令,以前介绍的所有Visual FoxPro命令都可以用在程序设计中。另外Visual FoxPro还提供了一些辅助命令,这些命令能使程序更好地阅读和有效地运行。本小节介绍: 程序注释命令 程序结束命令 信息对话框函数MESSAGEBOX 运行环境设置命令,2019/6/9,18,程序注释命令,Visual FoxPro提供了3种注释命令: 格式1: NOTE 格式2: * 功能:使 NOTE或* 后面的内容成为注释内容。 格式3: & 功能:对&左面的命令做出解释或给出运行结果,又称为行尾注释命令。,2019/6/9,19,格式1:RETURN 功能:返回到上一级模块。如果本程序是以菜单方式或在命令窗口中调用执行的,则返回到命令交互状态。 格式2:CANCEL 功能:终止程序运行,清除程序中的私有变量,返回到命令窗口。 格式3:QUIT 功能:关闭Visual FoxPro,返回到操作系统。,程序结束命令,2019/6/9,20,信息对话框函数MESSAGEBOX,MessageBox函数用于显示一个信息对话框,可以在程序运行过程中,显示一些信息,例如提示信息、错误信息等。其构成如图所示。,信息对话框的“标题”部分。,信息对话框的“图标”部分。,信息对话框的“提示信息”部分。,信息对话框的“按钮”部分。,2019/6/9,21,信息对话框函数MESSAGEBOX,格式: MESSAGEBOX(,) 功能:供用户定义信息对话框,按下相应的按钮返回一个数值。 说明: 用于指定在对话框中显示的信息文本。 用于根据表6-1的内容设置对话框中的按钮、图标和默认按钮,缺省该参数表示取0。,2019/6/9,22,信息对话框函数MESSAGEBOX,2019/6/9,23,信息对话框函数MESSAGEBOX,用于指定对话框标题栏的显示文本。缺省该参数表示在标题栏显示“Microsoft Visual FoxPro”。 函数值返回一个数值,用户可根据操作时按下的按钮来获得相应的返回值,返回值见表6-2,用户编程时根据返回值来设置动作。,2019/6/9,24,信息对话框函数MESSAGEBOX举例,例 6-3 在信息对话框中使用2个按钮“是”和“否”,使用“问号”图标,默认按钮为第二个按钮,显示“真的要退出系统吗?”信息,对话框标题为“提示信息”。 在命令窗口里输入: a=MESSAGEBOX(“真的要退出系统吗?“,4+32+256,“提示信息“) 就会显示如图所示的信息对话框。,2019/6/9,25,运行环境设置命令,在程序中运用一些环境设置命令,可使程序正常而高效地运行。运行环境设置命令大多数是由SET命令设置的,它一般有ON和OFF两个选项,当为ON状态时,设置有效,为OFF状态时设置无效。有的SET命令用TO指定设置值。常用的环境设置命令如表6-3所示。,2019/6/9,26,运行环境设置命令,2019/6/9,27,6.1.4 交互式输入命令,根据解决实际问题的需要,往往在程序运行的过程中,由用户向程序输入一些数据或信息,完成这种功能的一些命令称为交互式输入命令。Visual FoxPro提供了多种交互式输入命令。本小节介绍三种命令: ACCEPT INPUT WAIT,2019/6/9,28,字符型数据输入命令ACCEPT,格式:ACCEPT TO 功能:暂停程序的执行,等待用户输入一个字符串给变量。 说明: (1),是在屏幕上出现的提示信息。它可以是字符串,此时必须用双引号将其括起来,也可以是字符型内存变量,该内存变量必须预先赋值。 (2)用户在键盘输入的任何字符信息都被赋值给“内存变量”。输入的数据将作为字符型数据处理,不需要定界符括起来,如果输入了定界符,则这些定界符也被作为输入字符的一部分。 (3)输入完需要的信息后,按“Enter”键结束本命令的输入。如果没有输入其他信息,只按回车键,将把一个空字符串赋值给内存变量。,2019/6/9,29,ACCEPT使用举例,例 6-4 编一程序,将人事数据表打开,在程序运行中输入人员姓名,显示指定姓名的人员记录。 程序代码如下: NOTE 该程序用于从人事数据表中查找用户指定姓名的人员信息。 CLEAR USE rsb ACCEPT “请输入要查找的姓名:“ TO name LOCATE FOR ALLTRIM(姓名)=name DISPLAY RETURN,2019/6/9,30,表达式输入命令INPUT,格式:INPUT TO 功能:暂停程序的执行,接受用户输入合法的表达式并将表达式的值赋值给内存变量。 说明: (1),同“ACCEPT”命令中的。 (2)用户可输入任何一个合法的数值型(N)、字符型(C)、日期型(D)、逻辑型(L)表达式,系统先计算表达式的值并将该值赋值给内存变量。 (3)如果输入字符串信息,则必须加上双引号或单引号定界符,如“ABC“。 (4)按“Enter”键结束输入,如果输入的是非法表达式,系统将提示重新输入。,2019/6/9,31,INPUT使用举例,例 6-5 已知圆半径为r,求圆面积s(要求四舍五入保留三位小数)。 分析:假设圆的半径为r,则计算圆面积s的公式为:s=r2,计算圆面积公式的Visual FoxPro表达式为:PI()*r2 。程序代码如下: * 该程序用于计算用户指定半径的圆的面积。 CLEAR INPUT “请输入圆半径r=“ TO r s=ROUND(PI()*r2,3) &PI()为圆周率函数,ROUND函数为四舍五入函数 ?“该圆半径为:“,r ?“该圆面积为:“,s RETURN,2019/6/9,32,接收单字符命令WAIT,格式:WAIT TO WINDOWS AT , TIMEOUT NOWAIT 功能:暂停程序,用户按任意键或者时间超过等待的秒数后,程序继续执行。如果包含TO 短语,将用户所按键盘字符赋值给指定的内存变量。,2019/6/9,33,接收单字符命令WAIT说明,(1),指定要显示的自定义信息。若省略该参数,则 Visual FoxPro 显示默认的信息“按任意键继续”。如果该参数为空字符,则不显示信息。 (2)WINDOWS:在 Visual FoxPro 主窗口右上角的系统信息窗口中,显示提示信息。如果指定AT ,,则该窗口在指定屏幕坐标位置显示。,2019/6/9,34,接收单字符命令WAIT说明,(3)TIMEOUT :指定在执行 WAIT 命令之后,程序暂停的时间,参数指定等待的时间秒数。 (4)NOWAIT子句指在前述指定的Windows窗口中显示WAIT信息的同时,程序继续执行而不暂停。,2019/6/9,35,WAIT使用举例,下列命令将在屏幕16行、16列位置处显示一含有提示信息的小窗口,如图所示,此时单击鼠标按键、按下键盘上任意一个按键或小窗口在屏幕上停留7秒后,从屏幕上消失。 WAIT “请稍后,程序将继续执行。“ WINDOWS AT 16,16 TIMEOUT 7,2019/6/9,36,6.2 程序控制结构,结构化程序包括三种基本结构,即 顺序结构 选择结构 循环结构,2019/6/9,37,6.2.1 顺序结构,顺序结构是程序设计中最基本的结构,该结构按照程序命令出现的先后顺序依次执行。事实上,如果不进行特殊说明,程序中的命令就自动按其前后排列顺序执行。,2019/6/9,38,顺序结构程序举例1,例 6-6 假设我国2007年国民生产总值为200,000亿元,按每年平均10%的速度递增,编程计算到2020年我国国民生产总值将会达到多少? 国民生产总值计算公式为:未来值p1=初值p0(1+速度a)时间间隔n 这里,初值 p0=200000 亿元,速度为 a=0.1,时间间隔 n=2020-2007=13,P1为未来待计算的值。Visual FoxPro计算表达式为:p1=p0*(1+a)n 。该程序流程图如图所示。,2019/6/9,39,顺序结构程序举例1,程序代码如下: CLEAR p0=200000 a=0.1 n=13 p1=p0*(1+a)n ?“我国2007年的国民生产总值为:“,p0, “亿元。“ ?“我国2020年的国民生产总值为:“,p1, “亿元。“ RETURN,2019/6/9,40,顺序结构程序举例2,例 6-7 在人事数据表中,根据从屏幕上输入的职工姓名来查询该职工的姓名、性别、职称、出生日期、工作日期。 用ACCEPT命令输入和?命令输出,程序代码如下。,2019/6/9,41,顺序结构程序举例2,CLEAR USE rsb ACCEPT “请输入被查询职工的姓名:“ TO name LOCATE FOR ALLTRIM(姓名)=name ?“姓名:“+姓名 ?“性别:“+性别 ?“职称:“+职称 ?“出生日期:“+DTOC(出生日期) ?“工作日期:“+DTOC(工作日期) USE RETURN,2019/6/9,42,6.2.2 选择结构,选择结构,是一种常用的基本结构,是根据所给条件是否为真,选择执行某一分支的相应操作。按照选择结构执行路径的多少,可分为: 简单分支结构 双分支选择结构 多分支选择结构,2019/6/9,43,简单分支结构,格式: IF 命令序列 ENDIF 功能:根据条件的逻辑值来确定是否执行命令序列。,2019/6/9,44,简单分支结构说明,(1)根据的逻辑值进行判断。如果的逻辑值为.T.,就依次执行命令序列,执行完后就转去执行ENDIF之后的命令。如果的逻辑值为.F.,则IF和ENDIF之间的所有命令都不执行,而直接转到ENDIF之后的命令。,(2)IF语句和ENDIF语句必须成对出现,且各占一行。,(3)为了程序阅读方便,便于以后维护修改,建议对于命令序列部分采取向右缩进书写的方式。,2019/6/9,45,简单分支结构举例1,例 6-8 铁路托运行李,按规定每张客票托运行李不超过50公斤时,每公斤0.25元,如超过50公斤,超过部分按每公斤0.45元计算。编写一个程序,把行李重量输入计算机,计算出运费,并打印出付款清单。 问题分析:设行李重量为W公斤,应付运费为P元,则运费公式为: 当W50, p=0.25w 当W50, p=500.25+(w-50)0.45,2019/6/9,46,简单分支结构举例1,该问题计算机程序框图如右图所示。,程序代码如下: NOTE 计算铁路托运行李费,W为行李重量,P为运费。 CLEAR INPUT “请输入行李重量:“ TO w P=0.25*w IF w50 P=50*0.25+(w-50)*0.45 ENDIF ?“行李重量为:“,w,“公斤“ ?“应付运费为:“,p,“元“ RETURN,2019/6/9,47,简单分支结构举例2,例 6-9 程序运行时,从键盘输入两个数a、b,如果ab,则将二者的数据交换。 程序代码如下:,2019/6/9,48,简单分支结构举例2,CLEAR INPUT “请输入给变量a的数值:“ TO a INPUT “请输入给变量b的数值:“ TO b ?“a与b交换之前的值分别是:“+ALLTRIM(STR(a,10)+“,“+ALLTRIM(STR(b,10) IF ab c=a & c为中间变量 a=b b=c ENDIF ?“a与b交换之后的值分别是:“+ALLTRIM(STR(a,10)+“,“+ALLTRIM(STR(b,10) RETURN,2019/6/9,49,双分支选择结构,格式: IF 命令序列1 ELSE 命令序列2 ENDIF 功能:根据条件的逻辑值来决定程序执行命令序列1还是命令序列2。,2019/6/9,50,双分支选择结构说明,(1)如果的逻辑值为.T.,就执行命令序列1,执行完后就转到执行ENDIF之后的命令。如果的逻辑值为.F.,就执行命令序列2,完成后,转去执行ENDIF之后的命令。,(2)ELSE语句单独占一行,IF语句和ENDIF语句必须成对出现,且各占一行。,2019/6/9,51,双分支选择结构举例,例 6-10 设出租车不超过2公里时一律收费7元钱,超过时则超过部分每公里加收2.6元。试根据里程数编程计算并显示出应付车费(用双分支选择结构编程)。 程序代码如下:,2019/6/9,52,双分支选择结构举例,CLEAR INPUT “请输入里程数:“ TO k IF k=2 cf=7 ELSE cf=7+(k-2)*2.6 ENDIF ?“里程为:“,k,“公里“ ?“车费为:“,cf,“元“ RETURN,2019/6/9,53,分支结构嵌套,在分支结构的中,可以包含任何Visual FoxPro命令语句,也可以包括另外一个或几个合法的分支结构语句,也就是说分支结构可以嵌套。对于嵌套的分支结构语句,一定注意内外层分支结构层次分明,即注意各个层次的IFELSEENDIF语句的配对情况。,2019/6/9,54,分支结构嵌套举例,例 6-11 永立公司对销售人员的报酬计算方法如下:每月销售10万元(含10万元)以下者,只得基本工资1000元;每月销售10万元以上至30万元(含30万元)者,则超过10万元以上部分按2%提成;每月销售30万至50万(含50万元)者,超过30万元部分按5%提成;超过50万元部分按10%提成。以上各个级别的计算实行累加计算。编程按输入每个销售人员编号和销售额,计算每个销售人员的报酬(报酬结果按四舍五入规则取整)。,2019/6/9,55,分支结构嵌套举例,编程思路:为了编程方便,先将每个级别的基准报酬计算出来,再根据销售额的多少用嵌套分支结构判断计算。该程序代码如下:,CLEAR ACCEPT “销售员编号:“ TO salenumber INPUT “销售额:“ TO salevolume pay1=1000 pay2=pay1+ROUND(300000-100000)*0.02,0) pay3=pay2+ROUND(500000-300000)*0.05,0),2019/6/9,56,分支结构嵌套举例,IF salevolume=100000 pays=pay1 ELSE IF salevolume=300000 pays=pay1+ROUND(salevolume-100000)*0.02,0) ELSE IF salevolume=500000 pays=pay2+ROUND(salevolume-300000)*0.05,0) ELSE pays=pay3+ROUND(salevolume-500000)*0.1,0) ENDIF ENDIF ENDIF ?salenumber+“号销售员工作报酬:“+STR(pays,6,0)+“元。“ RETURN,2019/6/9,57,多分支选择结构,格式: DO CASE CASE CASE . . CASE OTHERWISE ENDCASE 功能:根据是否成立来决定是否执行其下的命令序列。,2019/6/9,58,多分支选择结构说明,(1)多分支选择结构执行的过程是:系统依次判断各是否满足,若某一为.T.,就执行该 下的,执行后不再判断其它,而转去执行ENDCASE后面的第一条命令。如果没有一个为.T.,就执行OTHERWISE后面的命令序列n+1,直到ENDCASE;如果没有OTHERWISE,则不作任何操作就转向ENDCASE之后的第一条命令。,(2)DO CASE语句和ENDCASE语句必须成对出现,各占一行。,2019/6/9,59,多分支选择结构说明,(3)多分支选择结构中各CASE语句后的是按其先后顺序判断执行的,因此对实际问题进行编程时,应认真考虑各个条件排列的先后顺序。,2019/6/9,60,多分支选择结构举例,例 6-12 用多分支选择结构编程计算例 6-11。程序代码如下:,CLEAR ACCEPT “销售员编号:“ TO salenumber INPUT “销售额:“ TO salevolume pay1=1000 pay2=pay1+ROUND(300000-100000)*0.02,0) pay3=pay2+ROUND(500000-300000)*0.05,0),2019/6/9,61,多分支选择结构举例,DO CASE CASE salevolume=100000 pays=pay1 CASE salevolume=300000 pays=pay1+ROUND(salevolume-100000)*0.02,0) CASE salevolume=500000 pays=pay2+ROUND(salevolume-300000)*0.05,0) OTHERWISE pays=pay3+ROUND(salevolume-500000)*0.1,0) ENDCASE ?salenumber+“号销售员工作报酬:“+STR(pays,6,0)+“元。“ RETURN,2019/6/9,62,6.2.3 循环结构,在程序设计中,有时需要从某处开始有规律地反复执行某些类似的操作,这些类似的操作一般用循环结构程序设计来解决。在Visual FoxPro中,提供了3种循环结构,即: 当型循环结构 步长型循环结构 表扫描型循环结构,2019/6/9,63,当型循环结构,格式: DO WHILE 命令序列 ENDDO 功能:根据是否满足来决定是否执行命令序列。,2019/6/9,64,当型循环结构说明,(1)当型循环执行的过程是:根据的逻辑值,进行判断。如果的逻辑值为.T.,则执行DO WHILE和ENDDO之间的命令序列(也称为循环体),当命令序列包含的所有命令执行完毕后,程序自动返回到DO WHILE语句,每执行一遍就判断一次DO WHILE语句中的。如果仍然为.T.,则继续执行DO WHILE和ENDDO之间的命令序列,直到的逻辑值为.F.,结束循环,转去执行ENDDO之后的第一条命令。,(2)DO WHILE和ENDDO语句应配对使用,各占一行。,2019/6/9,65,当型循环结构说明,(3)在命令序列的适当位置可以放置EXIT和LOOP语句,用以对循环过程作特殊处理。EXIT的功能是:结束循环命令,转去执行ENDDO之后的第一条命令。LOOP语句的功能是:终止本次循环命令,返回到循环入口。EXIT和LOOP语句只能在循环结构中使用,并且常常附加条件加以限制。,(4)在命令序列中可以嵌套IFENDIF、DO CASEENDCASE、DO WHILEENDDO、FORENDFOR、SCANENDSCAN等程序结构。,2019/6/9,66,当型循环结构程序举例,例 6-13 鸡兔同笼问题。设鸡和兔共有头38个,脚138个,问鸡和兔各为多少只? 问题分析:设鸡为cocks只,兔为rabbits只,则有:cocks + rabbits=38;2*cocks+4*rabbits =138。可令鸡和兔的头数之和或者脚数之和为一变量,如本题令二者脚数之和foots为变量,开始令cocks=0,foots=0,用循环进行判断是否foots138,如果是,则进行如下运算:cocks=cocks+1; rabbits=38-cocks;foots=2*cocks+4*rabbits;再进行循环判断,直到foots138不成立(即foots=138),循环结束,输出结果。程序框图如图所示。,2019/6/9,67,当型循环结构程序举例,程序代码如下: CLEAR cocks=0 foots=0 DO WHILE foots138 cocks=cocks+1 rabbits=38-cocks foots=2*cocks+4*rabbits ENDDO ?“鸡的数量为:“,cocks ?“兔的数量为:“,rabbits RETURN,2019/6/9,68,步长型循环结构,格式: FOR = TO STEP 命令序列 ENDFOR|NEXT 功能:根据循环变量的值是否超过终值来决定是否执行命令序列。,2019/6/9,69,步长型循环结构说明,(1)、都是数值表达式;当是1时,可以省略STEP子句。 (2)ENDFOR或NEXT语句为循环终端语句,用以标明本循环结构的终点。该语句必须和FOR语句配对使用。,2019/6/9,70,步长型循环结构说明,(3)该循环结构的执行过程是:首先将初值赋值给循环变量,然后判断循环变量的值是否超过终值(这里超过终值的含义是:如果步长值为正数,则循环变量的值大于终值为超过,如果步长值为负数,则循环变量的值小于终值为超过),不超过就执行循环体,遇到ENDFOR或NEXT语句,自动使循环变量增加一个步长值,再将循环变量的值与终值比较,如果循环变量的值不超过终值,就再执行循环体,不断循环执行。如果循环变量的值超过终值则不执行循环体,而转去执行ENDFOR或NEXT语句后面的第一条语句。 (4)在循环体内的适当位置也可以放置EXIT和LOOP语句,作用和用法与当型循环结构类似。,2019/6/9,71,步长型循环结构程序举例1,例 6-15 求1+2+3+99+100的值。 问题分析:采用累加的办法,用循环变量产生1、2、3、99、100这些数。用s保存累加和,s的初始值为0,每次循环将s加上循环变量的值,再赋值给变量s,循环结束即求得s。 程序代码为:,2019/6/9,72,步长型循环结构程序举例1,CLEAR s=0 FOR x=1 TO 100 s=s+x ENDFOR ?“1-100自然数累加和是:“,s RETURN,2019/6/9,73,步长型循环结构程序举例2,例 6-16 从键盘上输入任何一个自然数,求该自然数的阶乘。 问题分析:假设该自然数为n,那么求n的阶乘的公式是: n*(n-1)*(n-2)*2*1 有了这样的公式,我们就可以用循环程序将该n的阶乘求解出来。将循环变量的初值设为n,终值设为1,步长值设为-1。用factor作为存放阶乘的变量,factor的初始值为1,每次循环都使factor 乘以循环变量的值,循环结束即求得factor的值。该程序代码如下:,2019/6/9,74,步长型循环结构程序举例2,CLEAR factor=1 INPUT “请输入一个自然数:“ TO n FOR x=n TO 1 STEP -1 factor=factor*x ENDFOR ? “自然数“+ALLTRIM(STR(n,10)+“的阶乘是:“+ALLTRIM(STR(factor,20) RETURN,2019/6/9,75,表扫描循环结构,格式: SCAN FOR |WHILE 命令序列 ENDSCAN 功能:根据对打开数据表的范围和条件来决定是否执行命令序列。,2019/6/9,76,表扫描循环结构说明,(1)该结构是针对当前打开的数据表进行操作的。它的功能是:对当前打开的数据表中指定范围内符合条件的记录,逐个进行所规定的操作,如果缺省范围和条件子句时,则对所有记录逐个进行规定的操作。 (2)表扫描型循环结构每循环一遍,记录指针自动移动到下一条记录,不需要设置SKIP语句。 (3)SCAN和ENDSCAN语句要配对使用,且各占一行。 (4)在的适当位置也可以放置EXIT和LOOP语句,功能和用法同其他循环结构类似。,2019/6/9,77,表扫描循环结构程序举例,例 6-17 将人事数据表中基本工资小于1000的姓名、基本工资两个字段输出,并统计这些职工的人数。(用SCAN ENDSCAN结构编程) 基本操作步骤为:关闭所有数据表,打开人事数据表,设计一个累加变量n,代表满足条件的记录数,给n 赋初值0,用表扫描循环结构定位满足条件的记录,输出姓名、基本工资两个字段,并对n 进行累加1,循环结束即求得n,输出n。程序代码如下:,2019/6/9,78,表扫描循环结构程序举例,CLOSE DATABASE CLEAR USE rsb n=0 SCAN FOR 基本工资1000 ?姓名,基本工资 n=n+1 ENDSCAN ?“基本工资在1000元以下的人数有:“+STR(N,2)+“人。“ CLOSE DATABASE RETURN,2019/6/9,79,循环结构嵌套,循环结构的嵌套是指在一个循环体内包含其它的循环结构,也称为多重循环结构。 同一种类型的循环结构可以嵌套,不同类型的循环结构也可以嵌套。 要编好循环结构嵌套程序,必须做到:循环开始语句和循环结束语句配对出现;内外层循环层次分明,不得交叉。 Visual FoxPro 最多允许128层嵌套。请看下面的例子。,2019/6/9,80,循环结构嵌套举例,例 6-18 用双重循环打印九九乘法表,即: 11=1,12=2,19=9 21=2,12=4,29=18 91=9,92=18,99=81 问题分析:这是一个有9个行、9个列数据项的矩阵,可以用双重循环解决。外循环用于控制各个行,内循环用于控制每一行的各个列项,一行输出完毕以后,换行输出下一行各个列的数据项。程序代码如下:,2019/6/9,81,循环结构嵌套举例,*打印乘法九九表。 CLEAR FOR a=1 TO 9 FOR b=1 TO 9 p=a*b ?STR(a,1)+“+STR(b,1)+“=“+STR(p,2)+“ “ ENDFOR ? &注意?和?的区别 ENDFOR RETURN,2019/6/9,82,6.3 多模块程序,应用程序一般都是多模块程序,可包含多个程序模块。模块是可以命名的一个程序段,可指主程序、子程序、函数、过程。,2019/6/9,83,6.3.1 子程序,能够完成一定功能的可供其它程序使用(调用)的独立程序段称为子程序。它独立存在,但可以被多次调用,调用子程序的程序称为主程序。在应用系统开发中,把程序完成的主要功能都分配给各子程序去完成,这样主程序可以写得比较简捷,整个应用系统的维护方便,应用系统运行的效率也很高。,2019/6/9,84,1.子程序的调用,格式: DO WITH IN 功能:用来执行一个程序。 说明: (1)程序文件名1:指定要执行程序的名字。DO 直接执行或调用指定的程序。 (2)WITH :指定传递到子程序的参数,在中列出的参数可以是表达式、内存变量、常量、字段或用户自定义函数。 (3)当是子句IN 中的一个过程时,DO命令调用该过程。请参阅例6-24。,2019/6/9,85,2. 子程序的返回,格式: RETURN TO MASTER | TO 功能:将程序执行的控制权返回到指定程序的相关代码行。 说明: (1)该语句放在一个程序的末尾。 (2)不带参数的RETURN语句的功能是将程序控制权返回到调用该子程序的主程序的下一条命令语句。 (3)RETURN TO MASTER:如果有多级程序调用,某一子程序的该语句将使程序控制权返回到最高一级调用程序。 (4)RETURN TO :表示将控制权交给指定的程序。,2019/6/9,86,3. 子程序的建立,建立子程序的方法与建立程序的方法类似。但要注意: 每个子程序必须单独使用一个文件名保存起来,子程序文件名的扩展名也是.PRG。 主程序和子程序之间有关变量值的传递关系。,2019/6/9,87,子程序举例1,例 6-19 利用主程序调用子程序的方法计算任意3个自然数的阶乘和,即求s = a! + b! + c!。 建立步骤:先建立好求任一自然数阶乘的程序,如例 6-16。由于这里是通过主程序调用子程序的方法求三个自然数阶乘之和,因此在子程序中所求出的每个自然数的阶乘就不用输出了;另外子程序计算所需的自然数是主程序通过变量传递到子程序的,因此,在子程序中输入自然数的语句也可以不要。所以,在本例中,作为求阶乘的子程序可以是如下的程序代码:,2019/6/9,88,子程序举例,注意,该子程序中的变量n的值需要由主程序传递。将该子程序保存文件名为:jc。 主程序的编写:在程序运行时输入三个任意自然数分别给三个变量a、b、c,定义与子程序中传递数据的相关变量,这里分别是传递求阶乘需要的自然数变量n,保存计算阶乘结果的变量factor。然后三次调用子程序即可分别计算出三个自然数的阶乘,计算这三个阶乘之和并输出。 根据以上分析,主程序代码如下:,*子程序,文件名为jc factor=1 FOR x=n TO 1 STEP -1 factor=factor*x ENDFOR RETURN,2019/6/9,89,子程序举例,*主程序代码 CLEAR INPUT “a=“ TO a INPUT “b=“ TO b INPUT “c=“ TO c s=0 factor=1 n=a DO jc s=factor n=b,DO jc s=s+factor n=c DO jc s=s+factor ?ALLTRIM(STR(a,3)+“!+“+ALLTRIM(STR(b,3); +“!+“+ALLTRIM(STR(c,3)+“!=“,s RETURN,2019/6/9,90,子程序举例2,例 6-20 用带参数传递数据的方法编程计算球的体积(四舍五入保留三位小数)。球体积的计算公式是:volume=4/3r3,Visual FoxPro表达式是:volume=4/3*PI()*r3。 注意,在建立含有参数传递子程序时,子程序的第一条语句必须是: PARAMETER 要与DO WITH 语句中的中的参数一一对应,以便相互传递数据,由PARAMETER 中给出的参数叫形参,而DO WITH 中给出的参数叫实参。实参的名称与形参的名称可以一样,也可以不一样。一般情况下实参的个数等于(或小于)形参的个数,但不能大于形参的个数,如实参个数小于形参的个数,多出的形参取逻辑值.F.。,2019/6/9,91,子程序举例2,本例计算球的体积的子程序代码是: PARAMETER r,volume volume=ROUND(4/3*PI()*r3,3) RETURN 将该子程序以文件名qtj 保存起来。,主程序代码如下: CLEAR INPUT “请输入球的半径:“ TO r cube=0 DO qtj WITH r,cube ?“半径为“+ALLTRIM(STR(r,10)+“;球的体积是:“,cube RETURN,2019/6/9,92,6.3.2 自定义函数,Visual FoxPro提供了许多系统函数,用户也可以自己定义函数(User Defined Function),简称UDF。在Visual FoxPro中有两种形式的UDF: 独立用户定义函数 依附用户定义函数,2019/6/9,93,独立用户定义函数,格式: PARAMETERS 命令序列 RETURN 功能:定义一个可以独立运行的函数。,2019/6/9,94,独立用户定义函数说明,(1)PARAMETERS :接受函数运行时传递过来的数据,如果函数不需要传递数据,该语句可省略。,(2)命令序列:用于进行各种处理的命令组合。简单的函数也可以为空。,(3)RETURN 语句中的值作为返回函数值,它决定了函数的类型。如缺省该语句,则返回函数值为.T.。,2019/6/9,95,独立用户定义函数说明,(4)函数名称就是保存时用的程序文件名。如果UDF的名称与已有的函数名相同,系统只承认已有函数,因此不能用已有的函数名来命名UDF。,(5)UDF的调用形式是()。参数表中每个参数可以是任何合法的Visual FoxPro表达式,参数的个数必须与UDF中PARAMETERS语句里的参数表参数个数相等,数据类型也应符合UDF中的要求。,2019/6/9,96,独立用户定义函数举例,例 6-21 定义一个计算求立方数的函数。 该程序的代码如下 *求立方数函数。函数名为cube *(即以cube.prg为文件名存盘) PARAMETERS v RETURN v*v*v 在右面程序代码中,调用求立方函数cube.prg,求1到10的立方数。,*求1到10的立方数 CLEAR FOR i=1 TO 10 ?i,cube(i) ENDFOR RETURN,独立用户定义函数,2019/6/9,97,依附用户定义函数,依附用户定义函数不能作为一个独立的程序文件,它以FUNCTION开头,依附在某程序的后面或某过程文件中。依附用户定义函数用如下格式定义。 FUNCTION PARAMETERS 命令序列 RETURN 功能:定义一个跟随在主程序后面的依附用户定义函数。 说明:FUNCTION 在程序里标识UDF的开始并定义函数名。其它与独立函数规定相同。,2019/6/9,98,依附用户定义函数举例,例 6-22 用依附定义函数编写求1-10的立方数。 该程序的代码如下: *求1到10的立方数。主程序 CLEAR FOR i=1 TO 10 ?i,cube1(i) ENDFOR RETURN * 下面是依附用户定义函数代码 FUNCTION cube1 PARAMETERS v RETURN v*v*v,依附用户定义函数,2019/6/9,99,6.3.3 过程,可以把多个子程序合并成一个大的文件,在该文件中,每个子程序仍然是独立的,这个大的公用程序文件被称作过程文件,其中的每个子程序模块称为过程。由于过程文件是集中起来以一个文件的形式存储在磁盘上的,调用时作为一个文件一次打开,每个子过程可随时调用,从而大大减少了访问磁盘的次数,能够提高程序运行效率。,2019/6/9,100,6.3.3 过程,格式: PROCEDURE PARAMETERS RETURN 功能:定义一个过程。,说明: (1)过程是以PROCEDURE开头,并标识出的程序或程序段,指定生成过程的名称,是过程体,用DO 命令调用。 (2)过程可以放在主程序的后面,由主程序调用。 (3)可以将一个或多个过程组织在一个程序文件中,需要时分别调用。,2019/6/9,101,过程举例1,例 6-23 用主程序调用过程的方式编程求圆面积、圆周长、球体积。,过程代码如下(跟随在主程序的后面):,2019/6/9,102,过程举例1,*主程序代码如下: CLEAR INPUT “请输入半径:“ TO radius mj=0 zc=0 tj=0 DO ymj WITH mj,radius DO yzc WITH zc,radius DO qtj WITH tj,radius ?“半径为“+ALLTRIM(STR(radius,10)+“的圆面积是:“,mj ?“半径为“+ALLTRIM(STR(radius,10)+“的圆周长是:“,zc ?“半径为“+ALLTRIM(STR(radius,10)+“的球体积是:“,tj RETURN,2019/6/9,103,过程举例2,例 6-24 在主程序中调用过程文件中的过程的方式编程求圆面积、圆周长、球体积。 可以将例6-23中三个子过程组合成一个过程文件,假设文件名为:circle。它的程序代码如下:,2019/6/9,104,过程举例2,*过程文件circle的代码 PROCEDURE ymj PARAMETERS s,r s=pi()*r2 RETURN PROCEDURE yzc PARAMETERS s,r s=2*pi()*r RETURN PROCEDURE qtj PARAMETERS s,r s=4/3*pi()*r3 RETURN,2019/6/9,105,过程举例2,* 方法1程序代码如下: CLEAR INPUT “请输入半径:“ TO radius mj=0 zc=0 tj=0 DO ymj WITH mj,radius IN circle &以IN子句调用过程 DO yzc WITH zc,radius IN circle DO qtj WITH tj,radius IN circle ?“半径为“+ALLTRIM(str(radius,10)+“的圆面积是:“,mj ?“半径为“+ALLTRIM(str(radius,10)+“的圆周长是:“,zc ?“半径为“+ALLTRIM(str(radius,10)+“的球体积是:“,tj RETURN,2019/6/9,106,过程举例2,* 方法2程序代码如下: SET PROCEDURE TO circle &先将过程文件打开,需要时可 &直接调用其中包含的过程 CLEAR INPUT “请输入半径:“ TO radius mj=0 zc=0 tj=0 DO ymj WITH mj,radius &不再需要IN子句 DO yzc WITH zc,radius DO qtj WITH tj,radius ?“半径为“+ALLTRIM(str(radius,10)+“的圆面积是:“,mj ?“半径为“+ALLTRIM(str(radius,10)+“的圆周长是:“,zc ?“半径为“+ALLTRIM(str(radius,10)+“的球体积是:“,tj RETURN,2019/6/9,107,6.3.4 变量作用域,在多模块程序中,根据变量发生作用的范围,可将变量分为: 公共变量 私有变量 本地变量,2019/6/9,108,公共变量,在任何模块中都能使用的变量称为公共变量,也称为全局变量。当某些变量需要在各个模块中都可能发挥作用的时候,要定义成公共变量。用下列格式定义变量为公共变量。 PUBLIC 功能:将PUBLIC后指定的变量定义为公共变量。,2019/6/9,109,公共变量说明,(1)将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论