第六章 程序设计与软件工程基础 本章介绍程序设计语言及其分类,结构化程序设计的概念和面向对象程序设计的概念,算法和程序的基本结构,软件工程概述及软件开发活动,Visual Basic6.0程序设计语言等内容。 6.1 程序设计语言 6.1.1 程序设计语言分类 语言是人类用来表达意思,交流想法的工具。人类社会使用自然语言进行交流,如汉语、英语、法语等,但计算机是不能直接执行人类自然语言的。程序设计语言是人与计算机之间交换信息的工具,人是通过它来指挥计算机工作的。程序设计语言是一套表达计算过程的符号系统,其表达形式能够同时被计算机和人所理解。 根据程序设计语言与计算机硬件的联系程度可将程序设计语言分为三类,即机器语言、汇编语言和高级语言。前两类依赖于计算机硬件,又统称为低级语言。高级语言与计算机硬件关系较小。因此,可以说程序设计语言经历了由低级向高级的发展过程。 1.机器语言 机器语言是用二进制数表示的、计算机唯一能理解和直接执行的程序语言。机器语言中的每一条语句(称为指令)都是二进制形式的指令代码,如1011000000001000。指令代码一般由操作码和参与操作的操作数两部分组成,如机器指令1011000000001000中,10110000为操作码(指令的功能),00001000为操作数(指令的对象),功能是将操作数8送累加器AL。机器语言通常随着计算机型号的不同而不同,每一种型号的计算机所能执行的全部指令的集合就是该型号计算机的指令系统。机器语言程序不直观,编写难度大,易于出错,调试、修改繁琐,可移植性差,但执行速度最快。机器语言是最低级的程序设计语言,目前除了在某些单板机上使用机器语言外,大部分计算机程序都不直接使用机器语言编写。 2.汇编语言 汇编语言是将机器语言“符号化”的程序设计语言。在汇编语言中,用助记符代替机器指令,如可用汇编指令MOV AL,8来代替上面的机器指令1011000000001000。显然,这比一串二进制代码容易书写和容易记忆。 汇编语言程序比机器语言程序易于编写、检查和修改,也保持了机器语言编程质量高、运行速度快、占用存储空间少等优点。但汇编语言也是面向机器的语言,故通用性和可移植性差,即:能在某一类计算机上运行的程序,却不能在另一类计算机上运行。汇编语言也属于低级语言,它常用来编写实时系统以及高性能软件。 3.高级语言 高级语言是50年代后期发展起来的、面向问题求解过程的程序设计语言。与汇编语言相比,高级语言更接近于人类的自然语言和数学语言,一般采用英语单词表达语句,便于理解、记忆和掌握,如高级语言语句c=a+b的功能是将变量a、b的和存放在变量c中。高级语言的一个语句通常对应多条机器指令,因而用高级语言编写的程序短小精悍,不仅便于编写,而且易于查找错误和修改。高级语言通用性强,程序员不必了解具体机器的指令就能编制程序,而且所编写的程序稍加修改或不用修改就能在不同的机器上运行,可移植性好。目前常用的高级语言有:BASIC(Visual Basic)、FORTRAN、Pascal(Delphi)、C、C++、COBOL、PROLOG、Java等。 计算机语言与计算机科学的其他许多分支一样,有其科学的理论根据和严格的使用方法,并且是在不断发展和完善的。计算机语言的发展过程如下: 第一代 机器语言。 第二代 汇编语言。 第三代 面向过程的高级语言。 第四代 面向对象的高级语言。 第五代 智能化语言(正在研制中)。 6.1.2 语言处理程序 一台计算机只懂得本台机器的机器语言,它不能直接执行汇编语言或高级语言编写的源程序。为了使计算机能够执行这些源程序,人们设计了一种特定的“翻译”程序,它能将源程序翻译成目标程序,即机器语言程序来执行。这种翻译程序就是语言处理程序,常用的语言处理程序有汇编程序、解释程序和编译程序。汇编程序用来翻译用汇编程序编写的源程序,解释程序和编译程序用来翻译用高级语言编写的源程序。 1.汇编程序 把用汇编语言编写的源程序翻译成目标程序的程序称为汇编程序,翻译的过程称为“汇编”,执行的是目标程序。 2.编译程序 编译程序将高级语言源程序整个地翻译为机器指令表示的目标程序,使目标程序和源程序在功能上完全等价,然后执行目标程序,得出运算结果。翻译的过程称为“编译”。典型的编译型语言是FORTRAN、Pascal、C、C++等。 3.解释程序 解释程序将高级语言源程序一句一句地翻译为机器指令,每译完一句就执行一句,当源程序翻译完后,目标程序也执行完毕。典型的解释型语言是Basic、Java,但现在也都有了编译功能。 6.1.3 高级语言源程序的运行步骤 程序不是计算机程序设计中独有的概念,在日常生活中我们也常见到这个词,例如一个会议日程、一场演出的节目单等,这些程序都是由人的一项一项活动组成,有序地完成每一项活动也就实现了程序的目标。 计算机程序是人们让计算机完成特定任务的一系列命令的集合。要把一个用高级语言编好的源程序在计算机上进行运行并得到结果 ,需要多种软件的支持,如操作系统、编辑软件、翻译程序、连接程序等。当翻译程序为编译程序时,一个源程序的运行步骤如图6-1所示。 从图中可以看出一个程序的运行必须经过四个阶段:编辑→编译→连接→运行,即通过编辑程序编辑和修改源程序,由编译程序将源程序编译为目标程序,再经过连接程序将目标程序连接成可执行程序,最后运行可执行程序得到结果。当某个阶段中出现了错误,则必须进行错误修改,直到没有错误为止。 图6-1 高级语言源程序的运行步骤 6.1.4 程序语言的选择 通常情况下,一项任务可以用多种编程语言来实现。为一项工程选择语言时,应该考虑这种编程语言是否适合于手中的任务,这种语言在其他的应用程序中是否也经常使用,开发小组成员是否都精通这门语言等一些问题。如果对这些问题的回答都是肯定的,那么这门语言对这项工程是一个很好的选择。 下面简单介绍几种当今流行的语言的特性,可帮助我们正确选择编程语言。 1.8086汇编语言 8086汇编语言是一种低级语言,由一些容易记忆的短语组成。8086汇编语言指令集只适用于Intel 80x86系列微处理器,用它编写的程序只能在装有80x86系列微处理器的计算机上运行。现在8086汇编语言主要用在那些程序尽可能短的或速度要求很高的场合。专业程序员把8086汇编语言嵌入其他语言中(仅有部分高级语言支持嵌入功能)使程序执行速度快,汇编语言也常用来编写系统软件以控制计算机硬件。 2.FORTRAN FORTRAN是FORmula TRANslating的缩写,意思是“公式翻译程序”,是1954年至1957年间由John Backus领导下的IBM的一个开发小组研制出的第一个高级程序语言。目前常用的版本是FORTRAN 77和FORTRAN 90,是仍在使用的最早的高级语言,其他的高级语言几乎都是直接或间接地从FORTRAN发展而来。FORTRAN 90是按当代软件工程要求提出的若干新观点、新理论设计的,对于数值型和计算功能支持较强,一般被科学家用来在大型机或小型机上编制科学计算程序。 3.BASIC和Visual Basic BASIC语言是为初级编程者设计的,它具有简单易学、小型通用的特点和人机会话交互计算功能。自从1964年问世以来,已经出现了几种流行版本,如GW-BASIC、QUICK-BASIC等,目前仍在流行的是Microsoft公司的Visual Basic。大部分版本是解释型的,但有些支持编译。Visual Basic的集成开发环境支持调试时解释执行和对最终版本的编译,是当前开发商业软件的理想工具之一,它所带的控件使开发可视化的图形用户界面和访问数据库信息等变得非常简单和高效率。 4.C和C++ C语言的前身是ALGOL 68和 B语言,是为了改写UNIX操作系统而诞生的,设计的初衷就是为了编写系统软件和增加可移植性,它在多个UNIX平台和微机操作系统平台上有编译系统,曾经是可移植性最好的语言。C语言是面向过程的程序设计语言,它带有汇编语言的接口,可使有经验的程序员做到编程速度快、效率高。 C++语言是由C语言发展而来的,是C语言的超集,产生于20世纪80年代。它保留了C语言的几乎全部特性,并增加了对象的支持,因此既可以进行过程化的程序设计,也可以进行面向对象的程序设计。现在较流行的版本是Microsoft的Visual C++和Borland的C++ Builder。C++语言实现了类的封装、数据隐藏、继承及多态,使得其代码容易维护且具有高可复用性。 5.PROLOG PROLOG是逻辑程序设计语言,出现于1971年。它以谓词逻辑为理论基础,最主要的特征是能像人脑那样自动进行逻辑推理。PROLOG可用于程序正确性证明、自然语言理解、化学结构式分析以及法律、心理学、关系数据库、专家系统等许多领域的程序设计工作。 6.Java Java是美国SUN Microsystems公司于1995年3月推出的一种新型面向对象的编程语言。Java语言具有面向对象性、简单性、动态性、可移植性、分布式、多进程、与平台无关等特点。Java带来了一个崭新的编程环境,它可通过Internet,实现计算机编程人员长期以来一直追求的梦想:“编写一次,到处运行”。 另外,在互联网的应用中,还有大量的基于解释器的脚本语言,如HTML、VBScript、JavaScript等。脚本语言是一类专用语言,它将实用工具,库组件和操作系统命令整合为一个完整程序。脚本语言可以用来向计算机发送指令,但它们的语法和规则没有可编译的编程语言那样严格和复杂。脚本语言主要用于格式化文本和使用以编程语言编写的已编译好的组件。 脚本语言以脚本的形式定义一项任务。脚本需要一个主机应用系统依附来运行,不能单机运行。例如,用HTML为显示网页编写一个脚本,这个脚本由网络浏览器解释,这里网络浏览器就是主机应用系统,没有它,HTML脚本就不能运行。 6.2 计算机程序设计 程序是为了解决某一特定问题而用某一种计算机语言编写的指令序列,程序设计是用某种计算机语言编写程序的过程,所以程序是程序设计的结果。 计算机的工作方式有两种,一种是交互式,即人给计算机一个指令,计算机就完成一个操作;另一种是程序控制式,即先把计算机要完成的操作用一条条指令按序排好,然后让计算机一步一步地执行这些指令序列,从而完成我们让计算机实现的功能,且整个指令序列的执行过程不需要人工干预。 在用高级语言进行程序设计时要注意以下3个概念。 1.语法。每种计算机语言都有自己的语法规则,这些规则是非常严格的。在进行编译时,系统会按语法规则严格检查程序,如有不符合语法规则的地方,计算机就会显示出语法有错信息。 2.语义。即某一语法成分的含义。例如,Visual Basic语言中用“Dim”语句来显式声明变量,用“Print”方法来显示文本字符串和表达式的值,用“*”表示乘法,用“<>”表示不等于运算等。在使用时必须了解每一种语法成分的正确含义。 3.语用。即正确使用语言。要善于利用语法规则中的有关规定和语法成分的含义有效地组成程序,以达到特定的目的。 6.2.1 结构化程序设计 1969年,荷兰学者戴克斯特拉(E . W. Dijkstra)等提出了结构化程序设计(Structured Programming)的概念。结构化程序设计是“按照一组能够提高程序易读性与易维护性的规则而进行程序设计的方法”,是面向过程的程序设计(Process-Oriented Programming, POP),它从程序的结构和实施方法上讨论如何产生可读性好、可靠性高,且易于维护的程序。 结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。它主要包括以下几方面内容: 1.衡量程序质量的标准是“清晰第一、效率第二”。 2.要求程序设计者按一定规范书写程序,而不能随心所欲地设计程序。 3.程序由一些具有良好特性的基本结构组成,如顺序结构、选择结构和循环结构。由这些基本结构顺序地构成一个结构化的程序。避免使用可能造成程序结构混乱的GOTO转向语句。 4.大型程序应分割成一些功能模块,并把这些模块按层次关系进行组织。 5.在程序设计时应采用“自顶向下、逐步细化”的实施方法。即将一个大任务先分成若干个子任务,每一个子任务就是一个模块。如果某一个子任务还太复杂,还可以再分解成若干个子任务,如此逐层分解。对一个模块的设计也是采取这种“自顶向下、逐步细化”的方法,直到将它分解为上述基本结构为止。 按结构化程序设计方法设计出的程序,结构良好,各模块间的关系简单,每一个模块都由基本结构组成。这样的程序清晰易读,可理解性好,容易设计,容易验证其正确性,也容易维护。同时,由于采用了“自顶向下、逐步细化”的实施方法,能有效地组织人们的智力,有利于软件的工程化开发。 6.2.2 面向对象程序设计 面向对象的程序设计(Object-Oriented Programming,OOP)于20世纪80年代初提出,它起源于Smalltalk语言。用面向对象的方法解决问题,不再将问题分解为过程,而是将问题分解为对象。对象是现实世界中可以独立存在、可以被区分的一些实体,也可以是一些概念上的实体,世界是由众多对象组成的。 对象有三个要素:属性、方法和事件。属性是对象的性质,是用于描述和反映对象特征的参数。方法是对象的行为,即将一些通用的过程编写好并封装起来,作为方法供用户直接调用。事件是响应对象的动作,它发生在用户与应用程序交互时,如单击控件按钮、鼠标移动、键盘按下等。对象之间的相互作用通过消息传送来实现。消息是面向对象系统中对象之间通信和请求任务的操作。消息传递是程序运行的基本处理活动。 面向对象的程序设计是一种系统化的程序设计方法,它不抛弃结构化程序设计方法,而是站在比结构化程序设计更高、更抽象的层次上去解决问题。当它被分解为低级代码模块时,仍需要结构化编程的方法和技巧,只是他分解一个大问题为小问题时采取的思路与结构化方法不同。结构化的分解突出过程,强调的是如何做,代码的功能如何完成;面向对象的分解突出现实世界和抽象的对象,强调的是做什么,它将大量的工作由相应的对象来完成,程序员在应用程序中只需说明要求对象完成的任务。 面向对象程序设计具有如下优点 : 1.符合人们习惯的思维方法。 2.易于软件的维护和功能的增加。 3.可重用性好。 4.与可视化技术相结合,改善了工作界面。 6.3 算法和程序的基本结构 6.3.1 算法的概念 算法是对一个问题的解决方法和步骤的描述。计算机算法分为数值算法和非数值算法两大类。一个算法应具有以下的特点: 1.有穷性。一个算法应当包括有限个操作步骤,或者说它是由一个有穷的操作系列组成,而不应该是无限的。 2.确定性。算法中的每一步的含义都应该是清楚无误的,不能模棱两可,也就是说不应该存在“歧义性”。 3.一个算法应该有零个或多个输入。 4.一个算法应该有一个或多个输出。 5.有效性。一个算法必须遵循特定条件下的解题规则,组成它的每一个操作都应该是特定的解题规则中允许使用的、可执行的,并且最后能得出确定的结果。 任何一个问题能否用计算机解决,一个关键的步骤就是看能否设计出它的算法,有了合适的算法,再使用合适的程序设计语言就能方便地编写出程序。 程序设计的目的就是要编写出描述正确,运行后能得到预期结果的程序。但如果仅仅这样要求的话,就会带来一系列的麻烦,如可靠性差、用户难于使用、维护困难等,因此必须研究和讲究程序设计方法,编写出高质量的程序。 6.3.2 算法的描述 可用自然语言、流程图、结构化流程图、伪代码等来描述一个算法。计算机程序就是用计算机能够理解的信息(计算机语言)描述的算法。 1.自然语言 即用人们使用的语言描述算法。例如: 第一步:算法开始; 第二步:将a的值送给c; 第三步:将b的值送给a; 第四步:将c的值送给b; 第五步:算法结束。 这个算法的功能是将两个变量a和b的值互换,变量c是一个工作单元,用于临时存放数据。 2.流程图 流程图是一种算法的图形描述工具。它用一些几何图框表示各种类型的操作,在框内写上简明的文字或符号表示具体的操作,用箭头的流程表示操作的先后顺序。图6-2是ANSI(美国国家标准化协会)规定的一些常用的流程图符号。 例如:从键盘输入三个不同的整数,并分别存放到变量x、y、z中,然后通过判断输出三个数中的最大数(存放在变量max中)。选出三个数中最大数的算法流程图如图6-3所示。 图6-2 常用的流程图符号 图6-3 选出三个数中最大数的算法 6.3.3 程序的三种基本结构 结构化程序设计使用了三种基本结构:顺序结构、选择结构和循环结构。通过对这三种基本结构的组合和嵌套就能实现任何单入口、单出口的程序。 1.顺序结构 该结构是按照语句的书写顺序依次执行的,这是一种最简单的结构。如图6-4所示,执行完A操作后再执行B操作。 2.选择结构 该结构通过对条件的判断来选择一个分支执行。如图6-5所示,当条件为“真”时执行A操作,当条件为“假”时执行B操作。注意,A、B两个操作不能同时执行。 3.循环结构 该结构在给定条件下,重复执行某操作,直到条件不满足为止。循环结构可分为以下两种形式: (1)如图6-6(a)所示,这种循环结构的执行过程是先判断条件,当条件为“真”时重复执行A操作,直到条件为“假”时为止。A操作可能一次也不被执行。 (2)如图6-6(b)所示,这种循环结构的执行过程是先执行A操作,再判断条件,当条件为“真”时重复执行A操作,直到条件为“假”时为止。A操作至少被执行一次。 图6-4 顺序结构 图6-5 选择结构 图6-4~图6-6中的A操作、B操作可以是一个简单的语句,也可以是一组语句或是一个基本结构。从图中可以看出,这三种基本结构具有以下特点: 1.只有一个入口。 2.只有一个出口。 3.无死语句(即永远执行不到的语句)。 4.无死循环(即无终止的循环)。 (a) (b) 图6-6 循环结构 任何一个结构化程序都可以由这三种基本结构来构成。结构化程序要求每一个基本结构具有单入口和单出口的性质是非常重要的。这是为了便于保证和验证程序的正确性。设计程序时,一个结构一个结构地顺序写下来,整个结构如同一串珠子一样次序清楚,层次分明。在修改程序时,可以将某一基本结构独立出来进行修改,在修改一个基本结构时,不会影响到其它基本结构中的语句。 已经证明:由以上三种基本结构所构成的程序可以处理任何复杂的问题。一个结构化程序是由具有以上特点的基本结构组成的,反过来说,一个结构化程序必定能分解为上述基本结构。 6.4 软件工程概述 6.4.1 软件及软件的特征 软件包括多个计算机程序、数据结构和文档。计算机程序在执行时能提供期望的功能和性能;数据结构使得程序能够完全操纵信息;文档描述了程序的分析、设计、实现和维护的细节及使用说明。软件有以下特征: 1.软件是一种逻辑产品,与物质产品有很大的区别。 2.软件是开发出来的,一旦开发完成,通过复制就能产生大量的软件产品。 3.软件产品可能会被废弃,但不会被用坏,它是有生命周期的。 4.软件的生产主要是脑力劳动,目前还未完全摆脱手工开发方式。 5.个体化的软件开发方式使得开发成本非常昂贵。 6.软件必须具有可维护性、独立性、效率性和可用性。 6.4.2 软件危机 1946年世界上出现第一台电子计算机以来,计算机技术发展十分迅速,其应用范围也越来越广泛。计算机软件逐渐成为计算机系统的核心,没有软件就没有计算机的应用。由于软件开发越来越复杂,程序人员越来越满足不了需要,致使软件产品质量难以满足各方面的要求,再加上软件的生产率低,导致软件费用的上涨,到了六十年代末期,不可避免地引发了软件危机(Software Crisis),即软件成本高,质量低,不能按期交付使用,可靠性差,生产效率低以及无法维护的状况。当时,有人统计美国的大型软件项目都有错误,例如美国的阿波罗8号宇宙飞船,因一个计算机软件错误,造成一部分信息丢失,阿波罗14号在10天飞行中出现了18个软件错误等等。 为了解决软件危机,美国和西欧的一些计算机科学家,于1967年、1968年在欧洲召开了两次软件可靠性国际会议。在1968年的会议上第一次提出了“软件工程”这个词和一些软件工程技术。力图借助于现代工程原理来开发计算机程序及有关资料。其目的是要提高软件开发生产率和软件产品的质量。最初,人们认为软件就是计算机程序。后来,国际标准化组织把软件定义为:“与计算机系统操作有关的程序、过程、及任何有关的文档资料。” 6.4.3 软件工程的发展 软件工程(Software Engineering)是指运用工程学的知识和方法来指导软件的开发工作,以提高软件质量和降低软件成本。软件工程的发展可以分为三个时期,即程序设计时期、软件时期和软件工程时期。各个时期的主要特点如下: 1.程序设计时期(1946年~1954年) 程序由程序设计人员个体手工编制,软件作为硬件的一种附属品,只是为了计算机能运行和作一些简单的计算及数据处理,程序还没有作为商品,工作效率很低,属手工业生产方式。 2.软件时期(1955年~1970年) 程序生产方式为互助组式,主要采取由程序员小组进行编程的办法,当时社会上大量需求软件,但软件人员缺乏且水平低。价格高、质量低、粗制滥造的软件大批涌向市场。 3.软件工程时期(1970年以后) 软件作为一种社会产品,批量生产,有标准化的生产过程,出现了大批软件公司和软件工厂,以软件作为计算机的中心,提出了一整套软件生产过程的基础理论、方法和工程系统。 6.4.4 软件工程研究的内容 软件工程是指导软件开发和维护的工程类科学,它以计算机科学理论及其他相关学科的理论为指导,采用工程化概念、原理、技术和方法进行软件的开发和维护,把经过时间证明正确的管理措施和当前能够得到的最好的技术方法结合起来,以较少的代价获取高质量的软件。软件工程研究的内容为:过程和模型、方法和技术、工具和环境、标准和规范。软件工程管理则贯穿于这四个方面。 1.过程和模型 所有软件开发和维护都是由一系列过程构成,它将方法和技术、工具和环境、标准和规范有机地结合起来,以合理、及时地进行软件开发和维护。软件生存周期模型则将软件工程过程有机结合起来,提供一个结构框架,明确主要活动和任务,忽略次要的细节,以便于软件开发和维护的各类人员理解并适应不同的项目。因此,过程强调的是具体的活动和任务等,模型则突出表现过程的有机结合。 2.方法和技术 软件开发和维护方法体现了进行软件开发和维护的人员看待系统的立场和观点。例如,结构化方法认为系统是由一些结构化的功能相互联系、相互作用而构成。面向对象方法则认为系统是由一些对象的相互联系、相互作用而构成。技术则是方法的具体实现,由若干步骤组成,突出“如何做”。例如,SA/SD(System Analysis/System Design)是一种结构化分析与设计技术,OMT(Object Modeling Technique)是一种面向对象分析与设计技术。另外,还有一些与软件开发和维护有关的辅助技术,如软件可靠分析技术等。 3.工具和环境 工具为软件开发和维护的方法、技术提供了自动或半自动的软件支持,以提高软件生产效率,如编译程序等。将各种工具结合起来,连同有关的软硬件便形成软件开发和维护环境,其目的是使软件工具支持整个软件生存周期。 图6-7 软件工程层次结构 4.标准和规范 标准化及规范化可以使各工程工作有章可循,进而提高生产效率和产品质量。软件工程标准主要有五个层次:国际标准、国家标准、行业标准、企业规范和项目规范。 任何工程化方法都一定是围绕高质量这一核心的,如图6-7所示,软件工程研究的四个内容也构成了以软件质量为核心的层次结构。 6.5 软件工程工具和环境 6.5.1 软件工具 软件工具是指为支持计算机软件的开发、维护及相关工作而研制的程序系统。使用软件工具的目的是降低软件开发和维护的成本,提高软件产品的生产效率和质量。软件工具主要有以下几类: 1.开发工具 用于软件开发过程的各种开发活动,主要有:需求分析类工具、设计工具、编码工具、测试工具等。需求分析类工具用来辅助系统分析员生成完整、正确、一致的需求说明,改善软件开发人员间的通信状况,减少管理和维护费用;设计工具用来进行系统设计,形成设计规格说明,检查并排除规格说明中的错误;编码工具为程序设计人员提供各种方便的编程环境,如编辑、编译、调试和运行等;测试工具支持整个测试流程,包括选择测试用例、生成测试软件、执行测试、评价测试结果等。 2.维护工具 用于辅助维护人员对代码及有关文档进行各种维护活动,主要有:版本控制工具、文档分析工具、逆向工程工具、再工程工具等。版本控制工具用来存储、更新、恢复和管理一个软件的多个版本;文档分析工具用来对软件开发过程中形成的文档资料进行分析,给出软件维护活动所需的维护信息;逆向工程工具辅助软件人员将某种形式表示的软件转换成更高抽象形式表示的软件;再工程工具支持软件重构,提高软件功能、性能以及可维护性。 3.管理和支持工具 用于辅助软件项目管理人员和支持人员的各种管理和支持活动,主要有:项目管理工具、开发信息库工具、配置管理工具、软件评价工具等。项目管理工具用来辅助管理人员进行项目的计划、成本估算、资源分配、质量控制等管理活动;开发信息库工具可维护软件项目的各种开发信息;配置管理工具完成软件配置的标识、版本控制、变化控制等基本任务;软件评价工具可以辅助管理人员进行质量保证的有关活动。 6.5.2 CASE集成环境 将软件工具集成在一起,使得一个工具产生的信息能够被其他工具所用,这样的工具集称为计算机辅助软件工程(Computer Aided Software Engineering,简称为CASE)。CASE的集成机制主要有: 1.数据集成,使得工具间可以交换数据。 2.界面集成,使得工具有相同的界面风格和交互方式。 3.控制集成,在工具激活后能控制其他工具的操作。 4.过程集成,在系统中嵌入了有关软件过程的知识,可根据软件过程模型辅助用户启动各种软件开发活动。 5.平台集成,使得工具运行在相同的硬件/操作系统下。 CASE技术始于20世纪80年代,其发展经历了以下四个时期: 第一个时期:20世纪80年代初期。在这一时期,各种工具大多是孤立存在的,彼此间没有信息交换,且以分析、设计阶段的辅助工具为主,例如文档自动生成器、图表自动生成器等。 第二个时期:20世纪80年代中期。这一时期引入了系统信息中心库的概念,使得彼此孤立的工具开始有了信息交换环境的支持,推动了从分析到设计的软件工程上游阶段开发工具的一体化,即CASE上游工具集成。 第三个时期:20世纪80年代后期。这一时期把应用程序开发、维护自动化与项目管理工具结合起来,重视标准化的“接口型”的工具集成环境。 第四个时期:20世纪90年代初期至今。这一时期明确了CASE的最终目标是“统一使用开发支持工具,实现软件开发全过程的自动化”。如,在解决软件工程各阶段间信息交换和信息一致性问题上引入了“百科全书”(Encyclopedia),在使结构化方法可视化上使用图形工具,在使软件工程开发方法学与CASE工具统一化上使用了人工智能(AI)技术等等。 CASE技术的发展有待于软件工程方法学的发展,同时CASE技术的发展又促进着软件工程方法学的进一步发展。随着CASE技术在软件工程中的作用不断扩大和深化,在今后的软件工程领域,CASE技术将很有可能占据主导地位。 6.6 软件开发方法及开发活动 6.6.1 软件生存周期及模型 软件生存周期是一个软件从提出开发要求开始到该软件报废为止的整个时期,可大体分为三个时期:计划时期(包括问题的定义和可行性分析)、开发时期(包括需求分析、软件设计、编码、测试)、运行时期(包括软件维护)。 软件生存周期过程规定了在获取、供应、开发、操作和维护软件时要实施的过程、活动和任务。其目的是提供一个公共框架,以便软件开发人员可以使用“相同语言”在各自的环境中编写和管理软件。 软件生存周期模型是描述软件从项目需求定义开始,到开发成功后投入使用,在使用过程中不断增补修订,直到停止使用,这一期间的各种活动如何执行的模型。软件生存周期模型的作用是确立了软件开发中各阶段的次序限制,活动准则,所要遵守的规定和限制,便于各种活动的协调,人员之间的有效通信,有利于活动重用和活动管理。目前主要的模型有: 1.瀑布模型,将软件生存周期中各活动规定为依线性顺序连接的若干阶段。包括可行性分析、项目开发计划、需求分析、概要设计、详细设计、编码、测试和维护。它是一种理想的线性开发模式,缺乏灵活,特别是无法解决软件需求不明确的问题。不适合于需求不明确,设计方案有一定风险的软件项目。 2.渐增模型,软件在模型中是“逐渐”开发出来的,开发一部分,展示一部分,能及早发现问题。或者先开发“原型”软件,完成主要功能,然后逐步完善,最终获得满意的软件产品。 3.螺旋模型,将瀑布模型与增量模型结合起来,加入风险分析,弥补了这两种模型的不足。开发分为四步:制定计划、风险分析、开发实施、用户评估。 4.喷泉模型,以用户需求为动力,以对象为驱动的模型,适合于面向对象开发方法,使开发过程具有迭代性和无间隙性。 5.基于知识的模型,是瀑布模型与专家模型的结合。开发各阶段都利用相应专家系统来辅助设计,使维护在系统需求一级进行。 6.变换模型,适合于形式化开发方法的模型。 6.6.2 软件开发方法 软件开发方法就是使用定义好的技术及表示符号来组织软件生产过程的方法。软件开发方法对软件开发步骤、文档格式和评价标准提出了规范化的要求,使软件生产进入有章可循、向规范化和标准化迈进的“工程化”阶段。 1.结构化方法 结构化方法认为系统是由一些功能的相互联系、相互作用而形成,其总的指导思想是自顶向下、逐步求精、单入口、单出口,基本原则是抽象和功能分解。结构化方法围绕处理功能的实现“过程”来构造软件系统,特别适合于需求能够预先确定的系统的开发。目前,根据软件工程生存周期的不同阶段已形成了一整套的结构化系列方法,即结构化分析方法(Structured Analysis)、结构化设计方法(Structured Design)和结构化程序设计方法(Structured Programming)。 结构化方法简单实用,技术成熟,应用广泛。但对于大规模的项目或特别复杂的项目,结构化方法不够适用,它难于解决软件重用问题,难于适应需求变化,且软件维护依然比较复杂,而这些问题在面向对象方法中可以很好地解决。 2.面向对象方法 面向对象方法认为系统是由一些对象的相互联系、相互作用而形成,其出发点和基本原则是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界的方法与过程。目前,面向对象方法已形成了一整套的开发方法,它由面向对象分析(Object-Oriented Analysis)、面向对象设计(Object-Oriented Design)、面向对象程序设计(Object-Oriented Programming)等组成。面向对象方法有下列要点: (1)客观世界是由各种对象(Object)组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合起来。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的对象由比较简单的对象组合而成。 (2)把所有的对象都归为各种类(Class),每个类都定义了一组数据和方法。数据用于表示对象的静态属性,描述对象的状态信息;方法是对象所能执行的操作,也就是类中所能提供的服务。 (3)按照子类(也称为派生类)和父类(也称为基类)的关系,可以把若干个类组成一个层次结构的系统。在这种类层次结构中,通常下层的派生类具有一些和上层的基类相同的特性(包括数据和方法),这一特性称为继承(Inheritance)。 (4)对象之间只能通过传递消息进行通信(Communication with Messages)。 3.形式化方法 形式化方法(Formal Methods),即形式化规格说明和证明技术,是提高计算机软件可靠性的一种重要技术。形式化方法具有定义完备的语义,可以使用数学方法对其进行分析,尤其是能够采用一致性和完备性技术识别系统开发潜在的问题。形式化方法已经开始被工业界接受并用于开发实际系统。国外已开发出的比较成熟的形式化系统有:VDM系统、Z系统、RAISE系统等。 形式化方法生成的模型比结构化方法或面向对象方法得到的模型更完整、一致且无二义性。但使用形式化方法必须考虑初始成本及与之相关的技术变更。 6.6.3 软件开发活动 软件生存周期包含的复杂活动及时序性的要求,使软件开发变成了一个十分复杂的事情。根据软件生存周期模型,可将软件开发的活动分为核心活动及支持活动。核心活动主要涉及软件开发及软件运行的主流程,包括软件需求、软件设计、软件构造、软件测试及软件维护。支持活动涉及辅助流程,包括软件配置管理、软件工程管理、软件过程、软件工程工具和方法、软件质量。 1.核心活动 (1)软件需求 软件需求是摸清用户需要用软件解决什么问题,这些问题有什么特征、特点?可以抽象为何种模型?然后定义软件的规格说明,即指出什么样的软件能满足抽象出的模型。把对问题求解的描述变为对软件的需求。软件需求的难点有:需求因素繁多使得问题的复杂性增大、人员之间的交流障碍、不完备性和不一致性以及需求易变性。 软件需求的活动有:业务建模、识别问题、分析建模、需求规格化和编写文档。 (2)软件设计 软件设计的目标是显示系统如何在实现阶段被实现的。系统要达到:在特定的实现环境中完成需求描述中指定的任务和功能;系统健壮地被建造,如果功能需求发生变化易于更改。设计结果是一个设计模型和可选的分析模型。设计模型是源代码的抽象,即设计模型充当源代码如何被组建和编制的蓝图。 软件设计活动以体系结构设计为中心。结构由若干结构视图来表达,这些视图捕获了主要的构架设计的决定。结构视图是整个设计的抽象和简化,该视图中细节被放在了一旁,使重要的特点体现得更加清晰。 软件设计要做的事情有四个方面:软件系统结构设计、数据设计、界面设计和过程设计。 (3)软件构造 构造的目的是定义代码的组织结构及形式。形式包括源文件、二进制文件、可执行文件等。主要活动有编码实现、将开发出的构件作为单元进行测试和将由单个实现者或小组产生的结构集成为可执行的系统。在此活动中的重要任务是选择合适的开发语言工具及系统软件、数据库软件、中间件等,并制定编程规范。构造要注意使系统更易于使用和系统的可重用性。 (4)软件测试 测试的目的是验证软件构件间的交互作用、验证软件构件的正确集成、验证所有需求被正确的实现和识别,并确保在软件发布之前缺陷已被处理。测试分别从可靠性、功能性、应用性和系统性能进行。 测试活动主要有四类:单元测试、集成测试、确认测试和系统测试。 (5)软件维护 软件维护有四项内容,校正性维护占整个维护工作的21%,主要任务是识别和纠正错误,修改软件性能上的错误;适应性维护占整个维护工作的25%,主要任务是修改本软件使其适应系统硬件和软件的变化;完善性维护占整个维护工作的50%,主要任务是增加软件功能、增强软件性能、提高运行效率;预防性维护占整个维护工作的4%,主要任务是提高软件的可维护性和可靠性。 2.支持活动 (1)软件配置管理 描绘了如何在多个成员组成的项目中控制大量的产出物,如何管理并行开发、分布式开发,如何自动化创建工程。控制有助于避免混乱,并确保不会由同步更新、通知不达、多个版本等问题造成产品的冲突。 配置和变更管理提供了准则管理演化系统中的多个变体,跟踪给定软件创建过程中的版本。根据用户定义的版本规则建造程序或整个版本,实施特定于现场的开发策略。 (2)软件工程管理 软件工程管理是一门艺术,它平衡了互相冲突的目标,管理风险,克服各种限制来成功地发布满足投资用户和使用者需要的软件。如此少的无争议的成功项目无疑是该项任务难度的证明。其主要活动有:管理项目的框架、计划配备执行监控项目的实践准则、管理风险的框架。 (3)软件过程 软件过程确定了软件开发中各阶段的次序限制,活动准则,所要遵守的规定和限制,便于各种活动的协调,人员之间的有效通信,有利于活动重用和活动管理。 (4)软件工程工具和方法 本活动目的是给软件开发组织提供软件开发环境过程和工具软件。软件工程工具主要包括信息工程工具、过程模型和管理工具、项目计划工具、风险分析工具、项目管理工具、需求追踪工具、度量和管理工具、文档工具、系统软件工具、质量保证工具和数据库管理工具等等。 (5)软件质量 软件质量是与软件产品满足明确或隐含需求的能力有关的特征和特性的总和。软件质量可用功能特性、可靠性、可用性、效率、可维护性和可移植性这6个特性来评价。软件质量保证的SQA活动,贯穿于软件过程始终。开发单位应成立SQA小组来负责全面质量管理。在开发项目时就要做出SQA计划。SQA小组工作有:各种测试、各种评审、各种审计,同时要求对测试、评审、审计的过程进行详细记录并写出报告。 6.7 Visual Basic程序设计实例 6.7.1 Visual Basic简介 Microsoft Visual Basic(简称VB)是Microsoft公司1991年推出的,目前广泛使用的是Visual Basic 6.0,它共有三个版本:学习版(Learning)、专业版(Professional)和企业版(Enterprise)。VB是可视化的、面向对象的、由事件驱动的结构化高级程序设计语言。它提供了最迅速、最简捷的开发应用程序的方法。 1.VB 6.0的主要特点: (1)支持可视化的图形用户界面设计 在VB程序设计中,一切对象都是可视的。程序员只须根据界面的要求,利用工具按钮直接在窗体上画出菜单、按钮等对象,并且为它们设置所需的属性,界面设置结束后VB能自动生成界面代码。 (2)事件驱动的编程机制 在传统的程序设计中,程序是按照预先设计的流程运行的。在VB程序设计中,程序的运行将由用户的动作(即事件)来控制。事件可以由用户操作触发,也可以由来自操作系统或其它应用程序的消息触发,甚至可以由应用程序本身的消息触发。每个事件都能驱动一段程序的运行,这些事件的顺序决定了代码执行的顺序。 (3)基于对象的设计思想 VB把程序和数据封装起来成为一个对象,并使对象的大部分设计和编码工作让系统自动完成,程序员仅须编写针对某些事件的功能代码,可大大提高效率。 (4)基于构件和程序开发 在VB程序设计中,允许使用已经设计好的程序构件,不必一切从头开始。用户通过这些构件的重用,可迅速建立应用系统,加快应用程序的开发速度。 (5)对数据库和OLE技术的支持 VB本身提供了建立数据库的功能,并支持访问多种外部数据库,如FoxPro、Access等。VB还支持对象链接与嵌入(OLE),能利用这种技术将其他应用程序作为一个对象嵌入或链接到VB程序中,实现声音、图像、动画等多媒体功能。 (6)丰富的辅助开发工具 VB还可提供编辑器、调试器、安装向导等多种辅助开发工具,其中的Setup Wizard工具软件可支持用户制作带有安装程序的应用程序盘,生成可执行的EXE程序提交用户使用。 2.VB 6.0的运行环境 VB 6.0是可运行在 Microsoft Windows 98 /NT/Me/2000下的应用程序,硬件要求Pentium 或更高的处理器,或任何运行于 Microsoft Windows NT Workstation 的 Alpha 处理器。企业版的安装需要约140MB的硬盘空间,帮助系统约需67 MB的硬盘空间。 3.VB 6.0的启动 在安装好VB 6.0后,便可单击 Windows 任务栏中的开始按钮,选择“程序”菜单中的“Microsoft Visual Basic 6.0中文版”选项下的“Microsoft Visual Basic 6.0中文版”程序,就能启动 VB 6.0。也可以双击桌面上的 Visual Basic 快捷图标来启动 VB。 6.7.2 Visual Basic 6.0集成开发环境(IDE) 启动VB 6.0后,屏幕上出现图6-8所示的集成开发环境或IDE。集成开发环境是VB 6.0的工作环境,它在一个公共环境里集成了许多不同的功能,例如设计、编辑、编译和调试等。下面对集成开发环境进行详细介绍。 1.VB的三种工作模式 (1)设计模式:可进行界面设计和代码编制。 (2)运行模式:运行应用程序,这时不可设计界面和编辑代码。 (3)中断模式:应用程序暂时中断,这时不可设计界面,但可编辑代码。 例如:当集成开发环境的标题栏中的标题为“工程1-Microsoft Visual Basic [设计]”时,说明集成开发环境处于设计模式,方括号中的文字表示VB当前的工作模式。 2.菜单栏中各选项的功能 (1)文件:用于创建、打开、保存、显示最近的工程及退出VB。 (2)编辑:提供程序源代码编辑所需的各项功能。 (3)视图:提供集成环境下程序源代码、控件的查看和各种窗口的显示。 (4)工程:用于窗体、工程、控件等对象的处理。 (5)格式:用于控件对象的格式化处理。 (6)调试:用于程序调试、查错。 (7)运行:用于程序的启动、编译、中断、停止。 (8)工具:包含菜单编辑器及集成环境下的工具扩展。 (9)外接程序:用于为工程增加或删除外接程序。 (10)窗口:用于屏幕窗口布局及列出打开的文档窗口。 (11)帮助:为用户提供程序设计所需的参考信息。 图6-8 VB 6.0集成开发环境 3.工具栏 工具栏在编程环境下提供对于常用命令的快速访问。单击工具栏上的按钮,则执行该按钮所代表的操作。通常在启动 Visual Basic 之后,只显示“标准”工具栏,附加的编辑、窗体设计和调试工具栏可以从“视图”菜单下的“工具栏”命令中移进或移出。工具栏能紧贴在菜单条之下,或以垂直条状紧贴在左边框上,如果将它从菜单下面拖开,则它能“悬”在窗口中。 4.工具箱窗口 General工具箱窗口如图6-9所示,它提供了一组工具,用于设计时在窗体中放置控件对象,生成应用程序和用户接口。用户还可以将不在General工具箱中的其他ActiveX控件放到工具箱中。通过“工程”菜单中的“部件”命令,就会显示系统安装的所有ActiveX控件清单。要将某控件加入到General工具箱中,只要单击需加入控件前面的选择方框,如图6-10所示,然后单击“确定”按钮,选定的控件就出现在工具箱窗口中。 5.窗体设计器窗口 作为自定义窗口用来设计应用程序的界面,可方便地在窗体中添加控件、图形和图片来创建所希望的外观。应用程序中每一个窗体都有自己的窗体设计器窗口,每个窗口都必须有一个唯一的窗体名字,建立窗体时默认的窗体名称为Form1、Form2……。窗体的网格点间距可以通过“工具”菜单下的“选项”命令,在弹出的对话框中选择“通用”选项卡的“窗体网格设置”来改变。 图6-9 工具箱窗口 图6-10 添加其他ActiveX控件 6.工程资源管理器窗口 工程是指用于创建一个应用程序的文件的集合,工程文件的扩展名为.vbp。工程资源管理器窗口如图6-11所示,其中列出当前工程中的窗体和模块。窗口上有三个按钮,“查看代码”按钮用于显示代码窗口,以编写或编辑所选项目目标代码;“查看对象”按钮用于显示选取的工程,可以是窗体、模块、ActiveX对象或用户控件的对象窗口;“切换文件夹”按钮用于当正在显示包含在对象文件夹中的个别项目时可以隐藏或显示它们。 图6-11 工程资源管理器窗口 在工程资源管理器的列表窗口中,以层次列表形式列出所有已装入的工程以及工程中的项目。常用的有三类文件:窗体文件( .frm 文件),用于存储窗体上所使用的所有窗体对象、对象属性、相应的事件过程代码;标准模块文件(.Bas文件),用于存储所有的模块级变量和用户自定义的通用过程;类模块文件(.cls),用来建立用户自己的对象。 7.属性窗口 属性是指对象的特征,如大小、标题或颜色。属性窗口如图6-12所示,可按所选择的窗体、控件、类、用户控件、属性页、用户文档或菜单来列出设计时属性。该窗口只能在设计模式使用。属性窗口由以下几部分组成: 图6-12 属性窗口 (1)对象列表框:用户可以单击对象列表框右边的箭头,下拉出所选窗体包含的所有对象列表。 (2)属性显示排列方式:可按字母或按分类排序列表。 (3)属性列表框:用户可选定某一属性,然后对该属性的值进行设置。 (4)属性含义说明:当在属性列表框中选取某一属性时,在该处显示所选属性的含义。用来帮助用户理解属性和设置属性。 图6-13 代码编辑器窗口 图6-14 窗体布局窗口 8.代码编辑器窗口 代码编辑器窗口如图 6-13所示,它是输入应用程序代码的编辑器。应用程序的每个窗体或代码模块都有一个单独的代码编辑器窗口。它象一个高度专门化的字处理软件,有许多便于编写 VB代码的功能。 打开代码编辑器窗口有三种方法:从工程资源管理器窗口中选择一个窗体或标准模块并选择“查看代码”按钮,或用鼠标双击一个控件或窗体自动打开代码编辑器窗口,或从“视图”菜单中选择“代码窗口”命令。 代码编辑器窗口中包含两个列表框: (1)对象列表框:存储并显示当前被选中的窗体和控件名。单击列表框右边的箭头,显示和该窗体有关的所有对象的清单。 (2)过程列表框:列出对象的过程或事件。该框显示选定过程或事件的名称。 代码编辑器窗口的左下角还有一个过程查看按钮(窗口中只显示一个过程)和一个全模块查看按钮(窗口中显示所有的过程)。 9.窗体布局窗口 窗体布局窗口如图6-14所示,用于指定应用程序运行时各窗体的初始位置。可通过在窗体布局窗口中拖动表示窗体的小图像来布置应用程序中各窗体的起始位置。 10.立即窗口 立即窗口是为调试应用程序而提供的,在IDE之中运行应用程序时才有效。用户可直接在该窗口利用Print方法或直接在程序中用Debug.Print显示所关心的表达式的值。 11.对象浏览器窗口 对象浏览器窗口列出工程中有效的对象,并提供在编码中漫游的快速方法。可以使用“对象浏览器”浏览在 VB中的对象和其它应用程序,查看对那些对象有效的方法和属性,并将代码过程粘贴进自己的应用程序。 例6-1 在窗体上创建两个命令按钮Command1和Command2,将Command1的Caption属性值设置为“欢迎”,Command2的Caption属性值设置为“结束”。程序运行时,当单击Command1时在窗体上显示“欢迎使用VB!”,当单击Command2时在窗体上显示“再见!”。窗体界面及运行结果如图6-15所示。 (a) (b) (c) 图6-15 可通过下面的步骤来创建这个应用程序: 1.启动Visual Basic 6.0,然后创建一个新工程(也可以利用文件菜单中的“新建工程”命令来创建)。 2.单击工具箱窗口中的CommandButton(命令按钮)并将鼠标指针移到窗体上,这时指针变成十字线。按下鼠标左键在窗体上相应位置拖出一个表示命令按钮大小的方框然后释放鼠标左键,即可在窗体上创建命令按钮Command1。若对Command1的位置和大小不满意,还可以移动其位置和调整其大小。 3.双击工具箱窗口中的CommandButton(命令按钮),即可在窗体中央创建一个尺寸为默认值的命令按钮Command2。若对Command2的位置和大小不满意,还可以移动其位置和调整其大小。 4.单击Command1,在属性窗口中将其Caption的属性值设置为“欢迎”;单击Command2,在属性窗口中将其Caption的属性值设置为“结束”,如图6-15(a)所示。调整命令按钮的大小使其能完全显示出Caption的值。 5.在窗体上双击命令按钮Command1或Command2进入代码编辑器窗口,然后编写如下事件过程: Rem Command1_Click()事件的功能是在窗体上输出字符串" 欢迎使用VB!" Private Sub Command1_Click() 'Command1_Click()是一个单击事件 Cls '清除窗体上的所有显示内容 FontName = "黑体" '设置窗体显示字体为黑体 FontSize = 26 '设置窗体显示字体大小为26 Form1.Print '在窗体上输出一个空行 Form1.Print " 欢迎使用VB!" '在窗体上输出字符串" 欢迎使用VB!" End Sub '事件过程结束 Rem Command2_Click()事件的功能是在窗体上输出字符串" 再见! " Private Sub Command2_Click() 'Command2_Click()是一个单击事件 Cls FontName = "隶书" FontSize = 26 Form1.Print Form1.Print " 再见! " End Sub 说明:VB中可用关键字“Rem ”或撇号“ '”来注释文本,用Rem注释的内容必须单独为一行,而用撇号“'”引导的注释内容可以直接出现在语句的后面。在程序代码中加上一些注释可以帮助用户阅读和理解程序的功能。执行程序时,注释内容不被执行。 6.执行“运行”菜单中的“启动”命令运行程序并显示窗体界面,单击窗体上的命令按钮“欢迎”可驱动Command1_Click()事件,运行结果如图6-15(b)所示;单击窗体上的命令按钮“结束”可驱动Command2_Click()事件,运行结果如图6-15(c)所示。 7.执行“运行”菜单中的“结束”命令或单击窗体界面上的关闭按钮可以结束当前程序的运行。 8.执行“文件”菜单中的“工程另存为”命令来保存工程;执行“文件”菜单中的“Form1另存为”命令来保存窗体。(保存过的工程或窗体可供以后调用) 6.7.3 对象的属性、方法和事件 1.VB 6.0的常用属性 属性是用来描述和反映对象特征的参数。VB程序中的对象都有许多属性,对象中的数据就保存在属性中。设置对象的属性有两种方法,一种是在界面设计阶段利用属性窗口直接设置;另一种是通过赋值来实现,其格式为“对象.属性=属性值”,如Command1.Caption=”确定”语句,该语句的功能是将命令按钮Command1的Caption属性值设置为“确定”。常用的属性如下: (1)Name名称属性 在VB中,任何对象都有Name属性,它是所创建的对象名称。所有控件在创建时都由VB系统自动提供一个默认名称,可以在属性窗口的“名称”栏修改对象名称。在程序代码中是通过Name属性来引用、操作具体控件的。 (2)Caption标题属性 该属性确定了控件上显示的内容。对于窗体则是显示在标题栏上的文本内容,也是当窗体被最小化后出现在窗体图标下的文本。 对于命令按钮控件,在Caption属性设置时,如果某个字符前加入“&”,则程序运行时标题中的该字母带有下划线,这个字母就成为了快捷键。如设置Caption属性为&Ok,程序运行时命令按钮的标题就为Ok,当用户按下Alt+O便可激活并操作Ok按钮。 (3)Height、Width、Top和Left属性 Height和Width属性确定了控件的高度和宽度,Top和Left属性确定了控件在窗体中的位置。Top表示控件到窗体顶部的距离,Left表示控件到窗体左边框的距离。对于窗体, Top表示窗体到屏幕顶部的距离,Left表示窗体到屏幕左边的距离。 在窗体上设计控件时,VB自动提供了默认坐标系统,窗体的上边框为坐标横轴,左边框为坐标纵轴,窗体左上角顶点为坐标原点,单位为twip。1twip=1/20点=1/1440英寸=1/567厘米。 一个控件对象的Height、Width、Top和Left属性的含义如图6-16所示。  图6-16 (4)Enabled属性 用于确定一个窗体或控件是否能够对用户产生的事件作出反应。若Enabled属性设置为True则允许用户进行操作,若Enabled属性设置为False则不允许用户进行操作。当窗体或其他“容器”控件的Enabled属性设置为False时,则在其中的所有控件都无效。 (5)Visible属性 该属性决定控件是否可见。其值设置为True时,程序运行时控件可见;设置为False时,程序运行时控件被隐藏起来,用户看不到,但控件本身仍然存在。 (6)Font属性 该属性用于改变文本的外观,方法为:单击属性窗口中的Font属性,再单击其后的按钮(按钮上有三个小点),在弹出的“字体”对话框中便可设置字体、字体的大小等。 在程序代码中设置字体、字体尺寸和字体样式的方法如下: FontName="黑体" '设置窗体字体为黑体 FontSize=20 '设置窗体字体尺寸为20 FontItalic=True '设置窗体字体样式为斜体 FontBold=True '设置窗体字体样式为粗体 FontUnderline=True '设置为加下划线 Command1.FontName="黑体" '设置对象Command1的字体为黑体 (7)ForeColor前景颜色属性 该属性用来设置或返回控件的前景颜色,即正文颜色。其值是一个16进制常数,用户可以在调色板中直接选择所需要的颜色。 (8)Backcolor背景颜色属性 正文以外的显示区域的颜色,设置方法与设置前景颜色相同。 (9)BackStyle背景样式属性 设置为“0——Transparent”时透明显示,即控件背景颜色显示不出来,可看见控件背后的其他控件。设置为“1——Opaque”时不透明,此时可为控件设置背景颜色。 (10)BorderStyle边框样式属性 设置为“0——None”时控件周围没有边框。设置为“1——Fixed Single”时控件周围带有边框。窗体对象还有更多的边框样式,请上机试试, (11)MousePointer属性 该属性用于设置鼠标指针的形状,可设置的值的范围为0~15,具体意义请在属性窗口中查看。当值设置为99时,可让用户自定义图标。 (12)MouseIcon属性 设置定义鼠标图标,文件类型为.ico或.cur,图标库在Graphics目录下。该属性必须在MousePointer属性设置为99时使用。 (13)Alignment属性 用于设置Caption属性中文本的对齐方式,共有三种选择:值为0时左对齐;值为1时右对齐;值为2时居中对齐。 (14)AutoSize属性 该属性确定控件是否随Caption内容的多少自动调整控件本身的大小。如果值为True则随着调整,为False则不调整,超出范围的内容不显示。 (15)WordWarp属性 该属性用来设置当控件在水平方向上不能容纳其中的文本时,是否折行显示文本。当值设为True时,文本可以折行显示,控件在垂直方向上放大或缩小以适合文本的大小,其宽度保持不变;当其值为False时,表示文本不换行。 (16)TabIndex属性 该属性决定了按Tab键时焦点在各个控件中移动的顺序,默认顺序就是对象建立的先后顺序。 焦点是接收用户鼠标或键盘输入的能力。当对象具有焦点时,可接收用户的输入。在Windows环境下,可同时运行多个应用程序,有多个窗口,但焦点只有一个。焦点能由用户或应用程序设置。 当窗体上有多个控件时,对大部分控件系统会分配一个Tab顺序,即按Tab键时焦点在各个控件上移动的顺序。也可以通过设置控件的TabIndex属性的值来改变系统默认的Tab顺序。 2.VB 6.0的常用方法 面向对象的程序设计语言,为程序设计人员提供了一种特殊的过程和函数,这些过程和函数就称为方法。在VB中已将一些通用的过程和函数编写好并封装起来,作为方法供用户直接调用,方便了用户的编程,提高了编程效率。因为方法是面向对象的,所以在调用时一定要用对象。对象方法的调用格式为: [对象.]方法 [参数名表] (1)Print方法 Print方法的功能是在对象上输出信息,形式为: [对象.]Print [{Spc(n)|Tab(n)}][表达式列表][;|,] 其中: 对象:可以是窗体(Form)、图形框(PictureBox)、或打印机(Printer)。省略此项时默认在窗体上输出。 Spc(n)函数:用于在输出时插入n个空格,表示两个输出之间的间隔,允许重复使用。 Tab(n)函数:用于在输出表达式列表前向右移动n列,允许重复使用。当n的值大于当前位置的值,即CurrentX的值时,重新定位在下一行的n列。 表达式列表:要输出的数值或字符串表达式,若省略,则输出一个空行,多个表达式之间用逗号、分号分隔,也可以出现Spc和Tab函数。表达式列表开始打印的位置是由对象的CurrentX和CurrentY属性决定的,默认为打印对象的左上角0,0。 分号(;):表示光标定位在上一个显示的字符后。 逗号(,):表示光标定位在下一个打印区的开始位置处,打印区每隔14列开始。无“;”或“,”表示输出后换行。在Print方法中,分号和逗号可以混合使用。 (2)Cls方法 Cls方法用于清除运行时在窗体或图形框中显示的文本或图形。形式为:   [对象.]Cls 其中:“对象”为窗体或图形框,省略时默认为窗体。例如: Picture1.Cls '清除图形框 Cls '清除窗体 Cls方法使用后,CurrentX、CurrentY属性被改为0。该方法只清除运行时在窗体或图形框中显示的文本,不清除窗体在设计时的文本和图形。 (3)Move方法 Move方法用于移动窗体或控件,并可改变其大小。形式为: [对象.]Move 左边距离[,上边距离[,宽度[,高度]]] 其中: 对象:可以是窗体及除时钟、菜单外的所有控件,省略对象时为窗体。 左边距离、上边距离、宽度、高度:是数值表达式,以twip为单位。如果对象是窗体,则左边距离和上边距离以屏幕左边界和上边界为准,否则以窗体的左边界和上边界为准,宽度和高度表示可改变其大小。 (4)SetFocus方法 该方法可将光标置于所需要的控件上,即使控件对象获得焦点,形式为: [对象.] SetFocus 其中,对象可以是TextBox、CommandBox、ListBox、CheckBox等控件。 3.VB 6.0的常用事件 事件就是发生在对象上的事情,当对象的某个方面有变动时就会触发事件。当在对象上发生了事件后,应用程序就要处理这个事件,处理的步骤就是事件过程。在VB中,系统为每个对象预先定义好了一系列的事件,常用的事件有: (1)Click单击事件 在程序运行时,当用户用鼠标单击某个对象时发生。 (2)DblClick双击事件 在程序运行时,当用户用鼠标双击某个对象时发生。 (3)Change改变事件 在程序运行时,当某个控件的内容被用户或程序代码改变时发生,此事件如何和何时发生则随控件的不同而不同。 (4)GotFocus获取焦点事件 在程序运行时,当对象获得焦点时发生该事件。 (5)LostFocus失去焦点事件 在程序运行时,当对象失去焦点时发生该事件。 (6)KeyPress键盘按下事件 在程序运行时,在键盘上按下一个键并随时释放时发生该事件。 (7)Load窗体装载事件 当窗体被装载到工作区时发生该事件。在应用程序启动时会自动执行Load事件,所以该事件通常用来在启动应用程序时对属性和变量进行初始化。 6.7.4 窗体及常用控件 1.窗体 建立一个VB应用程序的第一步就是创建用户界面。窗体是一块“画布”,是所有控件的容器,用户可以根据自己的需要利用工具箱上的控件在“画布”上设计界面。 窗体的主要属性有:Name、Caption、MaxButton(最大化按钮,其值为True时有此按钮,为False时无此按钮)、MinButton(最大化按钮,其值为True时有此按钮,为False时无此按钮)、ControlBox(控制菜单按钮,其值为True时有此按钮,为False时无此按钮)、Picture(可在窗体上加载图片)、BorderStyle等。 窗体的主要事件有:Click、DblClick、Load等。 窗体的主要方法有:Print、Cls、Move、Show(显示窗体)、Hide(隐藏窗体)、Refresh(刷新窗体)等。 当使用VB创建一个新的应用程序工程时,它会自动建立一个新的窗体,并将该窗体命名为“Form1.frm”,用户可以在空窗体上创建自己的界面。一个应用程序可以有多个窗体,通过选择“工程”菜单中的“添加窗体”命令能建立一个新的窗体。 每个窗体的详细描述都存储在一个独立的窗体文件中,其扩展名为.frm。其中的信息包括窗体的初始大小、窗体的位置和标题文字等。通常都有一些VB代码附加在窗体上,用于确定当用户对窗口的控件操作时,应用程序如何响应。例如,当用户关闭窗口时,附加在窗体上的代码就应该对输入到窗口中的数据执行必要的操作,然后移去窗口。所有与某个特定窗体有关的代码都存于该窗体文件中。 2. CommandButton(命令按钮) 在程序执行期间,常常用命令按钮来接收用户的操作信息,激发某些事件,实现一个命令的启动、中断和结束等操作。 命令按钮的主要属性有:Name、Caption、Picture 、Style(其值置为1时,按钮上可显示背景颜色或Picture属性中选择的图片)、ToolTipText(工具提示属性,程序运行中,当鼠标在控件上暂停时显示的文本)。 命令按钮的主要事件有:Click、DblClick等。 命令按钮接受用户输入的命令可以有三种方式:鼠标单击、按Tab键使焦点跳转到该按钮再按回车键、快捷键(Alt+有下划线的字母)。 3.Label(标签控件) 标签控件是用来显示文本的控件,该控件和文本框控件都是专门对文本进行处理的控件,但标签控件没有文本输入和编辑的功能,一般不需要编程。 标签控件的主要属性有:Name、Caption(文本的长度最多为1024个字符)、Font、Left、Top、BorderStyle、BackStyle、AutoSize等。 标签控件的主要事件有:Click、Dblclick、Change等。 4.TextBox(文本框控件) 文本框控件是一个文本编辑区域,用户可以在该区域输入、编辑、修改和显示正文内容,即用户可以创建一个文本编辑器。 文本框控件的主要属性有:Name、Text(其值为文本框控件内显示的内容)、MultiLine(值为True时文本框可显示或输入多行文本)、MaxLength(值为0时文本框中可容纳任意长字符串,也可用一个非零值来设置可容纳的字符个数)、Locked(值为True时文本框中的内容不可编辑)、ScrollBare(值为0时无滚动条,为1时加水平滚动条,为2时加垂直滚动条,为3时两者都加)、PassWordChar(其值可代替正在输入的字符显示,常用于输入密码时)。 文本框控件的主要事件有:GotFocus、LostFocus、KeyPress、Change等。 文本框控件的主要方法有:SetFocus等。 常用工具箱上其他控件的建立和使用方法与以上所述控件类似,请参考相关书籍,并上机试试。 6.7.5 VB 6.0基本知识 1.数据类型 数据既是程序处理的基本对象,也是程序的必要组成部分。数据类型是指数据的内在表现形式。VB根据数据的不同性质和用途将其分为不同的数据类型。各种数据类型具有不同的存储长度、取值范围和允许的操作。表6-1列出了VB的部分数据类型。 2.变量和常量 常量是指在程序运行过程中其值不能被改变的量。VB中有三种常量:直接常量、用户声明的符号常量和系统提供的系统常量。 变量是指在程序运行过程中其值可以被改变的量。变量有两个特性:名字和数据类型。变量的名字用于在程序中标识变量和使用变量的值,数据类型则确定了变量中可以保存哪种数据。当新的数据存放到变量中时,原来的数据就不再存在,即变量中的值是在动态变化的。变量在使用前一般需要先声明变量名和数据类型,以决定系统为它分配的存储单元。在VB中是用Dim语句来声明变量的,形式为: Dim 变量名 [As 类型] 变量的命名规则为:以字母或汉字开头,由字母、汉字、数字、下划线组成,长度小于等于255个字符。 表6-1 VB的数据类型 数据类型 类型符 前缀 占字节数 数据表示范围  Byte(字节型) 无 byt 1 0~255  Boolean(逻辑型) 无 bln 2 True与False  Integer(整型) % int 2 -32768~32767  Long(长整型) & lng 4 -2147483648~2147483647  Single(单精度型) ! sng 4 负值:-3.402823E38~-1.401298E-45 正值:1.401298E-45~3.402823E38  Double(双精度型) # dbl 8 负值:-1.79769313486232D308~ -4.94065645841247D-324 正值: 4.94065645841247D-324~ 1.79769313486232D308  Currency(货币型) @ cur 8 -922337203685477.5808~ 922337203685477.5807  Date(日期型) 无 dtm 8 0101100~12319999  String(字符串型) $ str 与串长有关 0~65535个字符  Variant(变体型) 无 vnt 不定 根据实际类型而定  表6-2 算术运算符及优先级 运算符 功能 优先级 表达式例子 结果  ^ 乘方 1 A^X 25  - 负号 2 -A -5  * 乘 3 A*X 10  / 除 3 10/3 3.3333333333333  \ 整除 4 A\X 2  Mod 取模 5 10 Mod X 0  + 加 6 A+X 7  - 减 6 A-X 3  表6-3 部分关系运算符及优先级 运算符 功能 表达式例子 结果  = 等于 “Visual” = “Visl” False  > 大于 “Visual” >“Visl” True  >= 大于等于 “xyz”>= “变量” False  < 小于 45<67 True  <= 小于等于 “23” <= “3” True  <> 不等于 “xyz”<> “XYZ” True  3.运算符与表达式 运算符是用来表示某种运算的符号。VB中的运算符可分为算术运算符、字符串运算符、关系运算符和逻辑运算符。表达式是用运算符和园括号将常量、变量、函数等运算对象连接起来的符合VB语法规则的式子。表达式有算术表达式、字符串表达式、关系表达式和逻辑表达式。表达式通过运算后有一个结果,运算结果的类型由数据和运算符共同决定。 每种类型的运算符都有一组控制运算执行顺序的规则,这些规则就是运算符的优先级。当一个表达式中包含多种运算符时,运算的优先顺序为:算术运算符、字符运算符、关系运算符、逻辑运算符,同级运算从左到右,括号优先。 算术运算符及优先级如表6-2所示,算术表达式的值为一个数值。 部分关系运算符及优先级如表6-3所示,关系表达式的值为True(真)或False(假)。 部分逻辑运算符及优先级如表6-4所示,逻辑表达式的值为True或False。 字符串运算符有两个:“&”和“+”,功能都是将两个字符串连接起来,优先级一样。 表6-4 部分逻辑运算符及优先级 运算符 功能 优先级 说明 表达式例子 结果  Not 取反 1 当运算对象为假时结果为真 当运算对象为真时结果为假 Not F Not T True False  And 与 2 两个运算对象均为真时结果为真,否则为假 T And T T And F F And T F And F True False False False  Or 或 3 两个运算对象均为假时结果为假,否则为真 T Or T T Or F F Or T F Or F True True True False  4.分支结构 (1)If双分支结构 If 条件 Then  语句块1     Else 语句块2 End if 执行过程:若条件的值为逻辑?True),则执行Then后的语句块1;若条件的值为逻辑假(False),则执行Else后的语句块2。 结构中的“条件”可以是算术表达式、关系表达式和逻辑表达式,表达式的值为非零时条件是真,为零时条件是假 。 (2)If多分支结构 If 条件1 Then    语句块1     ElseIf 条件2 Then 语句块2 …     [Else 语句块n+1 ] End if 执行过程:依次判断各条件的值,一旦哪个条件的值为真(True),则执行该条件后的语句块。当所有条件的值都为假(False)时,则执行Else后的语句块。 (3)select多分支结构 Select Case 变量或表达式   ?Case 表达式列表1          语句块1 Case 表达式列表2          语句块2 …     [Case Else          语句块n+1] End Select 执行过程:拿“变量或表达式”的结果与“表达式列表i”的值比较,当“变量或表达式”的结果与“表达式列表i”中某个列表的值相匹配时,就执行该Case后的语句块。当“变量或表达式”的结果与“表达式列表i”的任何一个列表都不匹配时,执行Case Else后的语句块。 结构中的“变量或表达式”可以是数值型或字符串表达式。 结构中的“表达式列表i”必须与“变量或表达式”的类型相同,可以是所列出的四种形式之一:表达式、一组用逗号分隔的枚举值、表达式1 To 表达式2、Is关系表达式。表达式是与某个值比较,其他三种形式与设定值的范围比较,四种形式可以在数据类型相同的情况下混合使用。例如: Case "a"To "z" ' 表示测试表达式的值在小写字母a~z范围内 Case 1 to 10        ' 表示测试表达式的值在1~10范围内 Case "a","e","i","o","u"   ' 表示元音字母 Case 2,4,6,8,Is>10    ' 表示测试表达式的值为2,4,6,8或大于10 5.循环结构 (1)For循环结构 For 循环变量=初值 To 终值 [Step 步匠     语句块     [Exit For] '强制退出循环 语句块 Next 循环变量 执行过程如图6-17所示。 (2)Do循环结构 Do[{While|Until} 条件] 语句块      [Exit Do] '强制退出循环 语句块 Loop 执行过程如图6-18所示。 关键字While用于指明条件为真时执行循环体一次;关键字Until用于指明条件为假时执行循环体一次。此循环的语句块中必须包含修改条件的语句。 图6-17 图6-18 6.赋值语句 赋值语句是程序中最常用的语句,其功能是先计算出赋值号右边表达式的值,再将值赋给赋值号左边的变量。赋值语句的形式为:   变量名=表达式 表达式只能出现在赋值号的右边,它可以是任何数据类型的,但一般与变量名的类型一致。当表达式的值的数据类型与变量的数据类型不同时,VB将按以下方法处理: ⑴当表达式的数值与变量精度不同时,强制转换成赋值号左边变量的精度。例如: a%=7.7 '变量a为整型,表达式的值四舍五入后再赋给a,结果为8 x!=6.28315248# '变量x为单精度型,结果为6.283152,有效位降低到7位 ⑵当把字符串赋给数值型变量时,会将字符串自动转换成数值型再赋值,但当字符串中包含非数字字符或是一个空串,则出错。例如: a%=”314” '变量a中的结果为314 a%=”31x4” '出现“类型不匹配”错 a%=””    '出现“类型不匹配”错 ⑶当把逻辑型值赋给数值型变量时,True转换为-1,False转换为0;当把数值型值赋给逻辑型变量时,非0转换成True,0转换成False。例如: Dim blnX As Boolean '声明变量blnX为逻辑型 blnX=5 '变量blnX中的结果为True ⑷任何非字符类型的数据赋给字符型变量时,自动转换为字符型。 7.InputBox函数 InputBox函数是VB与用户之间直接进行交互的函数。函数形式为: InputBox(提示[,标题][,默认][,x坐标位置][,y坐标位置]) 该函数的功能是在屏幕上打开一个对话框,等待用户输入内容,当用户单击“确定”按钮或按回车键时,函数返回输入的值,其值的类型为字符串。例如,要用InputBox函数给变量Name赋值,可用下面的赋值语句: Name=InputBox("请输入你的姓名", "输入框", "张三", 200, 200)  图6-19 用InputBox函数显示的输入对话框 该语句执行后,将出现图6-19所示的输入数据对话框。 InputBox函数中各项参数的含义如下: (1)提示:不能省略此项,它是一个字符串或字符串表达式,其值在对话框中作为信息显示,可为汉字,长度不超过1024个字节,作用是提示用户输入。若要在多行上显示信息,必须在每行行末加回车Chr(13)和换行Chr(10)。 (2)标题:字符串或字符串表达式,在对话框的标题区(对话框顶部)显示。若省略此项,则把应用程序名放入标题栏中。 (3)默认:字符串或字符串表达式,用来显示输入的默认信息。 (4)x坐标位置、y坐标位置:整型表达式,坐标确定对话框左上角在屏幕上的位置,屏幕左上角为坐标原点,单位为twip。这两个参数或者全部给出,或者全部省略。如果省略,则对话框显示在屏幕的中心线向下约1/3处。 8.MsgBox函数 MsgBox函数是VB与用户之间直接进行交互的函数。函数形式为: 变量[%]=MsgBox(提示[,按钮][,标题]) MsgBox的功能是在屏幕上打开一个信息框,等待用户选择一个按钮。MsgBox函数返回所选按钮的整数值,其数值的含义见表6-5。例如: tt=MsgBox("输入有错,请重输!", 2 + 48, "错误提示") 该语句执行后的界面如图6-20所示。  图6-20 用MsgBox函数显示的输出对话框 MsgBox函数中各项参数的含义如下: (1)“提示”的含义与InputBox函数的相同。 (2)“标题”的含义与InputBox函数的相同。 (3)按钮:整型表达式,决定信息框按钮的数目和类型及出现在信息框上的图标类型,其设置见表6-6,该参数的值由表中的4组数值组合而成。 表6-5 MsgBox函数返回值的含义 内部函数 返回值 被单击的按钮  VbOk 1 确定  VbCancel 2 取消  VbAbort 3 终止  VbRetry 4 重试  VbIgnore 5 忽略  vbYes 6 是  vbNo 7 否  表6-6 按钮设置值及含义 分组 内部常数 按钮值 说明  按钮数目 VbOkOnly VbOkCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel 0 1 2 3 4 5 显示“确定”按钮 显示“确定”、“取消”按钮 显示“终止”、“重试”、“忽略”按钮 显示“是”、“否”、“取消”按钮 显示“是”、“否””按钮 显示“重试”、“取消”按钮  图标 类型 VbCritical VbQuestion VbExclamation VbInformation 16 32 48 64 关键信息图标 红色STOP标志 询问信息图标 ? 警告信息图标 ! 信息图标   i  默认按钮 VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 0 256 512 768 第1个按钮为默认按钮 第2个按钮为默认按钮 第3个按钮为默认按钮 第4个按钮为默认按钮  模式 VbApplicationModal VbSystemModal 0 4096 应用模式 系统模式  9.数组 数组就是一些具有相同数据类型的数据的有序集合。数组中每一个成员称为数组的一个元素,它们都有相同的变量名及不同的序号(下标),只有一个下标的数组被称为一维数组,有两个下标的数组被称为二维数组。数组元素如同其它标准类型变量一样可以被赋值或在表达式中使用。声明数组的形式为: Dim 数组名(下标1[,下标2… ])[As 类型] 如下面的定义语句: Dim a(4) As Integer  表示声明了一个具有5 个元素的一维数组,数组中每个元素的数据类型是整型,数组名为a,下标范围为0~4。a数组的五个元素分别是a(0),a(1),a(2),a(3),a(4)。声明数组就是在内存为数组分配一个连续的区域,所以数组元素在内存中是顺序存放的,数组名是这个区域的名称。 6.7.6 VB程序设计实例 1.在VB中创建应用程序的一般步骤 (1)建立应用程序界面。即新建各个窗体,并在窗体上创建各个控件对象。 (2)调整控件大小、位置和锁定控件。 (3)设置对象的属性,包括窗体本身的属性。每个刚建立的对象都有自己的默认属性,但它们不一定符合应用程序的要求,因此,需要在属性窗口中或在程序代码中修改某些对象的一些属性值。 (4)编写事件过程代码。选择需要编程的对象,双击该对象进入代码编辑器窗口,编写事件过程代码。 (5)保存工程。使用“文件”菜单中的“工程保存”命令,或者单击工具栏上的“保存”按钮,系统就会提示保存所有内容,保存类型可为类模块文件、标准模块文件、窗体文件和工程文件等。 (6)运行、调试程序。选择“运行”菜单中的“启动”命令、按F5键或单击工具栏上的“运行”按钮,则进入运行模式。若程序代码有错,则出现错误信息提示框。单击“调试”按钮,进入中断工作模式,此时出现代码窗口,光标停在有错误的行上,并用黄色显示错误行。修改其中错误后再次运行程序,一直修改到没有错误为止。 (7)停止运行程序。选择“运行”菜单中的“结束”命令或单击工具栏上的“结束”按钮,可停止程序的运行,返回设计模式。 2.程序设计实例 例6-2 从键盘输入年、月、日三个数字,判断该年是否为闰年,并根据月份来判断是什么季节和该月有多少天,根据日来判断是星期几。窗体界面如图6-21(a)所示,程序运行结果如图6-21(b)所示。 (a) (b) 图6-21 窗体界面 程序设计过程: (1)执行“文件”菜单中的“新建工程”命令新建一个工程。 (2)利用工具箱在窗体上建三个文本框控件Text1、Text2、Text3,用于输入数据年、月、日。 (3)利用工具箱在窗体上建六个标签控件Label1、Label2、Label3、Label4、Label5、Label6。其中:Label1、Label2、Label3(在文本框的右边)用于显示判断结果;Label4、Label5、Label6(在文本框的左边)用于显示提示内容。 (4)利用工具箱在窗体上建两个命令按钮控件Command1、Command2。 (5)选中窗体上的每一个控件,在属性窗口中依次为他们设置表6-7所示的属性值。 表6-7 控件属性值 控件名称 属性 属性值 控件名称 属性 属性值  Form1 Caption 日期判断 Label2 Caption 空白  Command1 Caption 开始  BorderStyle 1  Command2 Caption 清除 Label3 Caption 空白  Text1 Text 空白  BorderStyle 1  Text2 Text 空白 Label4 Caption 输入年份:  Text3 Text 空白 Label5 Caption 输入月份:  Label1 Caption 空白 Label6 Caption 输入日:   BorderStyle 1     (6)双击窗体上的命令按钮Command1进入代码编辑窗口,然后输入以下程序。 Rem Command1_Click()事件完成各种判断任务 Private Sub Command1_Click() Dim yy As Integer, mm As Integer, dd As Integer Dim leapyear As Boolean yy=Val(Text1.Text) mm=Val(Text2.Text) dd=Val(Text3.Text) Rem 判断闰年 If (yy Mod 4=0 And yy Mod 00<>0) Or (yy Mod 400=0) Then leapyear=True Label1.Caption="闰年" Else leapyear=False Label1.Caption="不是闰年" End If Rem 判断季节 Select Case mm        Case 3 To 5          Label2.Caption="春季"        Case 6 To 8          Label2.Caption="夏季" Case 9 To 11          Label2.Caption="秋季"       Case 12,1,2          Label2.Caption="冬季" End Select Rem 判断月中天数 Select Case mm Case 1,3,5,7,8,10,12 Label2.Caption=Label2.Caption+"(31天)" Case 4,6,5,9,11          Label2.Caption=Label2.Caption+"(30天)" Case 2          If leapyear Then             days="(29天)"           Else              days="(28天)"           End If Label2.Caption=Label2.Caption+days End Select Rem 判断星期几 ddd$=Str$(yy) & "," & Str$(mm) & "," & Str$(dd) Label3.Caption=WeekdayName(Weekday(ddd$)) End Sub Rem Command2_Click()事件完成清除任务 Private Sub Command2_Click() Text1.Text="" Text2.Text="" Text3.Text="" Label1.Caption="" Label2.Caption="" Label3.Caption="" End Sub Rem Form_Load()事件用于进行程序运行说明 Private Sub Form_Load() Dim char As String char="请先输入数据年、月、日"+Chr(13)+Chr(10)+"再单击开始按钮" MsgBox$ char,64+0,"程序运行说明" End Sub (7)运行并调试程序,当程序能正确运行并得到正确的运行结果时,保存工程和窗体。 例6-3 设计一个简易的计算器。窗体界面如图6-22(a)所示,程序运行结果如图6-22(b)、(c)所示。 程序设计过程: (1)执行“文件”菜单中的“新建工程”命令新建一个工程。 (2)在窗体上建一个命令按钮Command1, 右击该控件,在弹出的快捷菜单中选择“复制”命令,再右击窗体空白处,在弹出的快捷菜单中选择“粘贴”命令,这时系统会弹出一个对话框提示:“已经有一个控件‘Command1’,创建一个控件数组吗?”。单击“是”按钮,就建立了一个控件数组元素,这时系统自动将第一个控件元素的Index属性设置为0,而将复制得到的第二个控件元素的Index属性设置为1,继续进行下去,经过若干次“粘贴”操作,就可建立所需的命令按钮控件数组元素(共16个元素)。  (a) (b) (c) 图6-22 创疤褰缑?(3)在窗体上建一个命令按钮Command2,用来清除文本框Text1中的内容。 (4)在窗体上建一个文本框Text1,用来显示输入的数据、题目及结果。 (5)选中窗体上的每一个控件,在属性窗口中依次为他们设置表6-8所示的属性值。 表6-8 控件属性值 控件名称 属性 属性值 控件名称 属性 属性值  Form1 Caption 计算器 Command1 Caption 9  Command2 Caption C  Index 8  Command1 Caption 1 Command1 Caption 0   Index 0  Index 9  Command1 Caption 2 Command1 Caption +   Index 1  Index 10  Command1 Caption 3 Command1 Caption -   Index 2  Index 11  Command1 Caption 4 Command1 Caption *   Index 3  Index 12  Command1 Caption 5 Command1 Caption /   Index 4  Index 13  Command1 Caption 6 Command1 Caption =   Index 5  Index 14  Command1 Caption 7 Command1 Caption .   Index 6  Index 15  Command1 Caption 8 Text1 Text 空白   Index 7     (6)双击窗体进入代码编辑窗口,然后输入以下程序。 Dim op As String '变量op中放运算符 Dim v2 As String '变量v2存放要计算的第二个操作数 Dim v1 As Single '变量v1存放要计算的第一个操作数 Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 To 8 '将按钮1~9对应的数值连接到v1或v2中 If op="" Then Text1.Text=Text1.Text+Trim(Str(Index+1)) V1=Val(Text1.Text) Else v2=v2+Trim(Str(Index+1)) Text1.Text=Text1.Text+Trim(Str(Index+1)) End If Case 9 '将按钮0对应的数值连接到v1或v2中 If op="" Then Text1.Text=Text1.Text+"0" V1=Val(Text1.Text) Else v2=v2+"0" Text1.Text=Text1.Text+"0" End If Case 15 '将按钮.对应的小数点连接到v1或v2中 If op="" Then Text1.Text=Text1.Text+"." V1=Val(Text1.Text) Else v2=v2+"." Text1.Text=Text1.Text+"." End If Case 10 '将按钮+对应的运算符加号送给变量op op="+" Text1.Text=Text1.Text+op Case 11 '将按钮-对应的运算符减号送给变量op op="-" Text1.Text=Text1.Text+op Case 12 '将按钮*对应的运算符乘号送给变量op op="×" Text1.Text=Text1.Text+op Case 13 '将按钮/对应的运算符除号送给变量op op="/" Text1.Text=Text1.Text+op Case 14 '单击按钮=时进行运算并在Text1中显示结果 If op<>"" Then Select Case op Case "+" Text1.Text=Left$(Str$(v1+v2),14) Case "-" Text1.Text=Left$(Str$(v1-v2),14) Case "×" Text1.Text=Left$(Str$(v1*v2),14) Case "/" Text1.Text=Left$(Str$(v1/v2),14) End Select op="" v2="" v1=Val(Text1.Text) End If End Select End Sub Rem 单击按钮c时驱动Command2_Click()事件 Private Sub Command2_Click() Call Form_Load '调用事件过程Form_Load End Sub Rem 变量初始化 Private Sub Form_Load() op="" v2="" v1=0 Text1.Text="" End Sub (7)运行并调试程序,当程序能正确运行并得到正确的运行结果时,保存工程和窗体。 3.程序调试 程序调试是自己寻找和排错的过程。调试过程通常包括三个步骤:发现错误、分离错误、校正错误,这一过程将贯穿于从编程阶段到运行阶段。程序中出现的错误可以分为三类:编译错误、运行错误和逻辑错误。 编译错误是由结构不正确的代码造成的。如键入了一个拼写错误的关键字,遗漏了某个必需的标点符号,或在循环结构中使用了For而丢失了Next等。这类错误编译系统会做出提示,指出错误所诘男泻牛员阍诘魇允奔笆狈⑾植⒏恼?程序运行时,当一条语句试图执行一个不可能执行的操作时,会发生运行错误。最常见的运行错误是除数为0错误。如程序中含有a=b/c这样的语句,如果在程序运行时变量c的值为0,则该除法是一个无效的运算,而语句本身是正确的,并且当c不为0时也能得到正确的运算结果。运行错误只有在程序运行时才会发现。 当应用程序没有按预定的方式运行,则发生了逻辑错误。一个应用程序在语法上代码有效,运行时无任何无效的操作,即未发生编译错误和运行错误,但得不到正确的运行结果。如在编写计算球的体积的程序中,若将体积公式写成4/3*3.14*r*r(正确的公式是4/3*3.14*r*r*r),编译系统在编译时不能查出这类错误。这类错误具有更大的隐蔽性,因此排除难度较大。 VB 6.0提供了一些程序调试手段,可通过执行“调试”菜单中的相应命令来完成。 习题六 简答题: 1.程序语言分为哪三类?高级语言有什么特点? 2.计算机能直接执行高级语言编写的源程序吗?简述编译型高级语言源程序的执行过程? 3.程序的三种基本结构是什么? 4.什么是软件工程?软件工程研究的内容是什么? 5.VB 6.0有什么特点? 6.VB 6.0集成开发环境窗口包含哪些内容? 7.简述创建应用程序的一般步骤?8. 程序中出现的错误有哪些?