vf结构化程序设计课件_第1页
vf结构化程序设计课件_第2页
vf结构化程序设计课件_第3页
vf结构化程序设计课件_第4页
vf结构化程序设计课件_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

VisualFoxPro程序设计教程E-mail:VisualFoxPro程序设计教程1第9章结构化程序设计9.1程序设计基础9.2顺序结构程序9.3选择结构程序9.4循环结构程序9.5程序的模块化9.6程序调试第9章结构化程序设计9.1程序设计基础2

vf执行命令的方式:通过使用菜单或者在命令窗口执行,还有一种程序工作方式:把有关的操作命令组织在一起,存放到一个文件中,发出调用该文件的命令后,vf就可以自动地执行该文件中的命令,直到全部命令执行完毕。vf执行命令的方式:通过使用菜单或者在命令窗口执行,39.1程序设计基础

1.程序设计的概念

程序设计:程序设计反映了计算机解决问题的全过程,包含多方面的内容,而编写程序只是其中一个方面。使用计算机解决实际问题,通常先对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法。并用某一种程序设计语言编写程序,最后调试程序使之产生预期的结果。拿到一个实际问题后,应对问题的性质与要求进行深入分析,从而确定求解问题的数学模型或方法,接下来进行算法设计并画出流程图。有了算法流程图,在来编写程序时很容易的事。所以编写程序之前,先要把解决的问题分析清楚例如,在学生表中,需要按照学号查询学生的姓名和入学成绩。根据表操作的有关知识,很容易写出算法:(1)打开学生表(2)输入待查学生的学号(3)查找学号所对应的记录(4)显示该记录的学号、姓名和入学成绩9.1程序设计基础4

用计算机解决问题时,必须先确定算法,然后根据算法编写程序,最后通过运行程序来达到解决问题的目的。算法的概念做任何事都有一个过程(应有序)。即在允许的范围内进行有步骤的若干个操作序列。如学生考试:①进入考场,按指定座位入座; ②填写考生相关信息; ③答题; ④检查; ⑤如有错,则修改; ⑥交卷。这种事先设计出“行动步骤”即解题操作序列称之为算法。通俗地说,算法就是在规定的环境下,为解决某一问题而采取的方法和步骤。

用计算机解决问题时,必须先确定算法,然后根据算法编写程序5实际应用中,需要按照流程图描述算法,显得直观、简洁。流程图有一般流程图、N-S图等。一般流程图用菱形框表示判断,用矩形框表示进行某种处理,用流程线将各步操作连接起来。也可以用其它形式的流程图描述算法。2.程序的控制结构任何程序都由3种基本控制结构组成。即顺序结构、选择结构和循环结构(1)顺序结构

顺序结构是程序设计中最基本、最常见的结构。顺序结构的程序始终是按照语句排列的先后顺序从上到下逐条顺序执行。(2)选择结构

利用计算机具有逻辑判断能力的特点,根据不同的逻辑条件转去执行不同的程序语句,这些不同的转向语句就构成了分支结构。(3)循环结构

实际应用中,需要按照流程图描述算法,显得直观、简洁。流程6

具有重复操作功能的程序称为循环结构程序。在编制程序时,重复操作的语句不必重复编写,只要用循环结构的方法来处理,便能实现重复操作。重复执行的部分称为循环体。循环结构分为当型循环和直到型循环。各种结构如p135

当型循环先判断条件是否满足,当条件P满足时反复执行A程序块,每执行一次测试一次P,直到P不满足为止,跳出循环体执行它下面的基本结构

直到型循环先执行一次循环体,在判断条件P是否满足,如果不满足则反复执行循环体,直到P满足为止。两种循环结构的区别在于:当型循环结构是先判断条件,后执行循环体,而直到型循环结构是先执行,后判断。直到型循环结构至少执行一次循环体,而当型循环可能一次也不执行循环体。

具有重复操作功能的程序称为循环结构程序。在编制程序时,重73.结构化程序设计方法结构化程序设计方法是被普遍采用的一种程序设计方法,是软件开发的重要方法,用这种方法设计的程序结构清晰,易于阅读和理解,便于调试和维护结构化程序设计方法采用自顶向下、逐步求精和模块化的分析方法。

自顶向下:指对设计的系统有一个全面的理解,从问题的全局入手,把一个复杂的问题分解成若干个相互独立的子问题,然后对每一个子问题做进一步的分解,如此重复,直到每个问题解决为止。

逐步求精:程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,在把每一个模块的功能逐步分解细化为一系列的具体步骤,以至于能有某种程序设计语言的基本控制语句来实现。逐步求精总是和自顶向下结合使用,一般把逐步求精看做自顶向下设计的具体体现。

3.结构化程序设计方法8

模块化是结构化程序设计的重要原则,所谓模块化就是把大程序按照功能分为较小的程序。一般来说,一个程序是由一个主控模块和若干个子模块组成的。主控模块是用来完成某些公用操作及功能选择,而子模块是用来完成某项特定功能。一个复杂的问题可以分解成若干个简单的子问题来解决。这种设计风格,便于分工合作,讲一个庞大的模块分解成若干个子模块分别完成,然后用主控模块控制、调用子模块。模块化结构如P136总之,结构化程序设计过程就是将问题求解由抽象逐步具体化的过程。这种方法符合人们解决复杂问题遵循的普遍规律,可以显著提高程序设计的质量和效率。

模块化是结构化程序设计的重要原则,所谓模块化就是把94.程序文件的建立与执行

在VFP中,程序是保存在一个扩展名为.prg的程序文件中,通过调用和执行该程序文件来运行程序。I.建立程序文件

可用如下操作之一:菜单方式:“文件”→“新建”→“程序”→“新建文件”按钮。常用工具:“新建”按钮→“程序”→“新建文件”按钮。项目管理器:选“代码”卡→“程序”项→“新建”按钮。

命令:MODIFYCOMMAND[<文件名>]|?MODIFYFILE[<文件名>]|?之后,系统打开程序文件编辑窗口依次输入程序代码。

说明:

(1)程序文件类型:.prg(可省略)。命令为file时不能省略扩展名

(2)保存文件的路径:用户指定或建立在VFP默认文件夹下。(3)文件名中可以包含通配符*和?,与文件名相匹配的文件都会被打4.程序文件的建立与执行10开,都拥有自己的编辑窗口,用户可以通过“窗口”菜单来选择所需要的窗口,最好在命令后加入文件名,可以直接建立或修改给出的文件,以后不需要在存盘时在输入文件名。(4)文件名将显示在“程序窗口”标题栏的左侧。

