《面向对象的程序设计语言-C》课件-第2章.ppt

上传人:小飞机 文档编号:5033567 上传时间:2023-05-30 格式:PPT 页数:284 大小:639.50KB
返回 下载 相关 举报
《面向对象的程序设计语言-C》课件-第2章.ppt_第1页
第1页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第2页
第2页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第3页
第3页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第4页
第4页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第5页
第5页 / 共284页
点击查看更多>>
资源描述

《《面向对象的程序设计语言-C》课件-第2章.ppt》由会员分享,可在线阅读,更多相关《《面向对象的程序设计语言-C》课件-第2章.ppt(284页珍藏版)》请在三一办公上搜索。

1、1,第2章 C+语言基础,本章是学习C+语言的基础,包括以下几个方面:1结构化程序设计方法与面向对象程序设计方法的各自特点、区别和相互联系。2面向对象的程序设计方法中的有关概念,如类、对象、封装、继承、消息和多态性等。3C+程序的基本组成和框架结构。4掌握C+语言中的基本数据类型、各种运算符、表达式。5C+数据输入流对象cin和输出流对象cout的使用。6程序的3种基本结构7构造数据类型,如数组、结构体、指针等的定义方法、特点和使用方法。7函数的定义、调用及函数调用过程中的参数传递的机理和程序执行流程。8引用的概念及其定义和使用方法。,2,2.1 从面向过程的程序设计到面向对象的程序设计,2.

2、1.1 传统的结构化程序设计(Structured Programming-SP)方法 1使用SP方法设计程序的步骤在数据处理过程中,采用的是自顶向下、分而治之的方法,将整个程序按功能划分为几个可独立编程的子过程模块,每一子模块完成指定的子任务,并且提供一个清晰、严格的调用界面,主过程通过调用各子过程完来成全部处理工作。,3,2SP方法的特点优点:(1)这种程序设计方法力求算法描述准确。(2)对每一子过程模块容易进行程序正确性证明。缺点:(1)这种程序设计方法本质上是面向“过程”的,而“过程”和“操作”又是不稳定和多变的,因此不能直接反映人类求解问题的思路。(2)程序代码可重用性差。程序中除少

3、数标准库函数外,每设计一个程序时,程序员几乎从零做起。即使重用代码,通常也是通过拷贝或编辑重新生成一份。(3)维护程序的一致性困难。该种方法将数据与对数据进行处理的程序代码分离。,2.1 从面向过程的程序设计到面向对象的程序设计,4,2.1.2 面向对象的程序设计(Object-Oriented Programming-OOP)方法 1.面向对象的有关概念 面向对象的程序设计方法强调直接以问题域(现实世界)中的事物为中心来思考和认识问题,并按照这些事物的本质特征把它们抽象为对象,以作为构成软件系统的基础。(1)对象(Object):每个对象都具有属性(Attribute)和方法(Method)

4、这两方面的特征。对象的属性描述了对象的状态和特征,对象的方法说明了对象的行为和功能,并且对象的属性值只应由这个对象的方法来读取和修改,两者结合在一起就构成了对象的完整描述。,2.1 从面向过程的程序设计到面向对象的程序设计,5,(2)类(Class):具有相似属性和行为的一组对象,就称为类。可见,有了类的概念以后,就可以对具有共同特征的事物进行统一描述。(3)封装(Encapsulation):封装把对象的属性和方法看成了一个密不可分的整体,从而使对象能够完整地描述并对应于一个具体事物。(4)继承(Inheritance):将客观事物进行归类是一个逐步抽象的过程,反之,将类进行层层分类便是一个

5、概念逐渐细化的过程。在面向对象的程序设计中,允许在已有类的基础上通过增加新特征而派生出新的类,这称为继承。其原有的类称为基类(base class),而新建立的类称为派生类。,2.1 从面向过程的程序设计到面向对象的程序设计,6,(5)消息(Message):在面向对象的程序设计中,由于对象描述了客观实体,它们之间的联系通过对象间的联系来反映。当一个对象需要另外一个对象提供服务时,它向对方发出一个服务请求,而收到请求的对象会响应这个请求并完成指定的服务。这种向对象发出的服务请求就称为消息。(6)多态性(Polymorphism):多态性是面向对象的另一重要特征。在通过继承而派生出的一系列类中,

