《vfp程序设计》PPT课件.ppt
第九章第九章程序设计程序设计结构化程序设计功能模块(即过程、自定义函数)编制各个功能模块,再用主程序将它们串起来将应用程序分解成若干功能模块,通过各模块的相互调用来完成整个执行过程,是过程驱动的。面向对象程序设计类、对象、属性、事件、方法设计类、子类、对象(设计外观、设置属性、为事件编写方法程序)将应用程序分解成具有特定属性的对象,通过调用各对象的不同方法来完成相关事件,是事件驱动的。第九章第九章程序设计程序设计9.1程序的建立和执行程序的建立和执行9.2程序中的常用语句程序中的常用语句9.3顺序结构程序设计顺序结构程序设计9.4选择结构程序设计选择结构程序设计9.5循环结构程序设计循环结构程序设计9.6自定义函数、过程及其调用自定义函数、过程及其调用9.7程序的调试程序的调试9.8习题习题99.1程序的建立和执行程序的建立和执行9.1.1.基本概念程序:为解决某一问题而设计的一系列指令。主程序:通常被用户直接执行的程序。子程序:在程序中被调用的程序。源程序:由人用源语言编写的计算机程序,必须翻译成机器语言后才能被执行。目标程序:是源程序经过编译后所产生的机器语言程序。可执行程序:源程序被编译后产生的可被机器直接执行的程序,具有.EXE扩展名。在VFP中是指由项目管理器连编生成的、可脱离VFP环境运行的程序。应用程序:指为完成专门工作而设计的一组相互联系的例行程序和子程序。在VFP中是指一组VisualFoxPro程序、表单、菜单和其他文件经项目管理器连编后形成的单个程序,不能脱离VFP环境运行,扩展名为.APP。例行程序:按某种顺序排列的、使计算机能执行某种任务的指令集合,可以是一种专用的程序或作为程序的一部分。它可由若干个子程序组成。9.1程序的建立和执行程序的建立和执行9.1.2程序的建立和执行此前我们学习的命令,都是在交互状态下,输入一条命令即回车,马上即可见到结果。但这种工作方式不能完全满足我们的工作需要,有时,我们需要系统能自动、批量地完成一系列命令。在vfp中,这一功能可通过程序文件来完成。一、程序文件的建立:方式一:(1)在项目管理器中依次展开“全部”“代码”,选中“程序”,单击右侧的“新建”按钮。如图9-1所示。图9-1程序文件的建立图9-1程序文件的建立(2)在弹出的编辑窗口中输入代码,按ctrl+w保存,在“另存为”对话框中选保存位置,并输入文件名9.1程序的建立和执行程序的建立和执行9.1.2程序的建立和执行方式二:(1).使用命令,格式:modifycommand路径文件名(2).程序文件的执行:在命令窗口输入do文件名,回车。三.说明:程序文件的扩展名为.prg,使用命令创建和运行程序文件时,使用文件主名即可,扩展名系统自动会加上。四.使用命令编制一个程序文件并运行它1.输入命令modifycommandF:myvfpabc,弹出编辑窗口,如图9-2所示。图9-2使用命令编制程序文件2.在编辑窗口中输入两条命令,按ctrl+w保存图9-2使用命令编制程序件3.在命令窗口输入doabc命令运行程序文件abc.prg,会出现一个对话框,我们点了对话框中的“确定”后,系统就自动退出了,为什么会这样呢?程序文件执行时,会批量、依次执行文件中的命令.执行第1个消息框函数,程序进入暂停,等待用户选择。我们单击了“确定”按钮后,程序继续执行下一条命令“quit”,退出系统vfp支持3种基本程序控制构造:顺序结构,选择结构和循环结构。后面的章节将对其分别介绍。9.2程序中的常用语句程序中的常用语句一.屏幕输出语句:格式:?|?表达式功能:在屏幕上输出表达式的内容。1个问号为换行输出,2个问号为不换行输出【例9.1】编制1个命令文件text.prg,保存到f:myvfp中,统计“教师工资表”中的奖金和工资总额。程序文件内容:use教师工资表countalltomsumall工资ton?“奖金为:”,m?“工资总额为:”,n运行结果如图9-3所示。图9-3教师奖金工资统计结果9.2程序中的常用语句程序中的常用语句二.注释语句:格式:&注释内容功能:为程序中的语句作注释,注释内容不会执行。三.输入字符串语句:格式:accept字符串to内存变量功能:执行该语句时,暂停程序的运行,在屏幕上显示“字符串”的内容作为提示信息,等待用户通过键盘输入数据;输入数据后回车,输入的内容保存到指定的内存变量中,同时,程序继续向下执行。【例9.2】:编写命令文件test.prg,输入1个人名,在“学生情况表”中查询该学生的基本信息。程序文件内容:use学生情况表accept“请输入待查学生姓名:”tonamedisplay学号,姓名,性别for姓名=nameusereturn&该语句的功能是返回调用处运行结果如图9-4所示。图9-4查询学生的基本信息显示9.2程序中的常用语句程序中的常用语句四、输入表达式语句:格式:input表达式to内存变量说明:(1).该命令功能比accept强,accept只能输入字符型数据;而input可输入字符型、数值型、逻辑型和日期型。(2).使用input时,输入字符型数据时,必须加双引号等定界符;输入逻辑型数据时,要用圆点定界符(如.T.);输入日期型数据要用转换函数,如ctod(“11/15/2005”)。【例9.3】:编写程序文件test1.prg,输入1个工资,查询工资为此数值的有多少人。程序文件内容:use教师工资表input“请输入待查工资:”togzlist教师编号,工资for工资=gzusereturn运行结果如图9-5所示 图9-5工资查询显示9.2程序中的常用语句程序中的常用语句五.清屏语句:格式:clear功能:清除主屏幕上的显示信息。六.交互状态控制:格式:settalkoff/on说明:该命令规定是否将命令执行结果显示在屏幕上。默认为on,此时,每执行完1条命令,结果即显示在屏幕上;设置为off时,不显示执行结果。一般,我们在程序文件的开头都加上该语句,抑制显示中间结果。七.显示提示信息:格式:waitwindow提示信息字符串at行,列timeout秒数功能:在屏幕的指定位置出现提示窗口。例:在命令窗口输入如下命令回车:waitwindow“请等待”ATSROW()/2,(SCOLS()-LEN(M)/2在屏幕中央出现提示窗口,利用waitclear命令可将该窗口消除。说明:“timeout秒数”用于规定延时秒数,比如,我们输入waitwindow“请等待”ATSROW()/2,(SCOLS()-LEN(n)/2timeout3则提示窗口显示3秒后,自动关闭。八.返回语句:格式:return功能:返回调用处或命令窗口。该语句可省略,因为在每个程序执行的最后,系统都会自动执行1个return语句。9.3顺序结构程序设计顺序结构程序设计在顺序结构中,各种操作块按照出现的先后次序依次执行。9.3.1基本语句1、赋值语句在程序中若要使用(引用)变量,必须在使用(引用)前为变量设定一个初值,或者有时要改变它的现行值,这都需要给变量赋值。一般格式是:STORETO或=说明:(1)表达式可以是算术表达式、字符串表达式、日期表达式、关系表达式或逻辑表达式。(2)STORE可以给多个变量赋同一个值,=一次只给一个变量赋值。例如:STORE5TOX,Y,ZA=10(3)内存变量的类型由表达式的类型决定。(4)赋值号(=)不同于数学上的等号,A=5应读作“将数值5赋值给变量A”或“使变量A的值等于5”,下面的语句作用不同:x=yy=x(5)z=x+y不能写成x+y=z,赋值号左边只能是变量,不能是表达式。2、程序的注释(1)行首注释NOTE注释内容或*注释内容注释内容可以是任何文字,程序不执行以NOTE或*开头的语句,只起给程序说明的作用。(2)行尾注释&注释内容。9.3顺序结构程序设计顺序结构程序设计3、程序暂停语句WAIT提示信息TOWINDOWSATTIMEOUTn。说明:(1)“提示信息”是指要显示的自定义信息。若省略,则显示系统默认信息“请按任意键继续.”。(2)TO将按下的键以字符形式保存到变量中。(3)WINDOWSAT行,列指定显示信息的窗口在屏幕上的位置。若省略AT则在屏幕右上角。(4)TIMEOUTn指定在自动等待键盘或鼠标输入的秒数,必须放在语句最后。在n秒内没有按键或按鼠标,程序继续向下执行。4、程序结束语句RELEASE语句的格式:RELEASETHISFORMRELEASE方法的格式为:THISFORM.RELEASETHISFORMSET.RELEASE作用终止表单运行。9.3顺序结构程序设计顺序结构程序设计9.3.2程序举例下面是最简单的1种程序结构【例9.4】:顺序结构例程程序名为test2.prg。程序文件内容:settalkoffclearinput“请输入圆的半径:”tors=3.1415926*r*r?“圆的面积是:”,sreturn说明:执行程序时,屏幕上显示提示信息:请输入圆的半径。当用户键入半径并按回车时,vfp计算出圆的面积并显示在屏幕上。运行情况如图9-6所示。图9-6计算圆的面积9.4选择结构程序设计选择结构程序设计在科学计算中,只有顺序结构是不够的,只有能根据某个给定条件选择不同的执行流程才能真正体现计算机的另一大功能逻辑判断。实际应用中选择结构就是对指定的条件进行判断,如果条件成立,则执行指定的语句序列。在VFP中条件语句有二种:1、IFELSEENDIF2、DOCASEENDCASE这些语句又叫做条件语句。9.4选择结构程序设计选择结构程序设计9.4.1、单条件选择语句IF双分支结构格式一:IFENDIF执行过程是:如果所给定的条件为真,则执行“语句序列”,否则执行ENDIF之后的语句。流程图见图9-7。格式二:IFELSEENDIF执行过程是:如果所给定的条件为真,则执行“语句序列1”,否则执行“语句序列2”。流程图见图9-8。说明:(1)语句序列又可以是IF结构,称为IF语句的嵌套。(2)IF和ENDIF必须成对出现。图9-7单条件选择结构图9-8单条件选择结构条件语句序列TF条件A序列B序列TF9.4选择结构程序设计选择结构程序设计【例9.5】:设计1个名为test3.prg的查询程序,希望当待人不存在时有信息提示。程序文件内容:clearaccept“请输入待查人姓名”toxmlocatefor姓名=xmif.not.eof()displayelsemessagebox(“查无此人”)endifuseReturn运行结果如图9-9所示。图9-9无查询结果显示说明:程序执行时,执行locate命令时,记录指针从表的首记录一直找到最后1条记录都未发现该姓名记录时,记录指针才最后停在文件尾,此时eof()为真值;相反,若eof()取假值,则表示记录指针停在待查人的记录上。即当.not.eof()为真时,记录指针停在待查人的记录上,查到的指定的记录。也可用found()来代替程序中的.not.eof()。9.4选择结构程序设计选择结构程序设计2、IIF函数IIF函数可以实现一些简单的选择。其语法结构为:IIF(条件,表达式1,表达式2)说明:(1)当条件为真时,函数返回表达式1的值。(2)当条件为假时,函数返回表达式2的值。(3)Y=IIF(条件,表达式1,表达式2)相当于:IF条件Y=表达式1ELSEY=表达式2ENDIF。9.4选择结构程序设计选择结构程序设计9.4.2多分支条件选择语句DOCASE格式:DOCASECASE条件1语句序列1CASE条件2语句序列2OTHERWISE语句序列nENDCASE说明:(1)DOCASE、CASE、OTHERWISE和ENDCASE必须各占一行。DOCASE和ENDCASE必须成对出现。(2)在执行DOCASE语句时,依次判断各条件是否成立。若条件N成立,就执行相应的语句序列N,直到遇到下一个CASE或OTHERWISE或ENDCASE。(3)某一语句序列执行后,不再判断别的条件,直接转向ENDCASE后面的语句。因此,在一个CASE结构中,一次只执行一个语句序列。(4)如果没有一个条件成立,就执行OTHERWISE后面的语句序列,如果没有OTHERWISE就不作任何操作,就转向ENDCASE后面的语句。9.4选择结构程序设计选择结构程序设计【例9.6】:设计1个程序名为test4.prg,使用docase语句在“学生情况表”中按学号或姓名查询程序文件内容:clearuse学生情况表wait“请选择按姓名或按学号查询(M/X)”toxzdocasecasexz$“Mm”&此条件为真,说明选择了M,即按姓名查询accept“请输入待查人姓名:”toxmlocatefor姓名=xmcaxexz$“Xx”accept“请输入待查学号:”toxhlocatefor学号=xhotherwisewait“查询选择错误!按任意键退出!”windendcasedisplayusereturn运行结果如图9-10,图9-11,图9-12所示9.4选择结构程序设计选择结构程序设计图9-10按姓名查询结果显示图9-11按学号查询结果显示图9-12查询选择出错显示9.5循环结构程序设计循环结构程序设计前面我们学习的顺序结构和选择结构有一个共同点,即程序语句不能重复执行。在编程中常常遇到这样的情况:某一类问题的计算和处理方法完全一样,只是要要求重复计算多次,而每次使用的数据都按照一定的规律改变。程序设计中的循环结构(简称循环)是指在该程序中,从某处开始有规律地反复执行某一操作(或程序块)的现象。被重复执行的的部分称为循环体,循环体的执行与否及次数多少视循环类型与条件而定。当然,无论何种类型的循环,其共同特点是必须确保循环的重复执行能被终止(无死循环)。按照循环体执行的方式和条件,循环结构分为当型、直到型与步长型三种。由于“直到型”循环是“当型”循环派生出来的循环形式,二者可以互换,所以在VFP中只提供了“当型”和“步长型”和“表扫描型”三种循环语句:DOWHILEENDDO(当型)、FORRNDFOR(步长型)、SCANENDSCAN(表扫描型)。9.5循环结构程序设计循环结构程序设计9.5.1当型循环命令DOWHILE格式:DOWHILE语句序列EXIT语句序列LOOP语句序列ENDDO说明:(1)可以是条件表达式或逻辑常量。根据的逻辑值进行判断,若为真,则执行DOWHILE与ENDDO之间的循环体。若为假,则结束循环,转去执行ENDDO之后的语句。每执行一次循环体,程序自动返回到DOWHILE语句,判断一次。(2)EXIT是无条件结束循环命令。它使程序跳出循环,转去执行ENDDO之后的语句。(3)LOOP是无条件循环命令。它将控制直接转回到DOWHILE语句,而不执行LOOP和ENDDO之间的语句。(4)DOWHILE和ENDDO必须各占一行,且必须成对出现。9.5循环结构程序设计循环结构程序设计9.5.2步长型循环命令FOR若事先知道循环次数,则可以用步长型循环结构。步长型循环可以根据给定的次数重复执行循环体。其语法:FOR=TOSTEP语句序列EXIT语句序列LOOP语句序列ENDFOR说明:(1)是一个作为计数器的内存变量,在该结构之前可以不存在。是计数器的初值,是计数器值的增长或减小量。如果步长值是负数,则计数器是减小。如果少略STEP子句,则默认步长为1。(2)其余情况与DOWHILE结构相似。9.5循环结构程序设计循环结构程序设计【例9.7】:在屏幕上输出乘法口诀表程序名为test5.prg程序文件内容如下:?“九九乘法表”?fori=1to9forj=1toi?alltrim(str(i)+“*”+alltrim(str(j)+“=”+alltrim(str(i*j)+“”next?next运行结果如图9-13所示图9-13输出乘法口诀表9.5循环结构程序设计循环结构程序设计【例9.8】:求1!+2!+3!+20!的值。可在计算按钮的Click事件中编写如下代码:S=0FORN=1TO20T=1FORM=1TONT=T*MENDFORS=S+TENDFORTHISFORM.TEXT1.VALUE9.5循环结构程序设计循环结构程序设计9.5.3.表扫描型SCANENDSCAN格式:scan范围for条件语句序列endscan功能:对表中指定范围,满足条件的记录执行循环体语句,每执行一次循环,记录指针自动移动到下一条记录。操作表时,使用该语句功能强,效率高。【例9.9】:使用scan语句编程,显示“教师基本信息表”中的党员的姓名和职称。程序名为test6.prg。use教师基本信息表scanfor.not.党员否display姓名,职称endscanusereturn运行结果如图9-14所示。图9-14显示党员的姓名和职称9.6自定义函数、过程及其调用自定义函数、过程及其调用9.6.1自定义函数自定义函数是用户根据需要把特定的需重复调用的子程序编写成函数,这有别于VFP的标准函数。标准函数是VFP系统自带的,是开发VFP系统的设计人员设计的常用的某些固定的功能,用户可以直接调用。但它们的调用方法是一样的,即:函数名()。自定义函数的格式为:FUNCTIONPARAMETERSRETURN说明:(1)函数名指用户自定义的函数名,不能与系统函数名或内存变量名相同。(2)参数表是函数中使用的形式参数。(3)语句序列函数体语句。自定义函数可以放到过程文件中存储,也可以放到调用程序作为程序的一部分。若使用FUNCTION命令来指出函数名,表示该函数包含在调用程序中;若缺省FUNCTION行,表示该函数是一个独立的文件,函数名将在建立文件时确定,其扩展名仍然为.PRG。可使用命令MODIFYCOMMAND函数名建立或编辑自定义函数。自定义函数与系统函数的调用方法相同,其形式为:函数名参数表9.6自定义函数、过程及其调用自定义函数、过程及其调用9.6.2过程1.过程的概念:在程序设计时,常遇到这种情况,在同一个程序的不同处,或在不同程序中重复出现具有相同功能的程序段。如果每次都重复编写,将使程序变得十分冗长,而且浪费存储空间。解决这个问题的方法是单独设计这些共用程序段,需要时再调用。这些共用程序在有些高级语言中称为子程序,在vfp中称为过程。调用过程的程序就称为主程序或调用程序。调用程序与过程之间的关系是调用关系,调用的特点是:从调用程序中哪个地方调用过程,在执行完过程后将返回调用程序调用处的下一条语句继续执行。从结构和调用方法上看,过程分外部过程和内部过程。建立外部过程的方法与建立源程序(即程序文件)的方法完全相同,其扩展名也是.prg。内部过程是指调用程序尾部所附过程和过程文件中的过程。注意:过程文件现在已很少使用。9.6自定义函数、过程及其调用自定义函数、过程及其调用2内部过程的结构:程序尾部所附的过程和过程文件中的过程都属内部过程,其结构如下:PROCEDUREProcedureNamePARAMETERSParameterListCommandsRETURNeExpression说明:ProcedureName指定要创建的过程名PARAMETERSParameterList参数表,是过程中使用的形式参数,用于接收调用程序中传过来的实参表所对应的数据。Commands过程体语句。该命令的功能是在程序文件中标识一个过程的开始。过程作为程序的一部分时,通常列在程序的末尾。9.6自定义函数、过程及其调用自定义函数、过程及其调用3外部过程的结构:一个外部过程就是一个程序,在程序中用DO命令运行一个程序,就是过程调用,又称外部过程调用。被调用的程序必须有一条RETURN语句,以返回调用它的主程序。DO命令的格式如下:DOProgramName1|ProcedureNameINProgramName2WITHParameterList说明:ProgramName1指定要执行的程序名ProcedureName指定要执行的过程名INProgramName2执行有ProgramName2指定的程序文件中的过程。WITHParameterList指定要传给程序或过程的参数。ParameterList中的参数可以是表达式、变量、字母或数字、字段或用户自定义函数。RETURN命令的格式如下:RETURNeExpression|TOMASTER|TOProcedureName说明:eExpression指定返回给调用程序的表达式。TOMASTER将控制返回给最高层的调用程序。TOProcedureName将控制权返回给指定过程。该命令终止程序、过程或函数的运行,将程序控制权返回给调用程序、最高层调用程序、另一个程序或命令窗口。9.6自定义函数、过程及其调用自定义函数、过程及其调用9.6.3过程的调用在vfp中,无论内部过程还是外部过程,都可用do命令调用格式:do过程名with表达式表列【例9.10】:设计一个通过调用内部过程计算圆面积的程序。主程序的功能是输入圆的半径,并显示所求得的面积;内部过程的功能是计算圆的面积程序名为test7.prg。程序文件内容如下:clearinput“请输入圆的半径:”tor1s1=0doareawithr1,s1?“所求圆的面积=:”?s1returnprocedurearea&定义内部过程,过程名为areaparametersr,ss=3.1415926*r*rreturn运行结果如图9-15所示。图9-15计算圆的面积9.7程序的调试程序的调试9.7.1查错的常用方法。一、如果在我们程序中有语法性的错误,当程序运行到错误的语句时系统就会停下来,并提示我们程序有错,往往还会说出是什么错误,如“命令中含有不能识别的短语或关键字”,并给出选择“取消”、“挂起”、“忽略”、“帮助”四个选择如图9-16所示。图9-16程序中有语法性错误显示它们的意思分别是:取消中止程序运行,回到命令窗口,相当于执行了cancel命令,在程序中创建的所有变量被释放(除公共变量),但数据库及数据表一般保持当时的状态,您可以用browse命令查看数据表的内容即记录指针所在的位置等等;挂起暂停程序,相当于执行了suspend命令,这时程序中的所有变量都保持原值,您可以用?命令查看变量的值,当然也可以查看数据表的情况;忽略忽略所出现的错误,即跳过出错的语句继续执行后面的语句;帮助显示有关出错的帮助信息,对于错误做更详细的说明。不过很多时候都没什么帮助。9.7程序的调试程序的调试如果这时您一眼就能看出问题出在哪,那么您可以用取消,然后进到程序中找出错误所在,将其改正。在选择了取消后,可能这时有表单是打开的,那么用鼠标点一下该窗口,然后调菜单上的文件关闭。如果菜单是您自己的自定义菜单,用setsysmenutodefault回到系统菜单。改完后,再次运行程序前,最好将所有的数据库及表关闭,以免在程序打开一个数据表时出现表已打开的错误,比较好的办法是在程序开头先关闭所有的数据库及表。关闭所有数据库的命令是:closedatabasesall,关闭所有表的命令是:closetablesall。如果您不知道问题出在程序的哪个地方,那么就选择挂起,系统会弹出一个调试器窗口显示出错的语句,如图9-16,在跟踪窗口的黄色箭头所指的语句就是出错的语句。这时不要马上改程序,因为程序还没有结束运行,如要改程序应先终止程序运行,按调试中的终止按钮,然后退出调试器(菜单上的文件退出),接下来与上面选择取消后的处理方法相同。一般不要选择忽略,因为程序中上下语句都有很紧密的关系,当一条语句出错后,如果继续运行,可能会出现很多错误,而后面出错的语句可能并没有错,是因为前面错了才导致后面的语句出错,如果前面正确,后面也会正确,因此对于初学者来说,选择忽略不利于找出错误所在。9.7程序的调试程序的调试二、有些时候,程序中的语句并没有出错,但是运行的结果却不是我们所要的结果,这往往是因为我们用错了语句,虽然语句本身是正确的,但用在了不该用的地方、或者该用的地方没有用、又或者语句的先后顺序错了等等,都可能导致这种情况。一旦出现这种情况往往比上一种情况麻烦些,不容易一下看出问题出在哪里,那么需要我们仔细分析程序中的语句,看是否用的对,是否达到了我们的要求。比如在我们前面九九乘法管理程序中,在程序的开始多了一条“i=1”语句,导致运行的结果出错。图9-18程序中用错了语句有时光看语句,怎么也看不出问题在哪,这就用采用一些辅助手段,最常用的辅助手段是在可能发生问题的地方将程序挂起,即在程序中加一句suspend,当程序运行到这里时将程序挂起,然后在命令窗口中查看各有关变量的值或数据表的情况。另外在程序挂起时我们可以调出调试器,看程序执行到什么地方。调的方法是在菜单上的工具调试器,可以在其中的监视窗口查看各表达式的值,在局部窗口查看各变量的值,而且您可以在窗口中长条文本框(如图9-19)中输入一个表达式或变量,调试器会显示出它们的值。9.7程序的调试程序的调试图9-18程序中语句用错了图9-19调试器中的监视窗口如还不能找到问题,按可单步执行程序,即按一下运行一条语句,这样可以更有助于找到问题。9.7程序的调试程序的调试9.7.2常见错误启动一个表单后,再用代表这个表单的变量去调用它时却不行。调用表单的变量与其它变量一样,如是在一个子程序中创建的,当这个程序运行结束后,这个变量也就释放了,即这个变量不再存在了,虽然表单还在,故不能用这个变量去调用该表单了。解决的方法是将其设为公共变量,或在更高层的程序中创建,还可以在调用表单命令中加上“linked”子句(doform.name.linked)。常常在表格中或其它地方看不到数据表中的记录。这往往是因为记录指针到尾部,即EOF()真。修改记录时却修改了另一个记录。这往往是因为进入修改后又做了查询,查询后没有将记录指针返回到原记录。进入一个循环后就死机了。这是因为没有设置跳出循环的条件,或者条件永远不能满足,比如一个循环的跳出条件是当一个变量的值达到某一数值,每循环一次应将该变量加1,但忘了加1的语句,就会造成死循环,因为变量的值永远达不到预定的数值。查询英文时,明明有的记录查不到。这可能是大小写不一样造成的,比如:locateforname=“crops”,如果数据表中的是“CROPS”那么就查不到。解决的办法:locateforupper(name)=“CROPS”。不管是英文还是中文,还是查不到所要的记录。这种情况很可能是输入的查询值后面有空格,比如上面那个查询语句,如果操作者不小心在文本框中输入了“crops_”(下划线代表有一个空格),而这个空格往往是不容易被发现的,那么查询时就可能找不到,除非数据表中的数据也刚好是这样,这里要注意一点一个字符字段的内容如小于字段的长度,系统会自动为该字符后面加上空格,比如上面那个例子,如果name的长度是8,则“crops”这个记录name的值就是“crops_”(后面有三个空格),那么有三个空格和有一个空格就不相等。解决的办法是用trim()函数将输入的查询值后面的空格去掉,更进一步,为了防止不小心前面也加了空格,可用alltrim()将前后的空格都去掉。当在数据表中移动记录指针等操作时出现意想不到的错误。往往是因为没有记录。习题习题9一、选择题一、选择题1在VisualFoxPro环境下,执行命令文件exp.prg可以在命令窗口中输入命令_。.DOexp.exp.prg.exp.exe.DOexp.exe2在FOR.ENDFOR循环结构中,如省略步长则系统默认步长为()A.0B.-1C.1D.23在DOWHILE循环中,若循环条件设置为.T.,则下列说法正确的是()A.程序一定出现死循环B.程序不会出现死循环C.在语句组中设置EXIT防止出现死循环D.在语句组中设置LOOP防止出现死循环4.以下程序的运行结果为()X=1.5docasecasex2y=2casex1y=1endcasereturnA.1B.2C.OD.语法错误习题习题95循环结构中EXIT语句的功能是()A,放弃本次循环,重新执行该循环结构B,放弃本次循环,进入下次循环C,退出循环,执行循环结构的下一条语句D,退出循环,结束程序的运行6下列程序段有语法错误的行为第()行1ifb*b-4*a*c02s=sqrt(d)3elses=sqrt(-d)4endifA.1B.2C.3D.47下列程序段有语法错误的行为第()行1forI=1.50to12.34step0.832I=I+13nextA.1B.2C.3D.无8以下关于循环的叙述正确的有()A.循环语句的入口语句与出口语句必须配对出现B.循环体可以为空C.三种循环语句各有分工,不能相互转换D.循环体的执行次数不能也不可能为0次习题习题99下列程序段有语法错误的行为第()行1docase2casea03s=14else5s=06endcaseA.2B.4C.5D.610设有下列程序段:1dowhile2dowhile3enddo24exit5enddo1则执行到exit语句时,将执行()A.第1行B.第3行的下一个语句C.第2行D.第5行的下一个语句11执行下列命令后:D=*?5&D8=+STR(5&D8,2)命令?输出的值为()A.5&D8=0B.5&D8=40C.5*.8=4.0D.5*8=40习题习题912执行下列命令后:XYZ=123.456CH=XYZ?INT(CH)命令?输出的值为()A.0B.123.456C.123D.出错13.以下循环体共执行了()次ForI=1to10?II=I+1EndforA10B5C0D语法错14有关LOOP语句和EXIT语句叙述正确的是()A.LOOP和EXIT语句可以写在循环体的外面B.LOOP语句的作用是把控制转到ENDDO语句C.EXIT语句的作用是把控制转到ENDDO语句D.LOOP和EXIT语句一般写在循环结构里面嵌套的分支结构中习题习题915阅读程序,正确的运行结果是()DOWHILENOTEOF()LOCATEFORXB=“男”DISPLAYCONTINUEENDDOA.程序出错B.屏幕上显示STUDENT.DBF数据库中所有性别为男的记录C.屏幕上显示STUDENT.DBF数据库的所有记录D.程序死循环,屏幕上一直显示STUDENT.DBF数据库的第一条性别为男的记录16阅读程序,正确的运行结果是()CLEAUSEstudentINDEXONxbTOxbindexSEEK男DOWHILENOTEOF()DISPLAYSKIPENDDOA.程序出错B.屏幕上显示STUDENT.DBF数据库中所有性别为男的记录C.屏幕上显示STUDENT.DBF数据库的所有记录D.程序死循环,屏幕上一直显示STUDENT.DBF数据库第一条性别为男的记录习题习题917.有关SCAN循环结构,叙述正确的是()A.SCAN循环结构中的LOOP语句,可将程序流程直接指向循环开始语句SCAN.首先判断EOF()函数的真假B.在使用SCAN循环结构时,必须打开苛一个数据库C.SCAN循环结构的循环体中必须写有SKIP语句D.SCAN循环结构,如果省略了SCOPE子句、FOREXPLL和WHILEEXP12条件子句,则直接退出循环18有关FOR循环结构,叙述正确的是()A.对于FOR循环结构,循环的次数是未知的B.FOR循环结构中,可以EXIT语句,但不能使用LOOP语句C.FOR循环结构中,不能人为地修改循环控制变量,否则会导致循环次数出错D.FOR循环结构中,可以使用LOOP语句,但不能使用EXIT语句19FoxPro的应用程序由三种基本结构组合而成,它们是()A.顺序结构.选择结构和循环结构B.顺序结构.循环结构和模块结构C.逻辑结构.物理结构和程序结构D.分支结构.重复结构和子程式结构20在vfp的“程序”单中选择“运行”命令,被执行文件的扩展名不能为()A.prgB.sprC.pjxD.fxp习题习题921.下列关于过程的说法中不正确的是()A.过程文件可以放在任何程序文件代码的后面,也可以保存在称为过程文件的单独文件里B.过程文件只包含过程,这些过程只能被过程文件调用C.如果需要打开多个过程文件,可以在调用过程语句中加ADDITVE,那么在打开过程文件时,并不关闭原先已打开的过程文件D.关闭个别过程文件的命令格式是:RELESEPROCEDURE22有VisualFoxPro程序如下:SETTALKOFFUSECJM-ZF=0DOWHILE.NOT.EOF()M-ZF=M-ZF+ZFSKIPENDDO?M-ZFRETURN其中数据库文件CJ.DBF中有2条记录,内容如下:XMZF1李四500.002张三600.00运行该程序的结果应当是A.1100B.1000C.1600D.1200习题习题923在D盘的根目录下新建一个名为AA的程序文件,应在命令窗口键入哪条命令,打开程序编辑窗口()Amodifycommandd:aaB.modifycommandaaCcreated:aaD.createaa24本程序运行后,输出结果是()a=10c=db=11a=cc=12endifd=13?aifbaA.10B.11C.12D.1325本程序是否有错,如果有错,是什么类型的错误()。r=6s=3.14*r*h?“圆面积=”,sA.本程序正确B.语法错误C.逻辑(语序)错误D.该程序太大,超出2GB,无法运行习题习题926正确地编辑并运行了一个VFP程序文件后,在程序所在文件夹会发现有几个主名相同的文件?它们的扩展名都是什么()。A3个文件,它们的扩展名分别是.dbf.fpt.bakB1个源程序文件,即.prgC3个文件,它们的扩展名分别是.prg.fxp.bakD.1个目标程序文件,即.fxp27编写程序时,为了以后阅读修改程序方便,可以在写源程序时加入注释。必须要在注释信息前加上规定的符号(),使注释信息变为绿色,方不被程序执行。AB!C&D&或*28.程序的控制结构有几种()。A.3种:顺序结构,分支结构,循环结构B.3种:单分支结构,双分支结构,多分支结构C.程序多种多样,结构有无限多种D.1种:多分支结构29下面这个语句系列是什么类型的循环语句结构()DOwhile.EnddoA.步长循环B.条件循环C.扫描循环D.非循环习题习题930.下面这个语句系列是什么类型的循环语句结构()For.Endfor/nextA.步长循环B.条件循环C.扫描循环D.非循环31.下面这个语句系列是什么类型的分支结构()If.else.EndifA.双分支B.单分支C.不是分支语句D.多分支32.下面这个程序,如果程序执行了Loop语句,下一步执行哪一句()store0toi,s,tdowhilei100i=i+1s=s+iifint(i/2)=i/2loopendift=t+ienddoA.endifB.ifint(i/2)=i/2C.store0toi,s,tD.dowhilei100习题习题933VisualFoxPro中程序文件的扩展名是_。A.IDXB.PRGC.EXED.DBF34.函数实质上就是具有特定功能的程序。VFP自带了200多个函数,此外,我们还可以通过编程的方式创造新的函数,这个新的函数叫做()A.子程序B.过程C.自定义函数D.系统函数35.在主程序中,调用子程序的命令是()A.goB.toC.seekD.do36在VFP环境下,调出程序调试器的方法有2种,即()A.菜单“文件/打开”;菜单“显示/浏览”B.菜单命令“工具/调试器”;或在命令窗口键入debugC.菜单命令“工具/调试器”;或在命令窗口键入editD.菜单命令“工具/调试器”;或在命令窗口键入modify37结构化程序设计常用有3种方法,即()A.顺序结构,分支结构,循环结构B.程序,模块,命令C.录入,调试,运行D.自顶向下,模块化,层次化习题习题938本程序是求N!(N的阶乘)的值,留有一句未写,请选择一个答案。SETTALKOFF_FORY=1TONP