II.运行程序文件命令方式:DO<程序文件名>菜单方式:“程序”菜单→“运行”命令。工具方式(在程序打开的状态):单击常用工具栏的程序运行按钮!或按组合键CTRL+E。如果程序不带扩展名,vf将会按下列顺序寻找并执行这些程序:可执行文件(.exe)、应用程序(.app)、编译后的目标程序文件(.fxp)、程序文件(.prg)开,都拥有自己的编辑窗口,用户可以通过“窗口”菜单来选择所需11III.代码颜色VFP系统默认在程序代码中以绿色表示命令注释;蓝色表示命令关键字;黑色表示非命令关键字或者用户自定义使用的字符;红色则表示有语法错误的程序代码,提醒用户进行改正。如果用户要重新设置代码颜色,可以选择VFP系统“工具”菜单下面的“选项”命令,打开“选项”对话框,在“语法着色”选项卡中进行自定义设置。

III.代码颜色12IV.常用的命令当程序文件被执行时,文件中包含的命令将被依次执行,直到所有的命令被执行完毕。但当执行到程序文件中的以下命令时会终止执行或改变执行循序:CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口。DO:转去执行另一个程序。RETURN:结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回命令窗口。QUIT:退出VisualFoxPro系统,返回到操作系统IV.常用的命令139.2顺序结构程序程序文件中的一些辅助命令I.注释语句(1)程序注释语句格式:NOTE[<注释内容>]或*[<注释内容>]功能:注释说明。其后内容不需要用定界符定界,执行时也不显示。要单独成行。(2)语句行注释格式:&&[<注释内容>]功能:对语句进行注释。不可单独成行,须写在某语句之后。9.2顺序结构程序程序文件中的一些辅助命令14II.状态设置命令(1)设置会话状态格式:SETTALKON|OFF功能:是否关闭系统交互对话方式(默认打开的)。(2)设置屏幕状态格式:SETCONSOLEON|OFF功能:是否显示键盘的输入内容(默认是显示的)。如果要求输入的内容保密设置OFF状态。

(3)设置缺省驱动器和目录格式:SETDEFAULTTO[<盘符:>][<路径>]功能:设置输入/输出操作的缺省驱动器和目录。缺省时为当前目录。例:若打开或保存的文件都在D盘下的AA文件夹中,则可用命令:SETDEFAULTTOD:\AA

(4)设置独占方式格式:SETEXCLUSIVEON|OFF功能:设置是否以独占方式打开表文件(默认独占)。

(5)设置字符精确匹配格式:SETEXACTOFF|ON功能:设置=是否完全匹配(默认不完全匹配)。决定字符串比较符“=”两边内容是否完全匹配。II.状态设置命令15III.输入输出命令i.程序输出命令(1)格式:?/??<表达式1>[<表达式2>…](2)功能:该命令可以对<表达式>进行求值,并将结果输出到系统屏幕中,其中“?”表示换行显示结果,“??”则表示在同一行显示结果。?"今天是",date()ii.程序输入命令1)Accept命令(1)格式:Accept[<字符表达式>]To<内存变量>(2)功能:在VFP屏幕当前光标处显示<字符表达式>的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容以字符串的形式存储在<内存变量>中。Accept命令只能接受输入字符型数据,内容最多为256个字符,输入内容时不需要加字符定界符。III.输入输出命令16Accept"请输入内容:"toxyz?"你输的内容是:",xyz2)Input命令(1)格式:Input[<字符表达式>]To<内存变量>(2)功能:Input命令与Accept命令功能基本相同,都是在VFP屏幕当前光标处显示<字符表达式>的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容作为一个表达式进行处理,计算表达式的值,并将其存储在<内存变量>中。与Accept命令不同的是,Input命令允许输入各种类型的数据。

Input"请输入内容:"toxyz

?"你输的内容是:",xyz

Input命令也可以输入是字符型,逻辑型、日期型数据,但需加定界符

Accept"请输入内容:"toxyz17

字符型(“”''[])

逻辑型(.t..f.)

日期型({^1990-09-09})默认使用严格日期格式,在输入时也可用ctod将字符型的转换成日期型iii.Say命令(1)格式:@<行,列>[Say<表达式1>][Get<变量名>][Default<表达式2>](2)功能:该命令表示在屏幕窗口的指定位置中输出[Say<表达式1>]子句中的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容存储在[Get<变量名>]中。必须使用read命令激活当前所有get变量。@5,10say'输入半径:'getRdefault0readS=3.14*R*R?'圆的面积是:',S字符型(“”''[])184)Wait命令(1)格式:Wait[<字符表达式>][To<内存变量>][Windows[At<行>,<列>]][Nowait][Clear][Noclear][Timeout<数值表达式>](2)功能:在VFP程序文件的执行过程中,遇到Wait代码时暂停执行,并显示Wait<字符表达式>]指定的信息,用户按任意键或者单击鼠标后可以继续执行程序文件。Wait"谢谢使用VF系统!"Wait"谢谢使用VF系统!"windowsWait"谢谢使用VF系统!"windowsat5,5WaitIV.顺序结构程序

顺序结构是程序设计中最基本、最常见的结构。顺序结构的程序始终是按照语句排列的先后顺序从上到下逐条顺序执行。例.在学生表中,按照学号查询学生的姓名和入学成绩4)Wait命令19CLEARSETTALKOFFUSE学生ACCEPT"请输入待查学生的学号:"tobhLOCATEFOR学号=bh&&查找学号为bh的记录DISP学号,姓名,入学成绩USESETTALKONRETURN

CLEAR209.3选择结构程序

在解决实际问题中,往往需要根据给定的条件来决定应采取的处理方法。利用计算机具有逻辑判断能力的特点,根据不同的逻辑条件转去执行不同的程序语句,这些不同的转向语句就构成了分支结构。1.简单判断语句(IF…ENDIF)

格式:

IF<条件表达式>

<语句序列>

ENDIF

功能:先判断条件表达式的值,当其值为真时,则执行IF和ENDIF之间的命令序列;反之则转去执行ENDIF语句之后的语句。说明:<条件表达式>可以是各种表达式的组合,如关系表达式、逻辑表达式或者其他逻辑量。但表达式的返回值只能是逻辑值.T.或.F.。9.3选择结构程序在解决实际问题中,往往需要根据给212.二路选择分支结构(IF…ELSE…ENDIF)格式:IF<条件表达式><语句序列1>ELSE<语句序列2>ENDIF功能:先判断<条件表达式>,若其值为真,则执行<语句序列1>,然后转去执行ENDIF之后的语句;若其值为假,则执行<语句序列2>,然后转去执行ENDIF之后的语句。

