490 likes | 619 Views
计算机程序. 计算机的工作是用程序来控制的 程序是指令的集合。 指令是计算机可以识别的命令。. 机器语言与汇编语言. 由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。 计算机发展的初期,软件工程师们只能用机器语言来编写程序。这一阶段,在人类的自然语言和计算机编程语言之间存在着巨大的鸿沟。 汇编语言将机器指令映射为一些可以被人读懂的助记符,如 ADD 、 SUB 等。 此时编程语言与人类自然语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象层次太低,程序员需要考虑大量的机器细节。. 高级语言.
E N D
计算机程序 • 计算机的工作是用程序来控制的 • 程序是指令的集合。 • 指令是计算机可以识别的命令。
机器语言与汇编语言 • 由计算机硬件系统可以识别的二进制指令组成的语言称为机器语言。 计算机发展的初期,软件工程师们只能用机器语言来编写程序。这一阶段,在人类的自然语言和计算机编程语言之间存在着巨大的鸿沟。 • 汇编语言将机器指令映射为一些可以被人读懂的助记符,如ADD、SUB等。 此时编程语言与人类自然语言间的鸿沟略有缩小,但仍与人类的思维相差甚远。因为它的抽象层次太低,程序员需要考虑大量的机器细节。
高级语言 高级语言屏蔽了机器的细节,提高了语言的抽象层次,程序中可以采用具有一定涵义的数据命名和容易理解的执行语句。这使得在书写程序时可以联系到程序所描述的具体事物。
面向对象的语言 • 出发点: • 更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。 • 特点: • 是高级语言。 • 将客观事物看作具有属性和行为的对象。 • 通过抽象找出同一类对象的共同属性和行为,形成类。 • 通过类的继承与多态实现代码重用
面向对象的语言 • 优点: 使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。
程序设计方法的发展历程——面向过程的程序设计方法程序设计方法的发展历程——面向过程的程序设计方法 • 程序的目的:用于数学计算 • 主要工作:设计求解问题的过程 • 缺点:对于庞大、复杂的程序难以开发和维护
一、面向过程的程序设计 该程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。这种设计方法的着眼点是面向过程的,特点是数据与程序分离,即数据与数据处理分离。
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 设计思路 • 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 • 程序结构: • 按功能划分为若干个基本模块,形成一个树状结构。 • 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 • 其模块化实现的具体方法是使用子程序。
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 优点: 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
程序设计方法的发展历程——面向过程的结构化程序设计方法程序设计方法的发展历程——面向过程的结构化程序设计方法 • 缺点:可重用性差、数据安全性差、难以开发图形界面的应用 • 把数据和处理数据的过程分离为相互独立的实体。 • 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 • 每一种相对于老问题的新方法都要带来额外的开销。 • 图形用户界面的应用,很难用过程来描述和实现,开发和维护都很困难。
程序设计方法的发展历程——面向对象的方法 • 将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。 • 对同类型对象抽象出其共性,形成类。 • 类通过一个简单的外部接口,与外界发生关系。 • 对象与对象之间通过消息进行通讯。
程序设计方法的发展历程——面向对象的方法 • 优点: • 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 • 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
面向对象的程序设计 面向过程程序设计缺点的根源在于数据与数据处理分离。 面向对象程序设计模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体——对象(object),同类对象还可抽象出共性,形成类(class )。一个类中的数据通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口。对象之间通过消息(message)进行通讯。
基 本 概 念 对 象(object) 类(class) 消 息(message)
表针 旋钮 其他机械机构 属性 行为 基 本 概 念 对 象 调节旋钮
类的一个具体实现,称为实例 类 对象 描述这类对象共有的、本质的属性和行为 具体到一只圆形的或方形的手表 手表 一块手表 手表共有的属性(表针、旋钮、内部结构) 和行为(调节旋钮) 基 本 概 念 类 是一个抽象的概念,用来描述某一类对象所共有的、本质的属性和类行为。
现实生活中的对象 计算机中 的对象的原型 面向对象重要活动—抽象 • 数据抽象类型 class Car { private: int color_number; int door_number; int speed; public: void brake() { … } void speedUp() {…}; void slowDown() { … } } ;
面向对象的基本概念——类 • 分类——人类通常的思维方法 • 分类所依据的原则——抽象 • 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 • 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。
variables methods • 对象的抽象—类 • 类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。 • 程序中的对象—是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。
message 对象B 对象 A • 变量:即指对象的状态(从问题域出发抽象出来) • 方法:指对象的功能单元,是对对象属性的操作,是通过对象属下能够为解决问题而提供的服务。 • 什么是消息? 我们把对象之间产生相互作用所传递的信息称做消息。 • 软件对象通过相互间传递消息来相互作用和通信 • 一个消息由三部分组成: 1. 接受消息的对象 2. 要完成方法的名字 3. 方法需要的参数
一个例子: • 在程序中操作对象是类的一个实例:即对象 • 创建一个对象 Hello *obj=new Hello(); • 调用方法 obj->showStr(); class Hello { } private: char s[20]; public: void showStr () { cout<<s;} char* SetStr(char *str) { strcpy(s,str); return s;}
什么是封装? • 封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据。 封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 公有数据 数据 私有数据 方法 方法 对象A 对象B
三、面向对象的软件开发方法 面向对象软件开发的根本合理性在于它符合客观世界的组成方式和大脑的思维方式。 在大型程序开发过程中,编码只是其中很小一部分,应当采用工程化的方法,并将面向对象的思想贯穿于软件开发全过程,这就是面向对象的软件工程。 面相对象的软件工程同样遵循分层抽象、逐步细化的原则。软件开发过程包括以下五个阶段:
面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程(OOP) 面向对象的测试(OOT) 面向对象的维护(OOSM) 面向对象的软件开发方法 分析阶段的主要任务是按照面向对象的概念和方法,从问题中识别出有意义的对象,以及对象的属性、行为和对象间的通信,进而抽象出类结构,最终将它们描述出来,形成一个需求模型。 设计阶段从需求模型出发,分别进行类的设计和应用程序的设计。 编程阶段实现由设计表示到面向对象程序设计语言描述的转换。 测试的任务在于发现并改正程序中的错误。
四、“面向对象”程序设计的特点 • 封装性 (2) 继承与派生性 (3) 多态性
内 外 机械零件 动作 调节旋钮 读表盘 四、“面向对象”程序设计的特点 封装性 对象是一个封装体,在其中封装了该对象的属性和操作。通过限制对属性和操作的访问权限,可以将属性“隐藏”在对象内部,对外提供一定的接口,在对象之外只能通过接口对对象进行操作。 C++通过建立数据类型——类来支持封装和数据隐藏。封装性增加了对象的独立性,从而保证了数据的可靠性。一个定义完好的类可以作为独立模块使用。
汽车 载人 载货 客车 货车 小,速度快 大,速度慢 小轿车 大客车 四、 “面向对象”程序设计的特点 继承与派生 以汽车为例看客观世界描述事物的方式: 面向对象程序设计提供了类似的机制: 当定义了一个类后,又需定义一个新类,这个新类与原来的类相比,只是增加或修改了部分属性和操作,这时可以用原来的类派生出新类,新类中只需描述自己所特有的属性和操作。 新类称为子类或派生类,原来的类称为基类。派生可以一直进行下去,形成一个派生树。 继承性大大简化了对问题的描述,大大提高了程序的可重用性,从而提高了程序设计、修改、扩充的效率。
四、“面向对象”程序设计的特点 多态性 多态性指,同一个消息被不同对象接收时,产生不同结果,即实现同一接口,不同方法。
四、 “面向对象”程序设计的特点 继承和多态性组合,可以生成很多相似但又独一无二的对象。继承性使得这些对象可以共享许多相似特性,而多态又使同一个操作对不同对象产生不同表现形式。这样不仅提高了程序设计的灵活性,而且减轻了分别设计的负担。
五、 C语言与面向对象的C++ C语言是七十年代初贝尔实验室的Dennis Richie 等人在B语言基础上开发出来的。C最初是作为UNIX操作系统的开发语言为人们所认识。七十年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步脱离UNIX系统成为一种独立的程序设计语言。C 语言版本很多,为了让开发出来的代码能够在多种平台上运行,1988年美国国家标准协会ANSI对C语言进行了标准化,产生了ANSI C。
五、 C语言与面向对象的C++ C++是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C++继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。 C++支持面向对象程序设计,通过类和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。 此外,在一致性(Consistency)检查机制方面也作了加强,提高了软件开发的效率和质量。
C++语言的产生 • C++是从C语言发展演变而来的,首先是一个更好的C。 • 引入了类的机制,最初的C++被称为"带类的C"。 • 1983年正式取名为C++。C++语言的标准化工作从1989年开始,于1994年制定了ANSI C++标准草案。以后又经过不断完善,成为目前的C++。
C++的特点 • 全面兼容C • 它保持了C的简洁、高效和接近汇编语言等特点 • 对C的类型系统进行了改革和扩充 • C++也支持面向过程的程序设计,不是一个纯正的面向对象的语言
五、 C语言与面向对象的C++ C++与C完全兼容,很多用C编写的库函数和应用程序都可以为C++所用。 但正是由于与C兼容,使得C++不是纯正的面向对象的语言,它既支持面向对象程序设计,也支持面向过程设计。但我们应当注意用面向对象的思想进行设计,以发挥出C++的优势。 C++有许多版本,国内较为流行的有Microsoft公司的Visual C++等。
一个简单的C++程序 【例1】一个简单的C++程序。 程序组成: # include <iostream.h> max(int i,int j) { //A if(i>=j) return i; else return j; } void main(void){ //B int i,j; //说明变量 cout<<“输入i,j”; //显示提示信息 cin>>i>>j; //从键盘上输入变量值 cout<<“最大值是:”<<max(i, j) <<endl; //输出提示和结果 } 注释 编译预处理指令 程序体 由若干函数组成,其中有且仅有一个主函数 main(),这是程序的执行入口。在Windows 编程中定义为 winmain()。
了解C++语言新增的符号名称和算符 C++语言体系除了数量极其有限的专用描述语句和算符外,继承了全部C的语言体系。但这并不是说两者之间是全集与子集的量变关系。因为两者间总还有一些质的不同。
C++的文件扩展名 • C++最常用的简化输入/输出手段 • 任意位置可定义变量 C++将变量定义也作为一种语句,只要在使用前定义就可。 • 动态内存分配算符 • 引用(References)类型及其算符&
引用(References)类型及其算符& 引用用于在程序的不同部分用不同的变量名代表同一地址的同一内容,使得对其中一个变量的操作和对另一个变量的操作等效。其格式是: 如: int i; int &j=i; j=1;
要注意两种不同的“&”符号的意义。出现在类型名开头的声明句中“&”代表符号右端的别名。而在可执行句中“&”则是取变量的地址。要注意两种不同的“&”符号的意义。出现在类型名开头的声明句中“&”代表符号右端的别名。而在可执行句中“&”则是取变量的地址。 例: int i=0; int &j=i,k=i,&l=i; j=1;k=2;l=3; cout<<&i<<"_"<<i<<"\n"; cout<<&j<<"_"<<j<<"\n"; cout<<&k<<"_"<<k<<"\n"; cout<<&l<<"_"<<l<<"\n";
使用引用的几点注意 • 声明指针变量的引用的格式 int i=0,*j=&i,*&k=j; cout<<*k; 切不可写成下面的样子: int i,*p; int &r1=p; /*非法语句*/ int &r2=&i; /*非法语句*/
由于引用类型所定义的变量不是独立内存实体,所以不能用以对常数定义。由于引用类型所定义的变量不是独立内存实体,所以不能用以对常数定义。 int &r=3;//错误的 • 引用类型的变量,主要用于主子程序间的大量数据的传送.[例题]
行注释符//的使用 • 用#define予定义代名符 代名符在程序中不起任何实际作用,但可放在行首用来说明程序的设计者、类的归属、时间、所处的总体位置等有助于读程序的信息。 例: #define TEST TEST void main() {…}
更为严格的C++语法定义 • const定义 在C语言中,const int i=常数; 的格式是允许的,但其const功能尚不完善。如下面第二句的格式在C++中是合理合法的: const int i=9; char t[i]; //等效于char t[9]; 而在C语言中则报错。若在C 中要实现此种定义,只能用#define i=9来预定常数。而#define所定义的常数的类型在编译时是无法判断的。如果用#define定义的常数做实参传给函数时,函数只能按定义的传送类型来做隐含类型转换了。
更为严格的C++语法定义 • 指针定义时的类型必须同实际指向的对象类型相一致[例子]
C++中函数的新特性 • 函数声明、定义和调用的三个步骤 • 函数传递参数的使用 • 函数的返回值 • 内联(inline)函数 • C++中函数的缺省参数 • 函数的重裁
同C一样,用于 C++中的函数参数可以是值、地址(指针)和引用类型量。前两者的规则与C完全相同。 • 使用引用类型量做参数是传值和传地址的一种综合变化形式。充当引用类型的变量即可做实参也可做形参。
C++的函数返回值与C基本一样,不同之处在于: 无缺省返回类型 在C中,一个函数可以不声明其返回值的类型,即缺省为int。但在C++ 中没有这个缺省类型。因此对每个函数都必须给出返回值的类型声明。如果没有返回值,则声明应用void表示。 • 可以用引用类型量做函数返回值
例: struct dt{...}; dt &fun( ) /*若在fun()前加"&",则可在返回时只传少数字节的地址,从而节省时空*/ {dt dt1={...};return dt1;} void main() { dt dt2; /*因中介缓冲区的介入,传值时要二次传整体结构内容。*/ dt2=fun(); cout<<dt2...;/*显示dt2中的内容,实为子程序中dt1的内容*/ }
重载(Overload)是C中从未出现过的词汇。在C++中,将含有不同的参数个数和参数类型的一系列同名函数称为重载函数。此种函数族的出现就形成了用同一函数名重复、派生多种不同用途的函数的效应,我们又称这种效应为重载。重载函数具有极高的实用价值。比如要用同一个函数名dsp来显示不同型对象,就可以定义一系列重载函数来实现。重载(Overload)是C中从未出现过的词汇。在C++中,将含有不同的参数个数和参数类型的一系列同名函数称为重载函数。此种函数族的出现就形成了用同一函数名重复、派生多种不同用途的函数的效应,我们又称这种效应为重载。重载函数具有极高的实用价值。比如要用同一个函数名dsp来显示不同型对象,就可以定义一系列重载函数来实现。 例: #include<iostrean.h> void dsp(int i){cout<<"Value is "<<i;} char dsp(char c){cout<<"Character is"<<c;return c;} void dsp(...){...;} 调用时只要给出同一函数名dsp并赋予实参即可,C++系统自动判断出应调重载中的哪个函数