6、可能存在一些名称相同,但实现过程和功能不同的方法(Method)。所谓多态性是指当程序中的其他部分发出同样的消息时,按照接收消息对象的不同能够自动执行类中相应的方法。其好处是,用户不必知道某个对象所属的类就可以执行多态行为,从而为程序设计带来更大方便。,2.1 从面向过程的程序设计到面向对象的程序设计,7,2.面向对象的程序设计方法(OOP方法)这种方法将设计目标从模拟现实世界的行为转向了模拟现实世界中存在的对象及其各自的行为。在OOP中,将“对象”作为系统中最基本的运行实体,整个程序即由各种不同类型的对象组成,各对象既是一个独立的实体,又可通过消息相互作用,对象中的方法决定要向哪个对象发消息

7、、发什么消息以及收到消息时如何进行处理等。,2.1 从面向过程的程序设计到面向对象的程序设计,8,3OOP方法的特点(1)OOP以“对象”或“数据”为中心。由于对象自然地反映了应用领域的模块性,因此具有相对稳定性,可以被用作一个组件去构成更复杂的应用,又由于对象一般封装的是某一实际需求的各种成分,因此,某一对象的改变对整个系统几乎没有影响。(2)引入了“类”(class)的概念。类与类以层次结构组织,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上层所有类描述的全部性质,OOP中称这种机制为继承。(3)OOP方法的模块性与继承性,保证了新的应用程序设计可在原有对象的数据类型和功

8、能的基础上通过重用、扩展和细化来进行,而不必从头做起或复制原有代码,这样,大大减少了重新编写新代码的工作量,同时降低了程序设计过程中出错的可能性,达到了事半功倍的效果。,2.1 从面向过程的程序设计到面向对象的程序设计,9,2.1.3 面向对象的程序设计方法与结构化程序设计方法的比较(1)传统的结构化程序设计方法以过程为中心构造应用程序,数据和处理数据的过程代码是分离的、相互独立的实体,设计出的程序可重用代码少,且当代码量增加时维护数据和代码的一致性困难。(2)面向对象程序设计方法中,对象所具有的封装性和继承性使得代码重用成为可能,并大大减少了程序出错的可能性。(3)面向对象方法吸收了结构化程

9、序设计方法的优点,同时引入了新概念、新机制并建立了比传统方法更高层次的抽象。,2.1 从面向过程的程序设计到面向对象的程序设计,10,2.2.1 从C语言到C+语言 C语言以其如下独有的特点风靡了全世界:(1)语言简洁、紧凑,使用方便、灵活。C语言只有32个关键字,程序书写形式自由。(2)丰富的运算符和数据类型。(3)可以直接访问内存地址,能进行位操作,使其能够胜任开发操作系统的工作。(4)生成的目标代码质量高,程序运行效率高。(5)可移植性好。,2.2 C+程序的基本组成,11,2.2 C+程序的基本组成,局限性:(1)数据类型检查机制相对较弱,这使得程序中的一些错误不能在编译阶段被发现。(

10、2)C本身几乎没有支持代码重用的语言结构,因此一个程序员精心设计的程序,很难为其它程序所用。(3)当程序的规模达到一定程度时,程序员很难控制程序的复杂性。,12,2.2 C+程序的基本组成,C+包含了整个C,C是建立C+的基础。C+包括C的全部特征和优点,同时添加了对面向对象编程(OOP)的完全支持。1980年,贝尔实验室的Bjarne Stroustrup开始对C进行改进和扩充。1983年正式命名为C+。在经历了3次C+修订后,1994年制定了ANSI C+标准的草案。以后又经过不断完善,成为目前的C+。C+仍在不断发展中。美国微软公司现已准备推出C#(C Sharp)语言,来代替C+语言。

11、,13,2.2.2 C+程序的结构与基本组成 一个简单的C+程序,是由若干个函数构成的,其中有且仅有一个名称为main的函数存在,下图说明了C+程序的基本框架结构:,2.2 C+程序的基本组成,14,1声明区 声明区处在程序文件的所有函数的外部。(1)包含头文件:如#include iostream.h(2)宏定义:如#define PI 3.1415926(3)类定义:如class name;(4)结构体定义:如struct record;(5)函数声明:如void print();(6)全局变量声明:如float H=2.58;(7)条件编译:如#ifdef等。,2.2 C+程序的基本组成