条件?满足执行YN不满足执行2.二路选择分支结构(IF…ELSE…ENDIF)条件?满足22例根据输入的学生姓名,在学生表中查找学生记录

SETTALKOFF&&执行程序时,要求会话处于断开状态USE学生name=space(8)@10,5SAY"请输入学生姓名:"GETnameREADLOCATEFOE姓名=name&&在学生表中查找该记录IFFOUND()DISPLAY&&找到了,输出该记录ELSE@12,5SAY"对不起,该单位无此人!"ENDIFSETTALKON&&程序执行完后,会话状态打开USERETURN例根据输入的学生姓名,在学生表中查找学生记录233.分支结构的嵌套格式如下:IF<条件表达式1>…IF<条件表达式2>…[ELSE…]ENDIF…ENDIF

注意:IF分支结构中IF和ENDIF语句必须成对出现,缺一不可。系统在执行分支结构的嵌套时,由IF语句的最内层开始,逐层将IF和ENDIF配对。3.分支结构的嵌套244.多路分支选择结构格式:DOCASECASE<条件表达式1><语句序列1>CASE<条件表达式2><语句序列1>…CASE<条件表达式n><语句序列n>[OTHERWISE<语句序列n+1>]ENDCASE功能:在执行DOCASE语句时,依次判断各<条件表达式>的值是否为真,若为真,则执行CASE语句下的语句序列,直到遇到下一个CASE、OTHERWISE或ENDCASE。

条件可以为关系表达式、逻辑表达式或其他逻辑量。4.多路分支选择结构25DOCASE---ENDCASE结构语句功能流程:条件1语句1YN条件2语句2YN条件3语句3YN语句N+1NDOCASE---ENDCASE结构语句功能流程:条件26例在学生表中,查询"周文杰"的记录,根据性别和年龄确定参加运动会的项目SETTALKOFFUSE学生LOCATEFOR姓名="周文杰"IF.NOT.EOF()&&指针不是位于表尾时,开始搜索记录DOCASECASE性别="男"?"请参加拔河比赛"CASE性别="女"ANDYEAR(date())-YEAR(出生日期)>25?"请参加投篮比赛"

CASE性别="女"ANDYEAR(date())-YEAR(出生日期)<=25?"请参加1500米比赛"ENDCASEELSE?"无此学生"ENDIFSETTALKONRETURN例在学生表中,查询"周文杰"的记录,根据性别和年龄确定参加运279.4循环结构程序

在处理实际问题中,常常需要重复执行某些相同的程序段。具有重复操作功能的程序称为循环结构程序。在编制程序时,重复操作的语句不必重复编写,只要用循环结构的方法来处理,便能实现重复操作。VisualFoxPro提供了条件循环、计数循环和扫描循环等循环语句。

1.条件循环DOWHILE…ENDDO语句在编程时,若不知道要重复执行多少次操作,则可设置一个条件,当条件的值为真时就循环,反之则退出循环。

DOWHILE<条件表达式>

<语句序列>

[EXIT]

<语句序列>

[LOOP]

<语句序列>

ENDDO9.4循环结构程序在处理实际问题中,28

说明:

(1)DOWHILE称循环入口语句,也称循环出口语句。ENDDO语句会自动将程序返回DOWHILE语句,再对<条件表达式>进行判断。

(2)有选项[LOOP]时,程序将无条件地返回到DOWHILE语句,重新判断<条件表达式>的值,LOOP:无条件循环命令

(3)有选项[EXIT]时,程序将无条件地退出循环,转去执行ENDDO后面的语句,退出DOWHILE循环,EXIT:无条件结束循环命令说明:29

功能:先判断<条件表达式>的值,当<条件表达式>的值为真时,反复执行DOWHILE与ENDDO之间的循环体语句,直到<条件表达式>的值为假时退出循环,转去执行ENDDO之后的语句

注意:(1)在循环前,必须先对循环变量赋初值。(2)在循环内,必须有一条能改变循环变量值的语句,以保证循环能够结束。(3)当DOWHILE后的<条件表达式>为逻辑常量.T.时,在循环体中一定要有EXIT语句,以保证能退出循环。

条件?重复内容含改变条件YN功能:先判断<条件表达式>的值,当<条件表达式>的值为30【例】从键盘输入一正整数N,编程计算S=1+2+3+…+N的值。分析:(1)键盘输入:用INPUT实现;(2)重复相加(循环内容):一般采用重复执行累加的方法来求和。先进行1+2,再加3,再加4,…;即用累加器形式:S=S+X;(3)初值问题:X为1、S为0;(4)终值问题(即循环条件):X小于或等于键盘上输入的数;(5)改变循环条件的语句:X=X+1(是循环内容);(6)输出问题:?S(体现在循环外)。【例】从键盘输入一正整数N,编程计算S=1+2+3+…+N的31程序代码如下:SETTALKOFFCLEARINPUT"请输入一个正整数:"TONX=1S=0DOWHILEX<=N &&条件X小于等于输入的NS=S+X&&累加求和X=X+1

&&求下一个X的值ENDDO?SSETTALKON程序代码如下:32

说明:(1)循环变量名由用户自行定义。(2)初值、终值和步长值可以是常量、变量或表达式。(3)当终值大于初值时,步长应为正,反之则为负,若省略步长,则默认为1。(4)执行FOR语句时,先用循环变量值与终值比较,若不超过终值,则执行循环体,反之则退出循环;退出循环时,循环变量值等于最后一次循环时的值加上一个步长值。(5)当执行到ENDFOR语句时,循环变量自动增加一个步长并返回FOR语句

说明:33

2.计数循环FOR…ENDFOR语句

若已知循环的次数及循环变量的步长,使用FOR循环会比DOWHILE…ENDDO循环更方便。‘

格式:FOR<循环变量>=<初值>TO<终值>[STEP<步长>]<语句序列>[<LOOP>]<语句序列>[<EXIT>]<语句序列>ENDFOR

功能:从循环变量的<初值>开始,重复执行循环体内的语句,每执行完一次,循环变量自动增加一个<步长>值,若循环变量值不超过<终值>,则继续循环,反之则退出循环。

2.计数循环FOR…ENDFOR语句34

说明:(1)循环变量名由用户自行定义。(2)初值、终值和步长值可以是常量、变量或表达式。(3)当终值大于初值时,步长应为正,反之则为负,若省略步长,则默认为1。(4)执行FOR语句时,先用循环变量值与终值比较,若不超过终值,则执行循环体,反之则退出循环;退出循环时,循环变量值等于最后一次循环时的值加上一个步长值。(5)当执行到ENDFOR语句时,循环变量自动增加一个步长并返回FOR语句

35

