版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章结构化与面向对象程序设计基础
第6章结构化与面向对象程序设计基础
16.1结构化程序设计的基本概念
程序是一组能够完成特定任务的命令序列的集合。这些命令按照一定的逻辑顺序有机地结合在一起,并以文件形式存储在磁盘上,这种文件称为程序文件或命令文件,VFP中其扩展名为.PRG。执行程序时,计算机按程序的逻辑顺序自动执行程序文件中的命令。与在VFP的命令窗口逐条输入命令相比,采用程序方式的好处有:可利用编辑器方便地输入、编辑和保存程序。可采用多种方式、多次运行程序。可以实现程序代码的复用。6.1.1程序6.1结构化程序设计的基本概念
程序是一组能2【例6.1】编写程序文件exam6_1.prg实现例4.31。*显示学生选课成绩表xkcjb.dbf中当前记录的学号、课程号和成绩字段的值CLOSEALL&&关闭所有打开的文件SELECT2USEdab&&选择2号工作区打开dab表SELECTCUSEkcb&&选择3号工作区打开kcb表USExkcjbIN5&&在5号工作区打开xkcjb表?xkcjb.学号,b.姓名,xkcjb.课程号,xkcjb->成绩CLOSEALL&&关闭所有打开的文件RETURN【例6.1】编写程序文件exam6_1.prg实现例4.313在命令窗口中执行MODIFYCOMMANDexam6_1命令后,弹出代码编辑窗口,在该窗口中输入上述程序代码并保存。在命令窗口输入:DOexam6_1,程序执行结果为:2005001000138.0从该例子可以看出:程序代码保存在一个程序文件exam6_1.prg中,可以多次执行。在命令窗口中执行MODIFYCOMMAND4
1)算法的概念及特点要编制一个程序,必须首先构建解决问题的算法。所谓算法(Algorithm)就是对解决问题所采用的方法和步骤的描述。6.1.2算法及算法的表示【例6.2】输入3个数,找出其中的最大值并输出。分析:假设这3个数分别用a、b、c表示,最大值用max表示。由于计算机一次只能比较2个数,首先可以将a和b进行比较,把其中大的数放入max中,再将max与c比较,又将大的数放入max中,最后将max输出。此时max中的值就是a、b、c中的最大值。1)算法的概念及特点6.1.2算法及算法的5可以将求解这一问题的算法描述为:第1步:输入a、b、c。第2步:将a、b中大的一个数放入max中。第3步:将c与max中大的数放入max中。第4步:输出max。从该例子可以看出,算法是对一个问题的解决方法和步骤的描述,是一个有穷规则的集合。一个算法应该具有以下特点:
①确定性。一个算法给出的每个计算步骤都必须是准确的、无二义性。在【例6.2】中每一个步骤的含义都是确定的。可以将求解这一问题的算法描述为:从该例子可以6
②有穷性。一个算法必须在执行有穷多个计算步骤后终止。在【例6.2】中执行4个步骤后问题处理结束。
③有效性。算法中的每一个步骤必须能够有效地执行,并能够得到确定的结果。
④输入。一个算法可以有0个或1个以上的输入。在【例6.2】中需要输入a、b、c3个数。
⑤输出。一个算法有1个或多个的输出,一个算法得到的结果就是算法的输出。在【例6.2】中输出的是max。②有穷性。一个算法必须在执行有穷多个计算步骤后终止。在7任何一个问题能否让计算机处理,关键在于能否设计出合理的算法,有了合适的算法,再使用合适的计算机语言来编写程序。VFP就是一种语言工具。要用VFP编写出高质量的程序,一方面要构建合理的算法,另一方面要掌握VFP的语法规则,它是实现算法的基础。任何一个问题能否让计算机处理,关键在于能否设计8
2)算法的描述算法的描述方法有很多,如自然语言、伪代码、流程图等。为直观、准确地表示一个问题的处理方法和步骤,通常采用流程图的方法。流程图是用一些几何图形符号、线条及文字说明来表征一个问题的处理过程。一般采用传统流程图和N-S图来描述算法。实现【例6.2】的算法所对应的传统流程图如图(a)所示、N-S图如图(b)所示。2)算法的描述9输入a,b,c开始输入a,b,c将a,b中大的数放在max中将c,max中大的数放在max中输出max开始输出max将c,max中大的数放在max中将a,b中大的数放在max中(a)(b)输入a,b,c开始输入a,b,c将a,b中大的数放在max中10
3)3种基本结构的表示1966年,Bohra和Jacopini提出了程序的3种基本结构:顺序结构、选择(或分支)结构、循环结构,它们构成了实现一个算法的基本单元。顺序结构:是一种最基本、最简单的程序结构。如下图所示,先执行A,再执行B,A与B按照顺序执行。ABAB(a)流程图(b)N-S图3)3种基本结构的表示ABA(a)流程图11选择(或分支)结构:根据条件是否成立而执行不同的程序模块。在下图中,当条件P为真时,执行A,否则执行B。即要么执行A,要么执行B。PTFAB条件pABYN(a)流程图(b)N-S图选择(或分支)结构:根据条件是否成立而执行不同的程序模块。在12循环结构:是指重复执行某些操作,重复执行的部分称为循环体。如图所示为当型循环结构,当条件P为真时,反复执行A,直到条件P为假时才终止循环。其中A是循环体,A被重复执行的次数称为循环次数。循环结构除当型循环外,还有直到型循环。条件PAN
条件PAY(a)流程图(b)N-S图循环结构:是指重复执行某些操作,重复执行的部分称为循环体。如13结构化程序设计方法是一种自顶向下、逐步求精、模块化的程序设计方法。结构化程序设计方法的思想,就是将给定的一个功能较多的复杂问题合理地划分为若干个较简单的子问题,还可以将这些子问题再分解为若干功能更简单的子任务(可将每个子任务看作一个模块),以便于“分而治之”。如下图表达了一个较复杂问题的模块分解过程。6.1.3结构化程序设计方法概述问题C1问题A问题B1问题B2问题Bn…问题C2问题Cn…结构化程序设计方法是一种自顶向下、逐步求精、模块14在模块划分时,应该尽可能地保证数据的独立性和模块功能的唯一性。也就是说,各模块间的耦合性要尽量弱,即一个模块最好像是一个黑盒子,模块间的数据交换要尽量少;模块的内聚性要尽量强,即每个模块只完成单一的功能。采用结构化程序设计方法的好处是:可以使每个模块功能明确,模块间的关系简单、清晰(即可读性强),每个模块内部的修改尽可能不影响其他模块(即独立性好),同时每个模块的正确性容易验证(即可维护性好)。在VFP中,程序模块化是通过编写子程序、过程、函数来实现的。在模块划分时,应该尽可能地保证数据的独立性和模块功能156.2程序文件的建立、编辑、修改与执行
在VFP中,建立和编辑程序文件可以采用多种文本编辑工具实现,这些文本编辑工具可以是VFP系统提供的内部编辑器,也可以是其他常用文本编辑软件。一般在代码编辑窗口中编辑程序代码。在VFP系统环境下,建立和编辑程序文件有多种方法,在此主要介绍以下3种方式。
6.2.1程序文件的建立、编辑与修改6.2程序文件的建立、编辑、修改与执行
在V161)在项目管理器中创建程序文件如果要让程序包含在一个项目文件中,可在项目管理器中建立程序文件。在上图所示的【项目管理器】中,选择【代码】选项卡中的“程序”项,单击【新建】按钮,进入代码编辑窗口,输入程序内容,如右图所示。1)在项目管理器中创建程序文件在上图所示的【项17
2)用菜单方式新建程序文件在【文件】菜单中选择【新建】菜单选项,在出现的【新建】对话框中选择“程序”文件类型,再单击【新建文件】按钮即可进入代码编辑窗口编辑程序代码。如果要修改已有的程序文件,则在【文件】菜单中选择【打开】菜单项,这时弹出一个包含文件列表的对话框。在【文件类型】列表框中选择“程序”,然后在文件列表中选定要修改的程序文件,单击【确定】按钮即可。2)用菜单方式新建程序文件18
3)用命令方式新建程序文件
格式:MODIFYCOMMAND[<文件名>]|?例如,在命令窗口中输入“MODIFYCOMMANDsearch”命令(如图6.8所示),即可打开代码编辑窗口。如果程序文件不存在,系统就自动建立一个指定名字的新程序文件;如果文件已存在,则将打开该程序文件。
3)用命令方式新建程序文件19用上述3种方法之一创建程序文件后,必须在代码编辑完毕时,保存文件。其方法是选择【文件】菜单下的【保存】或【另存为】命令进行保存;也可以利用“Ctrl+W”组合键进行保存,程序将保存在当前盘的当前路径下(注意:“Ctrl+Q”组合键放弃存盘)。用上述3种方法之一创建程序文件后,必须在代码编20程序文件创建之后便可执行,执行程序文件的方法有:①若程序文件包含在一个项目中,则在【项目管理器】中,打开【代码】选项卡,展开“程序”项,选定程序文件,单击【运行】按钮。②在【程序】菜单中选择【运行】菜单项,在弹出的对话框中选定要运行的程序文件,单击“运行”按钮。③在【命令】窗口中,输入命令:DO<程序名>[WITH<参数表>]。6.2.2执行程序文件程序文件创建之后便可执行,执行程序文件的方法有:6216.3程序中常用命令
输入/输出处理是计算机和用户打交道的接口,是程序设计过程中不可缺少的组成部分。处理过程中的原始数据或用户的要求都需要通过输入语句来输入,而处理结果又通过各种形式的输出语句来输出。在VFP中用于输入、输出的命令很多,在此只介绍几个常用的命令。6.3.1基本的输入/输出命令6.3程序中常用命令
输入/输出处理是计算221)INPUT命令格式:INPUT[<提示信息>]TO<内存变量>功能:在屏幕上显示[<提示信息>],并等待用户通过键盘输入表达式,再把表达式的值赋给指定的<内存变量>。例如:s=75inputtoa?"a=",a执行上述命令,若输入的内容为s+20,则输出结果为:a=95这表明变量a接收的是表达式的值。1)INPUT命令例如:s=75232)ACCEPT命令格式:ACCEPT[<提示信息>]TO<内存变量>功能:该命令和INPUT类似,不同的是它会把输入内容作为字符串常量赋值给指定的<内存变量>。例如,把上例中的input改成accept:s=75accepttob?"b=",b执行上述命令,若输入的内容为s+20,则输出结果为:b=s+20这表明变量b接收的是字符串“s+20”。说明:这两个命令中的<提示信息>可以缺省。当提示信息缺省的时候,则直接等待用户输入。2)ACCEPT命令例如,把上例中的input改成ac243)WAIT命令格式:WAIT[[<提示信息>]TO<内存变量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<数值表达式>]功能:该命令的作用是暂停程序的执行,直到用户按任意键或单击鼠标或等待输入一个字符(可存入指定的内存变量)或在指定时间内继续程序的执行。3)WAIT命令25
说明:在该命令中,若选用WINDOW,则会出现一个用于显示提示信息的WAIT提示窗口,通常位于主窗口的右上角。若需指定提示窗口的位置时,可使用AT实现;若同时选用NOWAIT和WINDOW,则程序不等待用户按键就继续执行;若选用NOCLEAR,则不关闭提示窗口,直到执行下一条WAITWINDOW或WAITCLEAR为止;若选用TIMEOUT,则在超过设定等待时间后程序自动继续执行。
例如:若在主窗口的10行、20列处显示提示信息“输入无效,请等待重新输入…”,10秒钟后自动关闭提示窗口,程序继续执行。可使用命令:WAIT“输入无效,请等待重新输入…”WINDOWTIMEOUT10AT10,20。说明:在该命令中,若选用WINDOW,则会出现一个用264)基本输出命令?|??格式:?|??<表达式1>,[<表达式2>…]功能:计算给定的一个或多个表达式的值,并将结果显示在屏幕上。说明:“?”表示在当前光标的下一行输出,而“??”表示在当前光标位置处输出。4)基本输出命令?|??27在程序中,有一些专门用于程序开始和结束、对程序进行注释以及环境设置的命令,常用的有:
1)注释命令为了提高程序的可读性,编写程序时可在程序中适当加上一些注释。注释命令在执行时不做任何操作,也不影响程序的功能。
格式1:NOTE[<注释内容>]格式2:&&[<注释内容>]格式3:*[<注释内容>]功能:用于在程序中加入说明,以增加程序的可读性。
说明:NOTE和*命令用于行首注释,而&&命令通常用于行尾注释。6.3.2程序文件中的辅助命令在程序中,有一些专门用于程序开始和结束、对程序进28
2)程序结束命令VFP的应用程序可以根据需要终止执行并返回命令窗口,返回操作系统或返回到调用它的上一级程序或主程序。
格式1:CANCEL功能:结束当前VisualFoxPro程序的执行。
格式2:RETURN[TOMASTER]功能:结束当前程序的执行,返回到调用它的上一级程序。带TOMASTER选项表示直接返回到主程序。
格式3:QUIT功能:关闭所有文件,退出VFP系统,返回到操作系统。2)程序结束命令293)清屏命令命令格式:CLEAR功能:清除屏幕内容。4)SETTALKON/OFF功能:控制非输出性的结果是否在屏幕上显示出来。系统默认值为ON。5)SETSAFETYON/OFF功能:确定在改写已有文件前,是否显示提示对话框。系统默认值为ON。3)清屏命令306.4VFP程序的三种基本结构
顺序结构始终按照程序中语句的先后顺序逐条执行。6.4.1顺序结构【例6.3】鸡兔同笼,已知鸡兔的总头数为h,总脚数为f,求鸡兔各有多少只?鸡兔同笼问题的算法如图所示。输入h,fx=(4*h-f)/2y=(f-2*h)/2输出s6.4VFP程序的三种基本结构
顺序结构始终按照程序中语31其程序文件exam6_3.prg的代码为: input“请输入鸡兔总头数:”toh input“请输入鸡兔总脚数:”tof x=(4*h-f)/2&&x为鸡的只数 y=(f-2*h)/2&&y为兔的只数 ?”共有鸡:”,x ?”共有兔:”,y cancel其程序文件exam6_3.prg的代码为:32应用程序在进行数据处理时需要根据不同的条件选择执行不同的操作,使程序的流程根据不同条件来决定程序的走向,这种程序结构称为选择结构。在VFP中是用IF…ELSE…ENDIF和DOCASE…ENDCASE来实现的。6.4.2选择结构应用程序在进行数据处理时需要根据不同的条件选择执行不331)IF语句格式:IF<条件表达式><语句序列1>[ELSE<语句序列2>]ENDIF功能:执行该语句时,若条件表达式的值为.T.,则执行<语句序列1>,否则执行<语句序列2>,然后再执行ENDIF之后的语句,如图所示。条件表达式TF语句序列1语句序列2执行ENDIF之后的语句1)IF语句条件表达式TF语句序列1语句序列2执行ENDIF34说明:在IF语句中,ELSE选项可缺省,此时在如上图中去掉<语句序列2>即可。当ELSE缺省时,如果条件表达式为.F.,则执行ENDIF后面的语句。IF和ENDIF必须成对出现,否则程序将无法执行。该语句可以嵌套使用,但是在嵌套使用时不能出现交叉现象。说明:35【例6.4】输入球的半径,计算球的体积。其程序文件exam6_4.prg的代码为:clearinput"请输入球的半径:"torifr>0v=(4/3)*3.1416*r^3?"球的体积是:",round(v,2)&&保留2位小数elsemessagebox("输入半径不能为负数!")endifcancel【例6.4】输入球的半径,计算球的体积。36【例6.5】判断某一年是否是闰年。分析:假如年份用year表示,判断year是否是闰年的方法是:year能够被400整除或year能够被4整除并且不能够被100整除(用vfp表示的逻辑表达式为year/4=int(year/4)andyear/100<>int(year/100)oryear/400=int(year/400))。【例6.5】判断某一年是否是闰年。37其程序文件exam6_5.prg的代码为:clearinput"请输入年份:"toyearifyear/4=int(year/4)andyear/100<>int(year/100)oryear/400=int(year/400)?str(year,4)+"年是闰年"else?str(year,4)+"年不是闰年"endifreturn提示:判断一个整数M能否被另一个整数N整除,一般采用3种方法,即:判断MOD(M,N)是否等于0或INT(M/N)是否等于M/N或M%N是否等于0,若等于,则表明M能被N整除。其程序文件exam6_5.prg的代码为:提示:判断一个整382)多路分支语句格式:DOCASECASE<条件表达式1><语句序列1>[CASE<条件表达式2><语句序列2>…CASE<条件表达式N><语句序列N>][OTHERWISE<语句序列Q>]ENDCASE
2)多路分支语句39功能:从第一个CASE的条件开始判断,若<条件表达式I>(I=1、2、3…n)的值为.T.,则执行<语句序列I>(I=1、2、3…n),然后执行ENDCASE之后的语句。所以在一个DOCASE结构中,最多只能执行一个CASE语句后面的语句序列。如果所有CASE语句后的条件表达式的值均为.F.,则执行OTHERWISE之后的<语句序列Q>。OTHERWISE子句可以缺省,此时如果所有条件表达式的值均.F.,就退出该结构执行EDNCASE语句后面的语句。说明:①DOCASE、CASE<条件表达式I>、OTHERWISE和ENDCASE必须各占一行。②DOCASE和ENDCASE必须成对出现。③语句序列中可以嵌套各种控制结构的命令语句。功能:从第一个CASE的条件开始判断,若<条件表达式I>(I40【例6.6】计算分段函数的值分析:这是一个多分支结构的问题,实现方法很多,下面给出其中的2种。【例6.6】计算分段函数的值分析:这是一个多分支结构的问题41方法1:用CASE语句实现input"输入x的值:"toxdocase casex<0 f=2*x-1 casex=0 f=4*x otherwise f=7*x-5endcase?"f(",x,")=",freturn方法1:用CASE语句实现input"输入x的值:"t42方法2:用IF的嵌套结构实现input"输入x的值:"toxifx<=0ifx<0 f=2*x-1else f=4*xendifelsef=7*x-5endif?"f(",x,")=",freturn方法2:用IF的嵌套结构实现input"输入x的值:"43【例6.7】编写程序显示当前月份的季节。其程序文件exam6_7.prg的代码为:yue=month(date())&&获取当前月份值docasecaseinlist(yue,3,4,5)&&第一个表达式的值是其余表达式值之一就返回.T.jj="春"caseinlist(yue,6,7,8)jj="夏"caseinlist(yue,9,10,11)jj="秋"caseinlist(yue,12,1,2)jj="冬"endcasemessagebox("当前季节为:"+jj+"季")return【例6.7】编写程序显示当前月份的季节。44【例6.8】在学生选课成绩表xkcjb.dbf中,输入学生学号,根据该学生的成绩判断学生表现。若成绩≥85分输出“优秀”,若在70~85分输出“良好”,若在60~70分输出“及格”,60分以下则输出“不及格”。其程序文件exam6_8.prg的代码为:usexkcjbaccept"请输入学生的学号:"toxhlocatefor学号=xh【例6.8】在学生选课成绩表xkcjb.dbf中,输入学生学45ifnotfound() ?"学号输入错误!"else docase case成绩>=85 ?xh+"的成绩为:优秀" case成绩>=70and成绩<85 ?xh+"的成绩为:良好" case成绩>=60and成绩<70 ?xh+"的成绩为:及格" otherwise ?xh+"的成绩为:不及格" endcaseendifusereturnifnotfound()46循环是按照给定的条件去重复执行一段具有特定功能的程序。循环结构是一种重要的程序结构。在VFP中提供了DOWHILE…ENDDO、FOR…ENDFOR、SCAN…ENDSCAN三种循环处理命令。
1)DOWHILE循环命令格式:DOWHILE<条件表达式><语句序列>ENDDO
功能:当执行DOWHILE语句时,如果表达式的值为.T.,则执行<语句序列>,否则结束该循环,执行ENDDO之后的语句。语句序列条件ENDDO之后的语句假真6.4.3循环结构循环是按照给定的条件去重复执行一段具有特定功47【例6.9】计算s=1+2+3+...+100求解该问题的算法所对应的传统流程图和N-S图如图所示。开始I=1s=0I<=100s=s+II=I+1Y输出s结束NI=1,s=0I<=100s=s+II=I+1输出s(a)传流程图(b)N-S图【例6.9】计算s=1+2+3+...+100开始I=1s48程序文件exam6_9.prg的代码为:s=0 i=1 dowhilei<=100 s=s+I I=I+1 enddo ?”s=“,s cancel程序文件exam6_9.prg的代码为:s=049【例6.10】逐条显示学生档案表dab.dbf中计算机1班学生的信息。其程序文件exam6_10.prg的代码为:clearusedabdowhile.not.eof()&&当记录指针指到数据表尾则结束该循环 if专业班级=“计算机1班”&&指定学生的班级 disp endif skip&&记录指针移向下一记录enddousecancel【例6.10】逐条显示学生档案表dab.dbf中计算机1班学502)FOR…ENDFOR计数循环格式:FOR<循环变量>=<初值>TO<终值>[STEP<步长>]<语句序列>ENDFOR|NEXT功能:当FOR语句中循环变量的值在“初值”和“终值”之间时,执行FOR与ENDFOR之间的循环体,否则退出循环,如下图所示。2)FOR…ENDFOR计数循环51说明:当STEP(步长)缺省时,其默认值为1。当STEP不为1时,则循环变量的值就按照步长的值自动增加或减少(步长大于0,则增加,此时,循环条件为循环变量<=终值;步长小于0,则减少,此时,循环条件为循环变量>=终值)。循环初值赋给循环变量循环变量是否超过终值?执行循环体中语句序列循环体变量按步长变化执行ENDFOR之后的语句说明:循环初值赋给循环变量循环变量是否超过终值?执行循环体中52【例6.11】求n的阶乘。求解该问题的算法如图所示。其程序文件exam6_11.prg的代码为:input"请输入n:"tonfac=1fori=1ton fac=fac*iendfor?n,"!=",facreturn输入ni=1,fac=1i<=100
fac=fac*ii=i+1输出s求n!的N-S图【例6.11】求n的阶乘。输入n求n!的N-S图533)SCAN...ENDSCAN循环格式:SCAN[范围][FOR|WHILE<条件表达式>] <语句序列>ENDSCAN功能:在当前数据表中扫描指定范围内满足条件的所有记录,找到一条满足条件的记录就执行一遍<语句序列>,直到对所有满足条件的记录执行完为止。在命令中当范围缺省时为ALL。3)SCAN...ENDSCAN循环54【例6.12】利用SCAN语句在学生档案表dab.dbf中查找7月份出生的学生的学号、姓名、出生日期以及专业班级情况,并统计人数。其程序文件exam6_12.prgsettalkoffclearusedab?"学号","姓名","出生日期","专业班级"scanformonth(出生日期)=7?学号,姓名,出生日期,专业班级endscancounttorsformonth(出生日期)=7?"合计:",rs,"人"usesettalkoncancel
【例6.12】利用SCAN语句在学生档案表dab.dbf中查55程序执行结果为:学号 姓名出生日期专业班级20050010蜂雪燕07/02/87计算机1班20050030陈宗贵07/02/87英语3班合计:2人程序执行结果为:56
4)循环结构中的2个特殊语句在循环结构中可使用2个特殊语句LOOP和EXIT来改变程序的正常循环。如果在DOWHILE循环、FOR循环、SCAN循环语句中含有LOOP语句,当遇到了LOOP语句时,则忽略LOOP后面的语句序列,结束本次循环,去再次计算<条件表达式>的值;当遇到EXIT语句时,则无条件退出本层循环,执行ENDDO、ENDFOR、ENDSCAN之后的语句。如下图所示为DOWHILE循环中含有LOOP及EXIT语句的情况。4)循环结构中的2个特殊语句57语句序列1LOOPEXIT语句序列2条件ENDDO之后的语句假真语句序列1条件ENDDO之后的语句假真58【例6.13】利用exit和loop语句编写程序计算100以内的奇数和。其程序文件exam6_13.prg的代码为:s=0i=0dowhile.t. i=i+1 ifi>100 exit &&退出循环 endif ifi%2=0 &&如果i为偶数 loop &&结束本次循环 else s=s+i endifenddo?"100以内的奇数和为:",scancel说明:实现该问题的方法很多,该程序仅仅是为了说明EXIT和LOOP语句的使用,而不是最佳实现方法。【例6.13】利用exit和loop语句编写程序计算100以59
5)多重循环结构若在一个循环结构的循环体中又包含了循环,则该循环结构称为循环嵌套。在一个循环结构中按照嵌套层次的多少,可分为双重循环、三重循环等。嵌套层次在2层以上一般称为多重循环结构。按其所处的位置分别称为外循环与内循环,其中内循环结构的循环体称为内循环体,外循环结构的循环体称为外循环体,如下图所示。每一层循环结构可以采用DOWHLIE、FOR等语句,其执行过程,按照各自语句的含义执行。5)多重循环结构60外循环体外循环结构内循环结构内循环体(a)双重循环(b)三重循环EXITEXIT外循环体外循环结构内循环结构内循环体61【例6.14】利用双重循环编程求sum=1+(1+2)+(1+2+3)+…+(1+2+3+…+10)之值。其程序文件exam6_14.prg的代码为:clearsum=0fori=1to10 t=0 forj=1toi t=t+j endfor sum=sum+tendfor?"1+(1+2)+(1+2+3)+…+(1+2+3+…+10)=",sumreturn【例6.14】利用双重循环编程求sum=1+(1+2)+(162【例6.15】利用xkcjb.dbf和dab.dbf,通过反复输入学生的学号(输入回车键退出),查询学生的姓名、专业班级、课程号以及成绩情况。方法1:建立表间关联,并进行查找处理。setsafetyoff&&当产生已存在的文件或索引标记时,直接覆盖,不给出确认对话框sele1usedabindexon学号tagxhsele2usexkcjbsetrelationto学号intodab【例6.15】利用xkcjb.dbf和dab.dbf,通过反63dowhile.t.&&外循环 accept"请输入学生的学号:"toxh iflen(alltrim(xh))=0 exit endif ?“姓名专业班级课程号成绩" scanfor学号=xh&&内循环 ?dab.姓名,dab.专业班级,课程号,成绩 endscanenddocloseallsetsafetyonreturndowhile.t.&&外循环64方法2:利用SELECT-SQL语言实现。clearalldowhile.t. accept"请输入学生的学号:"toxh iflen(alltrim(xh))=0 exit endifselect姓名,专业班级,课程号,成绩;fromxkcjb,dabwheredab.学号=xhandxkcjb.学号=dab.学号toscreenenddo方法2:利用SELECT-SQL语言实现。65在编写应用程序时,往往会遇到一些比较复杂的问题。对这些问题的处理可以采用“自顶向下,逐步细化、模块化”的方法,把整体的功能需求逐步划分,通过简单而具有独立功能的子模块来实现。这样既可以保证模块的重复使用,也可以方便调试、节省存储空间。模块就是具有独立功能的程序段。在VFP中可以通过子程序、过程和自定义函数来实现模块的功能。6.5模块化程序设计在编写应用程序时,往往会遇到一些比66对于2个具有调用关系的程序文件,常把被调用的程序文件称为子程序,而调用它的程序称为主程序。子程序是指具有相对独立性和通用性的程序段,它是一个独立的程序文件(.prg),存放在磁盘上。
(1)子程序的建立、调用与返回子程序的建立方法与程序文件的方法相同。执行指定子程序可用DO命令来实现。
格式:DO<文件名>6.5.1子程序对于2个具有调用关系的程序文件,常把被调用的程67主程序与子程序的概念是相对的,子程序还可以调用它自己的子程序,即子程序可以嵌套调用。子程序的嵌套如下图所示。主程序……DOA……子程序A……DOB……RETURN子程序B…………RETURN……主程序……DOA……子程序A……DOB……RETURN子程序B…………RETURNTOMASTER……主程序与子程序的概念是相对的,子程序还68VFP的返回命令包含了因嵌套而引出的多种返回方式。格式:RETURN[TOMASTER]|[TO<程序文件名>]说明:命令格式中的[TOMASTER]选项表示返回到最外层主程序;选项[TO<程序文件名>]强制返回到指定的程序文件。VFP的返回命令包含了因嵌套而引出的多种返回69【例6.16】输入圆的半径r,求圆的面积。程序代码如下:**主程序***exam6_16.prginput"请输入圆的半径:"tordosub1&&调用子程序return**子程序,独立于主程序的程序文件**sub1.prgarea=pi()*r^2&&计算圆的面积,pi()返回π值?"圆的面积为:",areareturn&&返回主程序【例6.16】输入圆的半径r,求圆的面积。70
(2)带参数的子程序由于模块的功能之间具有相关性,有时候需要从主程序向子程序传递数据,有时候子程序又要传递数据给主程序,这些数据称为参数。具有参数传递的子程序称为带参数子程序。带参数子程序的开头必须是PARAMETERS参数语句,相应地,主程序的调用方式也有所不同。在带参数子程序中参数语句的格式为:
PARAMETERS<形式参数表>
说明:形式参数表又简称形参,必须是变量,用来接收主程序传递过来的参数,多个形参用逗号隔开。(2)带参数的子程序71主程序的调用命令是:DO<子程序文件名>WITH<实际参数表>
说明:①实际参数又简称实参,是用于向子程序传递数据的参数,可以是常量、已赋值的变量、表达式或函数。②实参的个数、类型应与带参数子程序PARAMETERS语句中的形参个数、类型一致,但名字可以不同。
调用时,主程序将实参一一对应地传送给子程序PARAMETERS语句中的形参(主程序→子程序)。子程序返回时,若实参是变量,则接受对应的形参的值(子程序→主程序)。主程序的调用命令是:72【例6.17】用带参数子程序编写例6.16。程序代码如下:***主程序***exam6_17.prgarea=0input"请输入圆的半径:"tordosub2withr,area &&调用子程序时传递参数?"圆的面积为:",areareturn【例6.17】用带参数子程序编写例6.16。73***子程序***sub2.prgparametersa,bb=pi()*a^2return调用时,将主程序的实参变量r、area的值一一对应地传递给子程序中的形参变量a、b;返回时,又会将a和b的值分别传给r和area。这是一个双向参数传递(主程序r子程序a,主程序area子程序b)。***子程序74子程序有一个弱点,每调用一次子程序,系统就要打开一个程序文件,当调用很多子程序或一个子程序被反复调用时,频繁打开文件的操作会增加磁盘开销,降低系统运行速度,同时也给系统开发带来了不便,为此,引入了过程。过程是可命名的、具有独立功能的程序段,与子程序不同的是,过程可以不是一个独立的程序文件。它既可以与主程序同在一个文件中,也可以和其他过程一起单独组成一个文件,这就克服了调用子程序时反复打开文件的缺陷。6.5.2过程子程序有一个弱点,每调用一次子程序,系统就要打75格式:PROCEDURE<过程名> <语句序列> RETURN|ENDPROC说明:PROCEDURE<过程名>是过程的开始,RETURN是过程的结束。过程可以与调用它的主程序放在同一个文件中,一般放在程序文件的末尾。
过程的调用与子程序的调用完全相同,即用DO<过程名>语句直接调用。格式:PROCEDURE<过程名>76【例6.18】用过程编写例6.16计算圆面积。程序代码如下:***exam6_18.prgarea=0input"请输入圆的半径:"tordosub3withr,area &&调用过程?"圆的面积为:",areareturn***将过程直接放在主程序的后面proceduresub3&&sub3是过程名parametersa,bb=pi()*a^2return&&返回主程序【例6.18】用过程编写例6.16计算圆面积。77VFP为用户提供了大量的系统函数(第3章已经学习了很多的系统函数),同时也允许用户创建自己的函数以满足不同领域的特殊需要。用户自己创建的函数称为自定义函数。与系统函数类似,自定义函数也是通过函数名返回函数值。6.5.3自定义函数VFP为用户提供了大量的系统函数(第78定义格式:[FUCATION<自定义函数名>][PARAMETERS<参数表>]<语句序列>RETURN<表达式>调用格式为:<函数名>([<参数表>])说明:①若使用FUNCTION语句来指出函数名,表示该函数包含在主程序中。若缺省该语句,表示此函数是一个独立的文件,函数名即程序文件名,其扩展名是.prg,并可使用命令MODIFYCOMMAND<函数名>来建立或编辑自定义函数。定义格式:[FUCATION<自定义函数名>]79②自定义函数的函数名不能和VFP的系统函数同名,也不能和内存变量同名。③[PARAMETERS<参数表>]定义了函数的参数,与带参子程序的参数用法相同。④<语句序列>组成为函数体,用于各种处理;简单的函数其函数体可以为空。⑤RETURN<表达式>将表达式作为函数值返回给主程序。②自定义函数的函数名不能和VFP的系统函数同名,也不能和内存80【例6.19】用自定义函数编写例6.16计算圆面积。方法1:自定义函数作为一个独立的文件。自定义求圆面积的函数area.prg如下:parametersareturnpi()*a^2 &&函数体为空,直接将表达式的值返回若要计算半径为10的圆面积,则在命令窗口中直接输入?area(10) &&显示结果:314.1593【例6.19】用自定义函数编写例6.16计算圆面积。81在实际应用中,常常把多个过程或自定义函数集中在一个程序文件中,这个文件称为过程文件。在过程文件中,每个过程或自定义函数仍然是独立的,只是为了避免频繁读取磁盘,在主程序调用时,一次全部调入内存,从而提高了系统的运行效率。6.5.4过程文件在实际应用中,常常把多个过程或自定义82(1)过程文件的格式PROCEDURE<过程名1> <语句序列1>RETURNPROCEDURE<过程名2> <语句序列2>RETURNFUNCTION<函数名3> <语句序列3>RETURNFUNCTION<函数名4> <语句序列4>RETURN (1)过程文件的格式83(2)过程文件的建立
过程文件的建立与一般程序文件的建立方法一样。(3)打开过程文件格式:SETPROCEDURETO<过程文件名>说明:该命令在主程序中使用。在同一时刻只能打开一个过程文件,打开新的过程文件时原来的过程文件会自动关闭。(4)关闭过程文件格式:SETPROCEDURETO或CLOSEPROCEDURE说明:若要修改过程文件,必须先关闭它。(2)过程文件的建立84VFP的内存变量除类型、取值外,还有一个非常重要的属性——作用域。变量的作用域是指变量在什么范围内是可见的、有效的和可操作的。在程序设计中,特别是模块化程序中,经常会遇到许多内存变量,这些内存变量有的在整个程序运行过程中有效,有的只在某些模块中有效,这就是内存变量的作用域。VFP中的内存变量按其作用范围可分为公共变量、私有变量和本地变量。6.5.5变量的作用域VFP的内存变量除类型、取值外,还有一个非常重851)公共变量
公共变量是指在整个程序执行过程中任何模块内都有效的内存变量。格式:PUBLIC<内存变量表>功能:将<内存变量表>中的变量全部设置成公共变量,并把这些变量的初值赋为.F.。说明:①在<内存变量表>中的变量可以是简单变量,也可以是数组。②在VFP命令窗口中定义的变量默认为全局变量,但这样定义的变量不能在程序中使用。③程序执行完毕后,全局变量不会在内存中自动释放。只有使用RELEASE命令或CLEARMEMORY命令才能清除公共变量。1)公共变量862)本地变量
本地变量只能在定义它的模块中使用,不能在其他模块中使用。只要定义它的程序运行结束,本地变量将自动释放。本地变量用LOCAL命令建立。格式:LOCAL<内存变量表>
功能:该命令是将<内存变量表>中的变量设置为本地变量,并为它们赋予初值.F.。
说明:本地变量要先定义后使用。
3)私有变量在VFP程序中不通过PUBLIC或LOCAL命令事先声明的变量均为私有变量。私有变量只能在建立它的模块及其下属各级模块中有效,一旦建立它的模块运行结束,这些私有变量将自动释放。2)本地变量3)私有变量87【例6.20】分析下面程序中变量的作用域。其程序文件exam6_20.prg的代码为:clearalllocalk&&定义本地变量ki=1&&定义私有变量idosub4?′主程序中输出的结果:′?i,j,k&&显示23.f.return【例6.20】分析下面程序中变量的作用域。88*子程序sub4.prgpublicj&&定义公共变量ji=i*2j=i+1k=j+1?′子程序中输出的结果:′?′i=′+str(i,2)+′j=′+str(j,2)+′k=′+str(k,2)&&显示i=2j=3k=4return*子程序sub4.prg894)变量屏蔽
在模块化程序设计中,各层模块中可能出现相同的变量名。为了避免在不同层次的模块中因为使用相同名字的变量而相互影响值的变化,可在子模块中使用PRIVATE命令屏蔽掉主模块或上级模块中同名的变量,使得这些变量在子模块中暂时无效。只要返回主模块或上级模块,原来同名变量会重新出现,并且其值保持不变。格式:PRIVATE[<内存变量表>|ALL[LIKE|EXCEPT<通配符>]]
功能:该命令将当前模块中某些与上层模块中同名的变量隐藏起来,直到声明它的程序、过程或自定义函数执行结束后,才恢复使用先前隐藏的变量。4)变量屏蔽90【例6.21】主程序调用子程序过程中的变量屏蔽。(1)程序代码如下:*主程序exam6_21.prgclearpublici,jstore1toi,j,kdosub5?′主程序的输出结果:′?′i=′+str(i,2)+′j=′+str(j,2)+′k=′+str(k,2)return【例6.21】主程序调用子程序过程中的变量屏蔽。91*子程序sub5.prgprivatej,k&&屏蔽主程序中的变量j、ki=i*2j=i+1k=j+1?′子程序中的输出结果:′?′i=′+str(i,2)+′j=′+str(j,2)+′k=′+str(k,2)return(2)执行主程序后的输出结果为: 子程序中的输出结果: i=2j=3k=4 主程序的输出结果: i=2j=1k=1*子程序sub5.prg(2)执行主程序后的输出结果为:92方法2:自定义函数与主程序在同一文件中。***主程序exam6_19.prginput"请输入圆的半径:"tor?"圆的面积为:",area(r)&&调用自定义函数return***自定义函数,直接放在主程序的后面functionarea&&area是自定义函数名parametersareturnpi()*a^2方法2:自定义函数与主程序在同一文件中。936.6程序调试与测试
程序设计完成后,除较简单的程序外,很少一次运行成功。通常在编译运行时,会发现许多错误或不能达到预期的结果。这就需要利用VFP的调试工具来调试程序,检查出程序中的错误位置及错误原因,并对其进行改正,直到满足要求为止。程序的调试通常先分模块调试,当各模块调试通过后,再将各模块合并在一起进行调试,通过联调后即可运行。
1)调试器窗口在VFP的环境下,选择【工具】菜单中的【调试器】命令或在命令窗口中输入DEBUG命令,即可进入调试器窗口,如下图所示。6.6程序调试与测试
程序设计完成后,除较简单94菜单栏工具栏跟踪窗口监视窗口调用堆栈窗口局部窗口调试输出窗口菜单栏工具栏跟踪窗口监视窗口调用堆栈窗口局部窗口调试输出窗口95
(1)工具栏的功能工具栏是一系列工具按钮的组合,是一种图形化的操作界面,具有直观快捷的特点。通过工具栏,可以迅速地使用常用的菜单命令。工具栏上的按钮通常与一些菜单命令相对应,提供了一种执行经常使用的快捷方法,调试器窗口工具栏按钮的含义,如下图所示。打开文件取销继续执行追踪单步跳出运行到光标处追踪窗口监视窗口局部窗口调用堆栈窗口输出窗口切换断点断点对话框清除所有断点切换编辑日记切换事件追踪(1)工具栏的功能打开文件取销继续执行追踪单步跳出96
(2)各子窗口的作用追踪窗口:用于显示正在调试执行的程序。在调试过程中,追踪窗口中左侧灰色区域会出现一些标记:〖ZK)〗箭头标记“”:表示程序执行的当前位置。选择【调试】菜单中的【单步】命令或单击工具栏中的【单步】按钮,系统就执行一条命令。每执行一次“单步”操作,系统就按程序的流程执行一条命令。断点标记“●”:在调试过程中,经常需要程序执行到某个位置上停止,以便分析当前程序执行的情况,这个位置称为断点。设置断点的方法可在指定行左边双击或将光标移到要测试的行并按空格键(或按回车键)。(2)各子窗口的作用97
局部窗口:用于显示程序或过程中想要查看的变量、数组、对象等。调用堆栈窗口:用于显示正在执行的过程或程序列表。如果一个程序被另一个程序调用,则两个程序的名字都显示在调用堆栈窗口中。
调试输出窗口:用于显示程序、过程或方法程序代码的输出。使用时可在必要的行添加DEBUGOUT命令。
格式:DEBUGOUT<表达式>当程序执行到此命令时,会计算出<表达式>的值,并送到调试输出窗口显示。局部窗口:用于显示程序或过程中想要查看98
2)程序调试实例【例6.22】用调试器调试程序exam6_14.prg,要求设置断点和表达式,并观察在程序执行过程中表达式及变量值的变化情况。调试步骤如下:①选择【工具】菜单中的【调试器】命令,进入调试器窗口。若在调试器窗口中没有出现跟踪、监视、局部窗口等,可单击【调试器】窗口中的【窗口】菜单,选择所需的窗口。②单击工具栏上的【打开】按钮或执行【文件】菜单中的【打开】命令,在弹出的【添加】对话框中,选择调试程序exam6_14.prg,确认后程序代码将显示在跟踪窗口中。2)程序调试实例99③在跟踪窗口中用鼠标双击代码行左边或将光标移到要测试的行并按空格键(或按回车键)设置断点。当程序执行到断点处,将暂时停止执行,以便用户观察。④在监视窗口中设置监视表达式,以监视程序中变量、函数、表达式的值及变化情况。⑤单击工具栏上的【跟踪】按钮,系统从程序的第一行开始执行,每单击一次【跟踪】按钮,系统就执行一行程序;也可单击工具栏上的【继续执行】按钮或【单步】按钮执行程序,从而在监视窗口、局部窗口中观察变量值或表达式值的变化情况。可根据需要选择使用。如下图所示的“监视窗口”中加入了i、t、j、sum4个变量,在程序的调试过程中,可以看到这些变量值的变化。③在跟踪窗口中用鼠标双击代码行左边或将光标移到要测试100vfpch6第6章结构化与面向对象程序设计基础课件101
3)调试程序中的错误程序的调试是程序开发过程中一个非常重要的环节。特别是代码较长的程序,其调试工作量特别大,通常需要程序设计者经过多次调试,不断地发现并修改其中的错误。熟悉程序调试过程中的错误类型是提高程序调试效率的有效途径。程序的错误一般有2类,一类是语法、词法错误;另一类是程序的逻辑错误。
3)调试程序中的错误102
(1)语法错误程序中的语法错误通常是由于读者对VFP的语法规则记忆不深、理解不够所导致。最常见的语法错误主要表现在:关键字、变量名和文件名拼写错误;表达式和函数中的类型不匹配;控制语句缺少结束语句或嵌套错误;遗漏关键字和变量之间的空格;内存变量没有初始化等。语法错误相对容易发现和修改,当程序运行遇到这类错误时,VFP会自动中断程序的执行,并弹出编辑窗口,显示出错的命令行,给出错误信息,可在代码编辑窗口中方便地对程序进行修改。(1)语法错误103
(2)逻辑错误程序的逻辑错误通常是由于程序结构或实现问题的算法不正确导致的。它不仅难以发现,而且是致命的,将直接影响到程序的执行结果。这类错误系统是无法确定的,只有程序设计者自己来检查错误。因此,要求在程序调试过程中跟踪程序的执行,在动态执行过程中分析执行结果是否与设计要求相符。在检查程序逻辑错误的过程中,可通过设置断点,追踪程序的运行过程来发现错误,也可通过单步执行、跟踪程序执行过程中某些信息的变化或设置错误陷阱捕捉可能发生的错误。(2)逻辑错误1046.7结构化程序设计应用实例【例6.23】求一元二次方程ax2+bx+c=0的根(不考虑复根)求一元二次方程的根的公式为:1)数字计算问题6.7结构化程序设计应用实例【例6.23】求一元二次方程105其算法的描述如下图所示。输入a,b,c计算disc=b2-4acTNa≠0TNdisc≥0输出无实数解计算x1、x2输出x1、x2输出a不能为0其算法的描述如下图所示。输入a,b,c计算disc=b2-106其程序文件exam6_23.prg代码为input"请输入数据a:"toainput"请输入数据b:"tobinput"请输入数据c:"tocdisc=b*b-4*a*cifa!=0 ifdisc>=0x1=(-b+sqrt(disc))/(2*a)x2=(-b-sqrt(disc))/(2*a)?"x1=",x1?"x2=",x2elsemessagebox("没有实数解")endifelsemessagebox("a不能为0",0+64,"一元二次方程的解")endifcancel其程序文件exam6_23.prg代码为107【例6.24】求任意两个数的最大公约数。求最大公约数的算法及实例分析如图6.23所示。
r!=0Tr=m%nm=nn=rr=m%nF输入m,nmnr162416241681680【例6.24】求任意两个数的最大公约数。r!=0Tr=108其程序文件exam6_24.prg的代码为cleastore0tom,n,r?"求任意两个数的最大公约数"input"请输入第一个数:"tominput"请输入第二个数:"tonr=m%ndowhiler<>0m=nn=rr=m%n enddo?"最大公约数是:",ncancel其程序文件exam6_24.prg的代码为109【例6.25】定义一个判断n是否是素数的函数,然后调用该函数求100以内的所有素数。分析:素数又称质数,只能够被1和它本身整除。如果要判断n是否是素数,就用2~(n-1)之间的数逐个去除,若余数都不为0,则n为素数,否则不是素数。为减少除的次数,提高运行效率,除到即可。【例6.25】定义一个判断n是否是素数的函数,然后调用该函110*main.prg调用该函数求100以内的素数clearform=2to100ifprime(m)??mendifendforcancel*prime.prg判断n是否是素数的函数PARAMETERSnflag=.t.&&flag为真时,表明n为素数k=int(sqrt(n))forj=2tokifmod(n,j)=0flag=.f.exitendifendforreturnflag*main.prg调用该函数求100以内的素数*prime111【例6.26】从键盘随意输入的10个数,然后按从大到小的顺序依次排列后输出。其程序文件exam6_26.prg的代码为:cleadimex(10)**输入数据fori=1to10 inpu"请输入第"+str(i,2)+"个数"tox(i)next【例6.26】从键盘随意输入的10个数,然后按从大到小的顺112**以下双重循环是完成排序
fori=1to9 forj=i+1to10 ifx(i)<x(j) t=x(i) x(i)=x(j) x(j)=t endif next next**以下循环是输出排序结果 fori=1to9 ?x(i) next return**以下双重循环是完成排序113【例6.27】(猜数游戏)由计算机随机产生一个整数,根据难易程度,可以是2位数、3位数或者更高。游戏者事先不知道它的值。游戏的任务就是去猜测这个数。如果游戏者猜测的次数越少,说明级别越高。为了提高游戏的趣味性,需要给游戏者提示一些信息,例如,随机数是x,游戏者猜测的数是y,如果y>x或者y<x应该给出提示。游戏能重复进行。在本例子中,随机数为2位。【例6.27】(猜数游戏)由计算机随机产生一个整数,根据难114其程序文件exam6_27.prg的代码为:=rand(-1)&&随机函数初始化_screen.fontsize=18&&设置桌面显示尺寸dowhile.t. clear&&清屏 x=int(rand()*100)&&产生2位随机数 y=-10000&&初始化猜测数 n=0&&初始化次数
其程序文件exam6_27.prg的代码为:115dowhiley<>x input'输入一个猜测数:'toy n=n+1 docase casey<x ?'您猜的数太小。'font'宋体',10 casey>x ?'您猜的数太大。'font'宋体',30 otherwise exit endcase ?'猜了第'+str(n,4),+'次'enddo
dowhiley<>x116 ?'恭喜您,猜中了!!!这是第'+str(n,4)+'次' z='y' wait'继续猜数吗?(y/n)'toz iflower(z)<>'y' exit endifenddo ?'恭喜您,猜中了!!!这是第'+str(n,4)+'次117【例6.28】编写程序求1!+2!+…+100!的值。其程序文件exam6_28.prg的代码为:s=0n=1dowhilen<=100 m=n dojswithm s=s+m n=n+1enddo?"1!+2!+3!+…+100!=",str(s,20)return【例6.28】编写程序求1!+2!+…+100!的值。118procedurejsparameterxb=1fora=1tox b=b*aendforx=breturnprocedurejs119
2)数据库操作问题【例6.29】有数据表ascdb.dbf,有3个字段:NUM1(N,2)、CHR1(C,2)与CHR2(C,2)。编写程序,向ascdb.dbf添加100条记录,每个字段的内容分别为:NUM1:1,2,3,4,5,…,24,25,26,27,28,29,…CHR1:A,B,C,D,E,…,X,Y,Z,A,B,C,…CHR2:A,E,I,M,Q,…,O,S,W,A,E,I,…注意:ASCII码到字符的转换函数为CHR(<数值表达式>),“A”的ASCII码为65。2)数据库操作问题120其程序文件exam6_29.prg的代码为:clearuseascdbdeleallpacknum=0asc1=64asc2=61dowhilenum<=99 num=num+1 asc1=asc1+1 ifasc1>=91 asc1=65 endif其程序文件exam6_29.prg的代码为:121 asc2=asc2+4 ifasc2>=91 asc2=asc2-26 endif appendblank replacenum1withnum replacechr1withchr(asc1),chr2withchr(asc2)enddousecancel asc2=asc2+4122【例6.30】在学生档案表(dab.dbf)和选课成绩表(xkcjb.dbf)中,查询成绩<60分的学生的学号、姓名、专业班级、所学课程的课程号、学期、成绩和重考成绩。【例6.30】在学生档案表(dab.dbf)和选课成绩表(123方法1:建立表间关联,并进行查找处理。其程序文件exam6_30.prg的代码为:setsafetyoffcloseallclearselect1usedabindexon学号tagxhselect2usexkcjbsetrelationto学号intodab方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《焊接工程综合实验》实验教学大纲
- 玉溪师范学院《体育科学研究方法》2022-2023学年第一学期期末试卷
- 数学15的认识教学课件教学课件教学
- 拆除工程施工方案
- 2024年电子控制自动变速箱项目评估分析报告
- 2024年网络接口适配器项目成效分析报告
- 2024年碱锰电池项目成效分析报告
- 采购产品特定模具费用先期垫付协议书
- 不带机械操作手的机械租赁合同
- 必胜客离职合同
- 2024年定制:医疗软件开发与定制服务合同
- 《金属材料与热处理(第8版)》中职全套教学课件
- 2024年《高等数学2》教案设计:案例分析与启示
- 2023年药品流通行业运行统计分析报告
- GB/T 16716.5-2024包装与环境第5部分:能量回收
- 2024年消防月全员消防安全知识专题培训-附20起典型火灾案例
- 2024年中国遥控风扇控制器市场调查研究报告
- 人力表单46 - 全体职工大会会议纪要(裁员)
- 2024-2030年中国纺织服装行业市场发展分析及发展趋势与投资研究报告
- GB/T 44413-2024城市轨道交通分类
- GB 19041-2024光气及光气化产品生产安全规范
评论
0/150
提交评论