12、,15,2主程序区主程序以main()函数开始,是整个程序运行的入口,该函数中可能包含的内容主要有:(1)局部变量的声明:如:int i=1;(2)函数调用:如:y=sin(x);(3)一般运算:如:a=b+c+d/3;(4)结构控制:如:if(ab)c=a;(5)对象与结构的处理。(6)文件的处理等。,2.2 C+程序的基本组成,16,图2.3 C+函数的组成 4程序举例,2.2 C+程序的基本组成,3函数定义区 程序中除了main函数之外,还可以包含其它的函数,每个函数是由函数说明和函数体两部分构成的。如图2.3所示:,17,2.2 C+程序的基本组成,18,上例程序结构可写为如下程序:【

13、例2-1】一个简单的C+程序。/This is first C+program/*C语言的某些特征仍可沿用*/#include iostream.h#include stdio.hvoid print();/函数声明void main()int i;char s80;,2.2 C+程序的基本组成,19,print();couts;couti;/验证结果couts is i years old.;void print()printf(printf is also can be usedn);,2.2 C+程序的基本组成,20,从上例可以看出:(1)C语言中原有的规则和语句在C+中仍可继续使用,但

14、C+又增添了很多新的风格。(2)一个C+的程序是由一到若干个函数构成的,但其中必须有且仅有一个名称为main的函数存在。(3)不管一个程序中有多个函数,只有main函数整个程序运行时的入口,程序运行时从此函数开始执行。但在程序中,main函数所处的位置可以任意。(4)一个C+的函数是由两部分构成的,即函数的说明部分和函数体,函数的说明部分包括了函数的返回值的类型、函数的名称、圆括号、形参及形参的类型说明。函数体由一对大括号括起来,其内容是由若干条语句,2.2 C+程序的基本组成,21,构成,函数体的内容决定了该函数的功能。(5)C+对程序中的名称是大小写“敏感”的,除特殊情况下,应一律小写。(

15、6)程序中的注释:可以用/*/或/(单行注释)对程序中的内容进行注释。二者的区别在于,采用/*/方法时,注释可以写成多行,而采用/方法时,注释只能写成一行,它可单独占一行,也可写在某行程序代码的末尾。(7)数据输出:除了使用printf()函数,还可使用功能更强大、更方便的cout对象进行输出数据。格式如下:cout数据1 数据2 数据n 如:上例中的语句couts“is”i“years old.”;表示同时输出了变量s的值、字符串“is”、变量i的值和字符,2.2 C+程序的基本组成,22,串“years old.”(8)数据输入:除了使用scanf()函数,还可使用功能更强大、更方便的ci

16、n对象进行数据输入。格式如下:cin变量1变量2变量n如:上例中的语句cins;表示给变量s输入一个值(9)在分别使用cout和cin进行数据的输出和输入时,需要在程序的开头嵌入”iostream.h”文件。在该头文件中定义了输入输出流对象cout和cin等。(10)一个C+的源程序文件在存盘时,要以.CPP为文件名后缀,而不是.C。,2.2 C+程序的基本组成,23,2.3 C+数据类型、运算符和表达式,2.3.1 数据类型(1)预定义数据类型(基本数据类型)。包括字符型、整型、浮点型、无值型四种,其中浮点型又分为单精度浮点型和双精度浮点型两种。(2)构造数据类型,包括数组、结构体、共用体(

17、联合)、枚举、类等。本节重点介绍C+的基本数据类型,有关构造数据类型将在后面章节进行介绍。,24,2.3.1.1 基本数据类型,2.3 C+数据类型、运算符和表达式,25,2.3.1.2 类型修饰符C+还允许在基本数据类型(除void类型外)前加上类型修饰符,来更具体地表示数据类型。C+的类型修饰符包括:signed 有符号unsigned无符号short短型long长型,2.3 C+数据类型、运算符和表达式,26,表2.2 C+的基本数据类型,27,表2.2 C+的基本数据类型,28,说明:(1)表中带 的部分表示是可以省略的,如short int可以写为short int 或简写为shor