例判断以下for循环执行结果

FORk=1TO6STEP2j=kNEXT?j,k

&&程序的输出值是57

例判断以下for循环执行结果36

3.扫描型循环SCAN…ENDSCAN语句

处理表循环的专门语句结构,以实现对表记录的逐条扫描操作。有的操作需要对表中的记录逐条进行。用DOWHILE循环处理时,每循环一次,都要用条件“.NOT.EOF()”来测试记录指针是否到文件尾,并且在循环体中还要用命令SKIP来向下移动记录指针。用SCAN…ENDSCAN可以简化循环的操作步骤。格式:SCAN[范围][FOR<条件>]<语句序列>[<LOOP>]<语句序列>[<EXIT>]<语句序列>ENDSCAN3.扫描型循环SCAN…ENDSCAN语句37

功能:在当前表中对指定范围、满足条件的记录进行逐个记录的扫描操作,扫描结束自动退出循环。SCAN循环执行流程如下图:

说明:(1)循环时能自动向下移动指针,直至文件尾。(2)若指定了范围和条件,则对指定范围、满足条件的记录作扫描操作,若缺省范围和条件,则对所有记录进行扫描。(3)选项[LOOP]和[EXIT]的功能与DOWHILE循环结构相同。是表尾?重复内容自带SKIPNY功能:在当前表中对指定范围、满足条件的38

例对学生表分别统计少数民族男、女学生的人数

CLEARSTORE0TOx,yUSE学生SCANFOR少数民族否IF性别="男"x=x+1ELSEy=y+1ENDIFENDSCAN?"少数民族男生有:"+STR(x,2)+"人"?"少数民族女生有:"+STR(y,2)+"人"USERETURN

&&没有上级程序,则返回到命令窗口

例对学生表分别统计少数民族男、女学生的人数39

9.5程序的模块化

I.子程序

(1)概念

子程序是独立于主程序之外的一个程序文件。

(2)创建方法与建立程序文件的方法相同,扩展名仍是.prg。

(3)作用利用子程序,可以简化程序中多处重复出现完成相同功能的程序段的设计问题,在程序运行中,子程序可被多次调用。

格式:

DO<子程序名>[WITH<参数列表>]i.子程序的调用(出现在上级程序的语句)

格式:

DO<子程序名>[WITH<参数列表>]

功能:

在程序中运行到该语句时,转去执行指定的子程序,执9.5程序的模块化40

行结束后返回到调用语句的下一条语句继续往下运行。若选择[WITH<参数列表>],则将指定的参数传递到子程序中供其使用。ii.子程序的返回(出现在子程序最后的语句)格式:RETURN[TOMASTER]功能:RETURN将返回到主程序调用语句的下一条语句继续执行其他语句;RETURNTOMASTER将返回到最高层调用处。说明:在子程序运行中,若遇到以下情况都能自动结束并返回主程序:RETURN、RETRY、CANCEL、子程序的末尾。当遇到QUIT命令时,返回主程序后退出VisualFoxPro系统。

行结束后返回到调用语句的下一条语句继续往下运行。若选41

II.过程

在一个系统模块中,子程序存放在分散的程序文件中,虽然方便编辑和维护,但系统运行时,需要打开多个子程序文件,这样既增加了运行时间,又降低了系统运行效率。引入过程程序设计,可以弥补上述不足。1.过程的概念

过程是由PROC<过程名>和ENDPROC包围的程序段。它与子程序的功能相同,即把具有相对独立功能的常用代码集中在一起,供主程序在需要时调用。其基本格式为:PROCEDURE<过程名><语句序列>ENDPROC

过程可以独立保存在一个过程文件中,也可以放在主程序的后面。包含过程的文件称为过程文件,过程文件中的过程可以被多次调用。II.过程42

过程文件的格式为: PROCEDURE<过程名1> <语句序列> ENDPROC PROCEDURE<过程名2> <语句序列> ENDPROC PROCEDURE<过程名3> <语句序列> ENDPROC2.过程文件的调用(1)过程文件的打开(出现在上级程序中)SETPROCEDURETO<过程文件名>(2)过程文件的关闭(出现在上级程序中)SETPROCEDURETO或CLOSEPROCEDURE

过程文件的格式为:43

(3)过程的调用(出现在上级程序中)DO过程名WITH<参数列表>(4)接收参数(出现在过程程序中)PARA<变量名列表>注意:在调用过程文件之前必须先打开过程文件,但若过程包含在主程序中,则可直接调用。子程序与过程的区别:(1)子程序只能独立存在于一个程序文件中,在主程序中可以直接调用;(2)过程可与主程序放在同一个文件中。此时在主程序中可能直接调用;(3)过程也可独立于主程序之外,即放在一个过程文件中。此时则须先打开过程文件再调用。(3)过程的调用(出现在上级程序中)44

III.自定义函数

按一定格式、由用户定义(编写)的、可供主程序调用的程序段称为自定义函数。1.自定义函数的建立格式:

FUNCTION<函数名><语句序列>

ENDFUNC功能:将包含的<语句序列>定义为函数,并为其指定一个函数名。III.自定义函数45

说明:(1)<语句序列>的首条语句一般为:PARAMETERS<变量列表>用于指定接收参数的变量名。(2)<语句序列>的最后一条语句必须为:

RETURN<表达式>

当函数返回主程序时,函数值通过RETURN<表达式>后的参数传递给主程序中的调用函数。(3)自定义函数要保存在一个独立的程序文件中。主程序调用自定义函数时,必须先用命令:

SETPROCTO<自定义函数文件名>打开该函数所在的程序文件。说明:46

2.自定义函数的调用

格式:函数名(<参数>)

功能:返回自定义函数的函数值。

说明调用自定义函数步骤:

(1)须先在主程序中通过命令“SETPROCTO<文件名>”打开包含自定义函数的程序文件;

(2)再由“函数名(<参数>)”的格式获得函数值。例如,若定义了一个求圆面积的函数为SA(R),当求半径为50的圆面积可直接由?SA(50)而得出结果2.自定义函数的调用47

IV.参数传递与作用域

在一个系统模块的运行过程中,主程序与子程序之间通过相互传递参数来完成整体上的运行。一般主与子之间参数传递通过:

(1)内存变量的作用域属性。

(2)命令

DO<子程序名或过程名>WITH<参数列表>1.用内存变量作用域属性传递参数VFP中,内存变量具有4种作用域属性:自然属性、公用属性、私有属性和本地属性。(1)自然属性在程序中没有特别声明过,只是通过赋值或数组定义出现的变量都是自然属性的内存变量。具有以下特点:

