资源描述:
《程序设计语言与程序设计》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
第1章程序设计语言与程序设计1.1填空题1.VB是以(事件驱动)作为运行机制的新一代可视化程序设计语言。2.程序设计语言是(人)与(计算机)交流的工具。3.若从机器执行的角度来对程序设计语言进行分类,则可以分为(低级语言)和(高级语言)两种。4.计算机系统中,对高级语言的翻译工具称为(编译)程序或(解释)程序。5.源程序中的错误一般分为(编译)错误、(运行)错误和(逻辑)错误等三种。6.VB把一个应用程序称为一个(工程),它包含各种文件。1.2选择题1.把a和b的乘积写成ab的错误属于(c)错误。a)编译b)运行c)逻辑d)编译和运行2.用户在什么时候都可以按(b)键来查看与当前进行的工作相关的帮助。a)Heldb)F1c)ESCd)F104窗体文件的扩展名为(d)。a).vbpb).basc).exed).frm4.指示一个窗体位置的值是窗体的(c)。 a)对象b)事件c)属性d)方法5.下面选项中不能运行VB程序的操作是(a)。a)双击窗体b)单击“启动”按钮图标c)从菜单栏运行菜单中选“全编译执行”菜单命令d)按F5键1.3问答题1.低级语言和高级语言的各自特点是什么?答:参见教材1.1。2.什么是数据描述和数据处理?答:参见教材1.2。数据描述就是把被处理的信息描述成计算机可以接受的数据形式;数据处理是指对数据进行输入,输出,整理,计算,存储,维护等一系列活动。3.源程序的翻译方式有哪两种,简述它们的工作过程。答:参见教材1.1。解释方式;编译方式4.一个好程序的基本要求是什么?答:参见教材1.2。正确性;易读性;运行高效率5.VisualBASIC集成开发环境的主窗口由哪些部分构成?各自的主要功能是什么?答:参见教材1.3。6.简述在VB的环境下,对象、属性、方法、事件和事件驱动程序的概念,并用例子进行说明。答:在VB的环境下,对象是系统中的基本运行实体,它封装了数据和操作 。工具箱中的命令按钮、标签、文本框等是对象摸板。控件是由VB工具箱创建的对象。属性是对象的性质或状态特征。例如,窗体的Caption(标题)、BackColor(背景颜色)、Height(高度)和Width(宽度)等都是窗体的属性。事件是对象之间传递的消息。VB控件的事件由系统预先定义。例如,Click(单击)事件、DblClick(双击)事件。方法是对象在某些事件驱动下执行的特定操作。它可以执行系统预定义的操作,例如窗体的Print(打印)方法、Show(显示窗体)方法;当事件由用户或VB系统触发时,对象会感受到该事件并对该事件作出响应,响应某个事件后所执行的程序就是事件驱动程序。事件驱动程序有时也称为事件过程。例如,以下是命令按钮Command1在接受单击事件时驱动的程序:PrivateSubCommand1_Click()Print"Helloworld!"EndSub7.总结使用VisualBASIC开发一个应用程序的过程。答:参见教材1.5。8.下面程序是什么事件驱动程序?如何执行该事件驱动程序?执行的结果如何?PrivateSubCommand1_Click()Print"欢迎你使用VB!"EndSub 答:略。1.4编程题编写一个程序。要求设置窗体的标题是“这是我的第一个练习”,且在程序执行后,单击窗体显示如下一行文字:我可以用VisualBASIC编写程序了!解答:(1)用户界面设计:设计用户界面由一个窗体构成。(2)对用户界面上的控件对象的属性进行设置:把窗体的Caption属性值设置为“这是我的第一个练习”。(3)编写控件对象的事件驱动程序:PrivateSubForm_Click()Print"我可以用VisualBASIC编写程序了!"EndSub第2章基本数据类型与表达式2.1填空题1.在程序设计语言系统中具有固定语法含义的符号串称为(关键字),它们通常用来表示系统提供的标准过程、函数、运算符、常量等。2.(标识符)用于标记用户自定义的常量、类型、变量、控件、过程、函数等名字。3.整型%数据占(2)字节的内存空间。长整型&数据占(4)个字节的内存空间。单精度!浮点型数据占(4) 个字节的内存空间。双精度#浮点型数据占(8)个字节的内存空间。日期型数据占(8)个字节的内存空间。4.100%表示100为(整)型数据;100!表示100为(单精度浮点)型数据;100@表示100为(货币)型数据。6符号常量在某一过程中说明,则该符号常量只能在(该过程内)内有效。6.若一个整型变量说明了之后没有给它赋值,则它的值为(0)。7.在VB中可以把类型说明符放在变量名的(末尾)来说明变量的类型。8.为使VB的编译程序自动检查变量声明,遇到未经说明的标识符发出错误警告信息,在程序中要加上(OptionExplicit)语句。9.对含有多种运算的表达式,各种运算之间的顺序为(函数运算)→(算术运算)→(关系运算)→(逻辑运算)。10.把1234.567的小数部分四舍五入转换为整数,可使用函数(Cint(1234.567))。11.将x四舍五入到百位(例如,若x=23874.52应舍入成23900),可使用表达式(Int(x/100+0.5)*100)。12.将x从十位截断(例如,x=23874.52应截成23800)可使用表达式(Fix(x/100)*100或者Int(x/100)*100或者Cint(x100)*100)。13.设X为数值变量,求X的常用对数可使用的表达式是(Log(X)/Log(10))。 14.要从字符串“VisualBASIC6.0”中截取子字符串“BASIC”可使用函数(Mid(“VisualBASIC6.0”,8,5))15.设S是字符串变量,并且串长度为7,写出生成由S的偶数序号字符组成的字符串的表达式(例如,把字符串”ABCDEFG”变成“BDF”)。答案:Mid(s,2,1)+Mid(s,4,1)+Mid(s,6,1)16.设S是字符串变量,并且串长度为7,写出用第2i–1个字符代替第2i个字符所得到字符串的表达式(例如,把字符串”ABCDEFG”变成“AACCEEG”)。答案:String(2,Mid(s,1,1))+String(2,Mid(s,3,1))+String(2,Mid(s,5,1))+Mid(s,7,1)或:String(2,Mid(s,1,1))+String(2,Mid(s,3,1))+String(2,Mid(s,5,1))+Right(s,1)17.产生从整数a到整数b之间的随机整数可使用表达式(Int((b-a+1)*Rnd+a))。18.产生从100.01到200.99之间的随机数(包括两端点)可使用的表达式是(Int((20099-10001+1)*Rnd+10001)/100)。2.2选择题1.下面选项中(c)是算术运算符。a)%b)&c)Modd)And4下面不合法的标识符是(d)。a)Go_Tob)Tab1c)姓名d)Int 3.下列选项中,把r定义为双精度型变量的是(c)。a)r%b)r!c)r#d)r$4.下列表达式中(d)是错误的。a)2^a/5b)–2^1/5c)2^(1/5)d)(-2)^(1/5)5.在下列选项中,正确表达2a+5的表达式是(c)。a)2^a+5b)2^a+2^5c)2^(a+5)d)2^a2^56.10Mod4的值为(b)。a)1b)2c)4d)107.下列运算符中(a)优先级最高。a)/b)c)Modd)+8.在VB中不能表示逻辑真的是(d)。a)Trueb)–1c)1d)T9.能正确表达a≤1或a≥5的逻辑表达式是(c)。a)a<=1或a>=5b)a<=1,a>=5c)a<=1ora>=5d)a<=1Anda>=510.设X为整型变量,不能正确表达1=5)11.求COS35°可以使用的函数是(d)。a)Cos35b)Cos(35)c)Cos(35o)d)Cos(35*3.14159/180)12.Len(“中国人民”)的值是(b)。a)0b)4c)8d)不能确定 13.设X是一个正实数,对X的第二位小数四舍五入可使用的函数是(c)。a)Int(X+0.05)/10b)Int((X+0.05)/10)c)Int(10*(X+0.05))/10d)Int(10*(X+0.05)/10)14.函数Int(Rad*99+1)产生随机数的范围是(b)。a)[1,99)b)[1,99]c)[1,100)d)[1,100]2.3下列符号哪些是正确的变量名1)n2)3x3)Abs4)855)print_566)名称7)π8)a%b9)ab#10)MyName11)“年龄”12)学校$答案:除了以下符号外,其它符号都是正确的变量名。错误的变量名原因3x变量名必须以字母为开始Abs不能和关键字同名85变量名必须以字母开始π不是英文字母a%b变量名中不能用字符%MyName变量名内不能有空格字符2.4把下列数学表达式写成VB表达式1)2)x{x[x(ax+b)+c]+d}+e3)ln(1+||10)4) 5)ctg6)log10(a2+2ab+b2)答案:1)1/(1+(1/(1+1/(x+y))))2)x*(x*(x*(a*x+b)+c)+d)+e3)Log(1+Abs((a+b)/(a-b))^10)4)Sqr(1+3.14159/2*Cos(48*3.14159/180))5)1/Tan((1-x*x)/(1+x*x))或者Cos((1-x*x)/(1+x*x))/Sin((1-x*x)/(1+x*x))6)Log(a*a+2*a*b+b*b)/Log(10)2.5写出下列函数的值1)Int(-1234.5678)2)Fix(1234.5678)3)val(“12.34”)4)Cint(1234.5678)5)Abs(-100)6)Sgn(-100)7)Sqr(sqr(16))8)Left(“VisualBASIC6.0”,6)9)Mid(“VisualBASIC6.0”,8,5)10)InStr(1,“VisualBASIC6.0”,“BASIC”)11)String(3,“$”)12)Int((100*Rnd)+1)答案:1)-12352)12343)12.344)12355)1006)-17)28)Visual9)BASIC10)011)$$$12)产生从整数1到整数100之间的随机整数2.6写出下列表达式的值1)(3+6)`22)184*4.0^2/1.6 3)253Mod3.2*Int(2.5)4)“xyz”+“438”5)“abc”&“123”&“abc”6)349.25+“0.75”=3507)“china”>=“canada”8)“abc”<=“abc”&“123”9)3>4And5=510)TrueOrNot7–3<=4答案:1)42)03)24)xyz4385)abc123abc6)True7)True8)True9)False10)True2.7设a1,a2,a3是布尔变量,其值依次为:True,True,False,写出下列布尔表达式的值1)Nota1AndNota22)Nota1EqvNota23)a1Ora2Anda34)a1Xora2Ora35)(Nota1Ora2)And(a2Ora3)6)Nota1Anda2Impa3答案:1)False2)True3)True4)False5)True6)True2.8用关系表达式或逻辑表达式表示下列条件1)i整除j2)n是小于正整数k的偶数3)1<=x<104)x,y其中有一个小于z5)y[–100,–10],并且y[10,100]6)坐标点(x,y)落在以(10,20)为圆心,以35为半径的圆内 7)三条边a,b和c构成三角形8)年份Year能被4整除,但不能被100整除或者能被400整除答案:1)iModj=02)n=-100Andy<=-10)AndNot(y>=10Andy<=100)6)Sqr((x-10)^2+(y-15)^2)<357)a+b>cAndb+c>aAndc+a>b8)YearMod4=0AndyearMod400<>0OrYearMod400=02.9问答题1.标识符的选取必须遵循什么规则?答:参见教材2.1.2。2.各种基本数据类型的取值范围如何?答:参见教材2.2表2-1。3.空串与空格有什么不同?答:参见教材2.1.1。4.什么是符号常量?使用符号常量有什么好处?答:参见教材2.3.1。5.自动变量与静态变量如何定义?它们之间有什么不同?答:参见教材2.3.2。6.两个字符串如何进行比较(关系)运算,如何确定运算结果?试举例说明。 答:参见教材2.4.3。第3章程序流程控制3.1填空题1.设变量r表示圆的半径,则计算圆的面积并赋给变量s使用的赋值语句为(s=3.14159*r*r)。2.给命令按钮Command2的Caption属性赋予字符串“退出”使用的赋值语句为(Command2.Caption="退出")。3.为了求n的阶乘,要求用户输入n的值。程序使用InputBox函数输入,要求对话框提示信息为“请输入一个求阶乘的数:”,标题为“求数的阶乘”,并且正确地把输入的信息转换为数值存放到变量n中,则使用的赋值语句为(n=val(InputBox("请输入一个求阶乘的数:","求数的阶乘"))。4.如果使用MsgBox对话框显示提示信息“退出本系统?”,并显示“是(Yes)”和“否(No)”两个按钮,显示图标“?”号,指定第一个按钮为默认值以及标题为“提示信息”,则调用MsgBox函数的形式为(MsgBox("退出本系统?",4+32+0,"提示信息"))。5.如果使用MsgBox对话框显示提示信息“文件未找到!”,并显示“确定”按钮、图标“!”号和标题“文件查找”,则使用的MsgBox语句为(MsgBox"文件未找到",0+48+0,"文件查找" )。6.要在当前窗体Form和立即窗口输出字符串“VisualBASIC6.0”使用的Print方法分别是(Print“VisualBASIC6.0”)和 (Debug.Print“VisualBASIC6.0”)。7.使用Print方法时,若用逗号分隔,则按(标准)格式输出各表达式的值,若用分号分隔,则按(紧凑)格式输出各表达式的值。8.注释语句是一个(非执行)语句,VB不对它们进行编译,对程序的执行结果没有任何影响。9.判别变量i是否为偶数,若为偶数就把它显示出来。使用单行结构条件语句为(IfiMod2=0Thenprintx)。10.判别变量x是否大于0,若大于0,则累加到变量s1中,否则,累加到变量s2中,使用的单行结构条件语句为(Ifx>0Thens1=s1+xElses2=s2+x)。11.给定分段函数,求y的值,使用的单行结构条件语句为(Ifx>0Theny=2*x+1ElseIfx=0Theny=0Elsey=2*x-1)。12.判别a是否等于b,若a=b,则输出字符串“aisequaltob”的块结构条件语句为()。答案:Ifa=bThenPrint“aisequaltob”End13.判别ch是否为小写字母,若是,输出“yes”;否则,输出“No”的块结构条件语句为()。答案:IfAsc(ch)>=97AndAsc(ch)<=122Then Print“Yes”ElsePrint“No”EndIf14.若一个case子句中的表达式表由逗号分隔的若干个常数组成,则它的含义是:当测试表达式的值等于(这些常数中的某一个)时,执行该case子句相应的程序块。15.若case子句中的表达式表列具有形式:<表达式1>To<表达式2>,则它的含义是:当测试表达式的值等于(这个范围内的值)时,执行该case子句相应的程序块。16.若case子句中的表达式表列具有形式:Is<关系运算符><表达式>,则它的含义是:当测试表达式的值满足(Is后的关系)时,执行该case子句相应的程序块。17.在循环语句中,反复执行的程序段称为(循环体);进入循环体的条件称为(循环条件);中止循环体执行的条件称为(结束循环条件)。3.2选择题1.下列赋值语句中,(d)是正确的。a)x!="abc"b)a%="10e"c)x+1=5d)s$=1002.下列选项中,(d)不能交换变量a和b的值。a)t=b:b=a:a=tb)a=a+b:b=a-b:a=a-b c)t=a:a=b:b=td)a=b:b=a3.若在消息框MsgBox中显示“确定(Ok)”和“取消(Cancel)”两个按钮,则buttons参数的设置值是(b)。a)0b)1c)2d)34.若在消息框MsgBox中选择第二个按钮为默认值,则buttons参数的设置值是(b)。a)0b)256c)512d)7685.若单击了“终止(Abort)”按钮,则MsgBox函数的返回值是(c)。a)1b)2c)3d)46.以下不正确的单行结构条件语句是(d)。a)Ifx>yThenPrint“x>y”b)IfxThent=t*xc)IfxMod3=2Then?xd)Ifx<0Theny=2*x-1:PrintxEndIf7.给定程序段DimaAsInteger,bAsInteger,cAsIntegera=1:b=2:c=3Ifa=c-bThenPrint"#####"ElsePrint"*****"以上程序(c)。a)没有输出b)有语法错c)输出#####d)输出*****8.把a, b之中的最大值存放于max,下面语句书写正确的是(d)。a)Ifa>bThenmax=aElsemax=bEndIfb)Ifa>bThenmax=aElsemax=bEndIfc)Ifa>bThenmax=aElsemax=bd)Ifa>bThenmax=aElsemax=bEndIf9.下列Case语句中正确的是(c)。a)SelectCasexCase1Or3Or5y=x*x-1CaseIs>10y=x+1EndSelect b)SelectCasexCase1,3,5y=2*x-1CaseIsx<=1Y=2*x+1EndSelectc)SelectCasexCaseIs<=0y=x-1CaseIs>0y=Sqr(x)+1EndSelectd)SelectCasexCasex>=1Andx<=5y=x-1CaseIs>10y=x*x+1EndSelect10.执行下列程序段后屏幕上(c)。i%=10:Sum=0Whilei>1Sum=Sum+ii=i-1 WendPrintSuma)无显示b)显示10c)显示54d)显示5511.执行下列程序段输出结果是(c)。x%=2Dowhilex<8Print“*”;x=x+2Loopa)*b)**c)***d)****12.设有程序段Dimk%k=5Dountilk=0k=k-1Loop则下面对循环语句描述正确的是(c)。a)循环体1次也不执行b)循环体执行1次c)循环体执行5次d)循环体执行无限次13.下面描述中错误的是(a,c)。a)执行Dountil<条件>…loop语句中,当循环<条件>为false时,结束循环体的执行。 b)执行While<条件>…Wend语句时,循环体可能一次也不执行。c)Do…loopWhile<条件>语句的循环体可能一次也不执行。d)执行Do…loopUntil<条件>语句中,当循环条件为true时,结束循环体的执行。14.下面程序段中循环语句的循环次数是( b)。Forx=10To1Step-3PrintxNextxa)0b)4c)5d)1015.执行语句Fori=1to3:i=i+1:Nexti后变量i的值是(c )。a)3b)4c)5d)616.下面程序段执行后输出结果是(b)。Fori=1To2s=1Forj=0Toi-1s=s+s*jNextjPrints,Nextia)11b)12c)21d)223.3阅读下列程序,写出执行结果1.PrivateSubForm_Click Print–2*3/2,“Visual”&“BASIC”,Not5>3,0.75Print–2*3/2;“Visual”&“BASIC”;Not5>3;0.75 x=12.34Print“x=”;PrintxEndSub答案:-3VisualBASICFalse.75-3VisualBASICFalse.75x=12.342.PrivateSubForm_Click PrintTab(10);-100;Tab(20);200;Tab(30);-300PrintSpc(10);-100;Spc(10);200;Spc(10);-300EndSub答案:-100200-300-100200-3003.PrivateSubForm_Clickx=12.35PrintFormat(x,”###.##”)PrintFormat(x,”##.##”)PrintFormat(x,”000.00”)PrintFormat(x,”00.0”)PrintFormat(x,”0.00%”) PrintFormat(x,”$##.##”)PrintFormat(x,”+##.##”)PrintFormat(x,”00.00E+00”)EndSub答案:12.3512.35012.3512.41235.00%$12.35+12.3512.35e+004.PrivateSubCommand1_Click()Dima%,b%,c%,s%,w%,t%a=-1:b=3:c=3s=0:w=0:t=0Ifc>0Thens=a+bIfa<=0ThenIfc<=0Thenw=a-bEndIfElse Ifc>0Thenw=a-bElset=cEndIfc=a+bPrinta,b,cPrints,w,tEndSub答案:-1322005.PrivateSubCommand1_Click()Dimx%,y%x=InputBox("请输入x的值:")SelectCasexCase1,3,5y=x-1Case6To10y=x+1Case2,4y=2*xCaseIs>10y=x*x+1EndSelectPrint"x=";x,"y=";y EndSub(x的输入值为2.5、8、4和15)答案:x=2y=4x=8y=9x=4y=8x=15y=2266.PrivateSubCommand1_Click()Dimi%,t!t=1:i=1Whilei<10t=t*ii=i+2WendPrint"t=";tEndSub答案:t=9457.PrivateSubCommand1_Click()Dimi%,x%,y%x=1:y=1:i=1DoUntili>8IfiMod2=1Thenx=x*i Elsey=y*iEndIfi=i+1LoopPrint"x=";x,"y=";yEndSub答案:x=105y=3848.PrivateSubCommand1_Click()Dimp%,s%p=1:s=1Dop=p+2:s=s+pLoopWhilep<10Print"s=";sEndSub答案:s=369.PrivateSubCommand1_Click()Dimm%,n%Form=1to3n=0Whilen<=m-1 Printm,nn=n+1WendNextmEndSub答案:1020213031323.4编程题1.输入一个学生成绩,若成绩在85分以上,则输出“verygood”;若成绩在60分到80分之间,则输出“good”;若成绩低于60分,则输出“nogood”。解答:(1)界面设计和属性设置在窗体上建立两个标签、两个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-3-1所示。表3-3-1第1题的属性设置控件名称属性名属性值Form1Caption根据分数给定评语 Label1Caption分数Label2Caption评语Text1Text空串Text2Text空串Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimscore!score=Val(Text1.Text)Ifscore>=85ThenText2.Text="Verygood!"ElseIfscore>=60ThenText2.Text="Good!"ElseText2.Text="Nogood!"EndIfEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况 运行程序后,屏幕出现用户界面。把鼠标移到Text1文本框并单击,输入分数。然后,单击“开始”命令按钮,系统执行Command1_Click事件过程。执行结果如图3.3.1所示。单击标题为“结束”的命令按钮,执行Command2_Click事件过程,结束程序的执行。图3.3.1第1题的执行结果2.求一元二次方程ax+bx+c=0的根。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-2所示。表3-3-2第2题的属性设置控件名称属性名属性值Form1Caption求一元二次方程的根Command1Caption开始Command2Caption结束(2)程序代码由中学数学知识知道,求一元二次方程的根的公式为:,编程时要考虑如下各种情况:①当a=0时,方程不是二次方程;②当b2-4ac=0时,有两个相同的实根:;③当b2-4ac>0时,有两个不同的实根:; ④当b2-4ac<0时,有两个共轭复根:。PrivateSubCommand1_Click()ClsDima!,b!,c!,disc!,x1!,x2!,realpart!,imagpart!a=InputBox("请输入方程的系数a:")b=InputBox("请输入方程的系数b:")c=InputBox("请输入方程的系数c:")Print:PrintPrintTab(10);"输入方程的系数为:";"a=";a;"b=";b;"c=";cPrintIfAbs(a)<=0.000001ThenPrintTab(15);"方程不是一个二次方程!"Elsedisc=b^2-4*a*cIfAbs(disc)<=0.000001ThenPrintTab(10);"方程有两个相同的实根:";"x1=x2=";-b/(2*a)ElseIfdisc>0.000001Thenx1=(-b+Sqr(disc))/(2*a)x2=(-b-Sqr(disc))/(2*a)PrintTab(5);"方程有两个实根:"PrintTab(18);"x1=";x1PrintTab(18);"x2=";x2 ElseIfdisc<0.000001Thenrealpart=-b/(2*a):imagpart=Sqr(-disc)/(2*a)PrintTab(5);"方程有两个虚根:";PrintTab(18);"x1=";realpart;"+";imagpart;"i"PrintTab(18);"x2=";realpart;"-";imagpart;"i"EndIfEndIfEndSubPrivateSubCommand2_Click()EndEndSub注意,程序中的条件“fabs(a)<=0.000001”和“fabs(disc)<=0.000001”分别用来判断a和disc的值是否为0。因为实数在计算机计算和存储时会有微小的误差,若用“a=0”和“disc=0”来判断a和disc是否为0,则会由于误差导致条件不成立,无法得到正确的运行结果。(3)运行情况运行程序后,单击“开始”命令按钮,执行Command1_Click事件过程。执行时,在InputBox框中输入a、b和c三个系数。图3.3.2~图3.3.5显示了不同系数输入的执行结果。图3.3.2执行结果(a)图3.3.3执行结果(b) 图3.3.4执行结果(c)图3.3.5执行结果(d)3.给定函数y=,从键盘上输入x的值,求y的值。(要求使用Case语句)解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-3所示。表3-3-3第3题的属性设置控件名称属性名属性值Form1Caption求给定分段函数的值Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDimx!,y!x=InputBox("请输入x的值:")Ifx>=1Andx<=5ThenSelectCasexCaseIs<2 y=3*x-5CaseIs<4y=2*Cos(x)+1CaseIs<=5y=Sqr(1+x*x)EndSelectElsey=x*x-4*x+5EndIfPrintTab(10);"x=";x,"y=";yEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击“开始”命令按钮,执行事件过程Command1_Click。执行时,按InputBox对话框提示,输入x的值。计算结果在窗体上显示。4.输入圆的半径R和运算标志,按照运算标志进行指定运算。给定的运算标志及其表示的运算如下:C(Circle)表示计算周长A(Area)表示计算面积 B(Both)表示周长和面积都计算(要求使用Case语句)解答:(1)界面设计和属性设置在窗体上放置两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-4所示。表3-3-4第4题的属性设置控件名称属性名属性值Form1Caption计算圆周长或圆面积或两者都计算Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDimr!,fAsString*1Constpi!=3.14159265r=InputBox("请输入圆的半径r:")Ifr>=0Thenf=UCase(InputBox("输入运算标志:"+Chr(13)&_"C___(计算周长)"+Chr(13)&_"A___(计算面积)"+Chr(13)&_"B___(两者都计算)")) '提示信息分多行显示SelectCasefCase"C"PrintTab(10);"半径r=";r;"圆周长=";r*2*piCase"A"PrintTab(10);"半径r=";r;"圆面积=";r^2*piCase"B"PrintTab(10);"半径r=";r;"圆周长=";r*2*piPrintTab(10);"半径r=";r;"圆面积=";r^2*piCaseElsePrintTab(18);"输入的运算标志错!"EndSelectElsePrintTab(18);"半径不能是负数!"EndIfEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击标题为“开始” 的命令按钮,执行Command1_Click事件过程。按InputBox对话框的提示输入半径r和运算标志。计算结果在窗体上显示。5.求满足12+22+…+n2>1000的最小n值。(要求使用While…WEnd语句)解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-5所示。表3-3-5第5题的属性设置控件名称属性名属性值Form1Caption求满足1^2+2^2+…+n^2>1000的最小n值Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimn%,s&n=0:s=0Whiles<=1000n=n+1s=s+n^2WendPrint:Print:PrintPrintTab(8);"满足1^2+2^2+…+n^2>1000的最小n值为:";n EndSubPrivateSubCommand2_Click()EndEndSub6.输入若干个正实数,个数预先不能确定,求这些正实数之和。(要求分别使用DoWhile…Loop语句和DoUntil…Loop语句)解答:(1)界面设计和属性设置在窗体上建立三个命令按钮。窗体和命令按钮的主要属性设置如表3-3-6所示。表3-3-6第6题的属性设置控件名称属性名属性值Form1Caption求正实数之和Command1CaptionDoWhile…LoopCommand2CaptionDoUntil…LoopCommand3Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDima!,s!a=InputBox("输入一个实数:")DoWhilea>=0 s=s+aa=InputBox("输入一个实数:")LoopPrint:PrintPrintTab(15);"输入的正实数之和为:";sEndSubPrivateSubCommand2_Click()ClsDima!,s!a=InputBox("输入一个实数:")DoUntila<0s=s+aa=InputBox("输入一个实数:")LoopPrint:Print:PrintPrintTab(15);"输入的正实数之和为:";sEndSubPrivateSubCommand3_Click()EndEndSub(3)运行情况运行程序后,屏幕出现用户界面如图3.3.6所示。单击标题为“Do While…Loop”或标题为“DoWhile…Loop”的命令按钮,系统执行相应的Click事件过程。用户可以输入一系列数据,以输入-1作结束。窗体显示运算结果。单击“结束”按钮,结束程序执行。图3.3.6第6题的执行结果7.使用公式来求π的近似值,直到最后一项的值小于10-8为止。(要求使用Do…LoopWhile语句)解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-7所示。表3-3-7第7题的属性设置控件名称属性名属性值Form1Caption求圆周率的近似值Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimi&,s#,term#i=1s=0Do term=1/(i*i)s=s+termi=i+1LoopWhileterm>=0.00000001Print:Print:PrintPrintTab(8);"圆周率的近似值为:";Sqr(6*s)EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击标题为“开始”的命令按钮,执行Command1_Click事件过程。计算结果在窗体上显示。8.由数值计算方法可知,用牛顿迭代法解方程f(x)=0的迭代公式为:试用牛顿迭代法求解方程x5-3x2+2x+1=0在x0=0附近的根。(要求使用Do…LoopUntil语句)解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-8所示。表3-3-8第8题的属性设置 控件名称属性名属性值Form1Caption用牛顿法求方程的根Command1Caption开始Command2Caption结束(2)程序代码根据迭代公式,牛顿迭代法的计算过程为:①令n=0,由迭代公式得,然后判别∣x1-x0∣是否小于ε(给定精度)。若是,则迭代结束,x1作为方程的近似根;否则,进行下一步。②令n=1,由迭代公式得,然后判别∣x2-x1∣是否小ε。若是,则迭代结束,x2作为方程的近似根;否则,由x2求x3的值,判断∣x3-x2∣。┇按这样迭代下去,一直到∣xi+1-xi∣<ε(i=0,1,2,…)为止。根据上述计算过程可以编写程序为:PrivateSubCommand1_Click()Dimx0!,x1!x1=0Dox0=x1x1=x0-(x0^5-3*x0^2+2*x0+1)/(5*x0^4-6*x0+2)LoopUntilAbs(x1-x0)<0.00001 PrintTab(10);"方程的根为:";x1EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击标题为“开始”的命令按钮,执行Command1_Click事件过程。在窗体上显示计算结果。9.求S=的值。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-9所示。表3-3-9第9题的属性设置控件名称属性名属性值Form1Caption求s=1-1/2+1/3-1/4+…+1/99-1/100的值Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimi%,s!,sign%sign=1:s=0 Fori=1To100s=s+sign*1/isign=-signNextiPrint:Print:PrintPrintTab(18);"s的值为:";sEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击标题为“开始”的命令按钮,执行Command1_Click事件过程。窗体显示计算结果。10.求100到999中的水仙花数。所谓水仙花数是指一个三位数,它的各位数字的立方之和等于该数。例如,因为153=13+53+33,所以153是水仙花数。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-10所示。表3-3-10第10题的属性设置控件名称属性名属性值 Form1Caption求水仙花数Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimi%,a%,b%,c%PrintPrintTab(5);"100--999之间的水仙花数为:"Fori=100To999a=i100b=(i-a*100)10c=i-a*100-b*10Ifi=a^3+b^3+c^3ThenPrintTab(10);iEndIfNextiEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况执行结果如图3.3.7所示。 图3.3.7第10题的执行结果11.求1000之内的所有完数。所谓完数是指一个数恰好等于它的所有因子之和。例如,因为6=1+2+3,所以6为完数。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-11所示。表3-3-11第11题的属性设置控件名称属性名属性值Form1Caption求完数Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimi%,j%,s%PrintPrintTab(5);"1--1000之内的完数为:"Fori=1To1000s=0Forj=1Toi-1IfiModj=0Thens=s+j NextjIfi=sThenPrintTab(5);iNextiEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况程序执行结果如图3.3.8所示。图3.3.8第11题的执行结果12.在窗体上输出形如以下图形,其中第一行的起始字母和终止字母由用户从键盘上输入。ABCDEBCDEACDEABDEABCEABCD解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-12所示。 表3-3-12第12题的属性设置控件名称属性名属性值Form1Caption输出由字母构成的图形Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDimstargAsString*1,endgAsString*1,stargc%,endgc%,i%,j%,k%starg=UCase(InputBox("请输入起始字母:"))endg=UCase(InputBox("请输入终止字母:"))stargc=Asc(starg)endgc=Asc(endg)PrintIfstargc<=endgcThenFori=0Toendgc-stargcPrintTab(24);Forj=stargc+iToendgcPrintChr(j);NextjFork=stargcTostargc+i-1 PrintChr(k);NextkPrintNextiElsePrintTab(15);"起始字母必须先于终止字母!"EndIfEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,需在InputBox对话框输入起始字母和终止字母。执行结果在窗体上显示。13.已知XYZ+YZZ=532,其中X,Y和Z为0~9的数字,编程求出X、Y和Z,并在窗体上把算式显示出来。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-3-13所示。表3-3-13第13题的属性设置控件名称属性名属性值 Form1Caption求算式中的数字Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimx%,y%,z%,i%PrintPrintTab(23);"x";"y";"z"PrintTab(22);"+";"y";"z";"z"PrintTab(21);"------------"PrintTab(23);5;3;2Forx=1To9Fory=1To9Forz=0To9i=100*x+10*y+z+100*y+10*z+zIfi=532ThenPrint:PrintTab(10);"算式中的数字为:";_"x=";x;"y=";y;"z=";z;"即":GoTolNextzNextyNextxl:PrintPrintTab(23);x;y;z PrintTab(22);"+";y;z;zPrintTab(21);"------------"PrintTab(23);5;3;2EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况执行结果如图3.3.9所示。图3.3.9第13题的执行结果第4章常用控件4.1填空题1.在图片框上放置的控件称为图片框的(子)对象,而窗体是图片框的(父)对象。2.窗体的“名称”(Name)属性只能在(属性窗口中)设置。3.在程序中设置窗体Forml的Caption属性为“主窗体”,使用的赋值语句是(Forml.Caption=”主窗体”)。4.当窗体的Enabled属性为(True)时,指定窗体响应事件。5.窗体的Unload事件是在QueryUnload事件发生之(后)发生。6.程序中,把当前窗体移动到屏幕左上角使用的方法为(Move0,0)。 7.在窗体Form1中坐标为(1600,800)的位置上输出字符串“VisualBASIC6.0”使用的语句为(Form1.Currrentx=1600)、(Form1.Currenty=800)、和(Form1.Print“VisualBASIC6.0”)。8.若使文本框有边框,需设置BorderStyle属性的值为(1)。9.在程序运行期间,用户可以用文本框显示信息。文本框接受输入的内容的属性是(Text)。10.若使文本框内能够接受多行文本,则要设置Multiline属性的值为(True)。11.要把图形文件“c:samplediannt.jpg”装载到图片框Picture1上,使用的语句为(Picture1.Picture=LoadPicture(“c:samplediannt.jpg”))。12.若使图片框自动调整大小以适应装入的图形,则要设置Autosize属性的值为(True)。13.除了在程序使用LoadPicture函数装载图形外,还可以在设计阶段通过修改(Picture)属性装载图形。14.若程序中要把一些文本内容输出到图片框PictureBox,应使用(Print)方法。15.当单选按钮OptionButton的Value属性为(False)时,表示该单选按钮处于未选中状态。16.若使命令按钮Command1重新生效,则使用的赋值语句为(Command1.Enabled=True)。 17.若使命令按钮不能接收和响应任何事件,可以设置Visible属性的值为(False)。18.只有控件对象的Enabled和Visible属性值都为(True)时,该控件对象才能接受焦点。19.Tab顺序是由建立控件时的(先后顺序)来确定。20.设置框架Frame上的文本内容需要使用(Caption)属性。21.在框架上可以设置一组相关控件,这些控件作为框架的(子)控件,它们具有总体的激活/屏蔽特性。22.若屏蔽框架上的控件对象,则需设置(Enabled)属性的值为False。23.列表框ListBox中项目的序号从(0)开始到(Listcount-1)结束。24.要显示列表框List1中序号为3项目内容,语句为(PrintList1.List(3))。25.向组合框Combo2添加序号为5,内容为“计算机学院”的项目,使用的语句为(Combo2.AddItem“计算机学院”,5)。26.要删除组合框Combo1序号为3的项目,使用的语句为(Combo1.ReMoveItem3)。27.使用滚动条ScrollBar时,若要设置当用鼠标单击两个滚动箭头之间区域的滚动幅度,需使用(LargeChange)属性。28.若要设置水平或垂直滚动条的最小值,需使用(Min)属性。 29.计时器Timer每经过一个由InterVal属性指定的时间间隔就会触发一次(Timer)事件。30.若要使计时器每0.5钞钟触发一次Timer事件,则要把InterVal属性值设置为(500)。4.2选择题1.窗体标题栏的显示内容由窗体的(b)属性决定。a)Nameb)Captionc)BackColord)Enabled2.当窗体被装入内存时,系统将自动执行(a,b)事件过程。a)Loadb)Activatec)Unloadd)QueryUnload3.在标签框上显示的内容由(b)属性来实现。a)Nameb)Captionc)Textd)ForeColor4.要使标题在标签框内居中显示,Alignment属性的取值应为(2)。a)0b)1c)2d)35.若使标签框根据所显示内容自动调整其大小,则可以通过设置(a)属性值为True来实现。a)AutoSizeb)Alignmentc)Enabledd)Visible6.文本框没有(d)属性。a)BackColorb)Enabledc)Visibled)Caption7.若设置文本框最多可以接受的字符数,则可以使用(d)属性。a)Lengthb)Multilinec)Maxd)MaxLength8.在文本框中设置垂直滚动条,要使ScrollBars的值为(c)。a)0b)1c)2d)3 9.在运行程序时,要使文本框获得焦点,则需使用(b)方法。a)Changeb)SetFocusc)GotFocusd)Move10.下列控件中,没有AutoSize属性的是(b,d)。a)标签b)文本框c)图片框d)图像框11.若把图片框Picture1中的图形清除,可以使用的语句是(b,c,d)。a)Picture1.Delb)Picture1.Picture=LoadPicture("")c)Picture1.Picture=LoadPicture()d)Picture1.Picture=Nothing12.命令按钮上的文本内容由(b)属性来设置。a)Textb)Captionc)Named)Show13.若将命令按钮设置为默认选择命令按钮,可以通过(c)属性来实现。a)Valueb)Cancelc)Defaultd)Enabled14.要使命令按钮失效,则可以设置(b)属性的值为False来实现。a)Valueb)Enabledc)Visibled)Cancel15.若使命令按钮在屏幕不可见,则可以通过修改(c)属性实现。a)Valueb)Enabledc)Visibled)Cancel16.当复选框Value属性值为(b)表示该复选框被选中。 a)0b)1c)2d)317.改变控件的Tab顺序可以修改(d)属性值。a)Visibleb)Enabledc)TabStopd)TabIndex18.下列控件中(d)不能接受GotFocus和LostFocus事件。a)命令按钮b)组合框c)复选按钮d)计时器19.要使列表框中的项目垂直滚动,应设置Columns属性值为(a)。a)0b)1c)2d)320.若要得到列表框中项目的数目,可以访问(c)属性。a)Listb)ListIndexc)ListCountd)Text21.设置列表框的选择方式,应使用(b)属性。a)Columnsb)MultiSelectc)Styled)List22.若要清除列表框的所有项目内容,可以使用(c)方法。a)AddItemb)ReMovec)Cleard)Print23.删除列表框中的某一个项目,需要使用(d)方法。a)Clearb)ReMovec)Moved)ReMoveItem24.在组合框中选择某一项目内容,可以通过(d)属性获得。a)Listb)ListIndexc)ListCountd)Text25.若要获得滚动条的当前位置,可以通过访问(a)属性来实现。a)Valueb)Maxc)Mind)LargeChange26.当用鼠标拖动滚动块时触发(b,c)事件。 a)Moveb)Changec)Scrolld)GotFocus27.设置计时器的时间间隔可以通过(d)属性来实现。a)Valueb)Textc)Maxd)InterVal28.暂时关闭计时器,需设置(b)属性。a)Visibleb)Enabledc)Lockd)Cancel4.3问答题1.在VB集成环境中,用属性窗口设置字体(Font)属性时,系统将弹出一个对话框(见图4-10),指出该对话框中包含些什么控件?答:在该对话框中包含列表框、命令按钮、框架、复选框和文本框等控件。2.设Text1为某一文本框名,下列程序段的输出结果是什么?Text1.Text="abcdefghijk"Text1.selstart=3Text1.sellength=5PrintText1.SelText答:输出结果是:defgh3.标签和文本框有什么区别?答:参见教材4.3。4.比较用Print方法输出和用标签输出的优缺点。 答:窗体、图片框和打印机等具有Print方法,用于直接输出文本。输出格式、字体风格通过语句中的格式控制和对象的字体属性共同完成。Print方法只有在程序运行后,执行代码才能显示结果。标签控件利用Caption属性输出文本,可以通过字体属性设置显示风格。其属性可以在设计阶段给定,也可以在程序运行时改变。标签控件是窗体的子对象,主要用于界面设计,不能输出复杂格式的数据,特别地,不能直接把输出送到外部设备,如打印机。5.图片框和图象框的作用是什么?它们之间有什么区别?在什么情况下可以相互代替?在什么情况下必须使用图片框?答:参见教材4.4。6.框架的作用是什么?如何在框架中建立控件?答:参见教材4.6。4.4编程题1.编一程序能够实现:每次单击命令按钮Command1能使标签Label1上的文字在窗体Form1上往右移动100缇,当标签在窗体Form1上往右移出窗体的右边界时,再次单击命令按钮Command1能使标签回到窗体的左边界。解答:(1)界面设计和属性设置在窗体上建立一个标签和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-4-1所示。表3-4-1第1题的属性设置控件名称属性名属性值Form1Caption使标签往右移 Label1CaptionFontNameFontSize欢迎使用VB!隶书三号字Command1Caption移动Command2Caption结束(2)程序代码PrivateSubCommand1_Click()IfLabel1.Left>Form1.ScaleWidthThenLabel1.Left=0ElseLabel1.Left=Label1.Left+100EndIfEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,屏幕出现用户界面。每单击一次标题为“移动” 的命令按钮,执行Command1_Click事件过程,使标签往右移100缇。右移出窗体的右边界时,再次单击“移动”命令按钮,标签回到窗体的左边界。执行情况如图3.4.1所示。图3.4.1第1题的执行情况2.编写一个把某些英文单词翻译为中文单词的简单程序。要求用户界面为一个窗体,窗体左侧是一个文本框,用户在这里输入想要翻译的英文单词(注意输入一个新的单词之前应清除原有内容);窗体中间是一个命令按钮,在该命令按钮上面显示“翻译”两字;窗体右侧也是一个文本框;当程序运行时,用户按下命令按钮后,窗体右侧的文本框显示单词的中文意思。如果找不到想要翻译的英文单词,则给出相应的信息。解答:(1)界面设计和属性设置在窗体上建立两个标签、两个文本框和一个命令按钮。窗体和窗体上控件的主要属性设置如表3-4-2所示。表3-4-2第2题的属性设置控件名称属性名属性值Form1Caption英文单词翻译为中文单词Label1Caption英文Label2Caption中文Text1Text空串Text2Text空串 Command1Caption翻译(2)程序代码PrivateSubForm_Load()Text1.Text="":Text2.Text=""EndSubPrivateSubCommand1_Click()SelectCaseLCase(Trim(Text1.Text))Case"china"Text2.Text="中国"Case"france"Text2.Text="法国"Case"england"Text2.Text="英国"Case"america"Text2.Text="美国"Case"india"Text2.Text="印度"CaseElseText2.Text="找不到该单词!"EndSelectEndSubPrivateSubText1_MouseDown(ButtonAsInteger,ShiftAsInteger,X AsSingle,YAsSingle)Text1.Text="":Text2.Text=""EndSub(3)运行情况上机运行程序后,屏幕出现用户界面。此时,把鼠标移到Text1文本框并单击,然后输入英文国家名,例如,China。英文国家名输入后,单击标题为“翻译”的命令按钮,系统执行相应的Click事件过程。执行结果如图3.4.2所示。单击工具栏上的“结束”按钮,系统结束程序的执行。图3.4.2第2题的执行结果3.在文本框中输入算术表达式,并以回车符作为输入结束标志。对表达式中的圆括号是否配对进行检查,且给出配对或不配对信息。若配对,则给出“左右圆括号配对”的信息;否则,给出“左圆括号多于右圆括号”或“右圆括号多于左圆括号”的信息。解答:(1)界面设计和属性设置在窗体上建立一个文本框。窗体和文本框的主要属性设置如表3-4-3所示。表3-4-3第3题的属性设置控件名称属性名属性值Form1Caption判别算术表达式中的圆括号是否配对 Text1Text空串(2)程序代码DimnAsIntegerPrivateSubText1_KeyPress(KeyAsciiAsInteger)ClsIfChr(KeyAscii)="("Thenn=n+1ElseIfChr(KeyAscii)=")"Thenn=n-1EndIfPrintIfKeyAscii=13ThenIfn=0ThenPrintTab(18);"左右圆括号配对!"ElseIfn>0ThenPrintTab(15);"左圆括号多于右圆括号!"ElsePrintTab(15);"右圆括号多于左圆括号!"EndIfEndIfEndSubPrivateSubText1_MouseDown(ButtonAsInteger,ShiftAsInteger,X AsSingle,YAsSingle)ClsText1.Text=""n=0EndSub(3)运行情况运行程序后,焦点在Text1文本框上。输入算术表达式,然后按回车键,执行Text1_KeyPress事件过程。执行结果如图3.4.3所示。若输入另一个算术表达式,可以单击Text1文本框,再次输入算术表达式和按回车键,执行Text1_MouseDown事件过程。图3.4.3第3题的执行结果4.编写一个程序,把某一图形装入到一个图片框中,且能实现该图形的放大、缩小和全屏显示。解答:(1)界面设计和属性设置在窗体上建立一个图片框和三个命令按钮。窗体和窗体上控件的主要属性设置如表3-4-4所示。表3-4-4第4题的属性设置控件名称属性名属性值Form1Caption图片缩放Picture1Picture一幅图片(在程序中装入) Command1Caption图片放大Command2Caption图片缩小Command3Caption全屏显示(2)程序代码PrivateSubCommand1_Click()IfPicture1.Height<2200ThenIfForm1.ScaleHeight-Picture1.Height>50ThenPicture1.Height=Picture1.Height+50EndIfEndIfIfForm1.ScaleWidth-Picture1.Width>70ThenPicture1.Width=Picture1.Width+70EndIfEndSubPrivateSubCommand2_Click()SelectCasePicture1.HeightCaseIs>50Picture1.Height=Picture1.Height-50CaseIs>30Picture1.Height=Picture1.Height-30CaseIs>10Picture1.Height=Picture1.Height-10 EndSelectSelectCasePicture1.WidthCaseIs>100Picture1.Width=Picture1.Width-100CaseIs>50Picture1.Width=Picture1.Width-50CaseIs>30Picture1.Width=Picture1.Width-30CaseIs>10Picture1.Width=Picture1.Width-10EndSelectEndSubPrivateSubCommand3_Click()Picture1.Height=Form1.ScaleHeight-1000Picture1.Width=Form1.ScaleWidthEndSubPrivateSubForm_Load()Picture1.Picture=LoadPicture_("c:ProgramFilesMicrosoftOfficeOfficeBitmapsstylesGlobe.wmf")EndSub(3)运行情况 运行程序后,单击不同的命令按钮,系统执行相应的Click事件过程。执行结果如图3.4.4所示。图3.4.4第4题的执行结果5.编写一个求三角函数值的程序。在程序中,用户可以选择输入角度或弧度值,也可以选择计算一种三角函数(例如,正弦、余弦、正切等)的值,且能把计算的结果显示出来。要求分别使用两组单选按钮进行输入选择和计算选择,每组单选按钮存放在一个框架中;用文本框输入角度或弧度值,用标签输出计算结果。解答:(1)界面设计和属性设置在窗体上建立两个标签、两个文本框和两个框架。一个框架包含两个单选按钮,另一个框架包含三个单选按钮。窗体和窗体上控件的主要属性设置如表3-4-5所示。表3-4-5第5题的属性设置控件名称属性名属性值Form1Caption计算三角函数的值Label1Caption输入Label2Caption输出Text1Text空串Text2Text空串Frame1Caption输入选择 Option1Caption角度Option2Caption弧度Frame2Caption函数选择Option3Caption正弦Option4Caption余弦Option5Caption正切(2)程序代码ConstPi=3.14159265PrivateSubForm_Load()Option1.Value=TrueOption3.Value=TrueText1.Text="":Text2.Text=""EndSubPrivateSubText1_Change()DimXAsSingleIf(Option1.Value)ThenX=Val(Text1.Text)*Pi/180ElseX=Val(Text1.Text)EndIfIf(Option3.Value)ThenText2.Text=Sin(X) ElseIf(Option4.Value)ThenText2.Text=Cos(X)ElseIf(Option5.Value)ThenText2.Text=Tan(X)EndIfEndSubPrivateSubText1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)Text1.Text="":Text2.Text=""EndSub(3)运行情况运行程序后,在文本框Text1输入角度,系统执行Text1_Change事件过程。执行结果如图3.4.5所示。单击标题为“弧度”的单选按钮和标题为“余弦”的单选按钮,鼠标单击文本框Text1,输入弧度,系统执行Text1_Change事件过程,执行结果如图3.4.6所示。图3.4.5第5题的执行结果(a)图3.4.6第5题的执行结果(b)6.编写一个程序,产生一个字体浏览器。要求用一个列表框显示系统当前可供选择的字体,另一个列表框显示系统当前可供选择的字体大小,并且使用标签显示所选字体及其大小样例。解答: (1)界面设计和属性设置在窗体上建立四个标签、两个列表框。窗体和窗体上控件的主要属性设置如表3-4-6所示。表3-4-6第6题的属性设置控件名称属性名属性值Form1Caption字体浏览器Label1Caption字体选择Label2Caption字体大小选择Label3Caption样例Label4CaptionBorderStyle中文字体演示1List1Style1List2Style1(2)程序代码PrivateSubForm_Load()DimiAsIntegerFori=0ToScreen.FontCount-1List1.AddItemScreen.Fonts(i)NextiFori=8To12List2.AddItemTrim(Str(i)) NextiFori=14To72Step2List2.AddItemTrim(Str(i))NextiEndSubPrivateSubList1_Click()Label4.FontName=List1.TextEndSubPrivateSubList2_Click()Label4.FontSize=List2.TextEndSub(3)运行情况运行程序后,执行事件过程Form_Load,屏幕上显示用户界面。单击左边列表框List1上某一复选框,选择字体。然后单击右边列表框List2上的某一复选框,选择字号,系统执行相应的事件过程。执行结果如图3.4.7所示。图3.4.7第6题的执行结果7.编写一个用于演示颜色合成情况的程序。要求使用滚动条作为红、绿和蓝三种基色值的输入控件。(提示:使用RGB函数对输入的三种基色进行合成得到复合颜色)解答: (1)界面设计和属性设置在窗体上建立四个标签和三个滚动条。窗体和窗体上控件的主要属性设置如表3-4-7所示。表3-4-7第7题的属性设置控件名称属性名属性值Form1Caption颜色合成演示Label1Caption红色份量值:Label2Caption绿色份量值:Label3Caption蓝色份量值:Label4CaptionBorderStyle空串1Hscroll1MaxLargeChange2555Hscroll2MaxLargeChange2555Hscroll3MaxLargeChange2555(2)程序代码 PrivateSubHScroll1_Scroll()Label1.Caption="红色份量值:"&HScroll1.ValueLabel4.BackColor=RGB(HScroll1.Value,HScroll2.Value,HScroll3.Value)EndSubPrivateSubHScroll2_Scroll()Label2.Caption="绿色份量值:"&HScroll2.ValueLabel4.BackColor=RGB(HScroll1.Value,HScroll2.Value,HScroll3.Value)EndSubPrivateSubHScroll3_Scroll()Label3.Caption="蓝色份量值:"&HScroll3.ValueLabel4.BackColor=RGB(HScroll1.Value,HScroll2.Value,HScroll3.Value)EndSub(3)运行情况运行程序后,把鼠标移到各个滚动条的滚动块,然后单击并拉着滚动块移动一段距离,系统执行相应的事件过程。执行结果如图3.4.8所示。图3.4.8第7题的执行结果 8.编写程序,把某一图形装入一个图像框中,并使它能在窗体上从左至右往返不断移动。(提示:使用窗体的Left属性和计时器控件)解答:(1)界面设计和属性设置在窗体上建立一个图像框、一个计时器和一个命令按钮。窗体和窗体上控件的主要属性设置如表3-4-8所示。表3-4-8第8题的属性设置控件名称属性名属性值Form1Caption使图片往返移动Image1Pictrue一幅图片(在程序中装入)Timer1Interval10(在程序中给定)Command1Caption停止移动(2)程序代码Dimx,fAsIntegerPrivateSubForm_Load()Image1.Picture=LoadPicture_("c:ProgramFilesMicrosoftOfficeOfficeBitmapsDbwizEvtmgmt.gif")Timer1.Interval=10'设定Timer事件每隔10毫秒发生一次EndSubPrivateSubTimer1_Timer()SelectCasef'f=0则向左移动,f=1则向右移动Case0 Ifx<5000Thenx=x+100Elsef=1'使图片向右移动Case1Ifx>-3000Thenx=x-100Elsef=0'使图片向左移动EndSelectImage1.Left=x'把图像框的左上角水平移到x的位置EndSubPrivateSubCommand1_Click()EndEndSub(3)运行情况运行程序后,屏幕出现一幅往返移动的图片。单击标题为“停止移动”的命令按钮,结束程序的执行。第5章数组与记录5.1填空题1.若要定义一个包含10个字符串元素,且下界为1的一维数组s,则数组说明语句为(Dims(1To10)AsString)。2.若要定义一个元素为整型数据的二维数组a,且第一维的下标从0到5,第二维下标从-3到6,则数组说明语句为(Dima(0To5,-3To6)AsInteger)。3.如果数组元素的下标值为实数,则VB系统会按(四舍五入原则)进行处理。 4.数组元素个数可以改变的数组称为( 可调数组 );数组元素可以存放不同类型数据的数组称为( 可变类型数组 )。5.数组刷新语句用于( 清除指定数组内容 )。若被刷新的数组是数值数组,则把所有元素置( 0);若被刷新的数组为字符串数组,则把所有元素置( 空字符串 )。6.设有表格控件grd1,若设置grd1的第2行第5列的单元格为当前活动单元格,使用的语句为( grd1.Row=2)和( grd1.Col=5 )。7.要使表格控件grd1的当前活动单元格显示字符串“姓名”,使用的语句是( grd1.Text=“姓名” )。8.建立一个具有10行10列的表格控件grd2,需使用的语句为( grd2.Row=10 )和( grd2.Col=10 )。9.在程序的运行中,对表格控件grd1的某些列的数据按降序并且区分大小写排序,使用的语句是( grd1.Sort=8 )。10.控件数组是由一组类型和( 名字 )相同的控件组成,共享(同一个事件过程)。11.控件数组中的每一个控件都有惟一的下标,下标值由(Index)属性指定。12.建立控件数组有两种方法:(在设计阶段通过相同Name属性值来建立)和(在程序代码中使用Load方法)。5.2选择题1.下列一维数组说明语句错误的是(d)。a)Dimb(100)ASDoubleb)Dimb(-5To0)ASByte c)Dimb(-10To–20)ASIntegerd)Dimb(5To5)ASString2.若有数组说明语句为:Dima(-3To8),则数组a包含元素的个数是(d)。a)5b)8c)11d)123.设有数组说明语句:Dim c(1To10),则下面表示数组c的元素选项中( c )是错误的。a)c(i-1)b)c(5+0.5)c)c(0)d)c(10)4.下列数组说明语句中正确的是(a)。a)Dima(-1To5,8)ASStringb)Dima(n,n)ASIntegerc)Dima(0To8,5To–1)ASSingled)Dima(10,-10)ASDouble5.设有数组说明语句:Dim b(-1To2,-2To2),则数组b中元素的个数是( d)。a)12b)15c)16d)206.设有数组说明语句:Dim c(-1To2,1To5),则下列表示数组c的元素选项中( c)是正确的。a)c(i+j)b)c(i)(j)c)c(i+1,i-1)d)c(1,0)7.若有数组说明语句:Dima()ASInteger,则a被定义为( b)。a)定长数组b)可调数组c)静态数组d)可变类型数组8.若有数组说明语句:Dimt(1To10)ASVariant,则t被定义为( d)。a)数值数组b)可调数组c)字符串数组d)可变类型数组 9.下面选项中,错误的是(c)。a)DimsAsvariant:s=Array("one","two","Three")b)Dimb:b=Array(1,2,3)c)DimbAsInteger:b=Array(1,2,3)d)DimbAsvariant:b=Array(1,2,3)10.若有以下说明语句TypeemployeenumAsIntegersalaryAsSingleEndTypeDimprogrammerAsemployee则下面表示记录变量programmer的成员Salary正确的是( d )。a)programmer→salaryb).salaryc)salary.programmerd)programmer.salary11.已知有说明语句TypedatyearAsIntegermonthAsIntegerdayAsIntegerEndTypeTypeempnoAsInteger nameAsString﹡10sexAsString*1birthdayAsdatsalaryAssingleEndTypeDimprogrammerAsemp并假设变量programmer所表示职工的出生日期是“1978年10月1日”,则下列正确的赋值语句是(d)。a)year=1978:month=10:day=1b)birthday.Year=1978:birthday.month=10:birthday.day=1c)programmer.year=1978:programmer.month=10:programmer.day=1d)programmer.birthday.year=1978:programmer.birthday.month=10:programmer.birthday.day=112.假设有上题的说明语句,则下列With语句正确的是(c)。a)withprogammerno=1000:name="张勇":sex="男"withbirthdayyear=1978:month=10:day=1Endwithsalary=2800Endwith b)withprogrammer.no=1000:.name="张勇":.sex="男"with.birthday.year=1978:.month=10:.day=1Endwith.salary=2800Endwithc)withprogrammer.no=1000:.name="张勇":.sex="男".birthday.year=1978:.birthday.month=10:.birthday.day=1.salary=2800Endwithd)withprogrammer,birthday.no=1000:.name="张勇":.sex="男".year=1978:month.=10:day.=1.salary=2800Endwith5.3问答题1.使用关键字Dim,ReDim和Static定义的数组分别称为什么数组?它们各有什么特点?答:参见教材5.3。2.若有表格控件grd1,则选定表格控件 grd1从第4行到第8行和从第4列到第8列的表格单元块需使用那些语句?答:grd1.Row=4:grd1.Col=4grd1.ColSel=8:grd1.RowSel=85.4阅读下列程序,写出执行结果1.PrivateSubCommand1_Click()Dimf(10)AsIntegerf(0)=1:f(1)=1Fori=2To10f(i)=f(i-2)+f(i-1)NextiFori=0To10IfiMod4=0ThenPrintPrintf(i),NextiEndSub答案:11235813213455892.PrivateSubCommand1_Click()Dims(1To6)AsIntegerFori=1To6s(i)=i NextiFori=1To3Forj=4To6t=s(i):s(i)=s(j):s(j)=tNextjNextiFori=1To6Prints(i);NextiEndSub答案:6543213.PrivateSubCommand1_Click()Dima(1To9)AsIntegerDimb(1To3,1To3)AsIntegerDimi%,j%Fori=1To9a(i)=iNextiFori=1To3Forj=1To3b(i,j)=a(i*j)Ifj<=iThenPrintb(i,j), NextjPrintNextiEndSub答案:1243694.PrivateSubCommand1_Click()Dima(1To5,1To5)AsInteger,i%,j%Fori=1To5Forj=1To5Ifi<=jThena(i,j)=1Elsea(i,j)=i-j+1NextjNextiFori=1To5Forj=1To5Printa(i,j);NextjPrintNextiEndSub答案:1 1 1 1 1 2 1 1 1 13 2 1 1 14 3 2 1 15 4 3 2 15.5编程题1.已知求成绩的平均值和均方差公式为:,,其中n为学生人数,s为第i个学生成绩。求某班的平均成绩和均方差。解答:(1)界面设计和属性设置在窗体上建立四个标签和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-5-1所示。表3-5-1第1题的属性设置控件名称属性名属性值Form1Caption求平均值和均方差Label1Caption平均值Label2Caption均方差Label3CaptionBorderStyle空串1Label4CaptionBorderStyle空串1 Command1Caption计算Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimsum1!,sum2!,ave!,dev!,n%,i%Dims()AsIntegern=InputBox("请输入学生人数:")ReDims(1Ton)Fori=1Tons(i)=InputBox("请输入第"&Str(i)&"个学生成绩:")Nextisum1=0:sum2=0Fori=1Tonsum1=sum1+s(i)Nextiave=sum1/nFori=1Tonsum2=sum2+(s(i)-ave)^2Nextidev=Sqr(sum2/n)Label3.Caption=aveLabel4.Caption=dev EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击标题为“计算”的命令按钮,输入学生人数和每个学生成绩。例如,输入3、70、80和90,执行结果如图3.5.1所示。图3.5.1第1题的执行结果2.编一程序,使用随机函数产生10个互不相同的两位整数存放到一维数组中,并输出该数组,然后求这组数中的最大值及最大值在数组中的位置。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-5-2所示。表3-5-2第2题的属性设置控件名称属性名属性值Form1Caption求两两不相同随机数最大值及其位置Command1Caption开始Command2Caption结束(2)程序代码 PrivateSubCommand1_Click()ClsDima(1To10),i%,j%,max%,p%RandomizeFori=1To10l:a(i)=Int((90*Rnd+10))Forj=1Toi-1Ifa(i)=a(j)ThenGoTolNextjNextiPrintPrintTab(2);"产生的随机数为:"PrintFori=1To10Print"a(";i;")=";a(i),IfiMod4=0ThenPrintNextimax=a(1):p=1Fori=2To10Ifa(i)>maxThenmax=a(i):p=iNextiPrint:Print PrintTab(2);"最大值为:";maxPrintTab(2);"最大值所在数组元素的下标为:";pEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况程序执行结果如图3.5.2所示。图3.5.2第2题的执行结果3.把20个整型数据存放到一维数组a中,找出a中出现频率最高的元素值及出现的次数。例如,若把1,5,4,3,5,8,5和3存放到数组a中,则出现频率最高的元素值是5,出现的次数是3。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮主要属性设置如表3-5-3所示。表3-5-3第3题的属性设置控件名称属性名属性值Form1Caption找出出现频率最高元素和出现次数Command1Caption开始Command2Caption结束 (2)程序代码PrivateSubCommand1_Click()ClsDimi%,j%,fmax%Dima(1To20)AsInteger,b(1To20)AsIntegerPrintPrintTab(2);"用随机函数产生的数值是:"RandomizeFori=1To20a(i)=Int(10*Rnd+1)'产生1~10之间的随机整数,并存放到a(i)中Printa(i),IfiMod4=0ThenPrintNextifmax=0Fori=1To20b(i)=0Forj=1ToiIfa(i)=a(j)Thenb(i)=b(i)+1'b(i)用来对a(i)出现的次数进行计数Ifb(i)>fmaxThenfmax=b(i)EndIf NextjNextiPrintPrintTab(2);"出现频率最高的数值是:";Fori=1To20Ifb(i)=fmaxThenPrinta(i);EndIfNextiPrintPrintTab(2);"出现的次数是:";fmaxEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况程序执行结果如图3.5.3所示。图3.5.3第3题的执行结果4.给定两组已按升序排列好的整型数据,编写一个程序把它们合并为一组仍按升序排列的数据。解答: (1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-5-4所示。表3-5-4第4题的属性设置控件名称属性名属性值Form1Caption把两个升序数组合并为一个升序数组Command1Caption合并Command2Caption结束(2)程序代码DimaAsVariant,bAsVariant,c%(0To11)PrivateSubForm_Activate()Dimi%a=Array(1,2,7,8)PrintPrintTab(5);"第一个升序数组:";Fori=0To3Printa(i);NextiPrint:Printb=Array(3,4,8,8,9,10,12,12)PrintTab(5);"第二个升序数组:";Fori=0To7 Printb(i);NextiEndSubPrivateSubCommand1_Click()Dimi%,j%,k%i=0:j=0:k=0Whilei<4Andj<8Ifa(i)>b(j)Thenc(k)=b(j):k=k+1:j=j+1'比较a和b中的元素,把较大的元素移到Else'c中,直到其中一个数组搬空为止c(k)=a(i):k=k+1:i=i+1EndIfWendWhilei<4c(k)=a(i):i=i+1:k=k+1'把a中剩余的元素搬到c中WendWhilej<8c(k)=b(j):j=j+1:k=k+1'把b中剩余的元素搬到c中WendPrint:Print PrintTab(5);"合并后的升序数组:"PrintTab(8);Fori=0To11Printc(i);NextiEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,系统执行Form_Activate事件过程,屏幕出现用户界面,并显示两个升序数组。此时,单击标题为“合并”的命令按钮,系统执行相应的Click事件过程。执行结果如图3.5.4所示。单击标题为“结束”的命令按钮,结束程序的执行。图3.5.4第4题的执行结果5.从键盘上输入一个正整数,判别它是否为回文数。所谓回文数是指正读和反读都一样的数。例如,123321是回文数。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-5-5所示。 表3-5-5第5题的属性设置控件名称属性名属性值Form1Caption判别一个整数是否为回文数Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDimnumAsLong,nAsLong,i%,k%,f%,b%(10)num=InputBox("请输入一个整数:")k=0:n=numDob(k)=nMod10'把num的各位数字存入数组b中k=k+1n=n10LoopWhilen<>0f=1Fori=0To(k-1)/2Ifb(i)<>b(k-1-i)Thenf=0'num的第i位与第k-1-i位数字不相同时f置0Nexti'说明num不是回文数Print IffThenPrintTab(2);num;"是回文数!"ElsePrintTab(2);num;"不是回文数!"EndIfEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,在调用InputBox函数出现对话框时,输入一个整数,例如,123454321。执行结果如图3.5.5所示。图3.5.5第5题的执行结果6.编一程序,把一个m行n列矩阵中的元素存放到一个二维数组中,并求出该数组的平均值、最大值和最小值。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-5-6所示。表3-5-6第6题的属性设置控件名称属性名属性值 Form1Caption求矩阵的平均值、最小值和最大值Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimi%,j%,m%,n%,sum!,ave!,max!,min!Dima()AsSinglem=InputBox("请输入矩阵的行数:")n=InputBox("请输入矩阵的列数:")ReDima(1Tom,1Ton)PrintPrintTab(2);"输入的矩阵为:"Fori=1TomPrintTab(15);Forj=1Tona(i,j)=InputBox("输入第"&Str(i)&"行"&"第"&Str(j)&"列元素:")Printa(i,j);NextjPrintNextisum=0 Fori=1TomForj=1Tonsum=sum+a(i,j)'求和NextjNextiave=sum/(m*n)'求平均值max=a(1,1)Fori=1TomForj=1TonIfa(i,j)>maxThenmax=a(i,j)'求最大值NextjNextimin=a(1,1)Fori=1TomForj=1TonIfa(i,j)maxThenmax=s(i).scoreNextiPrint PrintTab(4);"最高分数:";maxPrintTab(4);"分数最高者:";Fori=1TonIfs(i).score=maxThenPrints(i).nameEndIfNextiEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,需多次调用InputBox函数。在调用InputBox函数出现对话框时,输入学生人数、每个学生的姓名和分数,例如,输入3;李小萍;78;张志明;92;何伟;80。执行结果如图3.5.8所示。图3.5.8第8题的执行结果第6章绘图6.1填空题1.在VB中,自定义坐标系除了可以用(ScaleLeft)、(ScaleTop)、(ScaleWidth)和(ScaleHight )等4个属性来定义外,还可以用(Scale)方法来定义。2.若要调整对象的位置和大小,可以使用(Move)方法。3.若要把窗体移到屏幕中间,使用的语句为()。答案:Left=(Screen.Width-Width)/2Top=(Screen.Height-Height)/24.可以通过设置Shape控件的(Shape)属性来绘制各种几何图形。5.(Cls)方法可以清除窗体或图形框中在程序运行时产生的图形和文字。6.(Pset)方法用于单个像素的控制,可以用来设置指定坐标点处像素的色彩。若要“擦除”坐标为(100,100)的点的颜色,需使用的语句为(Pset(100,100)BackColor)。7.在程序中的语句“Line(100,100)-step(50,100)”执行之后,Currentx和Currenty的值分别为(150)和(200)。8.在窗体、图片框或打印机上绘制经裁剪后的图形文件,需使用(PaintPicture)方法。6.2选择题1.VB中坐标系的默认刻度的单位是缇,我们可以根据需要,用(b)属性来改变默认刻度的单位。a)Scaleb)ScaleModec)ScaleWidthd)ScaleHeight2.执行下列程序段后,窗体Form1右下角的坐标是(d)。Form1.ScaleTop=1 Form1.ScaleLeft=1Form1.ScaleHeight=-2Form1.ScaleWidth=2a)(1,1)b)(1,2)c)(-2,2)d)(3,-1)3.可以通过设置Line控件的(d)属性来绘制虚线、点线、点划线等各种样式的图形。a)Lineb)Stylec)Fillstyled)BorderStyle4.若用水平直线来填充由Shape控件,或由Circle,Line方法生成图形的内部,则需设置FillStyle的值为(c)。a)0b)1c)2d)35.Point(x,y)方法的功能是(c)。a)在坐标(x,y)处画出一点b)从点(0,0)到点(x,y)画出一条线c)得到(x,y)处的颜色代码d)以点(x,y)为圆心画一个圆6.语句“Circle(1000,1000),500,,-3.14/2,3.14”的功能是画出(a)。a)圆弧b)圆c)椭圆d)扇形6.3问答题1.窗体的Width,Height属性与ScaleWidth,ScaleHeight属性有什么区别?答:参见教材6.1。 2.如何使用窗体的4个属性:ScaleLeft,ScaleTop,ScaleWidth和ScaleHeight属性,以及Scale方法建立数学中的笛卡儿坐标系?试举例说明一下。答:参见教材6.1之自定义规格坐标系。3.比较使用图形控件和绘图方法绘图的特点。答:参见教材6.3,6.4。4.把一个具有Picture属性的对象中的图形绘制到另一个对象上,可以用赋值语句修改对象的Picture属性或使用PaintPicture方法实现。请比较这两种操作的特点。答:参见教材6.4.5。6.4阅读下列程序,写出运行结果。1.PrivateSubForm_Click()Scale(0,0)-(2500,1500)Fori=0To7FillStyle=iLine(80+i*300,200)-Step(200,200),,BNextiEndSub答案:2.PrivateSubForm_Click()Dimi%,radius%Fori=1To100xpos=ScaleWidth/2ypos=ScaleHeight/2 r=255*Rndg=255*Rndb=255*Rndradius=ypos*RndCircle(xpos,ypos),radius,RGB(r,g,b)NextiEndSub答案:画出100个圆心在窗体中间的圆,由随机数指定圆的半径和线条颜色。3.PrivateSubForm_Click()Scale(0,1)-(360,-1)DrawWidth=3Forx=0To360y=Cos(x*3.14159265/180)PSet(x,y),vbRedy=Sin(x*3.14159265/180)PSet(x,y),vbBlueNextxEndSub答案:画出一条红色余弦曲线和一条蓝色正弦曲线。6.5编程题1.编写程序,使用绘图方法在窗体上画出一个五角星。 解答:(1)界面设计和属性设置窗体作为用户界面。窗体的属性Caption的值设置为“绘制五角星”,其它属性采用默认值。(2)程序代码PrivateSubForm_click()Constp=3.14159265/180,b=1200Line(600,600)-Step(b,0)Line-Step(-b*Cos(36*p),b*Sin(36*p))Line-Step(b*Sin(18*p),-b*Cos(18*p))Line-Step(b*Sin(18*p),b*Cos(18*p))Line-Step(-b*Cos(36*p),-b*Sin(36*p))EndSub(3)运行情况执行结果如图3.6.1所示。图3.6.1第1题的执行结果2.给定正弦曲线的方程为y=sin(x),画出当x从-2?到2?变化时的正弦曲线。要求画出坐标轴,在坐标轴上标出刻度。解答:(1)界面设计和属性设置 窗体作为用户界面。窗体的属性Caption的值设置为?画正弦曲线?,其它属性采用默认值。(2)程序代码PrivateSubForm_Click()ClsPrintTab(5);"y=sinx"Scale(-8,2)-(8,-2)Line(-7.5,0)-(7.5,0)Line(0,1.9)-(0,-1.9)CurrentX=7.8:CurrentY=0.2:Print"x"CurrentX=0.5:CurrentY=2:Print"y"Fori=-7To7Line(i,0)-(i,0.1)CurrentX=i-0.2:CurrentY=-0.1:PrintiNextiFori=-1To1Ifi<>0ThenCurrentX=-0.7:CurrentY=i+0.1:PrintiLine(0.5,i)-(0,i)EndIfNextiCurrentX=-6.283:CurrentY=0Fori=-6.283To6.283Step0.01 x=iy=Sin(x)Line-(x,y),RGB(255,0,0)NextiEndSub(3)运行情况执行结果如图3.6.2所示。图3.6.2第2题的执行结果3.编一程序,使得窗体上的一个红色小球能按圆形轨迹运动。给定圆形轨迹方程为:其中r为圆的半径,?为圆心角,当?从0变化到2?时就得到一个圆。解答:(1)界面设计和属性设置窗体作为用户界面。窗体的属性Caption的值设置为?使红色小球按圆形轨迹运动?,其它属性采用默认值。(2)程序代码PrivateSubForm_Click()Constpi=3.1415926Dimr!,i!Scale(-1000,700)-(1000,-700) r=ScaleWidth/4FillColor=vbRedFillStyle=0WhileTrueFori=0To2*piStep0.001FillStyle=0Circle(r*Sin(i),r*Cos(i)),30,vbRedClsNextiWendEndSub(3)运行情况运行程序后,单击窗体,执行Form_Click事件过程。一个红色小球按圆形轨迹在窗体上不断运动,如图3.6.3所示,按组合键Ctrl+Break才停止。图3.6.3第3题的执行结果4.输入某班学生某门课程的成绩,统计成绩在90~100分、80~89分、70~79分、60~69分和不合格等各个分数段的人数,且以饼图的形式显示各个分数段人数占总人数的比例。解答:(1)界面设计和属性设置 在窗体上建立五个标签和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-6-1所示。表3-6-1第4题的属性设置控件名称属性名属性值Form1Caption以饼形显示各分数段人数比例Label1Caption红色:90--100Label2Caption黄色:80--89Label3Caption蓝色:70--79Label4Caption绿色:60--69Label5Caption黑色:0--59Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimn%,i%,score%,n1%,n2%,n3%,n4%,n5%,b1!,b2!,b3!,b4!,b5!Constpi=3.14159265n=InputBox("请输入学生总人数:")n1=0:n2=0:n3=0:n4=0:n5=0Fori=1Tonscore=InputBox("请输入第"&Str(i)&"个学生的分数:")SelectCasescoreCase90To100 n1=n1+1Case80To89n2=n2+1Case70To79n3=n3+1Case60To69n4=n4+1CaseElsen5=n5+1EndSelectNextib1=n1/n:b2=n2/n:b3=n3/n:b4=n4/n:b5=n5/nFillStyle=0Fori=1To300FillColor=QBColor(4)Ifn1<>0ThenCircle(1200,1200-i),800,QBColor(4),-2*pi,-2*pi*b1,2/3EndIfFillColor=QBColor(6)Ifn2<>0ThenCircle(1200,1200-i),800,QBColor(6),-2*pi*b1,-2*pi*(b1+b2),2/3 EndIfFillColor=QBColor(1)Ifn3<>0ThenCircle(1200,1200-i),800,QBColor(1),-2*pi*(b1+b2),-2*pi*(b1+b2+b3),2/3EndIfFillColor=QBColor(2)Ifn4<>0ThenCircle(1200,1200-i),800,QBColor(2),-2*pi*(b1+b2+b3),-2*pi*(b1+b2+b3+b4),2/3EndIfFillColor=QBColor(0)Ifn5<>0ThenCircle(1200,1200-i),800,QBColor(0),-2*pi*(b1+b2+b3+b4),-2*pi,2/3EndIfNextiFillColor=QBColor(4)Ifn1<>0ThenCircle(1200,1200-i),800,vbWhite,-2*pi,-2*pi*b1,2/3EndIfFillColor=QBColor(6) Ifn2<>0ThenCircle(1200,1200-i),800,vbWhite,-2*pi*b1,-2*pi*(b1+b2),2/3EndIfFillColor=QBColor(1)Ifn3<>0ThenCircle(1200,1200-i),800,vbWhite,-2*pi*(b1+b2),-2*pi*(b1+b2+b3),2/3EndIfFillColor=QBColor(2)Ifn4<>0ThenCircle(1200,1200-i),800,vbWhite,-2*pi*(b1+b2+b3),-2*pi*(b1+b2+b3+b4),2/3EndIfFillColor=QBColor(0)Ifn5<>0ThenCircle(1200,1200-i),800,vbWhite,-2*pi*(b1+b2+b3+b4),-2*pi,2/3EndIfEndSubPrivateSubCommand2_Click()EndEndSub (3)运行情况运行程序后,单击“开始”按钮,按InputBox提示输入学生人数和每个学生成绩。例如,输入3、70、80和90,执行结果如图3.6.4所示。图3.6.4第4题的执行结果5.编写一个程序,绘制一个能绕着圆中心旋转的正方形。解答:(1)界面设计和属性设置窗体作为用户界面,在窗体上放置一个计时器。窗体属性Caption的值设置为“绘制能绕着圆中心旋转的正方形”,计时器Timer1属性Interval的值设置为500,其它属性采用默认值。(2)程序代码PrivateSubTimer1_Timer()Scale(-1000,700)-(1000,-700)Dimr!,d!Statict#Constpi=3.1415926r=ScaleWidth/6d=Sqr(2*r*r)Ift>=2*piThent=0 Elset=t+0.1EndIfForm1.Cls:DrawWidth=2:FillStyle=7Line(0,0)-(r*Sin(t),r*Cos(t))Line-(d*Sin(t-45*pi/180),d*Cos(t-45*pi/180))Line-(r*Sin(t-90*pi/180),r*Cos(t-90*pi/180))Line-(0,0)Circle(0,0),d,RGB(255,0,0)EndSub(3)运行情况程序结果如图3.6.5所示。图3.6.5第5题的运行情况6.一块小石头掉进平静的水面,产生一圈圈的涟漪。编写程序,简单模拟这个动态效果。解答:(1)界面设计和属性设置窗体作为用户界面,在窗体上放置一个计时器。窗体属性Caption的值设置为“模拟小石头掉到水面”,计时器Timer1属性Interval的值设置为200,其它属性采用默认值。(2)程序代码 PrivateSubForm_Load()Scale(-1000,700)-(1000,-700)Line(-1000,0)-(1000,0),RGB(0,255,0)FillColor=RGB(255,255,0)EndSubPrivateSubTimer1_Timer()Staticr%,i%Ifi=0Andr=0Theni=700Ifr=0Andi>0ThenClsDrawMode=13:FillStyle=0Line(-1000,0)-(1000,0),RGB(0,255,0)Circle(0,i),100,RGB(255,255,0),,,2i=i-30EndIfIfi<=0Andr=0ThenDrawMode=14:FillStyle=1:ClsEndIfIfi<=0Andr<=1000Thenr=r+50Circle(0,0),r,RGB(0,255,0),,,1/4Circle(0,0),r+100,RGB(125,255,0),,,1/4 Circle(0,0),r+200,RGB(0,255,125),,,1/4EndIfIfi<=0Andr>1000Thenr=0:i=0:ClsEndIfEndSub(3)运行情况运行程序后,模拟小石头掉下来,如图3.6.6所示。当小石头掉到由绿线表示的水面时,产生一圈圈的涟漪,如图3.6.7所示。图3.6.6第6题的运行情况(a)图3.6.7第6题的运行情况(b)第7章过程7.1填空题1.一个VB应用程序可以包括的三种模块是:(窗体模块)、(标准模块)和(类模块)模块。2.函数过程定义中至少有一个赋值语句把表达式的值赋给(函数过程名)。3.在VB中,过程定义中有两种传递形式的参数:一种是(传值参数),称为传值调用;另一种是(传址参数),称为传址调用。4.若模块中以关键字public定义子过程,则在(整个应用程序)中都可以调用该过程。 5.若窗体模块或标准模块中以关键字private定义函数过程,则该函数过程只能在(该窗体模块或标准模块)中使用。6.每一个用标识符定义的变量、常量、过程都有一个有效范围,这个范围称为标识符的( 作用域 )。7.在模块内定义的过程,若在关键字sub或Function加前缀Public,则该过程称为( 全局级过程或工程级过程 )。8.过程中定义的静态变量作用域是( 该过程内 ),生存期是( 整个应用程序运行结束之前 )。7.2选择题1.标准模块中的代码存放在以(b)为扩展名的文件中。a).frmb).basc).clsd).txt2.(a)不能在标准模块中定义。a)事件过程b)子过程可以c)函数过程可以d)公共过程3.设已定义子过程p,有3个数值型传值参数;设a为实型变量,调用该子过程的正确语句为(c)。a)pb)callp0.5,a,100c)callp(0.5,cos(0.1),a+10)d)p(0.5,1.2,100)4. 设已定义函数过程f,它有三个实型传值参数;设a,b和c为实型变量,则调用该函数的正确语句为(c)。a)fb)f(a+b,b+c)c)f(a+b,b+c,c+a)c)fa+b,b+c,c+a5.在过程体中退出子过程的语句是(c)。 a)ExitDob)ExitForc)ExitSubd)ExitFunction6.在过程的形式参数的前面加上关键字(d),则该参数说明为传值参数。a)Valb)Refc)ByRefd)ByVal7.关于过程作用域,错误的描述是(d)。a)全局级过程的作用域为整个工程。b)在某一窗体模块中定义的全局级过程,若被该模块外的模块所调用,必须在该过程名前加上窗体名称。c)在不同模块中定义的模块级过程可以同名。d)模块级过程与工程级过程不能同名。8.关于变量的作用域,正确的描述是(b)。a)在模块内定义的变量,其作用域必定为所在模块。b)同一模块中不同级的变量不能同名。c)一模块中所有在过程之外用Dim定义的变量为全局变量。d)不同模块中定义的变量名字可以相同。9.当鼠标在窗体上移动时,会发生(c)事件。a)MouseDownb)MouseUpc)MouseMoved)DragDown10.当某个对象具有焦点时,在键盘上按下某一键时就会发生(a,c)事件。a)KeyPressb)KeyUpc)KeyDownd)DragDown 11.当用户(a)时,会引发焦点所在对象的KeyPress事件。a)在键盘上按下有ASC码的键b)释放键盘上有ASC码的键c)单击鼠标左键d)单击鼠标右键12.当用户在键盘上按下一个有ASC码的键时会发生(a)事件。a)KeyPress和KeyDownb)KeyPress和KeyUpc)KeyDown和KeyUpd)KeyPress和KeyMove7.3问答题1.过程的主要作用是什么?VB有什么类型的自定义过程?试举例说明。答:参见教材7.2。2.传值参数和传址参数的主要作用是什么?在调用过程进行参数传递时,它们之间有什么区别?答:参见教材7.3。7.4阅读程序,写出输出结果。1.PrivateSubp(ByValiAsInteger)Dimj%,k%Forj=0To7-iPrint"";NextjFork=0To2*i-1Print"*";Nextk PrintEndSubPrivatesubcommand1_Click()Dimi%Fori=1To2P(i)NextiFori=3To1Step-1P(i)NextiEndSub答案:******************2.PrivateSubCommand1_Click()Dimm%m=max(35,-21,480)m=max(max(m,75,100),380,28)Print"max=";m EndSubPrivateFunctionmax(ByValxAsInteger,ByValyAsInteger,ByValzAsInteger)Ifx>yThenmax=xElsemax=yIfz>maxThenmax=zEndFunction答案:max=4803.PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,cAsIntegerCalls(10,5,a)Calls(7,a,b)Calls(a,b,c)Print"a=";a,"b=";b,"c=";cEndSubPrivateSubs(xAsInteger,yAsInteger,zAsInteger)z=y–xEndSub答案:a=-5b=-12c=-74.PrivateSubCommand1_Click()Dimi%Constn=10Dima(1Ton)AsInteger RandomizeFori=1Tona(i)=Int(Rnd*100+1)Printa(i),IfiMod4=0ThenPrintNextiPrintCalls(a,n)EndSubPrivateSubs(a()AsInteger,ByValnAsInteger)Dimi%,k%Fori=1TonIfa(i)Mod3=2ThenIfkMod4=0ThenPrintPrinta(i),k=k+1EndIfNextiEndSub答案:输出10个1~99之间的随机整数,并把其中能被4整除的数输出来5.PublicxAsInteger PrivateSubCommand1_Click()x=10:PrintxCalls1:PrintxCalls2:PrintxEndSubPrivateSubs1()x=x+20:PrintxEndSubPrivateSubs2()DimxAsIntegerx=x+20:PrintxEndSub答案:10303020306.PrivateSubCommand1_Click()s3(1):s3(1):s3(1)EndSubPrivateSubs3(ByValaAsInteger)DimxAsInteger StaticyAsIntegerx=x+a:y=y+aPrint"x=";x,"y=";yEndSub答案:x=1y=1x=1y=2x=1y=37.5编程题1.已知m=,其中max(x,y,z)为求x,y和z这三个数最大值的函数。编一程序,输入a,b和c的值,求m的值。解答:(1)界面设计和属性设置在窗体上建立四个标签、四个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-7-1所示。表3-7-1第1题的属性设置控件名称属性名属性值Form1Caption计算m的值Label1Captiona=Label2Captionb=Label3Captionc=Label4Captionm=Text1,Text2,Text3,Text4Text空串 Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dima!,b!,c!,m#a=Val(Text1.Text)b=Val(Text2.Text)c=Val(Text3.Text)m=max(a,b,c)/(max(a+b,b,c)*max(a,b,b+c))Text4.Text=Str(m)EndSubPrivateFunctionmax(ByValx!,ByValy!,ByValz!)AsSingleDimma!Ifx>yThenma=xElsema=yIfz>maThenma=zmax=maEndFunctionPrivateSubCommand2_Click()EndEndSub(3)运行情况 运行程序后,单击Text1输入a的值;单击Text2输入b的值;单击Text3并输入c的值。数据输入后,单击标题为“开始”的命令按钮,执行Command1_Click()事件过程,并调用自定义max函数,在Text4显示计算结果。2.给定求组合数公式为:,编一程序,输入m和n的值,求的值。解答:(1)界面设计和属性设置在窗体上建立三个标签、一个OLE控件、三个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-7-2所示。表3-7-2第2题的属性设置控件名称属性名属性值Form1Caption计算组合数Label1Caption计算组合数公式Label2CaptionFontSizeC初号Label3Caption=OLE1ClassBackStyleBorderStyleSizeModeEquation.3(在建立OLE时选定)00 2Text1Text空串Text2Text空串Text3Text空串Command1Caption计算Command2Caption结束说明:表中的OLE控件用来在界面上显示计算组合数公式。建立OLE控件并输入公式的操作步骤为:双击工具箱上的OLE控件,系统在窗体上显示OLE控件,并弹出“插入对象”对话框,在“插入对象”对话框中选择对象类型“MicrosoftEquation3.0”,然后单击“确定”按钮打开公式编辑器,使用公式编辑器输入计算组合数公式。(2)程序代码PrivateSubfac(ByValk&,f&)Dimt&,i&t=1Fori=1Tokt=t*iNextif=tEndSubPrivateSubCommand1_Click()Dimm&,n&,cmn&,c1&,c2&,c3& n=Val(Text1.Text)m=Val(Text2.Text)Callfac(m,c1):Callfac(n,c2):Callfac(m-n,c3)cmn=c1/(c2*c3)Text3.Text=cmnEndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,分别从文本框Text1和Text2输入n和m的值。然后单击“计算”命令按钮,由Text3显示计算结果。参见图3.7.1。图3.7.1第2题的执行结果3.,其中f(t)=(1+e)/(1+e),求g(2.5,3.4),g(1.7,2.5)和g(3.8,2.9)的值。解答:(1)界面设计和属性设置在窗体上建立三个标签、三个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-7-3所示。表3-7-3第3题的属性设置控件名称属性名属性值 Form1Caption计算函数值Label1Captionx=Label2Captiony=Label3Caption空串Text1Text空串Text2Text空串Text3Text空串Command1Caption计算Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimx!,y!x=Val(Text1.Text)y=Val(Text2.Text)Label3.Caption="g("&Str(x)&","&Str(y)&")="Text3.Text=Str(g(x,y))EndSubPrivateSubCommand2_Click()EndEndSubPrivateFunctionf(ByValt!)AsSinglef=(1+Exp(-t))/(1+Exp(t)) EndFunctionPrivateFunctiong(ByValx!,ByValy!)AsSingleIfx<=yTheng=f(x+y)/(f(x)+f(y))Elseg=f(x-y)/(f(x)+f(y))EndIfEndFunctionPrivateSubText1_Click()Text1.Text="":Text2.Text="":Text3.Text=""Label3.Caption=""EndSub(3)运行情况运行程序后,由文本框Text1输入x值;Text2输入y值。单击“计算”的命令按钮,Text3显示计算结果。4.给定三组已按升序排列好的整型数据,使用过程编写程序把它们合并为一组仍能按升序排列的数据。解答:(1)界面设计和属性设置在窗体上建立四个标签、四个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-7-4所示。表3-7-4第4题的属性设置 控件名称属性名属性值Form1Caption把三组升序数据合并为一组升序数据Label1Caption第一组:Label2Caption第二组:Label3Caption第三组:Label4Caption合并后:Text1Text空串Text2Text空串Text3Text空串Text4TextMultiLineScrollBars空串True1Command1Caption合并Command2Caption结束(2)程序代码OptionBase1DimaAsVariant,bAsVariant,cAsVariantPrivateSubForm_load()Dimi%a=Array(1,2,7,8,9) Fori=1To5'显示数组a的元素值Text1.Text=Text1.Text&Str(a(i))Nextib=Array(3,4,8,8,9,10,12,12)Fori=1To8'显示数组b的元素值Text2.Text=Text2.Text&Str(b(i))Nextic=Array(1,5,5,6,8)Fori=1To5'显示数组c的元素值Text3.Text=Text3.Text&Str(c(i))NextiEndSubPrivateSubCommand1_Click()Dimi%,m%,n%,p%m=UBound(a)n=UBound(b)p=UBound(c)Dimd()ReDimd(m+n)Callgsort(a,b,d)Dime()ReDime(m+n+p) Callgsort(c,d,e)Fori=1Tom+n+p'显示数组e的元素值Text4.Text=Text4.Text&Str(e(i))NextiEndSubPrivateSubgsort(xAsVariant,yAsVariant,zAsVariant)Dimi%,j%,k%,n1%,n2%i=1:j=1:k=1n1=UBound(x):n2=UBound(y)Whilei<=n1Andj<=n2Ifx(i)>y(j)Thenz(k)=y(j):k=k+1:j=j+1Elsez(k)=x(i):k=k+1:i=i+1EndIfWendWhilei<=n1z(k)=x(i):i=i+1:k=k+1WendWhilej<=n2z(k)=y(j):j=j+1:k=k+1Wend EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,需合并的三组数据分别在三个文本框中显示出来。单击“合并”命令按钮,执行Command1_Click事件过程。执行结果如图3.7.2所示。图3.7.2第4题的执行结果5.编写程序,绘制一个三角形,并可以用鼠标把三角形拖着走。(提示:使用MouseMove事件)解答:(1)界面设计和属性设置窗体作为用户界面。窗体的Caption属性设置为“用鼠标把三角形拖着走”。(2)程序代码PrivateSubForm1_Click()Scale(-1000,700)-(1000,-700)triangle0,500EndSubPrivateSubtriangle(X%,Y%) Line(X,Y)-Step(-300,-400)Line-Step(600,0)Line-Step(-300,400)EndSubPrivateSubform_MouseMove(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)Dima%,b%a=X:b=YIfButton=1ThenClstrianglea,bEndIfEndSub(3)运行情况运行程序后,窗体上出现一个三角形。按住鼠标就可以拖着三角形来回移动。6.编写一个华氏温度与摄氏温度互相转换程序,要求通过触发KeyPress事件过程实现。解答:(1)界面设计和属性设置在窗体上建立两个标签、两个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-7-5所示。 表3-7-5第6题的属性设置控件名称属性名属性值Form1Caption华氏与摄氏温度互相转换Label1Caption华氏温度Label2Caption摄氏温度Text1Text空串Text2Text空串Command1Caption华氏转摄氏Command2Caption摄氏转华氏(2)程序代码PrivateSubCommand1_Click()Text1.Text="":Text2.Text=""Text1.SetFocusEndSubPrivateSubCommand2_Click()Text1.Text="":Text2.Text=""Text2.SetFocusEndSubPrivateSubForm_Load()Text1.Text="":Text2.Text=""EndSubPrivateSubText1_KeyPress(KeyAsciiAsInteger) IfKeyAscii=13ThenText2.Text=(Text1.Text-32)*5/9EndIfEndSubPrivateSubText2_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13ThenText1.Text=9/5*Text2.Text+32EndIfEndSub(3)运行情况运行程序后,单击“华氏转摄氏”的命令按钮(或直接单击文本框Text1),置焦点在Text1上,输入华氏温度值(例如,50),然后按回车键,文本框Text2显示摄氏温度,执行结果如图3.7.3所示。单击“摄氏转华氏”的命令按钮(或直接单击文本框Text2),置焦点在Text2上,输入摄氏温度(例如,100)值,然后按回车键,文本框Text1显示华氏温度,执行结果如图3.7.4所示。图3.7.3第6题的执行结果(a)图3.7.4第6题的执行结果(b)7.用递归过程编写一个程序,从键盘上输入一个整数,并把该整数逆序输出。例如,输入整数32767,输出为76723。解答: (1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-7-6所示。表3-7-6第7题的属性设置控件名称属性名属性值Form1Caption把一个整数颠倒输出Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()ClsDimnumber&number=InputBox("请输入一个整数:")PrintPrintTab(4);"输入的整数为:";numberPrintPrintTab(4);"输出的结果为:";Callrev(number)EndSubPrivateSubrev(ByValnum&)PrintFormat(numMod10,"#");num=num10 Ifnum<>0ThenCallrev(num)EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击“开始”按钮,在InputBox对话框输入整数,窗体逆序显示数字。8.给定递归公式:a与b的最大公约数=,用递归过程编写程序求a和b的最大公约数。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-7-7所示。表3-7-7第8题的属性设置控件名称属性名属性值Form1Caption求两个整数的最大公约数Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click() ClsDima%,b%a=InputBox("请输入整数a:")b=InputBox("请输入整数b:")PrintPrintTab(4);Str(a)&"和"&Str(b)&"的最大公约数为:";gcd(a,b)EndSubPrivateFunctiongcd(ByVala%,ByValb%)AsIntegerDimg%Ifb=0Theng=aElseg=gcd(b,aModb)EndIfgcd=gEndFunctionPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击“开始”按钮,输入两个整数,窗体显示最大公约数。 第8章文件8.1填空题1.在VisualBASIC中,我们可以使用的3种数据文件分别为(顺序文件)、(随机文件)和(二进制文件)。2.文件的基本操作可以分为3个阶段,这3个阶段是(打开文件)、(读写操作)和(关闭文件)。3.对数据文件进行任何读写操作之前都必须先用(Open)语句打开该文件。数据文件读/写完之后必须用(Close)语句关闭文件。4.关闭所有已打开的文件,使用的语句为(Close)。5.为了获得当前可使用的文件通道号,可以调用(FreeFile)函数。6.若要在c盘dir1目录下,使用1号通道建立一个顺序文件file1.dat,所用的open语句为(Open“c:dir1file1.dat”ForOutputAs#1)。7.若要在c盘dir1目录下的顺序文件file1.dat的后面追加数据,使用3号通道打开文件,所用的open语句为(Open“c:dir1file1.dat”ForAppendAs#3)。8.对顺序文件的写操作有标准格式和自定义格式。标准格式的写语句是( Write# ),自定义格式的写语句是( Print# )。9.对顺序文件的读操作可以使用( Input# )语句、( LineInput# )语句和( Input )函数。 10.若要在c盘dir1目录下,用5号通道建立一个随机文件file2.rec,每条记录占用10个字节的存贮空间,所用的open语句为(Open“c:dir1file2.rec”ForRandomAs#5Len=10)。11.对随机文件的写操作用( Put )语句,读操作使用( Get )语句。12.二进制文件是以( 字节 )为单位进行读写的。13.执行扩展名为.exe的文件使用(Shell)函数。14.设置当前驱动器为e盘,可用语句(ChDrive“e:”)。15.若要指定当前目录为d盘下的子目录dirl,命令为(ChDir“d:dirl”)。16.把文件“c:dir1f1.dat”改名为“c:dir1file1.dat”,命令为(Name“c:dir1f1.dat”As“c:dir1file1.dat”)。17.若要删除文件“c:dir1file1.txt“,命令为(Kill“c:dir1f.txt“)。8.2选择题 1.若以读的方式打开顺序文件“d:file1.dat”,则正确的语句是(b)。a)Open"d:file1.dat"ForOutputAs#1 b)Open"d:file1.dat"ForInputAs#1 c)Open"d:file1.dat"ForBinaryAs#1 d)Open"d:file1.dat"ForRandomAs#12.下列访问方式中,(a )不能以不同的文件号打开当前未关闭的文件。 a)Output和appendb)Inputc)Randomd)Binary3.要判别顺序文件中的数据是否读完,应使用(c)函数。 a)LOFb)LOCc)EOFd)FreeFile4.若要从占用1号通道的随机文件中读取数据,使用的语句为( d )。a)Print#1,rb)Write#1,rb)put#1,,rd)Get#1,,r5.下列控件中,(a)不是用于文件操作的控件。a)ListBoxb)DriveListBoxc)DirListBoxd)FileListBox6.设置或返回程序运行时要操作的驱动器,使用驱动器列表框DriveListBox的(c)属性。a)Valueb)Listc)Drived)pattern7.改变驱动器列表框的Drive属性将引发(d)事件。a)Loadb)Clickc)Patternchanged)Change8.目录列表框和文件列表框都有(c)属性。a)Listb)value(FileList)c)Pathd)Pattern(FileList)答案:9.文件列表框FileListBox用于设置或返回文件类型的属性是(c)。a)Driveb)Pathc)Patternd)FileTitle8.3问答题 1什么是文件?为什么要使用文件?答:参见教材8.1.1。2顺序文件和随机文件的主要区别是什么?答:参见教材8.2,8.3。3二进制文件以什么为读写单位?它与顺序文件和随机文件有什么关系?答:参见教材8.4。8.4编程题1.编一程序,输入某班学生某门课程的成绩,存放到顺序文件“d:scoref.dat”中。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-8-1所示。表3-8-1第1题的属性设置控件名称属性名属性值Form1Caption建立学生成绩文件Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimn%,i%,score! n=InputBox("输入学生人数:")Open"d:scoref.dat"ForOutputAs#1Fori=1Tonscore=InputBox("输入第"&Str(i)&"个学生的成绩:")Write#1,scoreNextiPrintTab(10);"学生成绩文件已经建立!"Close#1EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,单击“开始”命令按钮,按InputBox对话框提示输入学生人数和成绩。学生成绩文件建立后,窗体上显示“学生成绩文件已经建立!”。2.从第1题所建立的文件“d:scoref.dat”中读取各个学生的分数,把这些分数按降序重新排列,且把排序结果存放到“d:scoresortf.dat”中。解答:(1)界面设计和属性设置 在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-8-2所示。表3-8-2第2题的属性设置控件名称属性名属性值Form1Caption读文件并建立排序文件Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()Dimn%,i%,j%,score!,s!,t!ClsOpen"d:scoref.dat"ForInputAs#1Dima()n=LOF(1)/4ReDima(1Ton)i=0:s=0WhileNotEOF(1)'读文件并把数据存放到数组a中Input#1,scores=s+scorei=i+1a(i)=scoreWendFori=1Ton-1'对数组a进行排序 Forj=i+1TonIfa(i)""ThenOpen"d:txrf.rec"ForRandomAs#1Len=Len(zgr)n=LOF(1)/Len(zgr)+1Withzgr.num=Trim(Text1.Text).name=Trim(Text2.Text).tel=Trim(Text3.Text).postc=Trim(Text4.Text).addr=Trim(Text5.Text)EndWithPut#1,n,zgrMsgBox"新记录添加已经完成!"GoTolEndIfMsgBox"文件不存在,新记录添加失败!"l:EndSubPrivateSubCommand2_Click()'插入新记录事件过程Dimi%,insertp%,zgrAstxr IfDir("d:txrf.rec")<>""ThenOpen"d:txrf.rec"ForRandomAs#1Len=Len(zgr)Open"d:txrf1.rec"ForRandomAs#2Len=Len(zgr)insertp=Val(Text6.Text)i=1Whilei<>insertpGet#1,i,zgrPut#2,i,zgri=i+1WendWithzgr.num=Text1.Text.name=Text2.Text.tel=Text3.Text.postc=Text4.Text.addr=Text5.TextEndWithPut#2,i,zgrWhileNotEOF(1)Get#1,i,zgrPut#2,i+1,zgri=i+1 WendMsgBox"新记录插入已经完成!"CloseKill"d:txrf.rec"Name"d:txrf1.rec"As"d:txrf.rec"GoTolEndIfMsgBox"文件不存在,新记录插入失败!"l:EndSubPrivateSubCommand3_Click()EndEndSub(3)运行情况运行程序后,界面如图3.8.4所示。若添加新记录,则从各个文本框输入新职工记录数据。然后单击“添加新记录”按钮,执行Command1_Click事件过程,把该记录添加到文件末尾。若插入新记录,则输入新职工记录相应的数据后,再输入插入位置。然后单击“插入新记录”按钮,执行Command2_Click事件过程,记录插入到文件中指定位置。图3.8.4第6题的用户界面 7.从键盘上输入职工的编号,在由第3题所建立的通讯录文件“d:txrf.rec”中删除相应记录。删除之前提示用户,如果用户选择“确认”,执行删除;如果选择“取消”,则直接关闭文件。(1)界面设计和属性设置在窗体上建立六个标签、六个文本框和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-8-7所示。表3-8-7第7题的属性设置控件名称属性名属性值Form1Caption按编号删除记录Label1Caption编号Label2Caption姓名Label3Caption电话号码Label4Caption邮政编码Label5Caption住址Label6Caption需删除记录编号Text1、Text2、Text3Text空串Text4、Text5、Text6Text空串Command1Caption删除记录Command2Caption结束(2)程序代码PrivateTypetxrnumAsString*4 nameAsString*8telAsString*8postcAsString*6addrAsString*14EndTypePrivateSubCommand1_Click()DimdnumAsString*4,zgrAstxr,msg$,style$,title$,response$ClsOpen"d:txrf.rec"ForRandomAs#1Len=Len(zgr)IfDir("d:txrf1.mid")="d:txrf1.mid"ThenKill"d:txrf1.mid"EndIfOpen"d:txrf1.mid"ForRandomAs#2Len=Len(zgr)dnum=Text6.TextDoWhileNotEOF(1)Get#1,,zgrIfdnum=zgr.numThenMsgBox"需删除记录的职工已找到!"WithzgrText1.Text=.numText2.Text=.nameText3.Text=.tel Text4.Text=.postcText5.Text=.addrEndWithmsg="真的删除该记录吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息"response=MsgBox(msg,style,title)Ifresponse=vbYesThenGoTol1ElseCls:Close:GoTol2EndIfPut#2,,zgrLoopMsgBox"该职工的记录不存在!"CloseKill"d:txrf1.mid"GoTol2l1:DoWhileNotEOF(1)Get#1,,zgrPut#2,,zgrLoopCloseKill"d:txrf.rec" Name"d:txrf1.mid"As"d:txrf.rec"ClsMsgBox"记录已删除!"l2:EndSubPrivateSubCommand2_Click()EndEndSub(3)运行情况运行程序后,从“需删除记录编号”指示的文本框Text6中输入需删除记录编号。然后单击“删除记录”按钮,执行Command1_Click事件过程。找到需删除记录后,该记录的数据项显示在文本框中,如图3.8.5所示。这时,弹出MsgBox对话框,询问“真的删除该记录吗?”,单击“确定”按钮,系统删除指定记录。图3.8.5第7题的运行情况8.输入某单位所有职工1年12个月的工资,并存放到二进制文件“d:gzf.bin”中。解答:(1)界面设计和属性设置 在窗体上建立十二个标签、一个文本框、一个控件数组和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-8-8所示。Tex为文本框控件数组,用来输入1~12月份的工资。表3-8-8第8题的属性设置控件名称属性名属性值Form1Caption建立职工工资文件(二进制)Label1~12Caption1~12月份Text1Text空串Tex(0)~Tex(11)Text空串Command1Caption写入数据Command2Caption结束(2)程序代码Dimm%PrivateSubForm_Load()Dimi%Open"d:gzf.bin"ForBinaryAs#1m=1Text1.Text="输入第"&Str(m)&"个职工全年1--12月工资"EndSubPrivateSubCommand1_Click()DimMsg$,Style$,Title$,Response$Dimi%,gz!Fori=0To11gz=Val(Tex(i).Text) Put#1,,gzNextiMsg="要继续输入吗?"Style=vbYesNo+vbCritical+vbDefaultButton1Title="提示信息"Response=MsgBox(Msg,Style,Title)'显示信息对话框IfResponse=vbYesThenm=m+1Text1.Text="输入第"&Str(m)&"个职工全年1--12月工资"Fori=0To11Tex(i).Text=""NextiElseText1.Text="输入完毕!请结束程序的执行。"EndIfEndSubPrivateSubCommand2_Click()Close#1EndEndSub(3)运行情况 运行程序后,界面如图3.8.6所示。从各个文本框输入第一个职工的各月份工资。然后单击“写入数据”按钮,执行Command1_Click事件过程,把数据写到二进制文件“d:gzf.bin”中。弹出信息对话框询问“要继续输入吗?”。若单击“是”按钮,可以重复上述操作输入其它职工各个月份的工资。若单击“否”按钮,则在Text1中显示“输入完毕!请结束程序的执行。”这时单击“结束”按钮,关闭文件和结束程序的执行。图3.8.6第8题的用户界面9.从第8题所建立的文件“d:gzf.bin”中读出每个职工每个月的工资,且求每个职工全年平均工资和该单位全年平均工资。解答:(1)界面设计和属性设置在窗体上建立两个命令按钮。窗体和命令按钮的主要属性设置如表3-8-9所示。表3-8-9第9题的属性设置控件名称属性名属性值Form1Caption求每个职工和全单位全年平均工资Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click() Dimi%,j%,k%,l%,n%,gz!,s!,t!ClsOpen"d:gzf.bin"ForBinaryAs#1n=LOF(1)/(4*12)l=1:k=1:t=0Print:Print:PrintFori=1Tons=0Forj=1To12Get#1,k,gzs=s+gzk=4*l+1l=l+1NextjPrintTab(12);"第"&Str(i)&"个职工的平均工资为:";s/12t=t+sNextiPrintPrintTab(12);"全单位职工的平均工资为:";t/(12*n)Close#1EndSubPrivateSubCommand2_Click() EndEndSub(3)运行情况运行程序后,单击“开始”按钮,执行Command1_Click事件过程,窗体上显示每个职工全年平均工资和该单位全年平均工资。第9章复杂界面设计9.1填空题1.在VB中,菜单分为(下拉式)菜单和(弹出式)菜单。菜单设计是通过(菜单编辑器)设置菜单的属性。2.菜单项作为一个控件而存在,它只包含一个事件,这个事件称为(Click)事件。3.菜单编辑器中的“标题”选项是菜单项控件的(Caption)属性;“名称”选项是(Name)属性;“索引”选项是控件的(Index)属性;“复选”选项是控件的(Checked)属性;“有效”选项是(Enabled)属性;“可见”选项是(Visible)属性。4.要使某个菜单项在运行程序时失效,应设置该菜单项控件的(Enabled)属性为False;若要使某个菜单项在运行程序时不可见,则应设置该菜单项控件的(Visible)属性为False;5.在程序运行时,弹出菜单,需使用(PopupMenu)方法。6.若要装入并且显示窗体,需使用(Show)方法。7.SDI表示(单文档)界面,MDI表示(多文档)界面。 8.一个应用程序只能定义(1)个MDI父窗体,而父窗体可以有(多)个MDI子窗体。9.如果把一个窗体定义为MDI父窗体的子窗体,则要把该窗体的(MdiChild)属性设置为True。10.剪切板的功能是(为用户提供一块临时存储数据的空间,用户可以把数据(包括文本、图形等)存放到存储区,也可以从存储区读取数据。)。9.2选择题1.在使用菜单编辑器设计菜单时,用户必须指定的选项为(b)。a)标题b)名称c)索引d)快捷键2.每单击一次就能把选定的菜单项向上移动一个等级的箭头键是(b)。a)右箭头b)左箭头c)上箭头d)下箭头3.若要把窗体隐藏起来,需使用(b)方法。a)UnLoadb)Hidec)WindowStated)Show4.若要卸载窗体,需使用(a)方法。a)UnLoadb)Hidec)Loadd)Show5.若从剪贴板中读取数据,并写入目标对象中,应使用(a)方法。a)GetTextb)SetDatac)GetDatad)GetFormat9.3问答题 1.菜单的主要作用是什么?下拉菜单和弹出菜单有何区别?每层菜单项都能够定义事件过程吗?答:参见教材9.1。2.菜单的访问键和快捷键有什么区别?如何建立它们?答:参见教材9.1.2。3.在多重窗体程序中,进行窗体之间的切换需要用到什么方法?Unload语句和Hide方法对窗体操作有何区别?答:参见教材9.2.1。4.一个工程用多重窗体方式组织后,其中的每个窗体文件还能独立运行吗?答:参见教材9.2。5.多重窗体和MDI窗体的结构有何区别?答:参见教材9.3.2。9.4编程题1.使用下拉式菜单实现职工通讯录文件的建立、查询和编辑等功能。查询文件包括:按编号和按姓名查询;编辑文件包括:追加记录、删除记录和修改记录。解答:(1)界面设计和属性设置在窗体上建立三个菜单项(包含子菜单项)和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-9-1所示。表3-9-1第1题的属性设置 控件名称属性名属性值Form1Caption通讯录文件的建立、查询和编辑第一级菜单项1Caption(标题)Name(名称)建立Build第一级菜单项2第二级菜单项1第二级菜单项2Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)查询Inquire按编号查询NumberInquire按姓名查询NameInquire 第一级菜单项3第二级菜单项1第二级菜单项2第二级菜单项3Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)编辑Edit增加记录IncreaseRecord删除记录DeleteRecord修改记录ModifyRecord Command1Caption开始Command2Caption结束(2)程序代码PrivateTypetxrnumAsString*4nameAsString*8telAsString*8postcAsString*6addrAsString*14EndTypeDimtxrfnameAsString,zgr1AstxrOptionExplicitPrivateSubCommand1_Click()txrfname=InputBox("请输入通讯录文件名:")Command1.Enabled=FalseEndSubPrivateSubCommand2_Click()EndEndSubPrivateSubBuild_Click()'建立通讯录文件Dimn%,i%,zgrAstxrOpentxrfnameForRandomAs#1Len=Len(zgr) n=InputBox("输入职工人数:")Fori=1TonWithzgr.num=InputBox("输入第"&Str(i)&"个职工编号:").name=InputBox("输入第"&Str(i)&"个职工姓名:").tel=InputBox("输入第"&Str(i)&"个职工电话号码:").postc=InputBox("输入第"&Str(i)&"个职工邮政编码:").addr=InputBox("输入第"&Str(i)&"个职工住址:")EndWithPut#1,i,zgrNextiClose#1EndSubPrivateSubNumberInquire_Click()'按编号查询DimzgrAstxr,fnumAsString*4OpentxrfnameForRandomAs#3Len=Len(zgr)Clsfnum=InputBox("输入需查询职工编号:")WhileNotEOF(3)Get#3,,zgrIfzgr.num=fnumThenPrintTab(18);"该职工记录找到了!" PrintWithzgrPrintTab(8);"编号:";.numPrintTab(8);"姓名:";.namePrintTab(8);"电话号码:";.telPrintTab(8);"邮政编码:";.postcPrintTab(8);"住址:";.addrEndWithGoTolEndIfWendPrintTab(18);"该职工记录找不到!"l:Close#3EndSubPrivateSubNameInquire_Click()'按姓名查询DimzgrAstxr,fnameAsString*8,val%OpentxrfnameForRandomAs#3Len=Len(zgr)Clsl1:fname=InputBox("输入需查询职工姓名:")Iffname=Space(8)ThenMsgBox"按错键!请重新输入。":GoTol1WhileNotEOF(3)Get#3,,zgr val=InStr(1,Trim(zgr.name),Trim(fname),1)IfvalThenPrint:PrintPrintTab(18);"该职工记录找到了!"PrintWithzgrPrintTab(8);"编号:";.numPrintTab(8);"姓名:";.namePrintTab(8);"电话号码:";.telPrintTab(8);"邮政编码:";.postcPrintTab(8);"住址:";.addrEndWithGoTolEndIfWendPrint:Print:PrintPrintTab(18);"该职工记录找不到!"l:Close#3EndSubPrivateSubIncreaseRecord_Click()'增加记录Dimn%,zgrAstxrOpentxrfnameForRandomAs#1Len=Len(zgr) ClsWithzgr.num=InputBox("输入新职工编号:").name=InputBox("输入新职工姓名:").tel=InputBox("输入新职工电话号码:").postc=InputBox("输入新职工邮政编码:").addr=InputBox("输入新职工住址:")EndWithn=LOF(1)/Len(zgr)+1Put#1,n,zgrPrint:Print:PrintPrintTab(15);"新记录追加已经完成!"Close#1EndSubPrivateSubDeleteRecord_Click()'删除记录DimdnumAsString*4,zgrAstxr,msg$,style$,title$,response$ClsOpentxrfnameForRandomAs#1Len=Len(zgr)IfDir("d:txrf1.mid")="d:txrf1.mid"ThenKill"d:txrf1.mid"EndIfOpen"d:txrf1.mid"ForRandomAs#2Len=Len(zgr) dnum=InputBox("输入需删除记录的职工编号:")DoWhileNotEOF(1)Get#1,,zgrIfdnum=zgr.numThenPrintTab(15);"需删除记录的职工已找到!"PrintWithzgrPrintTab(10);"编号:";.numPrintTab(10);"姓名:";.namePrintTab(10);"电话号码:";.telPrintTab(10);"邮政编码:";.postcPrintTab(10);"住址:";.addrEndWithmsg="真的删除该记录吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息"response=MsgBox(msg,style,title)Ifresponse=vbYesThenGoTol1ElseGoTol2EndIfPut#2,,zgrLoopPrintTab(18);"该职工的记录不存在!" CloseKill"d:txrf1.mid"GoTol2l1:DoWhileNotEOF(1)Get#1,,zgrPut#2,,zgrLoopCloseKilltxrfnameName"d:txrf1.mid"AstxrfnameClsPrintTab(20);"记录已删除!"l2:EndSubPrivateSubModifyRecord_Click()'修改记录Dimmnum$,i%,msg$,style$,title$,response$,response1$,response2$,response3$,response4$ClsOpentxrfnameForRandomAs#1Len=Len(zgr1)mnum=InputBox("输入需修改记录的职工编号:") i=1DoWhileNotEOF(1)Get#1,i,zgr1Ifmnum=zgr1.numThenPrintTab(15);"需修改记录的职工已找到!"PrintWithzgr1PrintTab(10);"编号:";.numPrintTab(10);"姓名:";.namePrintTab(10);"电话号码:";.telPrintTab(10);"邮政编码:";.postcPrintTab(10);"住址:";.addrEndWithmsg="真的修改该记录吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息"response=MsgBox(msg,style,title)Ifresponse=vbYesThenClsPrintTab(22);"修改记录!":Printmsg="修改姓名吗?"style=vbYesNo+vbCritical+vbDefaultButton1 title="提示信息"response1=MsgBox(msg,style,title)Ifresponse1=vbYesThenzgr1.name=InputBox("输入职工姓名:",,zgr1.name)EndIfmsg="修改电话号码吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息"response2=MsgBox(msg,style,title)Ifresponse2=vbYesThenzgr1.tel=InputBox("输入职工电话号码:",,zgr1.tel)EndIfmsg="修改邮政编码吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息"response3=MsgBox(msg,style,title)Ifresponse3=vbYesThenzgr1.postc=InputBox("输入职工邮政编码:",,zgr1.postc)EndIfmsg="修改住址吗?"style=vbYesNo+vbCritical+vbDefaultButton1title="提示信息" response4=MsgBox(msg,style,title)Ifresponse4=vbYesThenzgr1.addr=InputBox("输入职工住址:",,zgr1.addr)EndIfPut#1,i,zgr1ClsPrintTab(20);"修改记录已经完成!"GoTolEndIfEndIfi=i+1LoopClsPrintTab(18);"该职工的记录不存在!"l:CloseEndSub(3)运行情况运行程序后,单击标题为“开始”的命令按钮,执行Command1_Click事件过程,InputBox对话框要求用户输入通讯录文件名。输入文件名后可以用鼠标单击不同的菜单项执行相应的Click事件过程,从而进行不同的操作。界面如图3.9.1所示。 图3.9.1第1题的用户界面2.编一程序,在文本框上装载某个文本文件,并且使用弹出式菜单对文本框中的文本进行字体、颜色(背景和前景)和大小设置。解答:(1)界面设计和属性设置在窗体上建立一个菜单项(包含多级子菜单项)和两个命令按钮。窗体和窗体上控件的主要属性设置如表3-9-2所示。表3-9-2第2题的属性设置控件名称属性名属性值Form1Caption设置文本字体、大小和颜色第一级菜单项1Caption(标题)Name(名称)Visible(可见)字体、大小和颜色的选择fontsizecolorFalse第二级菜单项1第三级菜单项1第三级菜单项2 第三级菜单项3第三级菜单项4Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)字体font宋体font1仿宋font2黑体font3楷体 font4第二级菜单项2第三级菜单项1第三级菜单项2第三级菜单项3Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)颜色color红色fred蓝色fblue绿色 fgreen第二级菜单项3第三级菜单项1第三级菜单项2第三级菜单项3Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)Caption(标题)Name(名称)大小size8fsize89fsize910fsize10 Command1Caption开始Command2Caption结束(2)程序代码PrivateSubCommand1_Click()FileName=InputBox("请输入需装载的文本文件名:")OpenFileNameForInputAs#1Text1.Text=StrConv(InputB(LOF(1),#1),vbUnicode)EndSubPrivateSubCommand2_Click()EndEndSubPrivateSubForm_Load()Text1.Text=""EndSubPrivateSubtext1_MouseUp(ButtonAsInteger,ShiftAsInteger,_XAsSingle,YAsSingle)IfButton=2Then'检查是否单击了鼠标右键PopupMenufontsizecolor,4Or2'把fontsizecolor菜单显示为一个弹出式菜单EndIfEndSubPrivateSubfblue_Click() Text1.ForeColor=vbBlueEndSubPrivateSubfgreen_Click()Text1.ForeColor=vbGreenEndSubPrivateSubfred_Click()Text1.ForeColor=vbRedEndSubPrivateSubfont1_Click()Text1.FontName="宋体"EndSubPrivateSubfont2_Click()Text1.FontName="仿宋_GB2312"EndSubPrivateSubfont3_Click()Text1.FontName="黑体"EndSubPrivateSubfont4_Click()Text1.FontName="楷体_GB2312"EndSubPrivateSubfsize8_Click()Text1.FontSize=8 EndSubPrivateSubfsize9_Click()Text1.FontSize=9EndSubPrivateSubfsize10_Click()Text1.FontSize=10EndSub(3)运行情况运行程序后,单击“开始”按钮,执行Command1_Click事件过程。在InputBox对话框,输入文本文件名。单击“确定”按钮后,文本文件显示在文本框。这时可以把鼠标移到文本框内,单击两次鼠标右键(第一次单击弹出Windows关联菜单),弹出菜单。根据不同的菜单项选择,系统执行相应的Click事件过程,进行不同的操作。参见图3.9.2所示。图3.9.2第2题的运行情况3.使用多重窗体方式编写职工通讯录文件处理应用程序,且为该应用程序设计封面窗体。文件处理包括建立、查询(按编号和按姓名查询)和编辑(追加记录和删除记录)等功能,这些功能分别安排在不同的窗体上实现。解答:略。读者可以参考第1题完成此题。第10章VisualBASIC中的数据库编程 10.1填充题1一个数据库系统是由(数据库)和(数据库管理系统)组成。2.数据库是由若干个(表)构成。表是由若干个(记录)构成。记录由若干个(字段)构成。3.能够惟一地标识表中一个记录的最小的字段集合称为(候选码)。被指定用来标识记录的候选码称为(主码)。4.数据检索语句中的“*”号表示指定数据表(全部字段的字段名)。5.VB数据库应用程序从逻辑上可以分为三个部分:(用户界面)、(Jet数据库引擎)和(数据库)。数据库引擎的任务是(对数据库进行各种操作)。6.VB提供了两类数据库访问接口模型。一类是(DAO)数据访问对象模型,另一类是(ADO)数据访问对象模型。每类数据库访问接口模型都有一个配套的数据访问控件。与DAO配套的是VB工具箱中的(Data)控件,与ADO配套的是(ADOData)控件。7.使用可视化数据管理器除可创建数据库外,还可完成一系列的数据库操作,这些数据库操作包括(查找、修改、增加和删除记录、修改表结构)。8.要使数据绑定控件能够显示记录集中的数据,必须在属性窗口中或在程序中设置数据绑定控件的两个属性:(DataSource)属性和(DataField)属性。 9.设置Data数据控件所连接的数据库类型,需要设置控件的(Connect)属性。10.把“ADO数据控件”添加到工具箱中的方法是:在“工程”菜单中单击(部件)命令,在弹出的“部件”对话框的“控件”列表框中选择(MicrosoftADODataControl6.0(OLEDB))选项,然后单击“确定”按钮。10.2选择题1.在VB中建立的MicrosoftAccess数据库文件的扩展名是(d)。a).dbb).accessc).dbfd).mdb2.下列选项中,不属于DML语句的是(a)。a)Alterb)Deletec)Insertd)Select3.创建数据库对象使用(b)方法。a)OpenDatabaseb)CreateDatabasec)CreateTableDefd)CreateField4.当Recordset对象的BOF属性的值为True时,表示(b)。a)当前记录指针指向Recordset对象的第一条记录b)当前记录指针指向Recordset对象的第一条记录之前c)当前记录指针指向Recordset对象的最后一条记录d)当前记录指针指向Recordset对象的最后一条记录之后5.下列选项中,不能移动记录指针的是(a,d)方法。a)Editb)Movec)Seekd)FindNext 6.使用FindFirst、FindNext、FindPrevious和FindLast方法可以在(a,b)类型的记录集中查找满足指定条件的记录。a)表b)动态集c)快照d)所有7.使用Seek方法可以在(a)类型的记录集中查找满足条件的记录。a)表b)动态集c)快照d)所有8.在使用Seek方法查找满足指定条件的记录时,可以根据记录集的(d)属性判别是否找到满足指定条件的记录。a)EOFb)BOFc)Matchd)NoMatch9.不能对记录集的记录进行定位的方法有(a)。a)Editb)AddNewc)Moved)Seek10.若建立Adodc数据控件到数据源的连接信息,需设置该控件的(a)属性。a)ConnectStringb)CommandTypec)RecordSourced)EOFAction10.3问答题1.SQL语句分为哪两大类语句?这两大类语句主要包括哪些语句,它们的功能如何?答:参见教材10.2.1。2.记录集有哪几种类型?它们有什么特点?答:参见教材10.3。3Recordset对象的AddNew方法、Delete方法和Move方法的功能是什么? 答:参见教材10.3.2。4可以与数据控件绑定的内部控件有哪些?答:参见教材10.3.2。10.4编程题1.给定下面某单位人事档案表,使用可视化数据管理器建立“人事档案.mdb”数据库,该库包括一个表,命名为“人事档案”,把人事档案表中数据存放到该表中。使用DAO数据访问对象编写一个简单人事档案管理程序。要求该程序具有查询、修改、添加、更新和删除记录功能。表3-10-1人事档案表编号姓名性别年龄职称专业学历住址00001何大伟男45教授计算机博士南秀村10号00002王芳芳女28讲师应用数学硕士北秀村22号00003张明扬男30副教授自动化学士西秀村18号00004黄向东男25讲师计算机硕士东秀村11号00005李小萍女39副教授计算机博士南新村15号解答: (1)数据库设计“人事档案.mdb”数据库中“人事档案”表的字段名字、类型和长度等设计由表3-10-2所示。表3-10-2“人事档案”表设计字段名类型长度字段名类型长度编号文本5职称文本6姓名文本6专业文本8性别文本2学历文本4年龄整型住址文本10(2)使用可视化数据管理器建立数据库仿照第一部分《实验十二》中实验内容第1题的操作步骤,使用可视化数据管理器创建“人事档案.mdb”数据库、建立“人事档案”表的结构和往“人事档案”表中输入数据。在建立“人事档案”表的结构时,应指定“编号”字段作为索引关键字段建立索引文件,索引文件名为“编号索引”。(3)界面设计和属性设置在窗体上建立八个标签、八个文本框和六个命令按钮。窗体和窗体上控件的主要属性设置如表3-10-3所示。表3-10-3第1题的属性设置控件名称属性名属性值Form1Caption记录的查询、修改、添加、更新和删除 Label1Caption编号Label2Caption姓名Label3Caption性别Label4Caption年龄Label5Caption职称Label6Caption专业Label7Caption学历Label8Caption住址Text1、Text2、Text3Text空串Text4、Text5、Text6Text空串Text7、Text8Text空串Command1Caption查询Command2Caption修改Command3Caption添加Command4Caption更新Command5Caption删除Command6Caption退出(4)程序代码DimdbAsDatabase,rsAsRecordsetDimbhAsString*5,ansAsStringPrivateSubForm_Load()Setdb=OpenDatabase(".人事档案.mdb") Setrs=db.OpenRecordset("人事档案",dbOpenTable)rs.Index="编号索引"CallpEndSubPrivateSubrecshow()Text1.Text=rs.Fields("编号")Text2.Text=rs.Fields("姓名")Text3.Text=rs.Fields("性别")Text4.Text=rs.Fields("年龄")Text5.Text=rs.Fields("职称")Text6.Text=rs.Fields("专业")Text7.Text=rs.Fields("学历")Text8.Text=rs.Fields("住址")EndSubPrivateSubp()Text1.Text="":Text2.Text=""Text3.Text="":Text4.Text=""Text5.Text="":Text6.Text=""Text7.Text="":Text8.Text=""EndSubPrivateSubCommand1_Click()Callp bh=InputBox("请输入需查询记录的职工编号:")rs.Seek"=",bhIfrs.NoMatchThenMsgBox("需查询记录找不到!"):GoTolrecshowl:EndSubPrivateSubCommand2_Click()Callpbh=InputBox("请输入需修改记录的职工编号:")rs.Seek"=",bhIfrs.NoMatchThenMsgBox("需修改记录找不到!"):GoTolrecshowans=MsgBox("确定要修改该记录吗?",vbOKCancel)Ifans=vbOKThenrs.EditText1.SetFocusEndIfl:EndSubPrivateSubCommand3_Click()Callpbh=InputBox("请输入需添加记录的职工编号:") rs.MoveFirstWhileNotrs.EOFIfrs.Fields("编号")=bhThenMsgBox("需添加记录已存在!"):GoTolrs.MoveNextWendrs.AddNewText1.SetFocusl:EndSubPrivateSubCommand4_Click()rs.Fields("编号")=Text1.Textrs.Fields("姓名")=Text2.Textrs.Fields("性别")=Text3.Textrs.Fields("年龄")=Text4.Textrs.Fields("职称")=Text5.Textrs.Fields("专业")=Text6.Textrs.Fields("学历")=Text7.Textrs.Fields("住址")=Text8.Textrs.UpdateMsgBox("更新记录已完成!")Callp EndSubPrivateSubCommand5_Click()bh=InputBox("请输入需删除记录的职工编号:")rs.Seek"=",bhIfrs.NoMatchThenMsgBox("需删除记录找不到!"):GoTolrecshowans=MsgBox("确定要删除该记录吗?",vbOKCancel)Ifans=vbOKThenrs.DeleteCallpEndIfMsgBox("删除记录已完成!")l:EndSubPrivateSubCommand6_Click()EndEndSub(5)运行情况上机运行程序后,屏幕出现用户界面,如图3.10.1所示。此时,单击各个命令按钮,系统执行相应的Click事件过程,并按提示操作,完成相应功能。 图3.10.1第1题的用户界面2.使用ADO数据控件编写一个程序,浏览由上题所建立的“人事档案”表中的记录。要求该程序具有显示首记录,下一个记录,上一个记录和末记录的功能。解答:(1)界面设计和属性设置在窗体上建立八个标签、八个文本框、四个命令按钮和一个ADO数据控件。窗体和窗体上控件的主要属性设置如表3-10-4所示。表3-10-4第2题的属性设置控件名称属性名属性值Form1Caption浏览“人事档案”表中的记录Adodc1CaptionEOFActionVisibleAdodc10FalseLabel1Caption编号Label2Caption姓名Label3Caption性别Label4Caption年龄Label5Caption职称Label6Caption专业 Label7Caption学历Label8Caption住址Text1、Text2、Text3Text4、Text5、Text6Text7、Text8TextDataSourceDataField空串Adodc1依次为:编号、姓名、性别、年龄、职称、专业、学历、住址Command1Caption首记录Command2Caption下一个Command3Caption上一个Command4Caption末记录(2)程序代码DimconnAsNewADODB.ConnectionDimcmdAsNewADODB.CommandDimrsAsNewADODB.RecordsetPrivateSubForm_Load()conn.Open"Provider=Microsoft.Jet.OLEDB.3.51;DataSource=人事档案.mdb"Setcmd.ActiveConnection=conn cmd.CommandType=adCmdTextcmd.CommandText="select*from人事档案"rs.Opencmd,,adOpenDynamicrs.MoveFirstCallrecshowEndSubPrivateSubrecshow()Text1.Text=rs.Fields("编号")Text2.Text=rs.Fields("姓名")Text3.Text=rs.Fields("性别")Text4.Text=rs.Fields("年龄")Text5.Text=rs.Fields("职称")Text6.Text=rs.Fields("专业")Text7.Text=rs.Fields("学历")Text8.Text=rs.Fields("住址")EndSubPrivateSubCommand1_Click()rs.MoveFirstCallrecshowEndSubPrivateSubCommand2_Click()rs.MoveNext Ifrs.EOFThenrs.MoveLastCallrecshowEndSubPrivateSubCommand3_Click()rs.MovePreviousIfrs.BOFThenrs.MoveFirstCallrecshowEndSubPrivateSubCommand4_Click()rs.MoveLastCallrecshowEndSub(3)运行情况运行程序后,界面如图3.10.2所示。单击各个命令按钮,系统执行相应的Click事件过程,完成相应功能。图3.10.2第2题的用户界面