18、t,二者的含义是相同的。(2)四种修饰符都可以用来修饰整型和字符型。用signed修饰的类型的值可以为正数或负数,用unsigned修饰的类型的值只能为正数。(3)用short修饰的类型,其值一定不大于对应的整数,用long修饰的类型,其值一定不小于对应的整数。,2.3 C+数据类型、运算符和表达式,29,2.3 C+数据类型、运算符和表达式,2.3.1.3 常量在C+语言中,数据分为常量和变量两大类。由于程序中的数据是有类型的,所以常量和变量都是有类型之分的。常量按照不同的数据类型可以分为:字符型常量、整型常量、浮点型常量,以及字符串常量等。程序是根据程序中常量的书写格式来区分它是哪种类型常

19、量的。,30,1.整型常量在程序中书写整型常量时,没有小数部分。用户可根据需要分别可以用十进制、八进制和十六进制的形式书写:十进制格式:由数字0至9和正、负号组成,书写时直接写出数字,如:123,-516,+1000等。八进制格式:以数字0开头的数字(0至7)序列,0111,010007,0177777等。十六进制格式:以0 x或0X开头的数字(数字0至9、字母a至z)序列,如0 x78AC,0 xFFFF等。,2.3 C+数据类型、运算符和表达式,31,2.浮点型常量只能用十进制来表示。可以用小数或指数形式表示,不分单精度和双精度类型。如:34.5,.345,1.5e-33.字符型常量(1)

20、用一对单引号括起来的一个字符,单引号只是字符与其他部分的分割符,不是字符的一部分,并且,不能用双引号代替单引号。在单引号中的字符不能是单引号或反斜杠。如:a,A,#合法的字符常量,非法的字符常量“A”不代表字符常量(2)另一种表示字符常量的方法是使用转义字符。C+规定,采用反斜杠后跟一个字母来代表一个控制字符,具有新的含义。,2.3 C+数据类型、运算符和表达式,32,C+中常用的转义字符,2.3 C+数据类型、运算符和表达式,33,4.字符串常量 用一对双引号括起来的一个或多个字符的序列称为字符串常量或字符串。字符串以双引号为定界符,双引号不作为字符串的一部分。如:“Hello”,“Good

21、 Morning!”,“I say:“Goodbye!”字符串中的字符数称为该字符串的长度,在存储时,系统自动在字符串的末尾加以字符串结束标志,即转义字符 0。5.符号常量 常量也可用一个标识符来代表,称为符号常量。如:#define PRICE 30main(),2.3 C+数据类型、运算符和表达式,34,使用符号常量应注意以下几个方面:(1)它不同于变量,在作用域内其值不能改变和赋值。如:在上例中如再用PRICE=40;这一语句进行赋值则是错误的。(2)符号常量名一般用大写,而变量名用小写,以示区别。6.程序中常量的表示方法在程序中的常量有以下三种表示方法:(1)在程序中直接写入常量如:-

22、200,3.4E-10,A,1,0 x120,045,5.35,1000l int i;char s;float f;i=20;s=a;f=2.0;,2.3 C+数据类型、运算符和表达式,35,(2)利用#define定义宏常量一般格式:#define 宏名 常数如:#define PI 3.14 s=2*PI*r;(3)利用const定义正规常数 一般格式:const数据类型标识符 常数名=常量值;说明:const必须放在被修饰类型符和类型名前面 数据类型是一个可选项,用来指定常数值的数据类型,如果省略了该数据类型,那么编译程序认为它是 int 类型,2.3 C+数据类型、运算符和表达式,3

23、6,如:const int a=10;表示定义了一个初始值为10的整型常量,它在程序中不可改变,但可用于表达式的计算中,2.3.1.4 变量1变量的概念及特点每一变量就相当于一个容器,对应着计算机内存中的某一块存储单元,用于存储程序中的数据。变量的值具有以下两个特点:(1)“一充即无”:即将一个新数据存放到一个变量中时,该变量中原来的值消失,变量的值变成了新值。如:执行完语句int i;i=10;i=20;后i的值为20,而不是10。,2.3 C+数据类型、运算符和表达式,37,(2)“取之不尽”:可将某个变量的值与程序中的其它数据进行各种运算,在运算过程中,如果没有改变该变量的值时,那么,不

24、管用该变量的值进行多少次运算,其值始终保持不变。如:语句int i,j,k;i=10;j=i+10;k=i+j*5;其中,i的值可无限制地多次使用,但它的值始终保持值10,因为在程序中没有改变变量i的值。2定义变量 程序中的每一变量,都要先定义,后使用。定义变量的一般有以下三种格式:数据类型标识符 变量名;数据类型标识符 变量名=初始化值;,2.3 C+数据类型、运算符和表达式,38,数据类型标识符 变量名1=初始值1,变量名2=初始值2,;如:char a;/定义字符型变量aint i=1000;/定义整型变量i,i的初始值为1000;float a=2,b=3,c;/定义浮点型变量 a、b