①作用范围:作用于定义该变量的程序及其下属的子程序。

②传递方向:单向(主→子)传递。

③变量寿命:主程序运行结束该变量被自动删除。IV.参数传递与作用域48

2)公用属性

自然属性的变量受作用域、传递方向和使用寿命的限制,不能使变量在整个系统模块中共享。

VFP为用户提供了一种能在系统模块的所有程序中使用的变量,这种能被所有程序共享的变量,称为具有公用属性的内存变量。有以下特点:

①声明格式:PUBLIC<内存变量列表>ALL[LIKE<通配符>/EXCEPT<通配符>]

②作用范围:系统模块中的所有程序。

③传递方向:双向(主←→子);调用时将变量值带入,返回时带回最后改变的值。在任一级程序都可定义,上级或下级都能传递。

④变量寿命:主程序运行结束仍保留在内存中。说明:

2)公用属性49

①已用其他方法定义的变量不能再用PUBLIC定义,公共变量的初值为.F.。

②在子程序中定义的公共变量返回主程序时其值也能被带回。

③<内存变量表>中可以包括普通变量,也可以包括数组变量(P155)④任何全局变量必须先定义,后赋值⑤使用ALL选项时,定义所有内存变量,使用ALLLIKE<通配符>时,定义所有变量名与<通配符>匹配的内存变量,使用ALLEXCEPT<通配符>时,定义所有变量名不与通配符匹配的内存变量。通配符中有?和*⑥全局变量在程序结束时不释放,即使主程序也是这样⑦在命令窗口中建立的所有内存变量或者数组自动定义为全局型(3)私有属性

①已用其他方法定义的变量不能再用PUBL50

有时用户希望变量能在其所有的下属子程序中使用,而不希望与上级主程序共享,并且可以与上级主程序定义的变量同名,在运行时彼此不受影响。为实现这一目的,VisualFoxPro为用户提供了一种称为具有私有属性的内存变量。有以下特点:

①声明格式:PRIVATE<内存变量列表>或PRAVITEALL[LIKE<通配符>/EXCEPT<通配符>]ALL指上级程序中的所有变量都被屏蔽。

②作用范围:该程序及下级子程序。

③传递方向:主→子,与自然属性的变量相同。有时用户希望变量能在其所有的下属子程序51

(4)本地属性

有时用户需要变量只能在一个子程序或过程中使用,而不希望被上级主程序或下级子程序共享,运行时,当与上级主程序或下属子程序同名时,彼此不会受影响(即当与上级程序同名时,屏蔽上级程序中的同名变量值,当与下级程序同名时,则保持其原有的值)。这种类似于私有属性又不影响下属子程序中同名变量的属性称为本地属性。具有以下特点:

①声明格式:LOCAL<内存变量列表>

②作用范围:该程序本身。

③传递方向:无。

④变量寿命:程序运行结束被自动删除。

⑤特殊作用:可屏蔽上级程序与当前程序同名的变量,同时也不受下属子程序中同名变量的影响。若在一个程序中出现同一个变量具有两种属性,则赋值时相互不受影响。(4)本地属性52

注意:(1)不能在一个子程序或过程中重复定义,但在上级程序中用PUBLIC和PRIV定义过的变量仍可在子程序或过程中用LOCAL定义;(2)用LOCAL定义的变量初值为.F.。

2.用DO命令传递参数

用内存变量属性传递参数时,要求主、子程序使用的变量名一定要相同。若不想受变量名的限制,可用调用命令来传递参数。(1)传递参数格式:DO<文件名>WITH<参数表达式列表>说明:WITH后的参数可以是常量、变量或表达式。(2)接收参数的命令格式格式:PARAMETERS<变量列表>说明:PARAMETERS后的参数只能是变量名。注意:53

注意:

①传递参数的命令可以位于主程序中的任意位置;

②接收参数的命令必须出现在子程序或过程中可执行命令的第一行(3)参数传递的方式

有两种:即引用传递和值传递。i.引用传递(也称址传递)当WITH后为内存变量名时,则每个变量的值传给PARA中的对应变量,且随子程序中的对应变量的变化而变化。

子程序返回主程序时,将传回最后改变的变量值。ii.值传递当WITH后为常数、表达式或圆括号括起来的内存变量时,每个表达式的值传给PARA中的对应变量,但其值不随子程序中的对应变量的变化而变化。

程序返回主程序时,最后改变的变量值将不传回。

注意:54

在自定义函数中,默认的参数传递方式是值传递方式。要改变参数的传递方式,需要使用命令:

SETUDFPARMSTOVALUE|REFERENCE功能:该命令用于设置参数传递方式。选择VALUE,按值传递方式传递参数,选择REFERENCE,按地址传递方式传递参数。例.写出下列程序的输出

SETTALKOFFx=1y=3DOsubWITHx,(y),5&&传递了三个参数x,y,5;x是地址传递方式,y是值传递方式,5是常量?x,yRETURNPROCEDUREsubPARAMETERa,b,ca=a+b+cb=a+b-cRETURN

在自定义函数中,默认的参数传递方式是值传55

学习程序设计方法后,将用程序的方法来对表内容进行操作。其思想就是将在命令窗口中对表操作的步骤及使用的命令按编程的规则写到程序文件中,通过运行程序文件来实现对表内容的操作。

对表内容进行的基本操作有:打开表文件、输入表记录、移动数据记录指针、查询和显示表记录、修改或删除表记录等。涉及到的操作命令有:USE、LIST、LOCATE、GO、APPEND、DELETE和REPLACE等。

学习程序设计方法后,将用程序的方法来对表56

9.6程序调试程序设计是一项创造性的劳动,编好的程序难免会有这样那样的错误以及许多考虑不周的地方,所以程序的调试在程序设计中有非常重要的地位。vfp提供了功能强大的调试工具-调试器,可以帮助用户进行程序调试工作1.程序调试概述程序调试首先确定程序出错的位置,然后加以改正,一直到满足预定的设计要求为止。程序调试往往是先分模块调试,当各模块都调试通过后,在联合起来调试,通过联调后,便可试运行,试运行无误既可投入正常使用,

程序的错误有两类:语法错误和逻辑错误。语法错误相对容易发现和修改,当程序运行出现此类错误时,vfp会自动中断程序的运行,并弹出编辑窗口,显示出错的命令行,给出错误的信息,这时可以方便的修改错误,逻辑错误就不那么容易发现了,这类错误是系统无法确定的,只有由用户自己来查错。需要跟踪程序的运行,在动态执行过程中监视并找出程序中的错误。

9.6程序调试57

