面向对象的程序设计语言——C》课件--第2章.ppt_第1页
面向对象的程序设计语言——C》课件--第2章.ppt_第2页
面向对象的程序设计语言——C》课件--第2章.ppt_第3页
面向对象的程序设计语言——C》课件--第2章.ppt_第4页
面向对象的程序设计语言——C》课件--第2章.ppt_第5页
已阅读5页,还剩279页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

返回 第2章 C+语言基础 本章是学习C+语言的基础,包括以下几个方面: 1结构化程序设计方法与面向对象程序设计方法的各自特点 、区别和相互联系。 2面向对象的程序设计方法中的有关概念,如类、对象、封 装、继承、消息和多态性等。 3C+程序的基本组成和框架结构。 4掌握C+语言中的基本数据类型、各种运算符、表达式。 5C+数据输入流对象cin和输出流对象cout的使用。 6程序的3种基本结构 7构造数据类型,如数组、结构体、指针等的定义方法、特 点和使用方法。 7函数的定义、调用及函数调用过程中的参数传递的机理和 程序执行流程。 8引用的概念及其定义和使用方法。 1 返回 2.1 从面向过程的程序设计到面向对象的程序设计 2.1.1 传统的结构化程序设计(Structured Programming- -SP)方法 1使用SP方法设计程序的步骤 在数据处理过程中,采用的是自顶向下、分而治之的 方法,将整个程序按功能划分为几个可独立编程的子 过程模块,每一子模块完成指定的子任务,并且提供 一个清晰、严格的调用界面,主过程通过调用各子过 程完来成全部处理工作 。 数据声明数据处理结果输出 2 返回 2SP方法的特点 优点: (1)这种程序设计方法力求算法描述准确。 (2)对每一子过程模块容易进行程序正确性证明。 缺点: (1)这种程序设计方法本质上是面向“过程”的,而“ 过程”和“操作”又是不稳定和多变的,因此不能直 接反映人类求解问题的思路。 (2)程序代码可重用性差。程序中除少数标准库函数外 ,每设计一个程序时,程序员几乎从零做起。即使重 用代码,通常也是通过拷贝或编辑重新生成一份。 (3)维护程序的一致性困难。该种方法将数据与对数据 进行处理的程序代码分离。 2.1 从面向过程的程序设计到面向对象的程序设计 3 返回 2.1.2 面向对象的程序设计(Object-Oriented Programming -OOP)方法 1. 面向对象的有关概念 面向对象的程序设计方法强调直接以问题域(现实世 界)中的事物为中心来思考和认识问题,并按照这些 事物的本质特征把它们抽象为对象,以作为构成软件 系统的基础。 (1)对对象(Object):每个对象都具有属性( Attribute)和方法(Method)这两方面的特征。对象 的属性描述了对象的状态和特征,对象的方法说明了 对象的行为和功能,并且对象的属性值只应由这个对 象的方法来读取和修改,两者结合在一起就构成了对 象的完整描述。 2.1 从面向过程的程序设计到面向对象的程序设计 4 返回 (2)类(Class):具有相似属性和行为的一组对象, 就称为类。可见,有了类的概念以后,就可以对具有 共同特征的事物进行统一描述。 (3)封装(Encapsulation):封装把对象的属性和方 法看成了一个密不可分的整体,从而使对象能够完整 地描述并对应于一个具体事物 。 (4)继承(Inheritance):将客观事物进行归类是一 个逐步抽象的过程,反之,将类进行层层分类便是一 个概念逐渐细化的过程。 在面向对象的程序设计中,允许在已有类的基础上通过 增加新特征而派生出新的类,这称为继承。其原有的 类称为基类(base class),而新建立的类称为派生 类。 2.1 从面向过程的程序设计到面向对象的程序设计 5 返回 (5)消息(Message):在面向对象的程序设计中,由 于对象描述了客观实体,它们之间的联系通过对象间 的联系来反映。当一个对象需要另外一个对象提供服 务时,它向对方发出一个服务请求,而收到请求的对 象会响应这个请求并完成指定的服务。这种向对象发 出的服务请求就称为消息。 (6)多态性(Polymorphism):多态性是面向对象的另 一重要特征。在通过继承而派生出的一系列类中,可 能存在一些名称相同,但实现过程和功能不同的方法 (Method)。 所谓多态性是指当程序中的其他部分发出同样的消息 时,按照接收消息对象的不同能够自动执行类中相应 的方法。其好处是,用户不必知道某个对象所属的类 就可以执行多态行为,从而为程序设计带来更大方便 。 2.1 从面向过程的程序设计到面向对象的程序设计 6 返回 2. 面向对象的程序设计方法(OOP方法) 这种方法将设计目标从模拟现实世界的行为转向了模 拟现实世界中存在的对象及其各自的行为。 在OOP中,将“对象”作为系统中最基本的运行实体, 整个程序即由各种不同类型的对象组成,各对象既是 一个独立的实体,又可通过消息相互作用,对象中的 方法决定要向哪个对象发消息、发什么消息以及收到 消息时如何进行处理等。 2.1 从面向过程的程序设计到面向对象的程序设计 方法 数据 消息 消息 7 返回 3OOP方法的特点 (1)OOP以“对象”或“数据”为中心。由于对象自然地反映了应 用领域的模块性,因此具有相对稳定性,可以被用作一个组件去 构成更复杂的应用,又由于对象一般封装的是某一实际需求的各 种成分,因此,某一对象的改变对整个系统几乎没有影响。 (2)引入了“类”(class)的概念。类与类以层次结构组织,属 于某个类的对象除具有该类所描述的特性外,还具有层次结构中 该类上层所有类描述的全部性质,OOP中称这种机制为继承。 (3)OOP方法的模块性与继承性,保证了新的应用程序设计可在原 有对象的数据类型和功能的基础上通过重用、扩展和细化来进行 ,而不必从头做起或复制原有代码,这样,大大减少了重新编写 新代码的工作量,同时降低了程序设计过程中出错的可能性,达 到了事半功倍的效果。 2.1 从面向过程的程序设计到面向对象的程序设计 8 返回 2.1.3 面向对象的程序设计方法与结构化程序设计方法 的比较 (1)传统的结构化程序设计方法以过程为中心构造应用 程序,数据和处理数据的过程代码是分离的、相互独 立的实体,设计出的程序可重用代码少,且当代码量 增加时维护数据和代码的一致性困难。 (2)面向对象程序设计方法中,对象所具有的封装性和 继承性使得代码重用成为可能,并大大减少了程序出 错的可能性。 (3)面向对象方法吸收了结构化程序设计方法的优点, 同时引入了新概念、新机制并建立了比传统方法更高 层次的抽象。 2.1 从面向过程的程序设计到面向对象的程序设计 9 返回 2.2.1 从C语言到C+语言 C语言以其如下独有的特点风靡了全世界: (1)语言简洁、紧凑,使用方便、灵活。C语言只有32 个关键字,程序书写形式自由。 (2)丰富的运算符和数据类型。 (3)可以直接访问内存地址,能进行位操作,使其能够 胜任开发操作系统的工作。 (4)生成的目标代码质量高,程序运行效率高。 (5)可移植性好。 2.2 C+程序的基本组成 10 返回 2.2 C+程序的基本组成 局限性: (1)数据类型检查机制相对较弱,这使得程序中的一些 错误不能在编译阶段被发现。 (2)C本身几乎没有支持代码重用的语言结构,因此一个 程序员精心设计的程序,很难为其它程序所用。 (3)当程序的规模达到一定程度时,程序员很难控制程 序的复杂性。 11 返回 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+语言。 12 返回 2.2.2 C+程序的结构与基本组成 一个简单的C+程序,是由若干个函数构成的,其中有 且仅有一个名称为main的函数存在,下图说明了C+程序 的基本框架结构: 2.2 C+程序的基本组成 声 明 区 #include : 函数声明 定义全局变量 主 程 序 区 类型 main(参数行) 程序主体; 函 数 定 义 区 函数定义 函数主体; 13 返回 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+程序的基本组成 14 返回 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+程序的基本组成 15 返回 图2.3 C+函数的组成 4程序举例 2.2 C+程序的基本组成 函 数 定 义 区 函数说明int max(int a,int b) 函数体 int c; c=a+b; return(c); 3函数定义区 程序中除了main函数之外,还可以包含其它的函数, 每个函数是由函数说明和函数体两部分构成的。如图2.3 所示: 16 返回 2.2 C+程序的基本组成 声 明 区 #include “iostream.h“ #include “stdio.h“ void print(); /函数声明 主 程 序 区 void main() int i; char s80; print( ); couts; couti; couts; couti; /验证结果 cout变量1变量2变量n 如:上例中的语句cins;表示给变量s输入一个值 (9) 在分别使用cout和cin进行数据的输出和输入时 ,需要在程序的开头嵌入”iostream.h”文件。在该 头文件中定义了输入输出流对象cout和cin等。 (10) 一个C+的源程序文件在存盘时,要以.CPP为文 件名后缀,而不是.C。 2.2 C+程序的基本组成 22 返回 2.3 C+数据类型、运算符和表达式 2.3.1 数据类型 (1)预定义数据类型(基本数据类型)。包括字符型 、整型、浮点型、无值型四种,其中浮点型又分为单 精度浮点型和双精度浮点型两种。 (2)构造数据类型,包括数组、结构体、共用体(联 合)、枚举、类等。 本节重点介绍C+的基本数据类型,有关构造数据 类型将在后面章节进行介绍。 23 返回 2.3.1.1 基本数据类型 2.3 C+数据类型、运算符和表达式 数据类型关键字字节数数值范围 字符型char 1 -128127 整 型int 4 -21474836482147483647 单精度浮点型float 4 (3.4E-383.4E38) 双精度符点型double 8 (1.7E-3081.7E308 无值型void 0 valueless 24 返回 2.3.1.2 类型修饰符 C+还允许在基本数据类型(除void类型外)前加上类 型修饰符,来更具体地表示数据类型。C+的类型修饰 符包括: signed 有符号 unsigned无符号 short短型 long长型 2.3 C+数据类型、运算符和表达式 25 返回 数据类型标识符 字节数 数值范围常量写法举例 Char 1 -128127A, 0,n signed char 1 -12812756 unsigned char 1 0255100 short int 2 -3276832767100 signed short int 2 -3276832767-3456 unsigned short int 2 0655350xff int 4 -2147483648 2147483647 1000 signed int 4 -2147483648 2147483647 -123456 unsigned int 4 042949672950xffff 表2.2 C+的基本数据类型 26 返回 数据类型标识符字节数数值范围常量写法举例 long int4-2147483648 2147483647 -123456 signed long int4-2147483648 2147483647 -3246 unsigned long int 404294967295123456 float 4(3.4E-383.4E38)2.35, -53.231 ,3E-2 Double8(1.7E-3081.7E308)12.354,-2.5E10 long double10(1.2E-4932 1.2E4932) 8.5E-300 表2.2 C+的基本数据类型 27 返回 说明: (1)表中带 的部分表示是可以省略的,如short int可 以写为short int 或简写为short,二者的含义是相同的。 (2)四种修饰符都可以用来修饰整型和字符型。用signed 修饰的类型的值可以为正数或负数,用unsigned修饰的类 型的值只能为正数。 (3)用short修饰的类型,其值一定不大于对应的整数, 用long修饰的类型,其值一定不小于对应的整数。 2.3 C+数据类型、运算符和表达式 28 返回 2.3 C+数据类型、运算符和表达式 2.3.1.3 常量 在C+语言中,数据分为常量和变量两大类。 由于程序中的数据是有类型的,所以常量和变 量都是有类型之分的。 常量按照不同的数据类型可以分为: 字符型常 量、整型常量、浮点型常量,以及字符串常量 等。 程序是根据程序中常量的书写格式来区分它是 哪种类型常量的。 29 返回 1.整型常量 在程序中书写整型常量时,没有小数部分。用户可根据 需要分别可以用十进制、八进制和十六进制的形式书写 : 十进制格式 :由数字0至9和正、负号组成,书写时直 接写出数字,如:123,-516,+1000等。 八进制格式 :以数字0开头的数字(0至7)序列, 0111,010007,0177777等。 十六进制格式 :以0x或0X开头的数字(数字0至9、字 母a至z)序列,如0x78AC,0xFFFF等。 2.3 C+数据类型、运算符和表达式 30 返回 2.浮点型常量 只能用十进制来表示。可以用小数或指数形式表示,不分 单精度和双精度类型。如:34.5 , .345, 1.5e-3 3.字符型常量 (1)用一对单引号括起来的一个字符,单引号只是字 符与其他部分的分割符,不是字符的一部分,并且,不能 用双引号代替单引号。在单引号中的字符不能是单引号或 反斜杠。如: a , A, # 合法的字符常量 , 非法的字符常量 “A” 不代表字符常量 (2)另一种表示字符常量的方法是使用转义字符。 C+规定,采用反斜杠后跟一个字母来代表一个控制字符 ,具有新的含义 。 2.3 C+数据类型、运算符和表达式 31 返回 C+中常用的转义字符 转义字符含义ASCII码值(十进制 ) a响铃(BEL)7 b退格(BS)8 n换行(LF)10 r回车(CR)13 t水平制表(HT)9 v垂直制表(VT)11 反斜杠92 单引号39 ”双引号34 0空格符(NULL)0 ddd任意字符3位八进制数 xhh任意字符2位十六进制数 2.3 C+数据类型、运算符和表达式 32 返回 4.字符串常量 用一对双引号括起来的一个或多个字符的序列称为字 符串常量或字符串。字符串以双引号为定界符,双引号不 作为字符串的一部分。如: “Hello”, “Good Morning!” ,“I say: “ Goodbye!” 字符串中的字符数称为该字符串的长度,在存储时, 系统自动在字符串的末尾加以字符串结束标志,即转义字 符 0。 5.符号常量 常量也可用一个标识符来代表,称为符号常量。如: #define PRICE 30 main() 2.3 C+数据类型、运算符和表达式 33 返回 使用符号常量应注意以下几个方面: (1)它不同于变量,在作用域内其值不能改变和赋值。 如:在上例中如再用PRICE=40;这一语句进行赋值则是 错误的。 (2)符号常量名一般用大写,而变量名用小写,以示区别 。 6. 程序中常量的表示方法 在程序中的常量有以下三种表示方法: (1)在程序中直接写入常量 如:-200,3.4E-10,A,1,0x120,045,5.35,1000l int i; char s; float f; i=20; s=a; f=2.0; 2.3 C+数据类型、运算符和表达式 34 返回 (2)利用#define定义宏常量 一般格式: #define 宏名 常数 如:#define PI 3.14 s=2*PI*r; (3)利用const定义正规常数 一般格式:const 数据类型标识符 常数名=常量值; 说明: const必须放在被修饰类型符和类型名前面 数据类型是一个可选项,用来指定常数值的数据类型 ,如果省略了该数据类型,那么编译程序认为它是 int 类 型 2.3 C+数据类型、运算符和表达式 35 返回 如:const int a=10; 表示定义了一个初始值为10的整型常 量,它在程序中不可改变,但可用于表达式的计算中, 2.3.1.4 变量 1变量的概念及特点 每一变量就相当于一个容器,对应着计算机内存中的某 一块存储单元,用于存储程序中的数据。变量的值具有以 下两个特点: (1)“一充即无”:即将一个新数据存放到一个变量中时 ,该变量中原来的值消失,变量的值变成了新值。 如:执行完语句int i; i=10; i=20;后i的值为20,而不是10。 2.3 C+数据类型、运算符和表达式 36 返回 (2)“取之不尽”:可将某个变量的值与程序中的其它数 据进行各种运算,在运算过程中,如果没有改变该变量 的值时,那么,不管用该变量的值进行多少次运算,其 值始终保持不变。 如:语句int i,j,k; i=10; j=i+10; k=i+j*5;其中,i的值可无 限制地多次使用,但它的值始终保持值10,因为在程序 中没有改变变量i的值。 2定义变量 程序中的每一变量,都要先定义,后使用。 定义变量的一般有以下三种格式: 数据类型标识符 变量名; 数据类型标识符 变量名=初始化值; 2.3 C+数据类型、运算符和表达式 37 返回 数据类型标识符 变量名1=初始值1,变量名2=初始值 2,; 如: char a; /定义字符型变量a int i=1000; /定义整型变量i,i的初始值为1000 ; float a=2,b=3,c; /定义浮点型变量 a、b、c,且a、b的 初始值分别为2、3。 变量名是每个变量的名称,其命名遵循以下规则: (1)由字母、数字和下划线(_)三类符号排列组合形 成,且开头字符必须是字母或下划线。 (2)名称中字符的最大个数是31个。 (3)C+中区分变量名的大小写。 2.3 C+数据类型、运算符和表达式 38 返回 (4)变量名不能和C+中的关键字同名,也不能和用户 编制的函数或C+库函数同名。如:int, double或static都 不能作为变量名。 (5)变量名尽量做到“见名知意”。 3定义变量的位置 在程序中的不同位置采用不同的变量定义方式,决定 了该变量具有不同的特点。变量的定义一般可有以下三 种位置: (1)在函数体内部 在函数体内部定义的变量称为局部变量,这种局部变 量只在进入定义它的函数体时起作用,离开该函数体后 该变量就消失(被释放),即不再起作用。因此,不同 函数体内部可以定义相同名称的变量,而互不干扰。如 : 2.3 C+数据类型、运算符和表达式 39 返回 void func1(void) int y; y=2; void func2(void) int y; y=-100; 在本例中,函数func1和func2的函数体内部都分别定义 了变量y,但它们都只能在各自的函数体内起作用,都是 局部变量。 2.3 C+数据类型、运算符和表达式 40 返回 (2)形式参数 当定义一个有参函数时,函数名后面括号内的变量,统称为形式 参数。如: int is_in(char *a, char b) while(*a) if (*a=b) return 1; else a+; return 0; 本例中,函数名is_in后面括号内的变量a和b是该函数的形式参数, 它们都只能在该函数体内起作用,是该函数的局部变量。 2.3 C+数据类型、运算符和表达式 41 返回 (3)全局变量:在所有函数体外部定义的变量,其作用 范围是整个程序,并在整个程序运行期间有效。如: #include “stdio.h” int count; /定义count变量是全局变量 void func1(void); void func2(void); int main() count=10; func1(); return 0; 2.3 C+数据类型、运算符和表达式 42 返回 void func1(void) int temp; temp=count; func2(); printf(“count is %d”, count); / /输出10 void func2(void) int count; for(count=1;count void main() short int aShort; int anInt; long aLong; char aChar; float aReal; cout10 大于x+yz =大于或等于x-y=a*b+2 = =等于x+y=a+b !=不等于x-y!=0 2.3 C+数据类型、运算符和表达式 52 返回 注意: 在对两个表达式的值进行是否相等的比较时,要用运算符 “=”,而不能写成“=”。 2.3.2.5 逻辑运算符和逻辑表达式 逻辑运算符是对两个逻辑量间进行运算的运算符,如表 2.7所示。 2.3 C+数据类型、运算符和表达式 逻辑运算符含义例子 !逻辑非!(x10) 则表达 式i 则表达式 i+|i+|i+的值为1(真),运算结束后,变量i的值为2 ,而不是4。 对于数学上的表示多个数据间进行比较的表达式,在 C或C+中要拆写成多个条件并用逻辑运算符连接形成一 个逻辑表达式。如:在数学上,要表示一个变量a的值处 于-1和-9之间时,可以用-9-9 float a,b; a=float(i); /将变量i的类型强制转换为浮点型,并将 其值赋给变量a b=(float)i; /将变量i的类型强制转换为浮点型,并将 其值赋给变量b 2.3.2.9 逗号运算符 逗号运算符的运算优先级是最低的。一般形式为: 表达式1,表达式2,表达式N 2.3 C+数据类型、运算符和表达式 61 返回 在计算逗号表达式的值时,按从左至右的顺序依次分 别计算各个表达式的值,而整个逗号表达式的值和类型 是由最右边的表达式决定。 如:有语句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 运算符的优先级与结合性 每个运算符都有自己优先级和结合性。当一个表达式 中包含多个运算符时,要确定运算的结果,必须首先确 定运算的先后顺序,即运算符的优先级和结合性。C+中 运算符的优先级和结合性如表2.11所示。 2.3 C+数据类型、运算符和表达式 62 返回 优先级运算符结合性 1 () : - . .* -* 自左至右 2 ! + - + - * cout。常用的流控制符及其功能如表2.12 所示。 表2.12 I/O流的常用控制符 2.4 数据的输入与输出 控制符功能 dec十进制数输出 hex十六进制数输出 oct八进制数输出 setfill(c)在给定的输出域宽度内填充字符c setprecision(n)设显示小数精度为n位 setw(n)设域宽为n个字符 setiosflags(ios:fixed)固定的浮点显示 68 返回 2.4 数据的输入与输出 setiosflags(ios:scientific)指数显示 setiosflags(ios:left)左对齐 setiosflags(ios:right)右对齐 setiosflags(ios:skipws)忽略前导空白 setiosflags(ios:uppercase)十六进制数大写输出 setiosflags(ios:lowercase)十六进制数小写输出 setiosflags(ios:showbase)按十六八进制输出数据时,前面 显示前导符0x; 69 返回 2.4 数据的输入与输出 设置域宽:所谓域宽就是被输出数据所占的输出宽度 (单位是字符数)。设置域宽可以使用流控制符setw(n) 和cout的方法cout.width(n) 其中n为正整数,表示域宽。但是, cout.width(n)和 setw(n)二者都只对下一个被输出的数据有作用,若一 个输出语句内有多个被输出的数据,而要保持一定格 式域宽时,需要在每一输出数据前加上cout.width(n)或 setw(n)。 此外,当参数n的值比实际被输出数据的宽度大时 ,则在给定的域宽内,数据靠右输出,不足部分自动 填充空格符;若被输出数据的实际宽度比n值大时,则 数据所占的实际位数输出数据,设置域宽的参数n不再 起作用。 70 返回 【例2-2】cout流控制符setw的使用。 #include #include void main() int a=21,b=999; cout #include void main() int a=21,b=999; cout #include void main() int a=21,b=999; /设置以十六制格式输出数据 2.4 数据的输入与输出 75 返回 cout #include void main() const double pi=3.14159; double r=6.779,c,s; c=2.0*pi*r; /计算圆的周长 s=pi*r*r; /计算圆的面积 2.4 数据的输入与输出 78 返回 /以指数格式输出圆的面积和周长 cout变量名1变量名2变量名n; 说明: (1)cin是系统预定义的一个标准输入设备 (2)cin的功能是:当程序在运行过程中执行到cin时, 程序会暂停执行并等待用户从键盘输入相应数目的数据 ,用户输入完数据并回车后,cin从输入流中取得相应的 数据并传送给其后的变量中。 (3)“”操作符后除了变量名外不得有其他数字、字符 串或字符,否则系统会报错。 2.4 数据的输入与输出 80 返回 如:cin“x=“x; /错误,因含有字符串“x=“ cinxx; /错误,因含有字符x= cinx10; /错误,因含有常量10 (4)cin后面所跟的变量可为任何数据类型,若变量为整型 数据类型,则在程序运行过程中从键盘输入数据时,可分 别按十进制、八进制或十六进制输入该整数。但要注意: 当按十进制格式输入整数时,可直接输入数据本身即可; 若以十六进制输入整数时,数据前要冠以0x或0X; 若按八进制格式输入整数时,数据前要冠以数字0,。 若cin后面的变量为浮点类型(单精度或双精度)时,可分 别按小数或指数的格式表示该浮点数。 若cin后面的变量为字符类型时,可直接输入字符数据而不 能在字符的两端加单引号。 2.4 数据的输入与输出 81 返回 (5)当程序中用cin输入数据时,最好在该语句之前用 cout输出一个需要输入数据的提示信息,以正确引导和提 示用户输入正确的数据。如: coutx; (6)当一个cin后面同时跟有多个变量时,则用户在输入 数据时的个数应与变量的个数相同,各数据之前用一个 或多个空格隔开,输入完后按回车键;或者,每输入一 个数据按回车键也可。如对于以下程序段: int x; double a; char c1; coutxac1; coutb?a:b; cout void main() int y; couty; if (y%4=0 coutscore; if(score=90) cout=80) cout=70) cout=60) coutscore80为良,80score70为中等, 70score60为及格,score void main() 2.5 C+的控制语句 98 返回 float score; int a; coutscore; a=score/10; switch(a) case 0: case 9:cout void main() int i,n; n=0; i=1; while(i void main() 2.5 C+的控制语句 103 返回 int i,n; n=0; i=1; do n=n+i; i+; while(i void main() int i,n; n=0; for(i=1;i void main() int i,n,sum; sum=0; for(i=0;in; if(n void main() int i; for(i=0;i void main() int i; int b5; for(i=0;i=0;i-) cout void main() char s20=“This is a string.“; int i=0; while (si!=0) cout.put (si); i+; 2.6 数组及其使用 124 返回 (3)用cout流对象的write方法,格式是: cout.write(字符串或字符数组名,个数n); 其作用是输出字符串中的前n个字符。如: #include void main() char s20=“This is a string.“; cout.write(s,4); 该程序的输出结果为This 5字符串的输入: 除了可以在程序中利用字符数组初始化的方法或赋值 方法将字符串存放到字符数组外,还可以采用以下方法 ,但要注意,只能用字符数组接收输入的字符串。 2.6 数组及其使用 125 返回 (1)利用cin直接输入。格式是: cin字符数组名; 如: #include void main() char s20; cins; cout void main() char s20; cin.getline (s,20); cout void main() char s20; char c; cin.get(s,10); couty) coutxy; c=max(a,b); couty?x:ty; return(z); 2.7 函数 134 返回 关于形参和实参说明几点: (1)实参可以是变量、常量、或表达式,但必须有确定 的值。而形参必须是变量。 (2) 形参变量,只有存在发生函数调用时,形参才被分 配存储单元,在调用结束时,形参所占的内存单元被释 放。 (3)实参与形参的类型必须一致,否则会发生“类型不 匹配”的错误。 (4)实参对形参的数据传递是“值传递”,即单向传递 。由实参把数据传给形参,并且存储单元与形参是不同 的单元,并将实参对应的值依次传递给形参变量。调用 结束后,形参单元被释放,而实参单元保留并维持原值 。 2.7 函数 135 返回 2. 函数的返回值: (1)函数的返回值是通过函数中的return语句获得的, return语句的格式为: return(表达式);或return 表达式; return语句的功能有两个, (A) 强制程序执行的流程从被调函数返回到主调函数 (B) 给主调函数带回一个确定的函数值 如:int max(int a,int b) return(ab?a:b); 2.7 函数 136 返回 (2) 函数值的类型:函数返回值的类型就是在定义函 数时的函数值的类型。在定义函数时,函数值说明的类 型和return语句中的表达式类型不一致时,则以函数类型 为准。 (3)如果被调用函数中没有return语句,为了明确表示 函数“不返回值”,要用viod定义无类型。 如: viod print() printf(“c language”); 这样系统就保证不使函数带回任何值。 2.7 函数 137 返回 2.7.2 函数的调用 1函数调用的格式 函数名(实参数) 如果调用的是无参函数,则实参表可略去,但函数的括 号不能省. 如果实参表中有多个参数,之间用逗号隔开,实参的 类型、个数应与形参顺序一一对应。 函数通过下列三种方式完成函数调用: (1)函数调用语句:即以一个函数的调用后面加上“;” 作为一个语句。如:printf(); (2)函数表达式:即函数出现在一个表达式中,这时要 求函数带回一个确定的值以参加表达式的运算。如: c=2*max(a,b); 2.7 函数 138 返回 (3)函数参数:以函数的调用作为一个函数的实参。 如: M=max(a,max(b,c); 2调用函数时的前提条件 在一个函数中调用另一个函数,需要具备的条件: (1)首先被调用的函数必须已经存在的函数。如果调用库 函数,一般还应在本文件的开头用#include命令将调用有关 库函数时所需用到的信息包含到本文件来。 (2)如果调用用户自己定义的函数,则必须对被调函数的 原型进行说明,函数的原型包括: 函数值的类型标识符 被调用函数名(形参及其类型表); (3)对函数原型的说明,通常放在程序的顶部,也可以存 放到一个头文件中,然后利用#include 语句嵌入到程序中。 2.7 函数 139 返回 3函数的定义与函数调用间的区别 (1)函数的“定义”是一个函数功能的确立,包括指定 函数名,函数返回值的类型,形参及其类型,函数体等 ,它是一个完整的、独立的函数单位。 (2)函数的“说明”则只是对已经定义好的函数的返回 值进行类型的说明,它包括函数名,函数类型和一对括 号。而不包括形参和函数体。 (3)对函数进行说明的作用是告诉系统,在本程序中将 要用到的函数是什么类型,以便在主调函数中按此类型 对函数值作相应的处理。 2.7 函数 140 返回 2.7.3 函数的嵌套调用 C+语言中函数的定义是平行的、独立的,所以,函 数的定义是不能嵌套进行的,但函数的调用可以。嵌套 调用即在调用一个函数的过程中,又调用另一函数。 2.7 函数 main()函数 调用a函数 a( )函数 调用b函数 b( )函数 141 返回 在本例中,main函数在执行过程中,调用了函数a,而 函数a中又调用了函数b,所以,这就是一种嵌套调用。 要注意:在函数嵌套调调用过程中程序执行的流程和返 回点的问题。 2.7 函数 142 返回 2.7 函数 2.7.4 函数的递归调用 1函数递归调用的概念 函数的递归调用就是当一个函数在执行的过程中,出 现了直接或间接地调用函数本身的函数调用方式。 下面定义求n!的函数。 long fact(long n) if (n=1) return 1; return fact(n-1)*n; /出现了函数fact自己直接调用本 身的函数调用 要正确地理解函数的递归调用时,程序执行的流程和返 回点。 143 返回 2.7 函数 2函数递归调用的条件 递归调用的条件也是我们在定义一个递归函数时应该 遵循的原则。 (1)必须有完成函数任务的语句。如:上例求n!中的 return 1; (2)有一个确定是否能避免递归调用的测试条件。如果 条件不满足时就递归调用,否则就不再递归调用。 (3)有一个递归调用语句,并且该递归调用语句的参数 应该逐渐逼近不满足条件,以致最后断绝递归。 (4)先测试,后递归调用。在递归函数定义中,必须先 测试,后递归调用。也就是说,递归是有条件的,满足了 条件后,才可以递归。 144 返回 2.7 函数 2.7.5 局部变量和全局变量 从程序中各个变量起作用的范围(作用域)来看,变量可以分为 局部变量和全局变量。 1. 局部变量 在一个函数的内部定义的变量就是内部变量(局部变量)。如: float f1(int a) int b,c; /a,b,c有效 void main( ) int n,m; /m,n有效 145 返回 2.7 函数 对局部变量作以下几点说明: (1)局部变量的作用范围(作用域):只局限在定义它 的本函数体之内。 (2)局部变量的生存期(存在的时间):只有当程序执 行到本函数时,才给这些局部变量分配存储单元,当本 函数执行完毕后,这些局部变量所占存储单元就被释放 。 146 返回 2.7 函数 (3)不同函数体中可以定义相同名字的变量,但它们代 表不同的对象,互不干扰。它们在内存占用不同的内存 单元。 (4)函数的形式参数也是该函数的局部变量,其他函数 不能调用。 (5)在一个函数内部,可以在复合语句中定义变量,但 这些变量只在本复合语句中有效,因此,复合语句也可 称为“分程序”或“程序块”。 147 返回 2.7 函数 2静态局部变量(局部静态变量): 定义方法是:在函数体内定义变量采用: static 类型标识符 变量名; 特点: (1)静态局部变量本身也是局部变量,因此其作用域也 是局限在定义它的本函数体内,当离开本函数体,该变量 就不再起作用,但其值还继续保留。 (2)另一方面,静态局部变量又是静态存储类别的变量 ,所以,在整个程序运行开始就被分配固定的存储单元( 占用静态存储区),整个程序运行期间不再被重新分配, 所以其生存期是整个程序运行期间。 (3)静态局部变量的赋初值的时间在编译阶段,并不是 每发生一次函数调用就赋一次初值。当再次调用该函数时 ,静态局部变量保留上次调用函数时的值。 148 返回 2.7 函数 3全局变量: 在所有函数体外部定义的变量为外部变量(全局变量 ),全局变量可以被本文件中其他函数所调用(使用) 。 全局变量的有效范围为:从定义该变量的位置开始到 本程序文件的结束。如: int p=1, q=5; /*全局变量*/ float f1(int a) int b,c char c1,c2; /* 全局变量 */ 149 返回 2.7 函数 char f2(int x, int y) int i,j; main() int m,n.; 对全局变量的几点说明: (1)全局变量在程序的全部执行过程中都占用固定的内 存储单元,而不是仅在需要时才开辟单元,所以其生存期 是整个程序运行期间。 150 返回 2.7 函数 (2)全局变量的作用范围是整个程序文件。全局变量处 于文件的开头定义时,其作用范围为整个文件,否则在定 义点之前的函数内使用时,应在函数体内或外部用extern 说明。 说明的格式是:extern 类型标识符 变量名; (3)在一个程序文件中定义的全局变量,要在同一程序 的另外一个程序文件中使用时,应在使用它的程序文件中 所有函数体内部或外部对所使用的全局变量用extern说明 。 (4)在同一个文件中全局变量与局部变量同名时,则在 局部变量的作用范围内,全局变量不起作用。 4静态全局变量 当在所有函数体的外部用如下格式定义变量时,则这 种变量称为静态全局变量。 static 类型标识符 变量名; 151 返回 2.7 函数 静态全局变量的特点是: (1)与全局变量基本相同,只是其作用范围(即作用域 )是定义它的程序文件,而不是整个程序。 (2)静态全局变量属于静态存储类别的变量,所以它在 程序一开始运行时,就被分配固定的存储单元,所以其 生存期是整个程序运行期间。 (3)使用静态全局变量的好处是同一程序的两个不同的 程序文件中可以使用相同名称的变量名,而互不干扰。 2.7.6 全局函数和静态函数 1全局函数 凡程序中定义的函数,如果未做特别说明,一律都是 全局的。也就是说,函数从本质上是全局的,一个程序 不管有多少个程序文件所组成,在某个程序文件中可以 152 返回 2.7 函数 调用同一程序的另外一个程序文件中定义的函数,只要 对被调函数的原型进行说明即可。声明函数原型的语句 : 类型标识符 函数名(形参类型表); 如:假设程序中定义了max函数,则: int max(int,int);就是对函数max原型的声明。 2静态函数: 静态函数定义方法为: static 类型标识符 函数名(形参及其类型) 函数体 注意:这种函数就只能在定义它的程序文件中调用。 2.7.7 内联函数 153 返回 2.7 函数 1内联函数的定义方法和格式: inline 函数值的类型 函数名(形参及其类型列表) 函数体 如:inline double square(double x) return x*x; void main() double x; coutx; cout void whatitis(int i) cout void print(double d) cout void sum(int num=10) /形参默认值 int i,s=0; for(i=1;i void main() 169 返回 2.8 指针类型及使用 int a,b; int *ip1,*ip2; /定义了两个指向整型的指针变量。 a=100;b=100; ip1=ip2= /将变量a,b的地址赋给

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论