.编写一个类,完成5个与下列哪些是算法的描述方法有关的功能 ;再编写一个公共 类,在mian()方法中逐?


从C到C++
C语言是结构化和模块化的语言,它是面向过程的。在处理较小规模的程序时,程序员用C语言较为得心应手。但是当
问题比较复杂﹑程序的规模比较大时,结构化程序设计方法就显出它的不足。C程序的设计者必须细致地设计程序中
的每一个细节,准确地考虑程序运行时每一时刻发生的事情,例如各个变量的值是如何变化的,什么时候应该进行哪些
输入,在屏幕上应该输出什么等。这对程序员的要求是比较高的,如果面对的是一个复杂问题,程序员往往感到力不从
心。当初提出结构化程序设计方法的目的是解决软件设计危机,但是这个目标并未完全实现。
为了解决软件设计危机,在20世纪80 年代提出了面向对象的程序设计( objectoriented programming , 0OP)思想,
这就需要设计出能支持面向对象的程序设计方法的新语言。Smalltalk 就是当时问世的一种面向对象的语言。而在
实践中,人们发现由于C语言是如此深入人心,使用如此广泛,以至最好的办法不是另外发明一种新的语言去代替它,而
是在它原有的基础上加以发展。在这种形势下,C++应运而生。C++是由AT&TBell(贝尔)实验室的Bjarne
Stroustrup博士及其同事于20世纪80年代初在C语言的基础上开发成功的。C++保留了C语言原有的所有优点,增
加了面向对象的机制。由于C++对C的改进主要体现在增加了适用于面向对象程序设计的“类( class )”,因此最初
它被Bjarne Stroustrup称为“带类的C”。后来为了强调它是C的增强版,用了C语言中的自加运算符“++”,改称
为C++。
AT&T发布的第一- 个C ++编译系统实际上是一个预编译器(前端编译器),它把C++代码转换成C代码,然后用C编译
系统编译,生成目标代码。第一个真正的C++编译系统是1988年诞生的。C++ 2.0 版本于1989 年出现,它作了重大
的改进,包括了类的多继承。1991 年的C++ 3.0版本增加了模板,C++ 4.0版本则增加了异常处理、命名空间、运行
时类型识别(RTTI)等功能。ANSIC++标准草案是以C++4.0版本为基础制定的, 1997年ANSI C++标准正式通过并
发布。但是目前使用的C++编译系统中,有一些是早期推出的,并未全部实现ANSIC++标准所建议的功能。C++是
由C发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C++。从C++的名字可以看出它是C的超
集。C++既可用于面向过程的结构化程序设计,也可用于面向对象的程序设计,是一种功能强大的混合型的程序设计
语言。
C++对C的“增强”,表现在两个方面:
(1)在原来面向过程的机制基础上,对C语言的功能作了不少扩充。
(2)增加了面向对象的机制。
面向对象程序设计是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。只有编写过大型程序的人
才能真正体会到C的不足和IC++的优点。
不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。在面向对象程
序设计中仍然要用到结构化程序设计的知识,例如,在类中定义一个函数就需要用结构化程序设计方法来实现。任何
程序设计都需要编写操作代码,具体操作的过程就是面向过程的。对于简单的问题,直接用面向过程方法就可以轻而
易举地解决。
读者在学习C++之后,既能进行面向过程的结构化程序设计,也能进行面向对象的程序设计。本书着重介绍C ++面
向对象程序设计的基本知识。
C++对C的扩充
C++既叮用于面向过程的程序设计,也可用于面向对象的程序设计。在面向过程程序设计的领域,C++继承了C语言
提供的绝大部分功能和语法规定,并在此基础上作了不少扩充,主要有以下几个方面。
C++ 的输入输出
C++为了方便用户,除了可以利用printf和scanf函数进行输出和输人外,还增加了标准输人输出流cout和cin。cout
是由c和out两个单词组成的,代表C++的输出流,cin是由c和in两个单词组成的,代表C++的输人流。它们是在头文件
iostream中定义的。键盘和显示器是计算机的标准输人输出设备,所以在键盘和显示器上的输人输出称为标准输人
输出,标准流是不需要打开和关闭文件即可直接操作的流式文件。
函数模板
函数的重载可以实现一个函数名多用,将实现相同的或类似功能的函数用同一个函数名来定义。这样可以使编程者
在调用同类函数时感到含义清楚,方法简单。但是在程序中仍然要分别定义每一个函数,如例1. 6的程序中三个max
函数的函数体是完全相同的,只是形参的类型不同,也要分别定义。有些读者自然会想到,对此能否再简化呢?
为了解决这个问题,C++提供了函数模板( function template)。所谓函数模板,实际上是建立一个通用函数,其函数
类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都
可以用这个模板来代替,不必定义多个函数,只须在模板中定义一次即可。在调用函数时系统会根据实参的类型来取
代模板中的虚拟类型,从而实现了不同函数的功能。
内置函数
调用函数时需要--定的时间,如果有的函数需要频繁使用,则累计所用时间会很长,从而降低程序的执行效率。C++提
供一种提高效率的方法,即在编译时将所调用函数的代码嵌人到主函数中。这种嵌人到主函数中的函数称为内置函
数(inlinefunction),又称内嵌函数。在有些书中把它译成内联函数。
作用域运算符
每一个变量都有其有效的作用域,只能在变量的作用域内使用该变量,不能直接使用其他作用域中的变量。
字符串变量
除了可以使用字符数组处理字符串外,C++还提供了-种更方便的方法一-用字符串类型( string类型)定义字符串变
量。
实际上,string并不是C++语言本身具有的基本类型(而char,int,float,double等是C++本身提供的基本类型),它是在
C++标准库中声明的一个字符串类,用这种类可以定义对象。
动态分配/撤销内存的运算符new和delete
在软件开发中,常常需要动态地分配和撤销内存空间。在C语言中是利用库函数malloc和free分配和撤销内存空间
的。但是使用malloc函数时必须指定需要开辟的内存空间的大小。其调用形式为malloc(size) 。size 是字节数,需
要人们事先求出或用sizeof运算符由系统求出。此外,malloc函数只能从用户处知道应开辟空间的大小而不知道数
据的类型,因此无法使其返回的指针指向具体的数据。其返回值一律为void *类型,必须在程序中进行强制类型转换,
才能使其返回的指针指向具体的数据。
小结
综上所述,C++对C功能的扩展包括:
(1)允许使用以“//"开头的注释。
(2)对变量的定义可以出现在程序中的任何行(但必须在引用该变量之前)。
(3)提供了标准输人输出流cin和cout,它们不用指定输人输出格式符(如%d),使输人输出更加方便。
(4)可以用const定义常变量。
(5)可以利用函数重载实现用同一函数名代表功能类似的函数,以方便使用,提高可读性。
(6)可以利用函数模板,简化同一类型的函数的编程工作。
(7)可以使用带默认值的参数的函数,使函数的调用更加灵活。
(8)提供变量的引用类型,即为变量提供一个别名,将“引用”作为函数形参,可以实现通过函数的调用来改变实参变量
的值。
(9)增加了内置函数(内嵌函数),以提高程序的执行效率。
(10)增加了单目的作用域运算符:,这样在局部变量作用域内也能引用全局变量。
(11)可以用string类定义字符串变量,使得对字符串的运算更加方便。
(12)用new和delete运算符代替malloc和free函数,使分配动态空间更加方便。
C++对C的扩展还有其他-些方面。这些扩充使得人们在进行程序设计时,更加方便和得心应手。在本书以后各章中,
将在程序中用到这些扩展的功能,读者会在实践过程中逐步熟悉和运用它们。
C ++程序的编写和实现
在前面已经看到了一些用C++语言编写的程序。但是,写出了程序并不等于问题已
经解决了,因为还没有上机运行,没有得到最终的结果。--个程序从编写到最后得到运行
结果要经历以下一些步骤。
1.用C++语言编写程序
所谓程序,就是一组计算机系统能识别和执行的指令。每一条指令使计算机执行特定的操作。用高级语言编写的程
序称为源程序(sourceprogram)。C++的源程序是以cpp作为后缀的(cpp是c plus plus的缩写)。
2.对源程序进行编译
从根本.上说,计算机只能识别和执行由0和1组成的二进制的指令,而不能识别和执行用高级语言写的指令。为了使计
算机能执行高级语言源程序,必须先用一种称为“编译器( complier)”的软件(也称编译程序或编译系统),把源程
序翻译成二进制形式的“目标程序( object program)”。
编译是以源程序文件为单位分别编译的,每一个程序单位组成--个源程序文件,如果有多个程序单位,系统就分别把它
们编译成多个目标程序。目标程序一般以. obj或. o作为后缀(object的缩写)。编译的作用是对源程序进行词法检查
和语法检查。词法检查是检查源程序中的单词拼写是否有错,例如把main错拼为mian。语法检查是根据源程序的上
下文来检查程序的语法是否有错,例如在cout语句中输出变量a的值,但是在前面并没有定义变量a。编译时对文件中
的全部内容进行检查,编译结束后显示出所有的编译出错信息。一般编译系统给出的出错信息分为两种,一种是错误(
error);一种是警告( warning) ,指一-些不影响运行的轻微的错误(如定义了一个变量,却一直没有使用过)。凡是检查
出error类的错误,就不生成目标程序,必须改正后重新编译。
3.将目标文件连接
在改正所有的错误并全部通过编译后,得到一个或多个目标文件。此时要用系统提供的“连接程序( linker)”将一个
程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成- -个可执行的 二进制文件,它的后
缀是. exe ,是可以直接执行的。
4. 运行程序
运行最终形成的可执行的二进制文件( . exe文件) ,得到运行结果。
关于C++.上机实践
在了解了C++语言的初步知识后,读者最好尽早在计算机上编译和运行C++程序,以加深对C++程序的认识以及初
步掌握C++的上机操作。光靠课堂和书本是难以真正掌握C++的所有知识及其应用的。有许多具体的细节,在课堂
上讲很枯燥而且有时还难以讲明白,上机一试就明白了。希望读者善于在实践中学习。
读者可以使用不同的C++编译系统,在不同的环境下编译和运行一个C++程序。但是需要强调的是,学习C++程序设
计应当掌握标准C++ , 而不应该只了解某一种“方言化”的C++。不应当只会使用一种C++编译系统,只能在一种
环境下工作,而应当能在不同的C++环境下运行自己的程序,并且了解不同的C ++编译系统的特点和使用方法,在需
要时能将自己的程序方便地移植到不同的平台上。
在本书的参考书《C++面向对象程序设计题解与上机指导》-书中简单介绍了在Visual C++ 6. 0和GCC两种典型的
环境下运行C++程序的方法。Visual C++ 6.0是在Windows环境下运行C ++的集成环境,目前在国内使用比较广
泛。GCC是自由软件,可以从网上下载,不必购买,能用于Windows , UNIX , Linux等不同的平台,在目前使用的各种
C++编译系统中,GCC是最接近C++标准的,在各国的C++开发人员中使用很普遍。为了方便读者使用GCC,随该
书赠送的光盘中包括GCC编译系统。请读者选择- -种(如能做到两种更好) C++编译系统,在该环境下输人和运行习
题中的程序,掌握上机的方法和步骤。
面向对象程序设计方法概述
对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结 构及对其的操作
过程。但是当程序规模较大时,就显得力不从心了。C++就是为了解决编写大程序过程中的困难而产生的。什么
什么是面向对象的程序设计
面向对象的程序设计的思路和人们日常生活中处理问题的思路是相似的。在自然世界和社会生活中,-个复杂的事物
总是由许多部分组成的。譬如,一辆汽车是由发动机、底盘、车身和轮子等部件组成的;一套住房是由客厅、卧
室、厨房和卫生间等组成的;一个学校是由许多学院、行政科室和学生班级组成的。当人们生产汽车时,并不是先设
计和制造发动机,再设计和制造底盘,然后设计和制造车身和轮子,而是分别设计和制造发动机、底盘、车身和轮子,最
后把它们组装在一起。在组装时,各部分之间有一定的联系,以便协调工作。例如驾驶员踩油门,就能调节油路,控
制发动机的转速,驱动车轮转动。
这就是面向对象的程序设计的基本思路。
为了进一步说明问题,下面先讨论几个有关的概念。
面向对象程序设计的特点
传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用
任何一组数据,而一组数据又能被多个函数所使用。程序设计者必须考虑每一个细节,什么时候对什么数据进行操
作。当程序规模较大、数据很多操作种类繁多时,程序设计者往往感到难以应付。
类和对象的作用
类是C++中十分重要的概念,它是实现面向对象程序设计的基础。C++对C的改进,最重要的就是增加了“类"这样一
种类型。所以C++开始时被称为“带类的C"。类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了
这种类型。如果一种计算机语言中不包含类,它就不能称为面向对象的语言。一个有一定规模的C++程序是由许多
类所构成的。可以说,类是C++的灵魂,如果不真正掌握类,就不能真正掌握C++。
C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。包括类和对象的概念.类的机制和声明、类
对象的定义与使用等。这是面向对象的程序设计的基础。基于对象就是基于类。与面向过程的程序不同,基于对象
的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性,就成为面向对
象的程序设计(有时不细分基于对象程序设计和面向对象程序设计,而把二者合称为面向对象的程序设计)。
基于对象程序设计所面对的是一一个个对象。所有的数据分别属于不同的对象。面向过程的程序中数据是公用的,
或者说是共享的,假如有变量a,b,c,可以被不同的函数所调用,也就是说这些数据是缺乏保护的。数据的交叉使用很容
易导致程序的错误。而实际上,程序中的每- -组数据都是为某-种操作而准备的,也就是说,一组数据是与一组操作相
对应的。因此人们设想把相关的数据和操作放在~ -起 ,形成- -个 整体,与外界相对分隔。这就是面向对象的程序设
计中的对象。
在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序:
程序=算法+数据结构
算法和数据结构两者是互相独立、分开设计的,面向过程的程序设计是以算法为主体的。在实践中人们逐渐认识到
算法和数据结构是互相紧密联系不可分的,应当以-一个算法对应一组数据结构,而不宜提倡一-个算法对应多组数据
结构,以及一组数据结构对应多个算法。基于对象和面向对象程序设计就是把一个算法和-组数据结构封装在.-个对
象中。因此,就形成了新的观念:
对象=算法+数据结构
程序= (对象+对象+对象+...) +消息 或: 程序=对象s+消息
“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,以及确定向这些对
象发出的命令,使各对象完成相应的操作。
面向对象的软件开发
在以前,软件开发所面临的问题比较简单,从任务分析到编写程序,再到程序的调试,难度都不太大,可以由一个人或-一
个小组来完成。随着软件规模的迅速增大,软件人员面临的问题十分复杂,需要考虑的因素很多,在一个软件中所产生
的错误和隐藏的错误可能达到惊人的程度,这不是程序设计阶段所能解决的。需要规范整个软件开发过程,明确软
件开发过程中每个阶段的任务,在保证前一个阶段工作的正确性的情况下,再进行下一阶段的工作。这就是软件工程
学需要研究和解决的问题。
面向对象的软件工程包括以下几个部分:
1.面向对象分析( object oriented analysis , O0A)
软件工程中的系统分析阶段,系统分析员要和用户结合在一起,对用户的需求作出精确的分析和明确的描述,从宏观的
角度概括出系统应该做什么(而不是怎么做)。面向对象的分析,要按照面向对象的概念和方法,在对任务的分析中,从
客观存在的事物和事物之间的关系,归纳出有关的对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同
属性和行为的对象用-个类(class)来表示。建立一个能反映真实工作情况的需求模型。在这个阶段所形成的模型是
比较粗略(而不是精细)的。
2.面向对象设计( object oriented design , OOD )
根据面向对象分析阶段形成的需求模型,对每-部分分别进行具体的设计,首先是进行类的设计,类的设计可能包含多
个层次(利用继承与派生机制)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。在设计阶段,
并不牵涉某-种具体的计算机语言,而是用一种更通用的描述I具(如伪代码或流程图)来描述。
3.面向对象编程( object oriented programming , OOP)
根据面向对象设计的结果,用一种计算机语言把它写成程序,显然应当选用面向对象的计算机语言(例如C++),否则是
无法实现面向对象设计的要求的。
4.面向对象测试( object oriented test , OOT)
在写好程序后交给用户使用前,必须对程序进行严格的测试。测试的目的是发现程.序中的错误并改正它。面向对象
测试是用面向对象的方法进行测试,以类作为测试的基本单元。
5.面向对象维护( object oriented soft maintenance , OOSM )
正如对任何产品都需要进行售后服务和维护一样,软件在使用中也会出现一些问题,或者软件商想改进软件的性能,
这就需要修改程序。由于使用了面向对象的方法开发程序,使得程序的维护比较容易了。因为对象的封装性,修改一
个对象对其他对象影响很小。利用面向对象的方法维护程序,大大提高了软件维护的效率。
在面向对象方法中,最早发展的是面向对象编程(OOP),那时0OA和O0D还未发展起来,因此程序设计者为了写出面向
对象的程序,还必须深人到分析和设计领域(尤其是设计领域),那时的OOP实际上包括了现在的OOD和OOP两个阶
段。对程序设计者要求比较高,许多人感到很难掌握。
现在设计一个大的软件,是严格按照面向对象软件工程的5个阶段进行的,这5个阶段的工作不是由一个人从头到尾
完成的,而是由不同的人分别完成的。这样,0OP阶段的任务就比较简单了,程序编写者只需要根据OOD提出的思路
用面向对象语言编写出程序即可。在一个大型软件的开发中, OOP只是面向对象开发过程中的一个很小的部分。
如果所处理的是一个较简单的问题,不必严格按照以上5个阶段进行,往往由程序设计者按照面向对象的方法进行程
序设计,包括类的设计(或选用已有的类)和程序的设计。
类和对象的关系
有一些对象是具有相同的结构和特性的。例如高炮一连、高炮二连、高炮三连是3个不同的对象,但它们是属于同一
类型的,它们具有完全相同的结构和特性。而民兵- -连、民兵二连、民兵三连这3个对象的类型也是相同的,但它们
与高炮连的类型并不相同。每个对象都属于一个特定的类型。
在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。前面已说明:类是对象的抽象,而对象是类
的具体实例(instance)。正如同结构体类型和结构体变量的关系-样(人们先声明一个结构体类型,然后用它去定义结
构体变量。同一个结构体类型可以定义出多个不同的结构体变量),在C++中也是先声明一.个类类型,然后用它去定
义若干个同类型的对象。对象就是类类型的一个变量。 好比建造房屋先要设计图纸,然后按图纸在不同的地方建
造若干栋同类的房屋。可以说类是对象的模板,是用来定义对象的一种抽象类型。
类是抽象的,不占用内存,而对象是具体的,占用存储空间。在- -开始时弄清对象和类的关系是十分重要的。
成员函数的性质
类的成员函数(简称类函数)是函数的一种,它的用法和作用和一般函数基本上是一样的,它也有返回值和函数类型,它
与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private( 私有的)、public(公用的)
或protected(受保护的)。在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范
围中的数据和函数)。例如私有的成员函数只能被本类中的其他成员函数所调用,而不能被类外调用。成员函数可
以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。
一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函
数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为
private。这种函数的作用是支持其他函数的操作,是类中其他成员的工具函数(utilityfunction),类外用户不能调用
这些私有的工具函数。
类的成员函数是类体中十分重要的部分。如果一个类 中不包含成员函数,就等同于C语言中的结构体了,体现不出
类在面向对象程序设计中的作用。
inline 成员函数
类的成员函数也可以指定为内置(inline)函数。
在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个
函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数
中不包括循环等控制结构,C++系统会自动将它们作为内置( inline)函数来处理。也就是说,在程序调用这些成员函
数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌人程序的调用点。这样可以大
大减少调用成员函数的时间开销。
C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已
被隐含地指定为内置函数。
通过对象的引用来访问对象中的成员
如果为一个对象定 义了一个引用,它们是共占同-段存储单元的,实际上它们是同一个对象,只是用不同的名字表示
而已。因此完全可以通过引用来访问对象中的成员,其概念和方法与通过对象名来引用对象中的成员是相同的。
如果已声明了Time类,并有以下定义语句:
由于t2与11共占同一段存储单元(即t2是t1的别名),因此t2. hour就是tu. hour。
公用接口与私有实现的分离
从前面的介绍已知:C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是
把数据和算法封装在用户声明的抽象数据类型中。在面向对象的程序设计中,在声明类时,一般都是把所有的数据指
定为私有的,使它们与外界隔离,把需要让外界调用的成员函数指定为公用的,外界通过公用的函数来实现对数据的
操作。外界与对象惟--的联系渠道就是调用公用的成员函数。这样就使类与外界的联系减少到最低限度。
在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员赋值,显示数据成员
的值,对数据进行加工等)。因此,公用成员函数是用户使用类的公用接口( public interface) ,或者说是类的对外接
口。当然并不一定要把所有成员函数都指定为public(公用)的,但非public 的成员函数就不是公用接口了。在类外
虽然不能直接访问私有数据成员,但可以通过调用公用成员函数来引用甚至修改私有数据成员的值。
就先说这么多了,希望能帮到大家。如有任何问题,欢迎与我联系。需要C语言入门大礼包、各种C语言C++学习资料的小伙伴可以加入小编的学习圈,里面聚集了一些正在学习C语言的小伙伴,在学习C语言的过程中遇到任何的问题,大家都可以一起交流,大家可以根据自己需要领取源码素材。希望大家都能够实现自己的梦想,加油!大家可以根据自己需要领取源码素材!
点击下方链接进群领取学习资料以及项目源码和素材!
点击链接加入群聊
}

我要回帖

更多关于 下列哪些是算法的描述方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信