语法错误:指不符合语法规则产生的错误。例如,表达式不完整、缺少必要的标点符号、关键字输入错误、数据类型不匹配、循环语句或选择语句的关键字不匹配等。通常,编译器对程序进行编译的过程中,会把检测到的语法错误以提示的方式列举出来,又称为编译错误。语法错误的调试,可以通过集成开发环境提供的调试功能来实现,在程序进行编译时,编译器会对程序中的语法错误进行诊断。编译诊断的语法错误分为三种:致命错误、错误和警告

逻辑错误:程序运行后,没有得到设计者预期的结果。这说明程序存在逻辑错误。这种错误在语法上是有效的,但是在逻辑上是错误的。例如:使用了不正确的变量,指令的次序错误,循环的条件不正确,程序设计的算法考虑不周全等。通常,逻辑错误也会附带产生运行错误,在一般情况下,编译器在编译程序时,不能检测到程序中的逻语法错误:指不符合语法规则产生的错误。58

辑错误,也不会产生逻辑错误的提示,因此逻辑错误比较难排除,需要程序员仔细的分析程序,并借助集成开发环境提供的调试工具,才能找到出错的原因,并且排除错误

2.调试器窗口工具->调试器命令或者在命令窗口输入DEBUG命令,系统就可以打开调试器窗口

包括5个窗口(1)跟踪窗口(2)监视窗口(3)局部窗口(4)调用堆栈窗口(5)调试输出窗口3.设置断点

调试器窗口中包括4种类型的断点:

辑错误,也不会产生逻辑错误的提示,因此逻辑错误比较难59经常不断地学习,你就什么都知道。你知道得越多,你就越有力量StudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe写在最后经常不断地学习,你就什么都知道。你知道得越多,你就越有力量写60谢谢你的到来学习并没有结束,希望大家继续努力LearningIsNotOver.IHopeYouWillContinueToWorkHard演讲人:XXXXXX时间:XX年XX月XX日

谢谢你的到来演讲人:XXXXXX61VisualFoxPro程序设计教程E-mail:VisualFoxPro程序设计教程62第9章结构化程序设计9.1程序设计基础9.2顺序结构程序9.3选择结构程序9.4循环结构程序9.5程序的模块化9.6程序调试第9章结构化程序设计9.1程序设计基础63

vf执行命令的方式:通过使用菜单或者在命令窗口执行,还有一种程序工作方式:把有关的操作命令组织在一起,存放到一个文件中,发出调用该文件的命令后,vf就可以自动地执行该文件中的命令,直到全部命令执行完毕。vf执行命令的方式:通过使用菜单或者在命令窗口执行,649.1程序设计基础

1.程序设计的概念

程序设计:程序设计反映了计算机解决问题的全过程,包含多方面的内容,而编写程序只是其中一个方面。使用计算机解决实际问题,通常先对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法。并用某一种程序设计语言编写程序,最后调试程序使之产生预期的结果。拿到一个实际问题后,应对问题的性质与要求进行深入分析,从而确定求解问题的数学模型或方法,接下来进行算法设计并画出流程图。有了算法流程图,在来编写程序时很容易的事。所以编写程序之前,先要把解决的问题分析清楚例如,在学生表中,需要按照学号查询学生的姓名和入学成绩。根据表操作的有关知识,很容易写出算法:(1)打开学生表(2)输入待查学生的学号(3)查找学号所对应的记录(4)显示该记录的学号、姓名和入学成绩9.1程序设计基础65

用计算机解决问题时,必须先确定算法,然后根据算法编写程序,最后通过运行程序来达到解决问题的目的。算法的概念做任何事都有一个过程(应有序)。即在允许的范围内进行有步骤的若干个操作序列。如学生考试:①进入考场,按指定座位入座; ②填写考生相关信息; ③答题; ④检查; ⑤如有错,则修改; ⑥交卷。这种事先设计出“行动步骤”即解题操作序列称之为算法。通俗地说,算法就是在规定的环境下,为解决某一问题而采取的方法和步骤。

用计算机解决问题时,必须先确定算法,然后根据算法编写程序66实际应用中,需要按照流程图描述算法,显得直观、简洁。流程图有一般流程图、N-S图等。一般流程图用菱形框表示判断,用矩形框表示进行某种处理,用流程线将各步操作连接起来。也可以用其它形式的流程图描述算法。2.程序的控制结构任何程序都由3种基本控制结构组成。即顺序结构、选择结构和循环结构(1)顺序结构

顺序结构是程序设计中最基本、最常见的结构。顺序结构的程序始终是按照语句排列的先后顺序从上到下逐条顺序执行。(2)选择结构

利用计算机具有逻辑判断能力的特点,根据不同的逻辑条件转去执行不同的程序语句,这些不同的转向语句就构成了分支结构。(3)循环结构

实际应用中,需要按照流程图描述算法,显得直观、简洁。流程67

具有重复操作功能的程序称为循环结构程序。在编制程序时,重复操作的语句不必重复编写,只要用循环结构的方法来处理,便能实现重复操作。重复执行的部分称为循环体。循环结构分为当型循环和直到型循环。各种结构如p135

当型循环先判断条件是否满足,当条件P满足时反复执行A程序块,每执行一次测试一次P,直到P不满足为止,跳出循环体执行它下面的基本结构

直到型循环先执行一次循环体,在判断条件P是否满足,如果不满足则反复执行循环体,直到P满足为止。两种循环结构的区别在于:当型循环结构是先判断条件,后执行循环体,而直到型循环结构是先执行,后判断。直到型循环结构至少执行一次循环体,而当型循环可能一次也不执行循环体。

具有重复操作功能的程序称为循环结构程序。在编制程序时,重683.结构化程序设计方法结构化程序设计方法是被普遍采用的一种程序设计方法,是软件开发的重要方法,用这种方法设计的程序结构清晰,易于阅读和理解,便于调试和维护结构化程序设计方法采用自顶向下、逐步求精和模块化的分析方法。

自顶向下:指对设计的系统有一个全面的理解,从问题的全局入手,把一个复杂的问题分解成若干个相互独立的子问题,然后对每一个子问题做进一步的分解,如此重复,直到每个问题解决为止。

逐步求精:程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,在把每一个模块的功能逐步分解细化为一系列的具体步骤,以至于能有某种程序设计语言的基本控制语句来实现。逐步求精总是和自顶向下结合使用,一般把逐步求精看做自顶向下设计的具体体现。

3.结构化程序设计方法69