25、、c,且a、b的 初始值分别为2、3。变量名是每个变量的名称,其命名遵循以下规则:(1)由字母、数字和下划线(_)三类符号排列组合形成,且开头字符必须是字母或下划线。(2)名称中字符的最大个数是31个。(3)C+中区分变量名的大小写。,2.3 C+数据类型、运算符和表达式,39,(4)变量名不能和C+中的关键字同名,也不能和用户编制的函数或C+库函数同名。如:int,double或static都不能作为变量名。(5)变量名尽量做到“见名知意”。3定义变量的位置 在程序中的不同位置采用不同的变量定义方式,决定了该变量具有不同的特点。变量的定义一般可有以下三种位置:(1)在函数体内部 在函数体内部

26、定义的变量称为局部变量,这种局部变量只在进入定义它的函数体时起作用,离开该函数体后该变量就消失(被释放),即不再起作用。因此,不同函数体内部可以定义相同名称的变量,而互不干扰。如:,2.3 C+数据类型、运算符和表达式,40,void func1(void)int y;y=2;void func2(void)int y;y=-100;在本例中,函数func1和func2的函数体内部都分别定义了变量y,但它们都只能在各自的函数体内起作用,都是局部变量。,2.3 C+数据类型、运算符和表达式,41,(2)形式参数 当定义一个有参函数时,函数名后面括号内的变量,统称为形式参数。如:int is_in

27、(char*a,char b)while(*a)if(*a=b)return 1;else a+;return 0;本例中,函数名is_in后面括号内的变量a和b是该函数的形式参数,它们都只能在该函数体内起作用,是该函数的局部变量。,2.3 C+数据类型、运算符和表达式,42,(3)全局变量:在所有函数体外部定义的变量,其作用范围是整个程序,并在整个程序运行期间有效。如:#include“stdio.h”int count;/定义count变量是全局变量void func1(void);void func2(void);int main()count=10;func1();return 0;,

28、2.3 C+数据类型、运算符和表达式,43,void func1(void)int temp;temp=count;func2();printf(“count is%d”,count);/输出10void func2(void)int count;for(count=1;count10;count+)putchar(.);,2.3 C+数据类型、运算符和表达式,44,2.3.2 运算符和表达式 程序中对数据进行的各种运算是由运算符来决定的,不同运算符的运算方法和特点是不同的,从此可以看出,一个运算式子中要涉及到数据及运算符,而运算符是对数据进行指定操作,并产生新值的特殊符号。2.3.2.1 算

29、术运算符和算术表达式 算术运算符就是对数据进行算术运算,如:加、减、乘、除等,是在程序中使用最多的一种运算符,C+的算术运算符如表2.4所示。,2.3 C+数据类型、运算符和表达式,45,表2.4 C+的算术运算符,算术表达式是指由算术运算符、括号将常量、变量、函数、圆括号等连接形成的一个有意义的式子。如:,46,(1+x)/(3*x)(2*x-3)*x+2)*x)-53.14*sqrt(r)b*b-4.0*a*c注意:(1)表达式中的括号不管有多少层,一律使用圆括号。(2)在将一个数学上的运算式子写成对应的C+的表达式时,要注意进行必要的转换。乘号不能省略。数学表达式中出现的数学运算函数要用

30、C+提供的对应的数学运算库函数来代替。,2.3 C+数据类型、运算符和表达式,47,要特别注意表达式中两个整型数相除的情况。如:有一数学表达式为2/3(f-32),要写成对应的C+的表达式时,正确地写法应写2.0/3.0*(f-32)。而不是2/3*(f-32)2.3.2.2 赋值运算符和赋值表达式 赋值运算符的功能将某个数据的值赋给某个变量。赋值运算符的用法格式:变量名 赋值运算符 常量、变量或表达式说明:(1)被赋值的目标,即赋值运算符左边的量必须是变量,而不能是常量或表达式。,2.3 C+数据类型、运算符和表达式,48,(2)C+中的赋值运算符如表2.5所示。(3)要注意区分赋值运算符“

