1、VISUAL C+ 程序设计基础,第一章 软件设计概论,第五章 类与对象,第四章 函数,第三章 结构化程序设计,第二章 C+基础知识,第十章 异常处理,第九章 输入/输出流类库,第八章 继承与多态,第七章 动态内存分配,第六章 指针与数组,第十一章 标准模板类库(STL),附 录,目 录,第一章 软件设计概述,软件设计是一个将人类思维物化为计算机思维的过程,通过这个过程计算机获得一定程度的独立加工甚至思维的能力,从而将人类思维推向更高层次。关于软件设计的概念和方法的研究是随着计算机应用的深入和所处理问题的复杂化而不断加深的。本章将就软件设计的相关概念和程序设计方法的演化发展作一简要介绍。,1.
2、1 软件与软件危机,1.2 软 件 工 程,1.3 程序设计方法,1.6 一个简单的C+程序,1.5 C语言和面向对象的C+,1.4 算法的设计与分析,第一章 软件设计概述,1.1 软件与软件危机,什么是软件,什么是软件危机,软件 程序,软件危机首次爆发于二十世纪六十年代。在大型程序设计中,人们发现投入大量的人力、物力、时间开发出的软件,其成本、效率、质量等方面却处于失控状态,尤其软件维护异常困难。程序的修改扩充往往需要大量重复性投入。,1.1 软件与软件危机,软件危机产生的原因主要有三个:,2 软件是一种逻辑产品而非物理产品,软件的开发过程本质上是人的思考过程。,3 人的智力在面对越来越复杂
3、的问题时,处理问题的效率会越来越低。,1 软件开发者不熟悉用户问题的领域,或没有理解用户需求,软件产品与要求不一致。,1.2 软件工程,软件危机的 出现迫使人们重新认识软件和软件开发过程。 大型软件开发也应该借鉴建筑、机械等行业的发展过程,由“手工方式”向“工程化”方向发展。1968年在北大西洋公约组织(NATO)的年会上首次提出软件工程的概念,此后又逐步提出软件生命期的概念。,1.2 软件工程,软件工程的提出和软件的定义,软件是程序、方法、规则、相关文档以及在计算机上运行所必需的数据的集合。而软件工程是开发、运行、维护软件的系统方法。,软件生命期,软件生命期指从开始研制到废弃不用的整个期间,
4、可划分为五个阶段:需求分析、设计、编程、测试和运行维护。,软件的质量标准,正确性 健壮性 可维护性 可用性 可重用性 效率等,1.2 软件工程,正确性软件的正确性指的是软件系统在正常条件下能够正确工作,完成规定功能。这是软件的首要指标。 例如,要求设计程序,输入一批数据,计算它们的累加和。在这里,正确性就是正确能正确计算累加和。,1.2 软件工程,健壮性 软件的健壮性指的是在意外情况下(如输入数据不合理或某些硬件故障),软件系统仍能适当地工作,并对意外情况进行适当处理,而不致于导致错误结果甚至系统的瘫痪或死机。 例如,要求设计程序,根据输入的三边a、b、c的长度判别三角形类型。现有如下设计思想
5、:若a、b、c中只有两个量相等,则为等腰三角形,若三个量均相等,则为等边三角形,否则为一般三角形。如果输入为(-2,-2,-2)时,程序输出为:等边三角形。这个结果显然是错误的。这是由于程序对不合理数据不能进行适当处理,我们就说这个程序的健壮性不好。,1.2 软件工程,可维护性 软件的维护包括发现并改正软件的错误,以及由于软件运行环境发生变化或软件功能扩充而对软件进行的改动。 软件的可维护性指的是软件容易维护的程度。一般地说,软件的可读性好,容易理解,维护起来也就比较容易。因此可读性是可维护性的基础。,1.3 程序设计方法,1.3.1 传统的结构化程序设计SP(Structured Progr
6、amming),1.3.2 面向对象的程序设计OOP(Object Oriented Programming),1.3.1 传统的结构化程序设计,传统的程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。这种设计方法的着眼点是面向过程的,特点是数据与程序分离,即数据与数据处理分离。 结构化程序设计的基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。,1.3.1 传统的结构化程序设计,1.3.1 传统的结构化程序设计,举一个简单的例子,要求读入一组整数,统计其中正整数和负整数的个数。 该任务的模块结构及细化过程如下:,1.3.1 传统的结构化程序设计,
7、结构化程序设计为处理复杂问题提供了有力手段,但到80年代末,这种设计方法逐渐暴露出以下缺陷: (1)难以适应大型软件的设计。 (2)程序可重用性差。,1.3.2 面向对象的程序设计,为什么要引入面向对象的设计方法,面向对象的设计方法与面向过程的设计方法有什么关系,1.3.2 面向对象的程序设计,面向过程程序设计缺点的根源在于数据与数据处理分离。 面向对象程序设计模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体对象(object),同类对象还可抽象出共性,形成类(class )。一个类中的数据通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口
8、。对象之间通过消息(message)进行通讯。,1.3.2 面向对象的程序设计,1 基 本 概 念,3 “面向对象”程序设计的特点,2 面向对象的软件开发方法,基 本 概 念,对 象(object),类(class),消 息(message),1 基 本 概 念,调节旋钮,对 象,1 基 本 概 念,是一个抽象的概念,用来描述某一类对象所共有的、本质的属性和类行为。,类,基 本 概 念,我们把对象之间产生相互作用所传递的信息称做消息。,消 息,启 动,转 向,面向对象的软件开发方法,面向对象软件开发的根本合理性在于它符合客观世界的组成方式和大脑的思维方式。 在大型程序开发过程中,编码只是其中很
9、小一部分,应当采用工程化的方法,并将面向对象的思想贯穿于软件开发全过程,这就是面向对象的软件工程。 面相对象的软件工程同样遵循分层抽象、逐步细化的原则。软件开发过程包括以下五个阶段:,面向对象的软件开发方法,测试的任务在于发现并改正程序中的错误。,分析阶段的主要任务是按照面向对象的概念和方法,从问题中识别出有意义的对象,以及对象的属性、行为和对象间的通信,进而抽象出类结构,最终将它们描述出来,形成一个需求模型。,设计阶段从需求模型出发,分别进行类的设计和应用程序的设计。,编程阶段实现由设计表示到面向对象程序设计语言描述的转换。,“面向对象”程序设计的特点,封装性,(2) 继承与派生性,(3)
10、多态性,3 “面向对象”程序设计的特点,封装性,对象是一个封装体,在其中封装了该对象的属性和操作。通过限制对属性和操作的访问权限,可以将属性“隐藏”在对象内部,对外提供一定的接口,在对象之外只能通过接口对对象进行操作。,C+通过建立数据类型类来支持封装和数据隐藏。封装性增加了对象的独立性,从而保证了数据的可靠性。一个定义完好的类可以作为独立模块使用。,3 “面向对象”程序设计的特点,继承与派生,以汽车为例看客观世界描述事物的方式:,当定义了一个类后,又需定义一个新类,这个新类与原来的类相比,只是增加或修改了部分属性和操作,这时可以用原来的类派生出新类,新类中只需描述自己所特有的属性和操作。,面
11、向对象程序设计提供了类似的机制:,继承性大大简化了对问题的描述,大大提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率。,新类称为子类或派生类,原来的类称为基类。派生可以一直进行下去,形成一个派生树。,“面向对象”程序设计的特点,语文、数学、英语、政治、物理、化学、生物,多态性,多态性指,同一个消息被不同对象接收时,产生不同结果,即实现同一接口,不同方法。,高中生,计 算平均成绩,大学生,高数、英语、计算机、线性代数,“面向对象”程序设计的特点,继承和多态性组合,可以生成很多相似但又独一无二的对象。继承性使得这些对象可以共享许多相似特性,而多态又使同一个操作对不同对象产生不同表现形式。
12、这样不仅提高了程序设计的灵活性,而且减轻了分别设计的负担。,1.4 算法的设计与分析,1.4.1 算 法 的 概 念,1.4.3 常 用 算 法 介 绍,1.4.2 算 法 的 表 示,1.4.1 算 法 的 概 念,通俗地说,算法就是解决问题的步骤。 算法是程序设计学习的重点。 用计算机解决问题的算法应具有以下特征:可执行性确定性有穷性可输入输出信息,1.4.2算法的表示及三种基本结构,3 循 环 结 构,1 顺 序 结 构,2 分 支 结 构,num115;,1.4.2算法的表示及三种基本结构,(1) 顺序结构,【例11】 求两数之和。,显示结果:35,num220;,sumnum1+nu
13、m2;,演示算法执行过程,输出sum;,1.4.2算法的表示及三种基本结构,(2) 分支结构,【例12】 输入三个数,输出其中的最大数。,x7;,y12;,z10;,if(xy) maxx; else max y;,if (zmax) maxz;,输出max;,显示结果:12,演示算法执行过程,1.4.2算法的表示及三种基本结构,【例13】求4个整数的和。,显示结果:59,演示算法执行过程,12,3,14,26,2,16,42,1,18,60,0,count4; /整数个数 sum0; /累加和的初值 while (count0) x输入一个整数;sumsum+x; countcount-1;
14、 输出sum;,1.4.3 常用算法介绍,1. 直接法,2.枚举法,3.递推法,解决的问题的种类与复杂程度各不相同决定了算法的多样性,但从其思想方法上可以将其归为以下几种:直接法、枚举法、递推法、递归法、回溯法等等。本节 将介绍以下三种:,1.4.3 常用算法介绍,1 直接法,直接法就是根据问题给出的条件直接求解,前面的很多例子都是这种算法的运用。这里不再举例。,1.4.3 常用算法介绍,2 枚举法,枚举法也称穷举法,基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。 枚举法适合求解的问题是:问题可能的答案是有限个且答案是可知的,但又难以用解析法描述。这种算法通常需要用循环结构
15、来完成。,请看下例:,【例14】 给定一个正整数,判断其非负整数立方根是否存在,若存在,输出该立方根。,1.4.3 常用算法介绍,算法如下:,分析:设某正整数为27,则非负整数立方根的取值范围为127,因此可在这一范围内对所有整数进行检测,满足立方根为27的就是所求整数。,【例14】求非负整数立方根算法:,1.4.3 常用算法介绍,27,1,显示结果:3,演示算法执行过程,比较,c*c*c,2,比较,c*c*c,3,比较,c*c*c,num27; cube_root1;/立方根初值 while (cube_rootnum) 输出 “无整数立方根”;,1.4.3 常用算法介绍,【例15】 判断一
16、个正整数是否素数,给出相应结果。,分析:假设正整数num, 如果num不是2,需要检测它是否含有除1和它本身之外的其他因子,如果有,就不是素数。检测方法是在2num-1范围内逐个验证。实际上可以证明在2 num平方根范围内逐个验证即可。,假定num为9,算法如下:,1.4.3 常用算法介绍,【例15】 判断9是否素数算法,9,2,3,显示结果:不是素数,演示算法执行过程,比较,求余,为0,比较,求余,不为0,3,为0,比较,求余,num9; if (num=2) 输出 “是素数”; else i2; ksqrt(num); /平方根取整while (ik)输出 “是素数”; else 输出 “
17、不是素数”;,1.4.3 常用算法介绍,3.递推法,递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出其他解,如数列问题以及一些近似计算问题等。通常也要借助于循环。,请看下例:,1.4.3 常用算法介绍,【例1】 求n!,分析:n!=123n,因此可以从1开 始,由1!乘以2得到2!,再乘以3得到3!,以此推出n!。,假定n4,算法如下:,1.4.3 常用算法介绍,【例1】 求n!算法:,显示结果:24,演示算法执行过程,1,2,4,比较,2,3,比较,6,4,比较,24,比较,5,factorial1; /阶乘初值 i2; n 4; while (i=n) factorialfac
18、torial*i ; ii+1; 输出 factorial;,1.5 C语言与面向对象的C,C语言是七十年代初贝尔实验室的Dennis Richie 等人在B语言基础上开发出来的。C最初是作为UNIX操作系统的开发语言为人们所认识。七十年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步脱离UNIX系统成为一种独立的程序设计语言。C 语言版本很多,为了让开发出来的代码能够在多种平台上运行,1988年美国国家标准协会ANSI对C语言进行了标准化,产生了ANSI C。,1.5 C语言与面向对象的C,(1)C语言既具备高级语言的结构和编程环境,又提供类似于汇编语言那样的系统资源操纵
19、能力及程序执行效率。适合解决有实时要求的问题。,C语言的主要特点:,(2)有丰富的运算符和数据类型,表达式类型多样化,可以方便地实现在其他语言中较难实现的运算,对各种不同类型的程序设计都有良好的适应性。,(3)以函数为基础实现程序的结构化设计,支持大型程序的多文件构成及单个文件独立编译,适合大型复杂程序的设计。,(4)语言简洁、紧凑,使用方便、灵活,书写形式自由。,(5)可移植性好。,1.5 C语言与面向对象的C,C+是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C+继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。,C+支持面向对象程序设计,通过类
20、和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。,此外,在一致性(Consistency)检查机制方面也作了加强,提高了软件开发的效率和质量。,1.5 C语言与面向对象的C,C+与C完全兼容,很多用C编写的库函数和应用程序都可以为C+所用。,但正是由于与C兼容,使得C+不是纯正的面向对象的语言,它既支持面向对象程序设计,也支持面向过程设计。但我们应当注意用面向对象的思想进行设计,以发挥出C+的优势。,C+有许多版本,国内较为流行的有Microsoft公司的Visual C+。,1.6 一个简单的C+程序,# include max(int i, int j) /Aif (i=j) return i; else return j; void main(void) /Bcoutij; /从键盘上输入变量值coutmax number is:max(i, j) n ; /输出提示和结果 ,【例18】 一个简单的C+程序。,程序组成:,注释,编译预处理指令,程序体,由若干函数组成,其中有且仅有一个主函数main(),这是程序的执行入口。在Windows编程中定义为winmain()。,下面进入VC+ 运行,