模块化是结构化程序设计的重要原则,所谓模块化就是把大程序按照功能分为较小的程序。一般来说,一个程序是由一个主控模块和若干个子模块组成的。主控模块是用来完成某些公用操作及功能选择,而子模块是用来完成某项特定功能。一个复杂的问题可以分解成若干个简单的子问题来解决。这种设计风格,便于分工合作,讲一个庞大的模块分解成若干个子模块分别完成,然后用主控模块控制、调用子模块。模块化结构如P136总之,结构化程序设计过程就是将问题求解由抽象逐步具体化的过程。这种方法符合人们解决复杂问题遵循的普遍规律,可以显著提高程序设计的质量和效率。

模块化是结构化程序设计的重要原则,所谓模块化就是把704.程序文件的建立与执行

在VFP中,程序是保存在一个扩展名为.prg的程序文件中,通过调用和执行该程序文件来运行程序。I.建立程序文件

可用如下操作之一:菜单方式:“文件”→“新建”→“程序”→“新建文件”按钮。常用工具:“新建”按钮→“程序”→“新建文件”按钮。项目管理器:选“代码”卡→“程序”项→“新建”按钮。

命令:MODIFYCOMMAND[<文件名>]|?MODIFYFILE[<文件名>]|?之后,系统打开程序文件编辑窗口依次输入程序代码。

说明:

(1)程序文件类型:.prg(可省略)。命令为file时不能省略扩展名

(2)保存文件的路径:用户指定或建立在VFP默认文件夹下。(3)文件名中可以包含通配符*和?,与文件名相匹配的文件都会被打4.程序文件的建立与执行71开,都拥有自己的编辑窗口,用户可以通过“窗口”菜单来选择所需要的窗口,最好在命令后加入文件名,可以直接建立或修改给出的文件,以后不需要在存盘时在输入文件名。(4)文件名将显示在“程序窗口”标题栏的左侧。

II.运行程序文件命令方式:DO<程序文件名>菜单方式:“程序”菜单→“运行”命令。工具方式(在程序打开的状态):单击常用工具栏的程序运行按钮!或按组合键CTRL+E。如果程序不带扩展名,vf将会按下列顺序寻找并执行这些程序:可执行文件(.exe)、应用程序(.app)、编译后的目标程序文件(.fxp)、程序文件(.prg)开,都拥有自己的编辑窗口,用户可以通过“窗口”菜单来选择所需72III.代码颜色VFP系统默认在程序代码中以绿色表示命令注释;蓝色表示命令关键字;黑色表示非命令关键字或者用户自定义使用的字符;红色则表示有语法错误的程序代码,提醒用户进行改正。如果用户要重新设置代码颜色,可以选择VFP系统“工具”菜单下面的“选项”命令,打开“选项”对话框,在“语法着色”选项卡中进行自定义设置。

III.代码颜色73IV.常用的命令当程序文件被执行时,文件中包含的命令将被依次执行,直到所有的命令被执行完毕。但当执行到程序文件中的以下命令时会终止执行或改变执行循序:CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口。DO:转去执行另一个程序。RETURN:结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回命令窗口。QUIT:退出VisualFoxPro系统,返回到操作系统IV.常用的命令749.2顺序结构程序程序文件中的一些辅助命令I.注释语句(1)程序注释语句格式:NOTE[<注释内容>]或*[<注释内容>]功能:注释说明。其后内容不需要用定界符定界,执行时也不显示。要单独成行。(2)语句行注释格式:&&[<注释内容>]功能:对语句进行注释。不可单独成行,须写在某语句之后。9.2顺序结构程序程序文件中的一些辅助命令75II.状态设置命令(1)设置会话状态格式:SETTALKON|OFF功能:是否关闭系统交互对话方式(默认打开的)。(2)设置屏幕状态格式:SETCONSOLEON|OFF功能:是否显示键盘的输入内容(默认是显示的)。如果要求输入的内容保密设置OFF状态。

(3)设置缺省驱动器和目录格式:SETDEFAULTTO[<盘符:>][<路径>]功能:设置输入/输出操作的缺省驱动器和目录。缺省时为当前目录。例:若打开或保存的文件都在D盘下的AA文件夹中,则可用命令:SETDEFAULTTOD:\AA

(4)设置独占方式格式:SETEXCLUSIVEON|OFF功能:设置是否以独占方式打开表文件(默认独占)。

(5)设置字符精确匹配格式:SETEXACTOFF|ON功能:设置=是否完全匹配(默认不完全匹配)。决定字符串比较符“=”两边内容是否完全匹配。II.状态设置命令76III.输入输出命令i.程序输出命令(1)格式:?/??<表达式1>[<表达式2>…](2)功能:该命令可以对<表达式>进行求值,并将结果输出到系统屏幕中,其中“?”表示换行显示结果,“??”则表示在同一行显示结果。?"今天是",date()ii.程序输入命令1)Accept命令(1)格式:Accept[<字符表达式>]To<内存变量>(2)功能:在VFP屏幕当前光标处显示<字符表达式>的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容以字符串的形式存储在<内存变量>中。Accept命令只能接受输入字符型数据,内容最多为256个字符,输入内容时不需要加字符定界符。III.输入输出命令77Accept"请输入内容:"toxyz?"你输的内容是:",xyz2)Input命令(1)格式:Input[<字符表达式>]To<内存变量>(2)功能:Input命令与Accept命令功能基本相同,都是在VFP屏幕当前光标处显示<字符表达式>的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容作为一个表达式进行处理,计算表达式的值,并将其存储在<内存变量>中。与Accept命令不同的是,Input命令允许输入各种类型的数据。

Input"请输入内容:"toxyz

?"你输的内容是:",xyz

Input命令也可以输入是字符型,逻辑型、日期型数据,但需加定界符

Accept"请输入内容:"toxyz78

字符型(“”''[])

逻辑型(.t..f.)

日期型({^1990-09-09})默认使用严格日期格式,在输入时也可用ctod将字符型的转换成日期型iii.Say命令(1)格式:@<行,列>[Say<表达式1>][Get<变量名>][Default<表达式2>](2)功能:该命令表示在屏幕窗口的指定位置中输出[Say<表达式1>]子句中的内容,等待用户的输入,按回车表示输入结束,系统会将用户输入的内容存储在[Get<变量名>]中。必须使用read命令激活当前所有get变量。@5,10say'输入半径:'getRdefault0readS=3.14*R*R?'圆的面积是:',S字符型(“”''[])794)Wait命令(1)格式:Wait[<字符表达式>][To<内存变量>][Windows[At<行>,<列>]][Nowait][Clear][Noclear][Timeout<数值表达式>](2)功能:在VFP程序文件的执行过程中,遇到Wait代码时暂停执行,并显示Wait<字符表达式>]指定的信息,用户按任意键或者单击鼠标后可以继续执行程序文件。Wait"谢谢使用VF系统!"Wait"谢谢使用VF系统!"windowsWait"谢谢使用VF系统!"windowsat5,5WaitIV.顺序结构程序

