1、C+程序设计第一章 面向对象程序设计绪论 1.1 什么是面向对象程序设计1.2 对象和类 1.3 数据的抽象和封装 1.4 继承性 1.5 多态性1.6 面向对象程序设计语言 关于课程n目标n进一步学会面向过程编程n理解面向对象思想n以对象的方式思考n熟悉C+(P)n利用 C+编程n在本课程中:nC+是一个学习面向对象概念的工具n运用面向对象模式进行程序设计n采用面向对象方法的效果(OOA/OOD)n可维护性n可扩展性n可靠性如何实现课程目标n阅读和记忆n阅读书籍,记住语言特点n思考n以对象和类的方式思考n实践n多编程参考课本nC+程序设计教程(钱能),清华大学出版社nC+程序设计教程,H.M
2、.Deitel,nP.J.Deitel著,机械工业出版社n C+大学教程(第二版),Harveay M.Deitel著,电子工业出版社 nC+Primer(第三版),Stanley B.lippmannJosee Lajoie著,中国电力出版社nC+编程思想(Thinking in C+),Bruce Eckel著,机械工业出版社1 1 从从C C语言到语言到C+C+语言语言C语言以其如下独有的特点风靡了全世界:(1)语言简洁、紧凑,使用方便、灵活。C语言只有32个关键字,程序书写形式自由。(2)丰富的运算符和数据类型。(3)可以直接访问内存地址,能进行位操作,使其能够胜任开发操作系统的工作。
3、(4)生成的目标代码质量高,程序运行效率高。(5)可移植性好。n局限性:(1)数据类型检查机制相对较弱,这使得程序中的一些错误不能在编译阶段被发现。(2)C本身几乎没有支持代码重用的语言结构,因此一个程序员精心设计的程序,很难为其它程序所用。(3)当程序的规模达到一定程度时,程序员很难控制程序的复杂性。发展n1980年,贝尔实验室的Bjarne Stroustrup开始对C进行改进和扩充。n1983年正式命名为C+。n在经历了3次C+修订后,1994年制定了ANSI C+标准的草案。以后又经过不断完善,成为目前的C+。nC+仍在不断发展中。美国微软公司现已推出C#(C Sharp)语言,来代替
4、C+语言。C+程序设计A Rich HistoryMS-DOSBASICWindowsVisual BASICIE,IISVisual Studio1995Internet1990GUI1981PC2002XMLWeb Services编译器nVC+6.0n或其它(Turbor C 3.0,Borland C+)有关面向对象编程的网站www.soft- 编程简介内容n方法学n编程技术n面向对象语言1.方法学思考问题的方法n归纳n从特殊到一般n从不同的 dogs 到词汇“dog”Dog思考问题的方法n演绎n从一般到特殊n从词汇“dog”,你可以区别出一个动物是还是不是一条狗DOG面向对象n它是一
5、种思考方法n世界上的任何东西都是一个对象;n任何系统都是由对象构成的(当然系统也是一个对象);n系统的演化和开发就是通过系统内外的对象进行交互完成的。世界上的任何东西都是一个对象n花,树,动物n学生,教授n桌子,椅子,教室,建筑n大学,城市,国家n世界,宇宙n学科,如计算机,信息系统,数学,历史 任何系统都是由对象构成的n法律系统n文化系统n教育系统n经济系统n信息系统n计算机系统系统开发就是定义对象间的交互n扬州大学是由下列对象的交互构成的:n学生n教授n职员n江苏省政府n中国政府n.扬大内部扬大内部扬大外部扬大外部设计方法学n面向对象首先是一种设计方法学(OOA/OOD)n对象是程序的构成
6、模块(接口对象(editor,menu,file,etc),数据管理对象(db),etc.).n对象代表了在应用中对现实世界的抽象.设计方法学n面向对象支持n归纳:对象-类n需要OOA/OOD工具.n演绎:类-对象n编程者需要学习有关类库的知识设计方法学n面向对象支持nTop-down:从超类到子类nBottom-up:从子类到超类n面向对象编程的基础*对象*封装*继承一般说来,对象是根据类来定义的。我们也可以用一个类来定义另一个类。例如,山地车、赛车和双座自行车都是自行车的一种。用面向对象的术语来说,它都是自行车类的子类或派生类,而自行车类是它们的超类或父类或基类。它们的关系如下图所示:自行
7、车每一个子类继承了超类的数据和操作,但是,子类并不是局限于超类的数据和操作。例如,双座自行车有两个坐垫,山地车有一个额外的低速齿轮。继承的主要益处是可以复用超类的程序代码*多态赛车三地车双座自行车面向对象n“世界是面向对象的”n-Alan Kay said.n如果你对世界了解,那么你就了解了面向对象.n所以,面向对象是容易的.2.编程n编程就像写作.n如果你能够描绘一样东西,你就可以写一个程序.n所以,编程也是容易的.n所以,面向对象的编程等于 容易+容易,得到“too(2)easy”.编程编程n但是,实际上,编程并不那么容易。因为编一个真正的好的程序是不容易的。它需要编程者的智慧,知识和经验
8、.n就象写作一样,要成为一个好的作家,就需要很多的经验和对这个世界的大量知识。n学习和练习就必不可少。编程技术n非结构化编程n过程编程n模块化&结构化编程n抽象数据类型n面向对象编程非结构化编程n我们经常将一个简单的程序写成一个主程序.此处,主程序代表了命令和声明的一个序列,这个系列在整个程序中对全局数据进行修改.Main ProgramData缺点n这种技术只能用于很小的程序中.n例如,如果相同的声明序列在不同的地方要多次出现时,我们就不得不拷贝这些序列。如果其中发生了一个错误,我们就需要对每一个拷贝进行修改.n这就导致了我们将这些序列抽取出来,单独命名,并通过调用和返回值的方法来实现多处复
9、用的方法。过程编程 n在过程编程中,你可以将序列归在一个地方n过程调用可以被用于调用过程。在调用完成后,控制流继续往下。Main ProgramProcedure过程n通过参数和子过程(过程的过程),程序就可以写得更有结构并且可以减少错误.n例如,如果过程是正确的,那么每一次使用它必然可以获得正确的结果n因而,为了查找错误,你就可以缩小查找的范围.模块化编程n在模块化编程中,具有公共功能的过程被集中在不同的模块中n一个程序就不再是一个单一整体构成的了,它被分解成多个小的部分,这些小的部分之间通过调用相互交互,构成了整个程序.Main Program(Also a module)DataData
10、Data1Module2 +DataData2Module1 +DataData1Procedure1Procedure2主程序协调多个模块之间的调用,并进行数据的传送Procedure3模块化编程n每一个模块都可以有自己的数据。这将允许每一个模块来管理内部状态,这些状态可以在调用这些模块中的过程时得到修改.n因此,每一个模块都有一个状态,每一个模块在整个程序中通常也最多存在一次结构化编程n结构化程序中的三种结构u顺序(s1,s2,sn)u分支(if-then-else)u循环Loop(for,do,and while loops)程序中有多少结构程序中有多少结构?抽象数据类型(ADTs)n抽
11、象n模型n抽象数据类型属性抽象-问题处理手段n为了理解问题,需要将不必要的细节分离出去:n你将构造你自己针对问题的抽象视图,抽象模型n这个建模过程称为抽象 abstraction.问题模型抽象模型n模型定义了一个抽象的视图,该视图只关注于与问题和求解者相关的部分。你需要定义下列属性:n影响的数据;n识别出来的操作;nADT 就是一种模型.Interface Operations Abstract Data StructureAbstract Data TypeADT定义(ADT)nADT 有下列一些特性:n1.它提供了一种类型.n2.它提供了操作的集合.该集合被称为接口.n3.接口的操作是类型
12、数据结构的唯一访问途径.n4.原理和前提定义了类型的应用领域.例子:ADT Listn类型 List.n类型list实例的接口由接口定义文件定义n操作:insert,get,append,delete,search,面向对象的编程n对象是由抽象数据类型来的n面向对象编程是对象交互的一个网络,每一个对象保存自己的状态n程序中的对象通过发送消息进行交互Object1Data1+Procedures1DataData1Object3 Data3+Procedures3Object2Data2+Procedures2 Object4 Data4+Procedures4面向对象编程n在面向对象编程中,我
13、们直接发送一个消息,而不是去调用一个程序来实现一个功能.n粗略地说,每一个对象实现了自己的模块面向对象编程n每一个对象负责正确地初始化和销毁自身.n相应地,对对象而言,我们就不需要显式地创建和生成过程n模块n信息隐藏n数据封装n抽象数据类型n对象面向对象的演化面向对象的演化记住n封装(Data&Operations)-信息隐藏的技术对象的用户不能看到对象的数据和操作的细节.n数据抽象-从对象中发现类的过程n抽象数据类型-类3.编码语言面向对象语言n面向对象编程语言就是能够很方便地支持面向对象概念的语言nSmalltalk:1972-1980.nC+:1980.nJava:1992(Smallt
14、alk+C+).n其它:nEffile,Objective-C,Ada,.SmalltalknSmalltalk 是一个纯的面向对象语言.n多数人认为Smalltalk 程序比 C+程序开发起来更快.Smalltalkn丰富的类库,通过继承实现重用nSmalltalk 拥有动态开发环境。它不是编译的,但是 C+是编译的.n这使得开发过程更可变,你可以方便地对类和各种情形进行修改Smalltalk 编程者并不能象在C+中那样立即掌握o-o概念.正因为如此,掌握Smalltalk需要更多地时间.但是多数时间是花在学习面向对象方法学和技术上,而不是编程语言上的。实际上,Smalltalk 比C和C+
15、更为简单.C+nC+是 C的面向对象版本.它与 C是一致的(它实际上是C的超集),所以现存的 C 代码能够包含在 C+程序中.n C+程序速度快,效率高.n这些特性已经使C+成为很流行的语言.C+n它牺牲了一些灵活性以提高效率.nC+采用编译时绑定的方法。这使得程序运行时的效率很高,代码也较小,但是它影响了重用类的某些能力.C+nC+已经非常流行,绝大多数新的 C 编译器实际上是 C/C+编译器.但是,如果想进行面向对象编程,你必须用C+编程(思考),而不是C.n这些都将对有经验的C编程者带来挑战。他们认为他们是在运用C+编程,但实际上只用了很少的面向对象特点。C+nC+是一个优秀的语言.n利
16、用它,你可以编出世界上最好的程序!nC+是一个差的语言.n使用它,你也可能编出世界上最差的程序n所以,在学习和使用它时,注意它的OO特性和非OO特性。Javan它是一个可移植语言,它可以运行在浏览器上。因此,它在Internet和Intranet上发挥出了极大的作用。JavanJava是 C+和Smalltalk古怪的混合.n它具有 C+的语法,使它容易学习(也许是难以学习,这依赖于学习者的经验).n它具有Smalltalk的结构,如虚拟机和字节码.Java(续)nC+的改进:n取消指针n垃圾回收n运行在类似于 Smalltalk-风格的虚拟机上n只要具有虚拟机,不同的机器上都可以运行Java
17、nJava 开发工具目前也已经有很多种了,如 Sun,Borland,IBM,MicrosoftC+程序设计 1.1 比较 p1C+程序设计面向对象思想问题域(Domain)以问题域中的事物为中心思考问题Object1Object2Objectn.对象归类-抽象化Class1Class2Classn.类实例化:定义对象,构建系统,形成解决方案C+程序设计面向过程思想问题域(Domain)以问题域的系统流程为中心分析Sub1Sub2Subn.各子流程实现-函数化Func1Func2Funcn.根据系统的流程组建软件,通过函数的调用实现C+程序设计1.2 对象和类客观世界-认识世界-计算机世界功能
18、模块设计相应的数据结构具体的函数和过程面向过程设计相应的数据结构功能模块面向对象C+程序设计面向对象程序设计是在吸取结构化程序设计的一切优点的基础上发展起来的一种新的程序设计方法。它的本质是把数据和处理数据的过程当成一个整体类。类是对一组具有共同的属性特征和行为特征的对象的抽象。C+程序设计类类 (教师类教师类)类是逻辑上相关的函数与数据的封装,它是对所要处理的问题的抽象描述。面向对象语言必需提供的用户定义的数据类型。类是将具有相同状态、操作和访问机制的多个对象抽象而成。对象对象 (一个教师(一个教师)从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的(比如一辆汽车),也可以是
19、无形的(比如一项计划)。对象是构成世界的一个独立单位,它具有自己的静态特征(状态)和动态特征(操作)。静态特征即可以用某种数据来描述的特征,动态特征即对象所表现的行为或对象所具有的功能。类的实体就是对象。C+程序设计类和对象的关系就是抽象和具体的关系。类与对象的关系如同汽车与具体的一辆车的关系。汽车都能跑,有四个轮子,所有的汽车组成了一个类,具体到一辆汽车,它具有类的全部特性(能跑,有四个轮子),是汽车类的一个子集或元素。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。所以,一个对象又称作类的一个实例(instance)。C+程序设计1.2.2对象的状态:对象的状态是所
20、有静态属性和这些属性的动态值的总和。(如银行帐户.)1.2.3对象的交互 (存取款.)C+程序设计 面向对象语言把状态和操作封装于对象体之中,并提供一种访问机制,使对象的“私有数据”仅能由这个对象的操作来执行。这种机制就是通过消息访问机制来实现的。消息在面向对象程序设计中,一个对象向另一个对象发出的请求被称为消息。消息是一个对象要求另一个对象执行某个功能操作的规格的说明,通过消息传递才能完成对象之间的请求或相互协作。C+程序设计方法方法是一系列计算步骤的有序集合。属于一个类的对象具有相同的行为,当某个行为作用在对象上时,我们就说对象执行了一个方法。一个对象请求另一个对象执行了一个特定的方法,等
21、价于一个对象发送一个消息给另一个对象,引起那个对象方法的执行。C+程序设计1.2.4类的确定和划分步骤:1)“程序要处理什么”2)“处理要完成怎样的功能”方法:用抽象的思维方式,寻求一个大系统中事物的共性,将具有共性的系统成分确定为一个类。(学校系统.)C+程序设计1.3数据的抽象与封装1.3.1 现实世界中的抽象与封装 (录音机按钮、软集成块)1.3.2 数据的抽象与封装的基本概念 (银行帐户的接口 p9)C+程序设计 封装封装封装是面向对象方法的一个重要原则。它有两个涵义:第一个涵义是,把对象的全部属性和动态行为结合在一起,形成一个不可分割的独立单位(即对象)。第二个涵义也称作“信息隐蔽”
22、,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。这主要是指对象的外部不能直接地存取对象地属性,只能通过几个允许外部使用地服务与对象发生联系。C+程序设计1.3.3对象的特性1)封装性2)模块独立性3)动态连接性4)易维护性C+程序设计1.4 继承性继承性 (我是谁,龙生龙我是谁,龙生龙.)继承是面向对象语言的另一特性。继承使某类的对象可以继承另一类对象的特性的一种机制。一个类的定义(子类)可以定义在另一个已定义类(父类)的基础上。子类可以继承父类中的属性和操作,也可以定义自己的属性和操作。继承的必要性:提高了重用性,降低了复杂度,减
23、少了接口的数量。类的继承的特性:类间共性共享;类间有差别;类间有层次性。C+程序设计1.4.2继承的分类按继承源来分,继承分为单继承和多继承(p13)。C+语言支持单继承和多继承,因而具有继承这一特性所带来的优势,大大增加了程序的重用性。继承的分类:p131.4.3继承与封装的关系 封装的单位是对象C+程序设计1.5 多态性多态性多态性即相同的消息作用在不同的对象上形成了不同的行为。(喝.水、酒)1.5.2 重载的概念相同名字函数或运算符在不同的场合可以表现出不同的行为。函数重载运算符重载C+程序设计 C+的发展历史nC+源于C语言,而C语言是在B语言的基础上发展起来的。n1960年出现了一种
24、面向问题的高级语言ALGOL 60。n1963年英国剑桥大学推出了CPL(Combined Programming Language)语言,后来经简化为BCPL语言。n1970年美国贝尔(Bell)实验室的K.Thompson以BCPL语言为基础,设计了一种类似于BCPL的语言,取其第一字母B,称为B语言。C+程序设计n1972年美国贝尔实验室的Dennis M.Ritchie为克服B语言的诸多不足,在B语言的基础上重新设计了一种语言,取其第二字母C,故称为C语言。n1980年贝尔实验室的Bjarne Stroustrup对C语言进行了扩充,推出了“带类的C”,多次修改后起名为C+。以后又经过
25、不断的改进,发展成为今天的C+。nC+改进了C的不足之处,支持面向对象的程序设计,在改进的同时保持了C的简洁性和高效性。C+程序设计1.2 C+程序的开发过程nC+语言是一种高级程序设计语言,它的开发过程与其他高级语言程序开发过程类似,一般要经过四个步骤:编辑 编译 链接 执行C+程序设计1.2.1 编辑编辑是指把按照C+语法规则编写的程序代码通过编辑器(Borland C+5.05,Visual C+6.0,Turbo C+3.0)输入计算机,并存盘。在存盘时,C+源文件的扩展名为.CPP。1.2.2 编译编译将编辑好的C+源程序通过编译器转换为目标文件(OBJ文件)。即生成该源文件的目标代
26、码。C+程序设计1.2.3 链接链接 将用户程序生成的多个目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代 码 连 接 在 一 起,生 成 一 个 可 执 行 文 件(.exe)。1.2.4 执行执行把生成的可执行文件运行,在屏幕上显示运行结果。用户可以根据运行结果来判断程序是否出错。C+程序设计上机说明C+程序设计一、实验目的1.认识Visual C+6.0 系统软件;2.编写Hello World 程序;3.理解源程序、目标程序程执行程序的内涵;4.熟练掌握编辑、编译、连接程序的熟练掌握编辑、编译、连接程序的过程过程。C+程序设计1.熟悉Visual C+6.0 系统软件的
27、基本使用方法;2.熟练掌握建立控制台工程文件的方法,并且要知道新建文件保存的保存目录,能够在下次打开该工程进行编辑修改;3.编写修改Hello World 程序;4.编译连接程序;5.执行该程序,查看程序执行结果;6.查找该程序的源程序、目标程序和可执行程序,理解它们各自的用途;二、实验内容C+程序设计1.建立一个工程(Hello World)n首先在D盘建立一个个人目录;n然后按下图所示建立控制台工程;三、实验步骤C+程序设计C+程序设计C+程序设计2.双击 main函,进入编辑状态;三、实验步骤C+程序设计C+程序设计C+程序设计3.编译、连接和执行程序三、实验步骤C+程序设计C+程序设计
28、C+程序设计4.查看源程序、目标程和可执行程序n源程在 Hello World 目录下 Hello World.cppn源程在 Hello World 目录下 Debug 下 Hello World.objn执行程序 Hello World 目录下 Debug 下 Hello World.exe三、实验步骤C+程序设计1.3 C+的词法与规则1.3.1 C+的字符集的字符集n数字:0,1,2,3,4,5,6,7,8,9。n小写字母:a,b,y,z。n大写字母:A,B,Y,Z。n运算符:+,-,*,/,%,=,!=,=,&,&,(),-,!,?,?:,,,;,”,#。n特殊字符:(连字符或下划线
29、)。n不可印出字符:空白格(包括空格、换行和制表符)。C+程序设计1.3.2 词与词法规则词与词法规则1.标识符标识符标识符是对实体定义的一种定义符,由字母或下划线(或连字符)开头、后面跟字母或数字或下划线(或空串)组成的字符序列,一般有效长度是8个字符(而ANSI C标准规定31个字符),用来标识用户定义的常量名、变量名、函数名、文件名、数组名、和数据类型名和程序等。C+程序设计2.关键字关键字关键字是具有特定含义,作为专用定义符的单词,不允许另作它用。autobreakcasechar classconstcontinuedefault do ddefaultdeletedouble el
30、seenum explicit externfloatforfriend gotoifinlineintlong mutablenewoperatorprivateprotectedpublicregisterreturnshort signedsizeofstaticstatic_caststruct switchthistypedefunionunsigned virtualvoidwhile C+程序设计3.运算符和分隔符运算符和分隔符 运算符是C+语言实现加、减等各种运算的符号。C+语言的分隔符主要是:空格、制表和换行符。4.字符串字符串字符串是由双引号括起来的字符。如“China”,
31、“C+Program”等。5.常量常量C+语言中常量包括实型常量(浮点常量)和整型常量(十进制常量、八进制常量、十六进制常量)、浮点常量、字符常量和字符串常量。C+程序设计6.注释注释注释是用来帮助阅读、理解及维护程序。在编译时,注释部分被忽略,不产生目标代码。C+语言提供两种注释方式。一种是与C兼容的多行注释,用/*和*/分界。另一种是单行注释,以“/”开头的表明本行中“/”符号后的内容是注释。如下程序:C+程序设计例1-1:一个简单的C+程序。#include void main()coutb)c=a-b;d=c*a;else c=a+b;d=c*b;C+程序设计(5)函数调用语句函数调用
32、语句函数调用语句是由一次函数调用加一个分号而构成的一个语句。例如:max(x,y);(6)空语句)空语句空语句:;即只有分号“;”的语句,什么也不做。C+程序设计n 抽象和分类 (例)抽象:抽象出实物的共同特点 分类:根据不同的特点进行归类 面向对象程序设计:可读性强,可重用性高,效率不一定高 结构化程序设计:可读性差,重用性差,但效率高C+程序设计nJosephus问题 一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,这个小孩就离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩是胜利者。问胜利者是第几个小孩?上面的问题可描述为:/Josephus问题
33、解答建立小孩结构类型初始化小孩数,开始位置,数小孩个数分配小孩结构数组C+程序设计for 初始化结构数组(构成环链)挂接下一个数组元素 小孩编号 输出编号endfor 转到初始位置 while(小孩数多于一个)数小孩个数(一个循环)出列小孩 将这个小孩从中删除endwhileC+程序设计输出得胜者 结构化方法:结构化方法按功能分割结构化方法按功能分割 自顶而下,逐步细化根据描述,Josephus问题可以分为四个模块 1初始化小孩数,开始位置,数小孩数;2 初始化环链表(采用链表数据结构来解)3 数小孩 4 处理未获胜的小孩。C+程序设计在此基础上要逐步细化:第一点细化为:键入小孩数、开始位置、
34、数小孩个数 小孩数校验 开始位置校验 数小孩数校验第二点细化为:分配结构数组 for 初始化结构数组(构成环链)连接下一个数组元素 小孩编号赋值 输出小孩编号 endfor 返回环链表 C+程序设计数小孩细化为:for(从1到数小孩间隔数)开始位置挪到下一个小孩 endfor 处理未获胜的小孩描述为:while(小孩数多于一个)数小孩(一个循环)出列小孩 将这个小孩删除 endwhileC+程序设计结构化程序设计需要知道整个过程,相应的数据结构,以及算法流程 具体实现:#include#incude struct Jose /小孩结构 int code;/小孩编号 Jose*next;/下一个
35、小孩结点;C+程序设计/全局变量int n;/小孩数int begin;/开始位置int m;/数小孩的顺序个数Jose*pivot;/链表哨兵Jose*pCur;/当前结点指针/函数声明int assign();/赋初值;void initial(Jose*pJose);/初始化环链表void count(int m);/数小孩void process();/处理所有未获胜小孩C+程序设计/主函数void main()if(!assign()cout”The program failed.n”;return;Jose*pJose=new Josen;/分配结构数组 initial(pJose
36、);/初始化结构数组 count(begin);/转到开始位置 process();/处理所有未获胜小孩 cout”n the winner is”codeendl;delete pJose;/释放空间;C+程序设计/赋初值int assign()int number,start,count;coutnumberstartcount;if(number3)/小孩数校验 cerr”bad number of boys n”;return 0;C+程序设计if(start1)/开始位置校验 cerr”bad beginning position.n”;return 0;if(count numbe
37、r)/数小孩 /顺序个数校验 cerr”bad interval number.n”;return 0;n=number;begin=start 1;m=count;/赋值 return 1;C+程序设计/链表初始化void initial(Jose*pJose)int lineCount=0;Jose*px=pJose;for(int i=1;inext=pJose+i%n;px-code=i;px=px-next;if(lineCount+%10)=0)coutendl;coutsetw(4)i;C+程序设计 coutendl;pCur=pJose+n 1;/指向数组最后一个元素/数m个小
38、孩void count(int m)for(int i=0;inext;C+程序设计/处理未获胜小孩void process()int linecount=0;for(int i=1;in;i+)count(m);/数小孩 if(linecount+%10)=0)coutendl;coutsetw(4)code;pivot-next=pCur-next;/删除小孩 pCur=pivot;C+程序设计n面向对象方法抽象和分类:大致确定类的属性(数据成员)和方法(函数成员)Josephus类属性:Boynumber,BeginPos,Interval方法:Initial,GetwinnerRing
39、类属性:First,Pivot,Current方法:Clear,Print,CountC+程序设计/主函数定义一个Jose类对象赋初值initial求获胜者getwinner 面向对象程序设计使用户不需要懂计算机太多,也不需要懂业务太多 面向对象程序的实现 文件:ring.h ,jose.h ring.cpp,jose.cpp,jose4.cppC+程序设计/*ring.h开始*/struct Boy /小孩结构作为链表结点 int code;Boy*next;C+程序设计class Ring /环链表类定义 public:Ring(int n);void Count(int m);/数小孩
40、void PutBoy();/输出当前小孩编号 void ClearBoy();/删除小孩 Ring();protected:Boy*pBegin;Boy*pivot Boy*pCurrent;/*ring.h结束*/C+程序设计/*ring.cpp开始*/#include#include#include“ring.h”Ring:Ring(int n)pBegin=new Boyn;pCurrent=pBegin;C+程序设计 for(int i=1;inext)pCurrent-next=pBegin+i%n;/将结点链起来 pCurrent-code=i;/小孩编号 PutBoy();co
41、utendl;pCurrent=&pBeginn-1;/当前小孩位置在最后一个编号/Ring:Ring(int n)C+程序设计void Ring:Count(int m)/数小孩 for(int i=0;i next;C+程序设计void Ring:PutBoy()/打印小孩 static int numInLine=0;if(numInLine+%10=0)cout endl;coutsetw(4)code;void Ring:ClearBoy()/删除小孩 pivot-next=pCurrent-next;pCurrent=pivot;C+程序设计Ring:Ring()/析构 delet
42、e pBegin;/*ring.cpp结束*/C+程序设计/*jose.h 开始*/class Jose public:Jose(int boys=10,int begin=1,int m=3)numOfBoys=boys;beginPos=begin;interval=m;void Initial();void GetWinner();protected:int numOfBoys;int beginPos;int interval;/*jose.h结束*/C+程序设计/*jose.cpp开始*/#include#include“ring.h”#include“jose.h”void Jos
43、e:Initial()int num,begin,m;coutnumbeginm;C+程序设计if(num2)cerr”bad number of boys n”;return;if(begin0)cerr”bad beginning position.n”;return;if(mnum)cerr”bad interval number.n”;return;/赋值numOfBoys=num;beginPos=begin;interval=m;C+程序设计void Jose:GetWinner()Ring x(numOfBoys);/小孩围成圈x.Count(beginPos);/转到开始位置 for(int i=1;i numOfBoys;i+)/处理其它小孩 x.Count(interval);/数小孩 x.PutBoy();/输出小孩编号 x.ClearBoy();/删除 cout”n the winner is”;x.PutBoy();/the winner/*jose.cpp结束*/C+程序设计/*jose4.cpp*/主函数#include“jose.h”void main()Jose jose;jose.Initial();joes.GetWinner();