31、=”与数学上的“等号”间的区别,如:int x,y;/定义变量x,y为int类型变量x=10;/将变量x赋成值10,2.3 C+数据类型、运算符和表达式,49,x=x+20;/将x的值在原值(10)的基础上再加上值20后(结果为30)赋给变量xy-=x+5;/等价于y=y-(x+5);右边表达式的值为30-(31+5)=-6,y被赋成值-6x%=y+10;/等价于x=x%(y+10);右边表达式的值为31%(-6+10)=3,y被赋成值32.3.2.3 sizeof运算符 sizeof运算符功能是求某一数据类型或某一变量在内存中所占空间的字节数。其使用的一般形式:sizeof(变量名或数据类型

32、)或sizeof 变量名或数据类型如:,2.3 C+数据类型、运算符和表达式,50,#include void main()short int aShort;int anInt;long aLong;char aChar;float aReal;coutdata typetmemory used(bytes);coutnshort inttsizeof(aShort);coutninteger tsizeof(anInt);coutnLong integertsizeof(aLong);coutnchar achart sizeof(aChar);coutnfloat tsizeof(aRea

33、l);,2.3 C+数据类型、运算符和表达式,51,其输出结果为:data type memory used(bytes)short int 2integer 4Long integer 4char achar 1float 4 2.3.2.4 关系运算符和关系表达式 关系运算符就是对两个量之间进行比较的运算符,如表2.6所示。,2.3 C+数据类型、运算符和表达式,52,由关系运算符将两个表达式连接形成的运算式子是关系表达式,一个关系表达式的值是一个逻辑值,当为真时,值为1,为假时,值为0。如:假设a=1,b=20,c=3,则ab表达式成立,其值为1b=c表达式不成立,其值为0(a+b)!=

34、c表达式成立,其值为1,2.3 C+数据类型、运算符和表达式,53,注意:在对两个表达式的值进行是否相等的比较时,要用运算符“=”,而不能写成“=”。2.3.2.5 逻辑运算符和逻辑表达式 逻辑运算符是对两个逻辑量间进行运算的运算符,如表2.7所示。,2.3 C+数据类型、运算符和表达式,54,由逻辑运算符将两个表达式连接形成的式子叫逻辑表达式。各种逻辑运算的“真值表”如表2.8所示。对于参加逻辑运算的操作数,系统认为“非0”为真,“0”为假。而逻辑表达式的结果只能为逻辑真(1)或逻辑假(0)。表2.8 逻辑运算真值表,2.3 C+数据类型、运算符和表达式,55,注意:(1)C或C+中在给出一

35、个逻辑表达式的最终计算结果值时,用1表示真,用0表示假。但在进行逻辑运算的过程中,凡是遇到非零值时就当真值参加运算,遇到0值时就当假值参加运算。如:int a=10,b=15,c=14;则(a+6)则表达式i&(i=0)&(+i)的值为0(假),该表达式运算结束后,变量i的值为0,而不是1。,2.3 C+数据类型、运算符和表达式,56,a|b|c 只要a为真,就不必须判断b和c;只有a为假,才判别b;a和b 都为假才判别c。如:int i=1,j;则表达式i+|i+|i+的值为1(真),运算结束后,变量i的值为2,而不是4。对于数学上的表示多个数据间进行比较的表达式,在C或C+中要拆写成多个条

36、件并用逻辑运算符连接形成一个逻辑表达式。如:在数学上,要表示一个变量a的值处于-1和-9之间时,可以用-9-9&a-9&a-1的形式。,2.3 C+数据类型、运算符和表达式,57,2.3.2.6 条件运算符在C+中只提供了一个三目运算符即条件运算符“?:”,其一般形式为:表达式1?表达式2:表达式3条件运算的规则是:首先判断表达式1的值,若其值为真(非0),则取表达式2的值为整个表达式的值;若其值为假(0),则取表达式3的值为整个表达式的值。如:若a=3,b=4,则条件表达式ab?a:b的值为4。2.3.2.7 位运算符1位运算符及其运算规则 所谓位运算符是指能进行二进制位运算的运算符。C+提