顺序结构是程序设计中最基本、最常见的结构。顺序结构的程序始终是按照语句排列的先后顺序从上到下逐条顺序执行。例.在学生表中,按照学号查询学生的姓名和入学成绩4)Wait命令80CLEARSETTALKOFFUSE学生ACCEPT"请输入待查学生的学号:"tobhLOCATEFOR学号=bh&&查找学号为bh的记录DISP学号,姓名,入学成绩USESETTALKONRETURN

CLEAR819.3选择结构程序

在解决实际问题中,往往需要根据给定的条件来决定应采取的处理方法。利用计算机具有逻辑判断能力的特点,根据不同的逻辑条件转去执行不同的程序语句,这些不同的转向语句就构成了分支结构。1.简单判断语句(IF…ENDIF)

格式:

IF<条件表达式>

<语句序列>

ENDIF

功能:先判断条件表达式的值,当其值为真时,则执行IF和ENDIF之间的命令序列;反之则转去执行ENDIF语句之后的语句。说明:<条件表达式>可以是各种表达式的组合,如关系表达式、逻辑表达式或者其他逻辑量。但表达式的返回值只能是逻辑值.T.或.F.。9.3选择结构程序在解决实际问题中,往往需要根据给822.二路选择分支结构(IF…ELSE…ENDIF)格式:IF<条件表达式><语句序列1>ELSE<语句序列2>ENDIF功能:先判断<条件表达式>,若其值为真,则执行<语句序列1>,然后转去执行ENDIF之后的语句;若其值为假,则执行<语句序列2>,然后转去执行ENDIF之后的语句。

条件?满足执行YN不满足执行2.二路选择分支结构(IF…ELSE…ENDIF)条件?满足83例根据输入的学生姓名,在学生表中查找学生记录

SETTALKOFF&&执行程序时,要求会话处于断开状态USE学生name=space(8)@10,5SAY"请输入学生姓名:"GETnameREADLOCATEFOE姓名=name&&在学生表中查找该记录IFFOUND()DISPLAY&&找到了,输出该记录ELSE@12,5SAY"对不起,该单位无此人!"ENDIFSETTALKON&&程序执行完后,会话状态打开USERETURN例根据输入的学生姓名,在学生表中查找学生记录843.分支结构的嵌套格式如下:IF<条件表达式1>…IF<条件表达式2>…[ELSE…]ENDIF…ENDIF

注意:IF分支结构中IF和ENDIF语句必须成对出现,缺一不可。系统在执行分支结构的嵌套时,由IF语句的最内层开始,逐层将IF和ENDIF配对。3.分支结构的嵌套854.多路分支选择结构格式:DOCASECASE<条件表达式1><语句序列1>CASE<条件表达式2><语句序列1>…CASE<条件表达式n><语句序列n>[OTHERWISE<语句序列n+1>]ENDCASE功能:在执行DOCASE语句时,依次判断各<条件表达式>的值是否为真,若为真,则执行CASE语句下的语句序列,直到遇到下一个CASE、OTHERWISE或ENDCASE。

条件可以为关系表达式、逻辑表达式或其他逻辑量。4.多路分支选择结构86DOCASE---ENDCASE结构语句功能流程:条件1语句1YN条件2语句2YN条件3语句3YN语句N+1NDOCASE---ENDCASE结构语句功能流程:条件87例在学生表中,查询"周文杰"的记录,根据性别和年龄确定参加运动会的项目SETTALKOFFUSE学生LOCATEFOR姓名="周文杰"IF.NOT.EOF()&&指针不是位于表尾时,开始搜索记录DOCASECASE性别="男"?"请参加拔河比赛"CASE性别="女"ANDYEAR(date())-YEAR(出生日期)>25?"请参加投篮比赛"

CASE性别="女"ANDYEAR(date())-YEAR(出生日期)<=25?"请参加1500米比赛"ENDCASEELSE?"无此学生"ENDIFSETTALKONRETURN例在学生表中,查询"周文杰"的记录,根据性别和年龄确定参加运889.4循环结构程序

在处理实际问题中,常常需要重复执行某些相同的程序段。具有重复操作功能的程序称为循环结构程序。在编制程序时,重复操作的语句不必重复编写,只要用循环结构的方法来处理,便能实现重复操作。VisualFoxPro提供了条件循环、计数循环和扫描循环等循环语句。

1.条件循环DOWHILE…ENDDO语句在编程时,若不知道要重复执行多少次操作,则可设置一个条件,当条件的值为真时就循环,反之则退出循环。

DOWHILE<条件表达式>

<语句序列>

[EXIT]

<语句序列>

[LOOP]

<语句序列>

ENDDO9.4循环结构程序在处理实际问题中,89

说明:

(1)DOWHILE称循环入口语句,也称循环出口语句。ENDDO语句会自动将程序返回DOWHILE语句,再对<条件表达式>进行判断。

(2)有选项[LOOP]时,程序将无条件地返回到DOWHILE语句,重新判断<条件表达式>的值,LOOP:无条件循环命令

(3)有选项[EXIT]时,程序将无条件地退出循环,转去执行ENDDO后面的语句,退出DOWHILE循环,EXIT:无条件结束循环命令说明:90

功能:先判断<条件表达式>的值,当<条件表达式>的值为真时,反复执行DOWHILE与ENDDO之间的循环体语句,直到<条件表达式>的值为假时退出循环,转去执行ENDDO之后的语句

注意:(1)在循环前,必须先对循环变量赋初值。(2)在循环内,必须有一条能改变循环变量值的语句,以保证循环能够结束。(3)当DOWHILE后的<条件表达式>为逻辑常量.T.时,在循环体中一定要有EXIT语句,以保证能退出循环。

条件?重复内容含改变条件YN功能:先判断<条件表达式>的值,当<条件表达式>的值为91【例】从键盘输入一正整数N,编程计算S=1+2+3+…+N的值。分析:(1)键盘输入:用INPUT实现;(2)重复相加(循环内容):一般采用重复执行累加的方法来求和。先进行1+2,再加3,再加4,…;即用累加器形式:S=S+X;(3)初值问题:X为1、S为0;(4)终值问题(即循环条件):X小于或等于键盘上输入的数;(5)改变循环条件的语句:X=X+1(是循环内容);(6)输出问题:?S(体现在循环外)。【例】从键盘输入一正整数N,编程计算S=1+2+3+…+N的92程序代码如下:SETTALKOFFCLEARINPU

温馨提示

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

评论

0/150

提交评论