第5章 程序设计基础.docx
- 文档编号:17955368
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:32
- 大小:42.49KB
第5章 程序设计基础.docx
《第5章 程序设计基础.docx》由会员分享,可在线阅读,更多相关《第5章 程序设计基础.docx(32页珍藏版)》请在冰点文库上搜索。
第5章程序设计基础
第5章程序设计基础
5.1学习目标
●掌握创建、修改和运行程序的方法。
●掌握顺序结构的特点。
●掌握分支语句IF……ELSE……ENDIF、DOCASE……ENDCASE的用法。
●掌握循环语句FOR……ENDFOR、DOWHILE……ENDDO、SCAN……ENDSCAN的用法。
●掌握EXIT和LOOP在循环结构中的作用。
●掌握过程和用户自定义函数的创建方法。
●掌握面向对象的程序设计的概念。
●掌握类和对象的概念、类的特点。
●掌握对象的属性、方法和事件概念。
●掌握基类的概念、最小事件集和最小属性集,分清容器类和控件类。
●掌握引用对象、设置对象属性和调用对象的方法程序的方法。
●了解对象对事件的响应、容器层次与类层次中的事件发生情况以及事件激发顺序。
●掌握常用的事件。
●掌握事件驱动和事件循环的概念。
5.2例题解析
一、选择题解析
1.在VFP集成环境下,用户利用DO命令执行一个程序文件时,系统实质上是执行扩展名为的文件。
A..PRGB..BAKC..FXPD..QPR
【解析】答案为C。
程序文件的后缀是.PRG,修改后在磁盘上产生.BAK文件(保存的是修改前的程序文件内容)。
VFP环境下运行程序文件,系统会自动地对.PRG文件进行编译,生成“伪编译”程序文件(.FXP)。
.QPR是查询文件的扩展名。
2.在INPUT、ACCEPT和WAIT命令中,必须要以回车键表示输入结束的命令是。
A.INPUT、ACCEPTB.INPUT、WAIT
C.ACCEPT、WAITD.INPUT、ACCEPT和WAIT
【解析】答案为A。
WAIT命令只能接收单个字符,可以在用户输入一个字符后自动结束该命令。
而INPUT、ACCEPT命令,等待用户从键盘输入数据,并以回车键表示结束输入。
3.下列关于DOCASE……ENDCASE语句说法不正确的是。
A.只要CASE条件成立,就执行这个CASE条件对应的命令序列
B.DOCASE和ENDCASE必须成对出现
C.所有的CASE条件都不成立且没有OTHERWISE语句,则直接跳出本结构,执行ENDCASE后面的语句
D.在DOCASE和第一个CASE之间的任何语句都不被执行
【解析】答案为A。
不管有几个CASE条件同时成立,只有最先成立的那个CASE条件对应的命令序列被执行。
如果所有的CASE条件都不成立且没有OTHERWISE语句,则直接跳出本结构。
DOCASE和ENDCASE必须成对出现,在DOCASE和第一个CASE之间的任何语句都不被执行。
4.在DOWHILE.T.的循环中,退出循环应使用的命令是。
A.LOOPB.EXITC.CLOSED.CLEAR
【解析】答案为B。
LOOP与EXIT都用于循环体中,结束当前的循环,但两者有着根本区别。
语句EXIT结束循环,将跳到直接包含它的循环体语句外,控制程序执行ENDDO或ENDFOR的后续语句。
语句LOOP结束当前的循环,即忽略此后的循环体语句,重新回到循环头,根据循环测试条件决定是否退出循环。
语句CLOSE是关闭语句,如CLOSEALL即关闭当前打开的所有的文件,包括表、数据库、项目等等。
CLEAR是清屏命令。
5.阅读下面的程序:
STORE.T.TOx
STORE0TOy
DOWHILEx
y=y+1
IFINT(y/5)=y/5
?
?
y
ELSE
LOOP
ENDIF
IFy>20
STORE.F.TOx
ENDIF
ENDDO
该程序运行后,输出的结果是。
A.51015B.5101520C.51015D.510152025
【解析】答案为D。
本例中运用了循环语句中嵌套条件语句程序形式,在内存变量x为真的条件下,重复检查在1~25之间,哪些是5的倍数的数并输出。
该程序用到了判断一个数是否能被某个数整除的方法,即INT(y/5)=y/5,也可用表达式MOD(y,5)=0实现。
LOOP语句是短路语句,实现了当y不是5的倍数时,将控制直接返回给DOWHILE语句,以进入新的一次循环。
采用IFy>20……ENDIF语句用于控制循环结束,当y=21(不是5的倍数)时,此时执行LOOP语句;同理,当y=22、y=23、y=24时程序执行情况与y=21相同;当y=25(是5的倍数)时,不换行显示当前的y值,接下来执行IFy>20……ENDIF分支语句,将变量x赋值为.F.,显然不满足再一次执行DOWHILE循环的条件,从而退出循环。
6.有一分支程序如下所示,DOP4.PRG条件是。
IFS>100
DOP1.PRG
ELSE
IFS>10
DOP2.PRG
ELSE
IFS>1
DOP3.PRG
ELSE
DOP4.PRG
ENDIF
ENDIF
ENDIF
A.S>100B.S>10andS<=100C.S>1andS<=10D.S<=1
【解析】答案为D。
这是一道IF语句嵌套的例子,又称为多条件分支语句,常用于情况复杂、条件多的程序控制中。
建议编写时采用缩进格式保证IF~ELSE~ENDIF的配对出现。
由于IF条件语句有单分支和双分支两种形式,并允许嵌套,所以书写的原则是保证ENDIF总是与最靠近的没有配对的ELSE、IF相匹配。
一般情况下,若要判断多于两种可能的情况,有两种常用的方法可以实现。
请看下面的示例:
试求两个数的算术值(+,-,*,/),其他任意运算输出error。
比较两个程序片段,分析执行结果。
(1)程序片段1
INPUT"数1:
"tox
INPUT"数2:
"toy
WAIT"请输入一个运算符:
"TOopWINDOWAT10,12
if(op='+')
?
str(x,10,2)+op+str(y,10,2)+"=",str(x+y,10,2)
else
if(op='-')
?
str(x,10,2)+op+str(y,10,2)+"=",str(x-y,10,2)
else
if(op='*')
?
str(x,10,2)+op+str(y,10,2)+"=",str(x*y,10,2)
else
if(op='/')
?
str(x,10,2)+op+str(y,10,2)+"=",str(x/y,10,2)
else
?
'error'
endif
endif
endif
endif
(2)程序片段2
INPUT"数1:
"tox
INPUT"数2:
"toy
WAIT"请输入一个运算符:
"TOopWINDOWAT10,12
DOCASE
CASEop="+"
?
str(x,10,2)+op+str(y,10,2)+"=",str(x+y,10,2)
CASEop="-"
?
str(x,10,2)+op+str(y,10,2)+"=",str(x-y,10,2)
CASEop="*"
?
str(x,10,2)+op+str(y,10,2)+"=",str(x*y,10,2)
CASEop="/"
?
str(x,10,2)+op+str(y,10,2)+"=",str(x/y,10,2)
OTHERWISE
?
"error"
ENDCASE
该程序段分支语句的功能还可以用IIF函数来实现:
?
iif(op='+',str(x+y,10,2),iif(op='-',str(x-y,10,2),iif(op='*',str(x*y,10,2),iif(op='/',str(x/y,10,2),'error'))))
7.阅读下面的程序:
sum=0
N=0
FORI=11to-1step-2
Sum=sum+I
N=N+1
ENDFOR
?
I,N
该程序运行后,输出的结果是。
A.1,6B.-1,7C.-3,7D.11,0
【解析】答案为C。
当步长>0时,FOR循环执行应满足的条件为循环变量≤终值;当步长<0时,FOR循环执行应满足的条件为循环变量≥终值。
本例中步长=-2<0,可见FOR循环执行应满足的条件为循环变量I≥-1。
在每次执行循环的过程中,循环变量I依次取值为11、9、7、5、3、1、-1。
N是计数器,功能是统计循环执行的次数。
当I=-1时,执行第7次循环,所以N的值为7,然后控制返回到FOR循环头,计算循环变量的值I=I+(-2)=-3,经过判断不再满足I≥-1循环执行的条件,此时结束循环。
8.运行以下程序段后,运行结果是。
SUM5=0
FORI=5TO1STEP-1
SUM5=SUM5+SUB1(I)
ENDFOR
?
SUM5
FUNCTIONSUB1
PARAMETERSN
S=1
DOWHILEN>0
S=S*N
N=N-1
ENDDO
RETURNS
ENDFUNC
A.153B.120C.15D.100
【解析】答案为A。
用户可以将经常执行的具有某种功能的一段程序代码独立出来,将其作为自定义函数,它不仅提高了程序的共享性,还提高了程序的可读性。
调用函数和自定义函数可以存放在同一个程序中,但要将调要函数放在整个自定义函数的前面。
本例自定义函数SUB1()的功能是求N!
,该函数中的参数N是形参,调用函数中的I是实参,它们之间采用了值传递,因此内存变量SUM5=5!
+4!
+3!
+2!
+1!
=153。
9.下列关于属性、方法和事件的叙述中,是错误的。
A.属性用于描述对象的状态,方法用于表示对象的行为
B.基于同一个类产生的两个对象可以分别设置自己的属性值,不一定具有相同的BaseClass值
C.事件可以有与之相关的事件代码,事件代码也可以像方法一样被显式调用
D.VFP基类的最小属性集有Class、BaseClass、ClassLibrary、Parentlass,最小事件集有Init、Destroy、Error
【解析】答案为B。
例如两个按钮控件的BaseClass值均为CommandButton。
事件可以有与之相关的事件代码,事件代码也可以像方法一样被显式调用,如表单上放置两个按钮Command1和Command2,它们的click事件代码分别如下:
Command2.click:
messagebox("thisistheanswerofcommand2")
Command1.click:
mand2.click
则用鼠标左键单击command1时,屏幕上出现结果如图5-1。
图5-1事件代码可以像方法一样被显式调用
10.有关类、对象、事件,下列说法不正确的是。
A.对象只能用本身包含的代码来实现操作
B.对象是类的特例
C.类刻划了一组具有相同结构、操作并遵守相同规则的对象
D.事件是一种预先定义好的特定动作,由用户或系统激活
【解析】答案为A。
对象实现的操作既可以是通过本身包含的代码来实现,也可以通过继承父类或基类中的代码来实现。
11.下面关于面向对象程序设计的论述,其中正确的论述是。
A.面向对象程序设计方法的特点是自顶向下的功能分解
B.Form、Column、CommandGroup、TextBox是容器类
C.PageFrame、Timer、FormSet、Header是非可视类
D.以上都不正确
【解析】答案为D。
“自顶向下的功能分解”是结构化程序设计的特点,面向对象程序设计方法的特点是自底向上的功能综合。
按照基类是否能包含其它类,分成容器类和控件类,TextBox文本框属于控件类。
根据是否可见(即基于其所创建的对象在运行时是否可见),基类又分成可视类与非可视类,PageFrame页框、Header列标头均属可视类。
12.下面是VFP中关于对象及相关事件的论述,其中不正确的论述是。
A.VFP容器对象事件相应次序是一般只响应最里层的事件。
但是CommandGroup、OptionGroup则在里层无Click事件代码时,执行外层的Click事件代码
B.与焦点有关的事件包括GotFocus、LostFocus、When和Valid,它们发生的顺序是When、GotFocus、Valid、LostFocus
C.表单form1中有一个文本框text1,为了表单装载后对文本框做初始化工作:
text1.value="初始值",可在表单的Load事件代码中输入命令thisform.text1.value="初始值"
D.表单form1中有一个标签label1,则在该表单的Destroy事件代码中输入命令thisform.label1.caption="标签将释放",实现改变标签的标题内容
【解析】答案为C。
Init事件是在创建对象时发生,表单的Load事件发生在表单中对象text1的Init事件之前,故不能识别文本框text1,所以C错。
容器对象的Init事件自内向外发生,即容器中的对象的Init事件在容器对象的Init事件之前发生,若在表单的Init事件代码中输入命令thisform.text1.value="初始值",则正确。
Destroy事件是在对象释放时发生,容器对象的Destroy事件自外向内发生,即容器中的对象的destroy事件在容器对象的destroy事件之后发生,所以D正确。
13.子类或对象具有沿用父类的属性、方法和事件代码的能力,称为。
A.继承性B.多态性C.封装性D.抽象性
【解析】答案为A。
在面向对象的程序设计中,通过类可以简化应用程序的设计,因为类具有继承性、多态性、封装性、抽象性等特点。
父类(ParentClass)指定派生类或子类的父类,父类可以是一个VisualFoxPro基类(例如Form类),或者是另一个用户自定义的类或子类。
子类(subclass)从父类那里获得所有的属性和方法,并且可修改。
继承特性使得同类型对象共享数据与程序代码,提高程序的复用性。
14.某表单FrmA上有一个命令按钮组CommandGroup1,命令按钮组中有四个命令按钮,它们的Name属性分别是:
CmdTop,CmdPrior,CmdNext,CmdLast。
要求单击CmdLast时,将按钮CmdNext的Enabled属性置为.F.,则在按钮CmdLast的Click事件中应加入________命令。
A.This.Enabled=.F.B.This.Parent.CmdNext.Enabled=.F.
C.This.CmdNext.Enabled=.F.D.Thisform.CmdNext.Enabled=.F.
【解析】答案为B。
该例中控件的包含关系是这样:
表单FrmA包含了一个命令按钮组CommandGroup1,该命令按钮组包含了四个命令按钮CmdTop,CmdPrior,CmdNext,CmdLast。
当单击CmdLast时,即当前访问的对象是CmdLast,在它的Click事件中需访问CmdNext的属性,则可采用绝对引用和相对引用两种方法去访问CmdNext。
本题答案是采用相对引用方法,还可以用这样的访问方法:
Thisform.CommandGroup1.CmdNext.Enabled=.F.。
VFP中的对象分为容器型对象和非容器对象,并且允许容器嵌套。
例如页框中可以包含若干页,页可包含表格等。
因此,访问一个对象时(又称引用)有两种方法:
绝对引用和相对引用。
当要引用一个容器中的对象时,采用从最外层容器(最高层)出发,一层一层展开,容器中的嵌套对象采用“点”进行分隔,这种方法称为绝对引用。
相对引用是指在容器层次中相对于某个容器层次的引用,有以下几种形式的关键字:
Thisform――――当前表单(当前对象所在的表单)
ThisformSet――――当前表单集(当前对象所在的表单集)
Parent――――当前对象的直接容器对象
ActiveForm――――当前活动表单
ActiveControl――――当前活动控件
_Screen――――屏幕对象
This――――当前对象
15.对于同一个表单,下列四个事件:
Init、Load、Activate和Destroy发生的顺序为。
A.Init、Load、Activate、DestroyB.Load、Init、Activate、Destroy
C.Activate、Init、Load、DestroyD.Destroy、Load、Init、Activate
【解析】答案为B。
对于表单:
Init事件是初始化对象事件,在创建表单时发生;Load事件是装载表单事件,在将表单装入内存时发生,即在创建表单前发生;Activate事件是激活表单事件,当激活表单时发生;Destroy是释放对象事件,在关闭表单时发生。
16.从CommandButton基类创建子类cmdA和cmdB,再由cmdA类创建cmdAA子类,则cmdA、cmdB和cmdAA必具有相同的。
A.Caption属性B.Name属性C.BaseClass属性D.ParentClass属性
【解析】答案为C。
用户不仅可以基于VFP基类创建自定义子类,也可以基于已创建的自定义子类再创建子类,这一过程可以继续下去。
在类的各个层次中,每个层次中的类的ParentClass(返回派生当前子类的父类的类名)是不同的,但它们必定来自同一个BaseClass(返回派生当前子类的基类的类名),本例中cmdA、cmdB和cmdAA的BaseClass属性值均为CommandButton基类。
17.设页框PageFrame1是页面Page1的直接容器(又称父对象),Page是的Page1父类,在Page1的某事件代码中有引用“This.Parent”,则该引用指_________。
A.页面Page1的父类B.页框PageFrame1的父类
C.页面Page1所在的表单D.页框PageFrame1
【解析】答案为D。
Parent关键字指的是父对象而不是父类(ParentClass),因此,在页面Page1的某事件代码中包含“This.Parent”引用的是父对象PageFrame1页框,而不是父类Page,更不是页框PageFrame1的父类。
二、填空题解析
1.阅读下列程序,回答指定问题。
USESALARY
DOWHILE.NOT.EOF()
IF实发工资>=250
SKIP
LOOP
ENDIF
DISPLAY
SKIP
ENDDO
CLOSEDATABASE
RETURN
该程序完成的功能是______________;LOOP语句的功能是______________。
【解析】答案是:
程序完成的功能是显示实发工资低于250元(不含250)的记录信息。
LOOP为短路语句,它的功能是当检验当前的记录满足“实发工资>=250”条件时,不执行语句DISPLAY和SKIP,将控制直接返回给DOWHILE语句。
2.完善程序,使其具有以下功能:
根据学生成绩表(CJ.DBF)中学生的考试成绩,按划分标准(90~100:
优秀;80~89:
良好;70~79:
中等;60~69:
及格;<60:
不及格),给出相应的等级,设CJ表中有一个名为Dj的字段。
USECJ
DOWHILE.T.
N=CJ
DOCASE
CASE
(1)
ReplaceDjwith"不及格"
CASE
(2)
ReplaceDjwith"及格"
CASE(3)
ReplaceDjwith"中等"
CASE(4)
ReplaceDjwith"良好"
OTHERWISE
ReplaceDjwith"优秀"
ENDCASE
SKIP
IFEOF()
EXIT
ENDIF
ENDDO
【解析】答案为
(1)N<60;
(2)N<70;(3)N<80;(4)N<90。
程序中用到了DO循环嵌套CASE语句和IF语句的形式,先进入循环,执行CASE语句,再利用条件语句来判断何时结束循环。
CASE语句中的各种CASE条件,排列顺序很重要,如果排列不对,将产生错误的结果。
例如,有如下的程序片段:
DOCASE
CASEN<90
ReplaceDjwith"良好"
CASEN<60
ReplaceDjwith"不及格"
CASEN<70
ReplaceDjwith"及格"
CASEN<80
ReplaceDjwith"中等"
OTHERWISE
ReplaceDjwith"优秀"
ENDCASE
结果对小于90分的成绩等级均给"良好"。
3.完善程序,使其具有以下功能:
显示学生表(xs.dbf)男、女同学平均年龄,要求输出时保留4位小数。
Usexs
Store0tosum1,sum2,cot1,cot2
ForI=1to
(1)&&reccount()函数返回打开的表的记录数
Ifxb="男"
sum1=sum1+
(2)&&SUM1中存放男同学年龄之和
cot1=cot1+1&&COT1中存放男同学人数
Else
sum2=sum2+(3)&&SUM2中存放女同学年龄之和
cot2=cot2+1&&COT2中存放男同学人数
Endif
Skip
Endfor
?
(4)
?
(5)
【解析】答案为
(1)reccount();
(2)year(date())-year(csrq);(3)year(date())-year(csrq);(4)"男同学的平均年龄为"+STR(sum1/cot1,7,4);(5)"女同学的平均年龄为"+STR(sum2/cot2,7,4)。
此程序中用到了循环语句FOR……ENDFOR,使用语句SKIP将记录指针向下移动一个记录,直到学生表中的记录全部处理完。
表达式year(date())-year(csrq)用于计算每个学生的年龄。
STR()为VFP系统提供的函数,其功能是将数值表达式转换成字符串,第一个参数为要转换的数值表达式,第二个参数为串长,第三个参数为小数位。
"男同学的平均年龄为"+STR(SUM1/COT1,7,4)是一字符表达式,若没有STR转换函数(写成?
"男同学的平均年龄为"+SUM1/COT1),则系统会提示“操作符与操作数类型不匹配”。
①本例循环语句也可以用SCAN……ENDSCAN循环语句实现。
SCAN循环执行完循环体会自动下移一条记录,所以不要加上SKIP语句。
SCAN
Ifxb="男"
Sum1=sum1+year(date())-year(csrq)
Cot1=cot1+1
Else
Sum2=sum2+year(date())-year(csrq)
Cot2=cot2+1
Endif
ENDSCAN
②本例循环语句也可以用DOWHILE……ENDDO循环语句实现。
DOWHILE循环的循环条件为“NOTEOF()”,若记录指针没有指向表文件尾,就进行循环处理;否则,结束循环。
DOWHILENOTEOF()
Ifxb="男"
Sum1=sum1+year(date())-year(csrq)
Cot1=cot1+1
Else
Sum2=sum2+year(date())-year(csrq)
Co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 程序设计基础 程序设计 基础