37、供的位运算符如表2.9所示。,2.3 C+数据类型、运算符和表达式,58,位运算的运算规则为:(1)按位与&:两个运算量相应的位都是1,则该位的结果值为1,否则为0;(2)按位或|:两个运算量相应的位只要有一个是1,则该位的结果值为1,否则为0;,2.3 C+数据类型、运算符和表达式,59,(3)按位异或:两个运算量相应的位不同,则该位的结果值为1,否则为0;(4)按位取反:将运算量的每一位取反。(5)按位左移:将操作数中的每一位向右移动指定的位数,移出的位被舍弃,空出的位补0或补符号位。如:a=5,b=6,则:a00000101 00000101 00000101b&00000110 000

38、00110 00000110 0000011000000100000001110000001111111001即:a&b=4,a|b=7,ab=3,b=249。,2.3 C+数据类型、运算符和表达式,60,2复合位运算符 位运算符与赋值运算符结合可以形成复合位运算符,如表2.10所示。2.3.2.8 强制类型转换运算符 该运算符的功能是将某一数据从一种数据类型向另一,2.3 C+数据类型、运算符和表达式,61,种数据类型进行转换。其使用的一般形式:数据类型标识符(表达式)(数据类型标识符)表达式如:int i=2;float a,b;a=float(i);/将变量i的类型强制转换为浮点型,并将

39、其值赋给变量ab=(float)i;/将变量i的类型强制转换为浮点型,并将其值赋给变量b2.3.2.9 逗号运算符 逗号运算符的运算优先级是最低的。一般形式为:表达式1,表达式2,表达式N,2.3 C+数据类型、运算符和表达式,62,在计算逗号表达式的值时,按从左至右的顺序依次分别计算各个表达式的值,而整个逗号表达式的值和类型是由最右边的表达式决定。如:有语句int a=3,b=4;则表达式a+,b+,a+b的值为9。再如:设有int i;则表达式i=1,i+=2?i+1:i+4的值为6。2.3.2.10 运算符的优先级与结合性 每个运算符都有自己优先级和结合性。当一个表达式中包含多个运算符时

40、,要确定运算的结果,必须首先确定运算的先后顺序,即运算符的优先级和结合性。C+中运算符的优先级和结合性如表2.11所示。,2.3 C+数据类型、运算符和表达式,63,表2.11 C+中运算符的优先级和结合性,64,2.4 数据的输入与输出,在C+语言中,数据的输入和结果的输出是分别使用系统所提供的输入流对象cin和输出流对象cout来完成的。在使用过程中,只要在程序的开头嵌入相应的头文件“iostream.h”即可。2.4.1 数据的输出cout 输出流对象输出数据的语句格式为:cout数据1数据2数据n;说明:(1)cout是系统预定义的一个标准输出设备(一般代表显示器);“”是输出操作符,

41、用于向cout输出流中插入数据。(2)cout的作用是向标准输出设备上输出数据,被输出的数据可以是常量、已有值的变量或是一个表达式。,65,如:#include#include void main()float a=3,b=4;cout The result is:;coutsqrt(a*a+b*b);该程序的输出结果为:The result is:5(3)可以在cout输出流中插入C+中的转义字符。如:cout the value of a:n;couta;,2.4 数据的输入与输出,66,表示输出完字符串Input the value of a:后,在下一行输出变量a的值。(4)可以将多个

42、被输出的数据写在一个cout中,各输出项间用“”操作符隔开即可,但要注意cout首先按从右向左的顺序计算出各输出项的值,然后再输出各项的值。如:cout value of a:a value of b:b The result is:sqrt(a*a+b*b);再如:设变量i的值为10,则couti,i+,i+;的输出结果为:12,11,10(5)一个cout语句也可拆成若干行书写,但注意语句结束符“;”只能写在最后一行上。如:对于上面的语句也可写成如下形式:,2.4 数据的输入与输出,67,cout value of a:/注意行末无分号 a value of b:b The result

43、is:sqrt(a*a+b*b);/在此处书写分号(6)在cout中,实现输出数据换行功能的方法:既可使用转义字符“n”,也可使用表示行结束的流操作子endl。如:coutThis is first Line.nThis is second line.;上面语句可等价地写为:coutThis is first Line.endlThis is second line.;,2.4 数据的输入与输出,68,(7)在cout中还可以使用流控制符控制数据的输出格式,但使用这些流控制符时,要在程序的头上嵌入头文件#include。常用的流控制符及其功能如表2.12所示。表2.12 I/O流的常用控制符,

44、2.4 数据的输入与输出,69,2.4 数据的输入与输出,70,2.4 数据的输入与输出,设置域宽:所谓域宽就是被输出数据所占的输出宽度(单位是字符数)。设置域宽可以使用流控制符setw(n)和cout的方法cout.width(n)其中n为正整数,表示域宽。但是,cout.width(n)和setw(n)二者都只对下一个被输出的数据有作用,若一个输出语句内有多个被输出的数据,而要保持一定格式域宽时,需要在每一输出数据前加上cout.width(n)或setw(n)。此外,当参数n的值比实际被输出数据的宽度大时,则在给定的域宽内,数据靠右输出,不足部分自动填充空格符;若被输出数据的实际宽度比n

45、值大时,则数据所占的实际位数输出数据,设置域宽的参数n不再起作用。,71,【例2-2】cout流控制符setw的使用。#include#include void main()int a=21,b=999;coutsetw(3)asetw(4)asetw(5)aendl;coutsetw(3)bsetw(4)bsetw(5)bendl;coutsetw(3)a+bsetw(4)a+bsetw(5)a+bendl;其输出结果是:21 21 21/程序中第一个cout的输出结果999999 999/程序中第二个cout的输出结果102010201020/程序中第三个cout的输出结果,2.4 数据的

46、输入与输出,72,设置域内填充字符:在默认情况下,当被输出的数据未占满域宽时,会自动在域内靠左边填充相应个数的空格符。但我们也可以设置在域内填充其他的字符,方法是利用cout的fill方法cout.fill(c)或setfill(c)。cout.fill(c)上和 setfill(c)可以对所有被输出的数据起作用。【例2-3】在例2-2的基础上增加域内填充字符的功能。#include“iostream.h”#include“iomanip.h”void main()int a=21,b=999;cout.fill(#);/设置域内填充字符为#字符 coutsetw(3)asetw(4)aset

47、w(5)aendl;,2.4 数据的输入与输出,73,coutsetw(3)bsetw(4)bsetw(5)bendl;cout.fill(%);/将域内填充字符改为%字符 coutsetw(3)a+bsetw(4)a+bsetw(5)a+bendl;其输出结果是:#21#21#21/程序中第一个cout的输出结果,未占 满域宽的部分填充#字符。999#999#999/程序中第二个cout的输出结果10201020%1020/程序中第三个cout的输出结果,未占满 域宽的部分填充%字符。,2.4 数据的输入与输出,74,当采用流控制符设置填充字符时,上面程序代码也可等价地改为:#include

48、#include void main()inta=21,b=999;coutsetw(3)setfill(#)asetw(4)asetw(5)aendl;coutsetw(3)bsetw(4)bsetw(5)bendl;coutsetw(3)setfill(%)a+bsetw(4)a+bsetw(5)a+bendl;,2.4 数据的输入与输出,75,设置输出数据的进位计数制:在默认情况下,被输出的数据按十进制格式输出。但可以使用流控制符hex和oct控制数据的输出格式为十六进制和八进制,一旦设置成某种进位计数制后,数据的输出就以该种数制为主,可利用流控制符dec将数制重新成十进制。【例2-4】

49、在例2-2的基础上增加域内填充字符的功能。#include#include void main()int a=21,b=999;/设置以十六制格式输出数据,2.4 数据的输入与输出,76,coutsetw(3)setfill(#)hexasetw(4)asetw(5)aendl;coutsetw(3)bsetw(4)bsetw(5)bendl;coutsetw(3)setfill(%)a+bsetw(4)a+bsetw(5)a+bendl;/设置以八制格式输出数据coutsetw(3)setfill(#)octasetw(4)asetw(5)aendl;coutsetw(3)bsetw(4)b

50、setw(5)bendl;coutsetw(3)setfill(%)a+bsetw(4)a+bsetw(5)a+bendl;/设置以十制格式输出数据coutsetw(3)setfill(#)decasetw(4)asetw(5)aendl;coutsetw(3)bsetw(4)bsetw(5)bendl;coutsetw(3)setfill(%)a+bsetw(4)a+bsetw(5)a+bendl;,2.4 数据的输入与输出,77,程序的输出结果为:#15#15#15/以十六进制格式输出数据3e7#3e7#3e73fc%3fc%3fc#25#25#25/以八进制格式输出数据17471747#

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号