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

上传人:sh****n 文档编号:7433374 上传时间:2020-03-21 格式:PPT 页数:284 大小:980.50KB
返回 下载 相关 举报
《面向对象的程序设计语言-C》课件-第2章.ppt_第1页
第1页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第2页
第2页 / 共284页
《面向对象的程序设计语言-C》课件-第2章.ppt_第3页
第3页 / 共284页
点击查看更多>>
资源描述
1 第2章C 语言基础 本章是学习C 语言的基础 包括以下几个方面 1 结构化程序设计方法与面向对象程序设计方法的各自特点 区别和相互联系 2 面向对象的程序设计方法中的有关概念 如类 对象 封装 继承 消息和多态性等 3 C 程序的基本组成和框架结构 4 掌握C 语言中的基本数据类型 各种运算符 表达式 5 C 数据输入流对象cin和输出流对象cout的使用 6 程序的3种基本结构7 构造数据类型 如数组 结构体 指针等的定义方法 特点和使用方法 7 函数的定义 调用及函数调用过程中的参数传递的机理和程序执行流程 8 引用的概念及其定义和使用方法 2 2 1从面向过程的程序设计到面向对象的程序设计 2 1 1传统的结构化程序设计 StructuredProgramming SP 方法1 使用SP方法设计程序的步骤在数据处理过程中 采用的是自顶向下 分而治之的方法 将整个程序按功能划分为几个可独立编程的子过程模块 每一子模块完成指定的子任务 并且提供一个清晰 严格的调用界面 主过程通过调用各子过程完来成全部处理工作 3 2 SP方法的特点优点 1 这种程序设计方法力求算法描述准确 2 对每一子过程模块容易进行程序正确性证明 缺点 1 这种程序设计方法本质上是面向 过程 的 而 过程 和 操作 又是不稳定和多变的 因此不能直接反映人类求解问题的思路 2 程序代码可重用性差 程序中除少数标准库函数外 每设计一个程序时 程序员几乎从零做起 即使重用代码 通常也是通过拷贝或编辑重新生成一份 3 维护程序的一致性困难 该种方法将数据与对数据进行处理的程序代码分离 2 1从面向过程的程序设计到面向对象的程序设计 4 2 1 2面向对象的程序设计 Object OrientedProgramming OOP 方法1 面向对象的有关概念面向对象的程序设计方法强调直接以问题域 现实世界 中的事物为中心来思考和认识问题 并按照这些事物的本质特征把它们抽象为对象 以作为构成软件系统的基础 1 对象 Object 每个对象都具有属性 Attribute 和方法 Method 这两方面的特征 对象的属性描述了对象的状态和特征 对象的方法说明了对象的行为和功能 并且对象的属性值只应由这个对象的方法来读取和修改 两者结合在一起就构成了对象的完整描述 2 1从面向过程的程序设计到面向对象的程序设计 5 2 类 Class 具有相似属性和行为的一组对象 就称为类 可见 有了类的概念以后 就可以对具有共同特征的事物进行统一描述 3 封装 Encapsulation 封装把对象的属性和方法看成了一个密不可分的整体 从而使对象能够完整地描述并对应于一个具体事物 4 继承 Inheritance 将客观事物进行归类是一个逐步抽象的过程 反之 将类进行层层分类便是一个概念逐渐细化的过程 在面向对象的程序设计中 允许在已有类的基础上通过增加新特征而派生出新的类 这称为继承 其原有的类称为基类 baseclass 而新建立的类称为派生类 2 1从面向过程的程序设计到面向对象的程序设计 6 5 消息 Message 在面向对象的程序设计中 由于对象描述了客观实体 它们之间的联系通过对象间的联系来反映 当一个对象需要另外一个对象提供服务时 它向对方发出一个服务请求 而收到请求的对象会响应这个请求并完成指定的服务 这种向对象发出的服务请求就称为消息 6 多态性 Polymorphism 多态性是面向对象的另一重要特征 在通过继承而派生出的一系列类中 可能存在一些名称相同 但实现过程和功能不同的方法 Method 所谓多态性是指当程序中的其他部分发出同样的消息时 按照接收消息对象的不同能够自动执行类中相应的方法 其好处是 用户不必知道某个对象所属的类就可以执行多态行为 从而为程序设计带来更大方便 2 1从面向过程的程序设计到面向对象的程序设计 7 2 面向对象的程序设计方法 OOP方法 这种方法将设计目标从模拟现实世界的行为转向了模拟现实世界中存在的对象及其各自的行为 在OOP中 将 对象 作为系统中最基本的运行实体 整个程序即由各种不同类型的对象组成 各对象既是一个独立的实体 又可通过消息相互作用 对象中的方法决定要向哪个对象发消息 发什么消息以及收到消息时如何进行处理等 2 1从面向过程的程序设计到面向对象的程序设计 8 3 OOP方法的特点 1 OOP以 对象 或 数据 为中心 由于对象自然地反映了应用领域的模块性 因此具有相对稳定性 可以被用作一个组件去构成更复杂的应用 又由于对象一般封装的是某一实际需求的各种成分 因此 某一对象的改变对整个系统几乎没有影响 2 引入了 类 class 的概念 类与类以层次结构组织 属于某个类的对象除具有该类所描述的特性外 还具有层次结构中该类上层所有类描述的全部性质 OOP中称这种机制为继承 3 OOP方法的模块性与继承性 保证了新的应用程序设计可在原有对象的数据类型和功能的基础上通过重用 扩展和细化来进行 而不必从头做起或复制原有代码 这样 大大减少了重新编写新代码的工作量 同时降低了程序设计过程中出错的可能性 达到了事半功倍的效果 2 1从面向过程的程序设计到面向对象的程序设计 9 2 1 3面向对象的程序设计方法与结构化程序设计方法的比较 1 传统的结构化程序设计方法以过程为中心构造应用程序 数据和处理数据的过程代码是分离的 相互独立的实体 设计出的程序可重用代码少 且当代码量增加时维护数据和代码的一致性困难 2 面向对象程序设计方法中 对象所具有的封装性和继承性使得代码重用成为可能 并大大减少了程序出错的可能性 3 面向对象方法吸收了结构化程序设计方法的优点 同时引入了新概念 新机制并建立了比传统方法更高层次的抽象 2 1从面向过程的程序设计到面向对象的程序设计 10 2 2 1从C语言到C 语言C语言以其如下独有的特点风靡了全世界 1 语言简洁 紧凑 使用方便 灵活 C语言只有32个关键字 程序书写形式自由 2 丰富的运算符和数据类型 3 可以直接访问内存地址 能进行位操作 使其能够胜任开发操作系统的工作 4 生成的目标代码质量高 程序运行效率高 5 可移植性好 2 2C 程序的基本组成 11 2 2C 程序的基本组成 局限性 1 数据类型检查机制相对较弱 这使得程序中的一些错误不能在编译阶段被发现 2 C本身几乎没有支持代码重用的语言结构 因此一个程序员精心设计的程序 很难为其它程序所用 3 当程序的规模达到一定程度时 程序员很难控制程序的复杂性 12 2 2C 程序的基本组成 C 包含了整个C C是建立C 的基础 C 包括C的全部特征和优点 同时添加了对面向对象编程 OOP 的完全支持 1980年 贝尔实验室的BjarneStroustrup开始对C进行改进和扩充 1983年正式命名为C 在经历了3次C 修订后 1994年制定了ANSIC 标准的草案 以后又经过不断完善 成为目前的C C 仍在不断发展中 美国微软公司现已准备推出C CSharp 语言 来代替C 语言 13 2 2 2C 程序的结构与基本组成一个简单的C 程序 是由若干个函数构成的 其中有且仅有一个名称为main的函数存在 下图说明了C 程序的基本框架结构 2 2C 程序的基本组成 14 1 声明区声明区处在程序文件的所有函数的外部 1 包含头文件 如 include iostream h 2 宏定义 如 definePI3 1415926 3 类定义 如classname 4 结构体定义 如structrecord 5 函数声明 如voidprint 6 全局变量声明 如floatH 2 58 7 条件编译 如 ifdef 等 2 2C 程序的基本组成 15 2 主程序区主程序以main 函数开始 是整个程序运行的入口 该函数中可能包含的内容主要有 1 局部变量的声明 如 inti 1 2 函数调用 如 y sin x 3 一般运算 如 a b c d 3 4 结构控制 如 if a b c a 5 对象与结构的处理 6 文件的处理等 2 2C 程序的基本组成 16 图2 3C 函数的组成4 程序举例 2 2C 程序的基本组成 3 函数定义区程序中除了main函数之外 还可以包含其它的函数 每个函数是由函数说明和函数体两部分构成的 如图2 3所示 17 2 2C 程序的基本组成 18 上例程序结构可写为如下程序 例2 1 一个简单的C 程序 ThisisfirstC program C语言的某些特征仍可沿用 include iostream h include stdio h voidprint 函数声明voidmain inti chars 80 2 2C 程序的基本组成 19 print cout s cout i 验证结果cout s is i yearsold voidprint printf printfisalsocanbeused n 2 2C 程序的基本组成 20 从上例可以看出 1 C语言中原有的规则和语句在C 中仍可继续使用 但C 又增添了很多新的风格 2 一个C 的程序是由一到若干个函数构成的 但其中必须有且仅有一个名称为main的函数存在 3 不管一个程序中有多个函数 只有main函数整个程序运行时的入口 程序运行时从此函数开始执行 但在程序中 main函数所处的位置可以任意 4 一个C 的函数是由两部分构成的 即函数的说明部分和函数体 函数的说明部分包括了函数的返回值的类型 函数的名称 圆括号 形参及形参的类型说明 函数体由一对大括号 括起来 其内容是由若干条语句 2 2C 程序的基本组成 21 构成 函数体的内容决定了该函数的功能 5 C 对程序中的名称是大小写 敏感 的 除特殊情况下 应一律小写 6 程序中的注释 可以用 或 单行注释 对程序中的内容进行注释 二者的区别在于 采用 方法时 注释可以写成多行 而采用 方法时 注释只能写成一行 它可单独占一行 也可写在某行程序代码的末尾 7 数据输出 除了使用printf 函数 还可使用功能更强大 更方便的cout对象进行输出数据 格式如下 cout 数据1 数据2 数据n如 上例中的语句cout s is i yearsold 表示同时输出了变量s的值 字符串 is 变量i的值和字符 2 2C 程序的基本组成 22 串 yearsold 8 数据输入 除了使用scanf 函数 还可使用功能更强大 更方便的cin对象进行数据输入 格式如下 cin 变量1 变量2 变量n如 上例中的语句cin s 表示给变量s输入一个值 9 在分别使用cout和cin进行数据的输出和输入时 需要在程序的开头嵌入 iostream h 文件 在该头文件中定义了输入输出流对象cout和cin等 10 一个C 的源程序文件在存盘时 要以 CPP为文件名后缀 而不是 C 2 2C 程序的基本组成 23 2 3C 数据类型 运算符和表达式 2 3 1数据类型 1 预定义数据类型 基本数据类型 包括字符型 整型 浮点型 无值型四种 其中浮点型又分为单精度浮点型和双精度浮点型两种 2 构造数据类型 包括数组 结构体 共用体 联合 枚举 类等 本节重点介绍C 的基本数据类型 有关构造数据类型将在后面章节进行介绍 24 2 3 1 1基本数据类型 2 3C 数据类型 运算符和表达式 25 2 3 1 2类型修饰符C 还允许在基本数据类型 除void类型外 前加上类型修饰符 来更具体地表示数据类型 C 的类型修饰符包括 signed有符号unsigned无符号short短型long长型 2 3C 数据类型 运算符和表达式 26 表2 2C 的基本数据类型 27 表2 2C 的基本数据类型 28 说明 1 表中带 的部分表示是可以省略的 如short int 可以写为shortint或简写为short 二者的含义是相同的 2 四种修饰符都可以用来修饰整型和字符型 用signed修饰的类型的值可以为正数或负数 用unsigned修饰的类型的值只能为正数 3 用short修饰的类型 其值一定不大于对应的整数 用long修饰的类型 其值一定不小于对应的整数 2 3C 数据类型 运算符和表达式 29 2 3C 数据类型 运算符和表达式 2 3 1 3常量在C 语言中 数据分为常量和变量两大类 由于程序中的数据是有类型的 所以常量和变量都是有类型之分的 常量按照不同的数据类型可以分为 字符型常量 整型常量 浮点型常量 以及字符串常量等 程序是根据程序中常量的书写格式来区分它是哪种类型常量的 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 3C 数据类型 运算符和表达式 31 2 浮点型常量只能用十进制来表示 可以用小数或指数形式表示 不分单精度和双精度类型 如 34 5 345 1 5e 33 字符型常量 1 用一对单引号括起来的一个字符 单引号只是字符与其他部分的分割符 不是字符的一部分 并且 不能用双引号代替单引号 在单引号中的字符不能是单引号或反斜杠 如 a A 合法的字符常量 非法的字符常量 A 不代表字符常量 2 另一种表示字符常量的方法是使用转义字符 C 规定 采用反斜杠后跟一个字母来代表一个控制字符 具有新的含义 2 3C 数据类型 运算符和表达式 32 C 中常用的转义字符 2 3C 数据类型 运算符和表达式 33 4 字符串常量用一对双引号括起来的一个或多个字符的序列称为字符串常量或字符串 字符串以双引号为定界符 双引号不作为字符串的一部分 如 Hello GoodMorning Isay Goodbye 字符串中的字符数称为该字符串的长度 在存储时 系统自动在字符串的末尾加以字符串结束标志 即转义字符 0 5 符号常量常量也可用一个标识符来代表 称为符号常量 如 definePRICE30main 2 3C 数据类型 运算符和表达式 34 使用符号常量应注意以下几个方面 1 它不同于变量 在作用域内其值不能改变和赋值 如 在上例中如再用PRICE 40 这一语句进行赋值则是错误的 2 符号常量名一般用大写 而变量名用小写 以示区别 6 程序中常量的表示方法在程序中的常量有以下三种表示方法 1 在程序中直接写入常量如 200 3 4E 10 A 1 0 x120 045 5 35 1000linti chars floatf i 20 s a f 2 0 2 3C 数据类型 运算符和表达式 35 2 利用 define定义宏常量一般格式 define宏名常数如 definePI3 14 s 2 PI r 3 利用const定义正规常数一般格式 const数据类型标识符常数名 常量值 说明 const必须放在被修饰类型符和类型名前面 数据类型是一个可选项 用来指定常数值的数据类型 如果省略了该数据类型 那么编译程序认为它是int类型 2 3C 数据类型 运算符和表达式 36 如 constinta 10 表示定义了一个初始值为10的整型常量 它在程序中不可改变 但可用于表达式的计算中 2 3 1 4变量1 变量的概念及特点每一变量就相当于一个容器 对应着计算机内存中的某一块存储单元 用于存储程序中的数据 变量的值具有以下两个特点 1 一充即无 即将一个新数据存放到一个变量中时 该变量中原来的值消失 变量的值变成了新值 如 执行完语句inti i 10 i 20 后i的值为20 而不是10 2 3C 数据类型 运算符和表达式 37 2 取之不尽 可将某个变量的值与程序中的其它数据进行各种运算 在运算过程中 如果没有改变该变量的值时 那么 不管用该变量的值进行多少次运算 其值始终保持不变 如 语句inti j k i 10 j i 10 k i j 5 其中 i的值可无限制地多次使用 但它的值始终保持值10 因为在程序中没有改变变量i的值 2 定义变量程序中的每一变量 都要先定义 后使用 定义变量的一般有以下三种格式 数据类型标识符变量名 数据类型标识符变量名 初始化值 2 3C 数据类型 运算符和表达式 38 数据类型标识符变量名1 初始值1 变量名2 初始值2 如 chara 定义字符型变量ainti 1000 定义整型变量i i的初始值为1000 floata 2 b 3 c 定义浮点型变量a b c 且a b的初始值分别为2 3 变量名是每个变量的名称 其命名遵循以下规则 1 由字母 数字和下划线 三类符号排列组合形成 且开头字符必须是字母或下划线 2 名称中字符的最大个数是31个 3 C 中区分变量名的大小写 2 3C 数据类型 运算符和表达式 39 4 变量名不能和C 中的关键字同名 也不能和用户编制的函数或C 库函数同名 如 int double或static都不能作为变量名 5 变量名尽量做到 见名知意 3 定义变量的位置在程序中的不同位置采用不同的变量定义方式 决定了该变量具有不同的特点 变量的定义一般可有以下三种位置 1 在函数体内部在函数体内部定义的变量称为局部变量 这种局部变量只在进入定义它的函数体时起作用 离开该函数体后该变量就消失 被释放 即不再起作用 因此 不同函数体内部可以定义相同名称的变量 而互不干扰 如 2 3C 数据类型 运算符和表达式 40 voidfunc1 void inty y 2 voidfunc2 void inty y 100 在本例中 函数func1和func2的函数体内部都分别定义了变量y 但它们都只能在各自的函数体内起作用 都是局部变量 2 3C 数据类型 运算符和表达式 41 2 形式参数当定义一个有参函数时 函数名后面括号内的变量 统称为形式参数 如 intis in char a charb while a if a b return1 elsea return0 本例中 函数名is in后面括号内的变量a和b是该函数的形式参数 它们都只能在该函数体内起作用 是该函数的局部变量 2 3C 数据类型 运算符和表达式 42 3 全局变量 在所有函数体外部定义的变量 其作用范围是整个程序 并在整个程序运行期间有效 如 include stdio h intcount 定义count变量是全局变量voidfunc1 void voidfunc2 void intmain count 10 func1 return0 2 3C 数据类型 运算符和表达式 43 voidfunc1 void inttemp temp count func2 printf countis d count 输出10 voidfunc2 void intcount for count 1 count 10 count putchar 2 3C 数据类型 运算符和表达式 44 2 3 2运算符和表达式程序中对数据进行的各种运算是由运算符来决定的 不同运算符的运算方法和特点是不同的 从此可以看出 一个运算式子中要涉及到数据及运算符 而运算符是对数据进行指定操作 并产生新值的特殊符号 2 3 2 1算术运算符和算术表达式算术运算符就是对数据进行算术运算 如 加 减 乘 除等 是在程序中使用最多的一种运算符 C 的算术运算符如表2 4所示 2 3C 数据类型 运算符和表达式 45 表2 4C 的算术运算符 算术表达式是指由算术运算符 括号将常量 变量 函数 圆括号等连接形成的一个有意义的式子 如 46 1 x 3 x 2 x 3 x 2 x 53 14 sqrt r b b 4 0 a c注意 1 表达式中的括号不管有多少层 一律使用圆括号 2 在将一个数学上的运算式子写成对应的C 的表达式时 要注意进行必要的转换 乘号不能省略 数学表达式中出现的数学运算函数要用C 提供的对应的数学运算库函数来代替 2 3C 数据类型 运算符和表达式 47 要特别注意表达式中两个整型数相除的情况 如 有一数学表达式为2 3 f 32 要写成对应的C 的表达式时 正确地写法应写2 0 3 0 f 32 而不是2 3 f 32 2 3 2 2赋值运算符和赋值表达式赋值运算符的功能将某个数据的值赋给某个变量 赋值运算符的用法格式 变量名赋值运算符常量 变量或表达式说明 1 被赋值的目标 即赋值运算符左边的量必须是变量 而不能是常量或表达式 2 3C 数据类型 运算符和表达式 48 2 C 中的赋值运算符如表2 5所示 3 要注意区分赋值运算符 与数学上的 等号 间的区别 如 intx y 定义变量x y为int类型变量x 10 将变量x赋成值10 2 3C 数据类型 运算符和表达式 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 3sizeof运算符sizeof运算符功能是求某一数据类型或某一变量在内存中所占空间的字节数 其使用的一般形式 sizeof 变量名或数据类型 或sizeof变量名或数据类型如 2 3C 数据类型 运算符和表达式 50 includevoidmain shortintaShort intanInt longaLong charaChar floataReal cout datatype tmemoryused bytes cout nshortint t sizeof aShort cout ninteger t sizeof anInt cout nLonginteger t sizeof aLong cout ncharachar t sizeof aChar cout nfloat t sizeof aReal 2 3C 数据类型 运算符和表达式 51 其输出结果为 datatypememoryused bytes shortint2integer4Longinteger4charachar1float42 3 2 4关系运算符和关系表达式关系运算符就是对两个量之间进行比较的运算符 如表2 6所示 2 3C 数据类型 运算符和表达式 52 由关系运算符将两个表达式连接形成的运算式子是关系表达式 一个关系表达式的值是一个逻辑值 当为真时 值为1 为假时 值为0 如 假设a 1 b 20 c 3 则a b表达式成立 其值为1b c表达式不成立 其值为0 a b c表达式成立 其值为1 2 3C 数据类型 运算符和表达式 53 注意 在对两个表达式的值进行是否相等的比较时 要用运算符 而不能写成 2 3 2 5逻辑运算符和逻辑表达式逻辑运算符是对两个逻辑量间进行运算的运算符 如表2 7所示 2 3C 数据类型 运算符和表达式 54 由逻辑运算符将两个表达式连接形成的式子叫逻辑表达式 各种逻辑运算的 真值表 如表2 8所示 对于参加逻辑运算的操作数 系统认为 非0 为真 0 为假 而逻辑表达式的结果只能为逻辑真 1 或逻辑假 0 表2 8逻辑运算真值表 2 3C 数据类型 运算符和表达式 55 注意 1 C或C 中在给出一个逻辑表达式的最终计算结果值时 用1表示真 用0表示假 但在进行逻辑运算的过程中 凡是遇到非零值时就当真值参加运算 遇到0值时就当假值参加运算 如 inta 10 b 15 c 14 则 a 6 则表达式i i 0 i 的值为0 假 该表达式运算结束后 变量i的值为0 而不是1 2 3C 数据类型 运算符和表达式 56 a b c只要a为真 就不必须判断b和c 只有a为假 才判别b a和b都为假才判别c 如 inti 1 j 则表达式i i i 的值为1 真 运算结束后 变量i的值为2 而不是4 对于数学上的表示多个数据间进行比较的表达式 在C或C 中要拆写成多个条件并用逻辑运算符连接形成一个逻辑表达式 如 在数学上 要表示一个变量a的值处于 1和 9之间时 可以用 9 9 a 9 a 1的形式 2 3C 数据类型 运算符和表达式 57 2 3 2 6条件运算符在C 中只提供了一个三目运算符 即条件运算符 其一般形式为 表达式1 表达式2 表达式3条件运算的规则是 首先判断表达式1的值 若其值为真 非0 则取表达式2的值为整个表达式的值 若其值为假 0 则取表达式3的值为整个表达式的值 如 若a 3 b 4 则条件表达式a b a b的值为4 2 3 2 7位运算符1 位运算符及其运算规则所谓位运算符是指能进行二进制位运算的运算符 C 提供的位运算符如表2 9所示 2 3C 数据类型 运算符和表达式 58 位运算的运算规则为 1 按位与 两个运算量相应的位都是1 则该位的结果值为1 否则为0 2 按位或 两个运算量相应的位只要有一个是1 则该位的结果值为1 否则为0 2 3C 数据类型 运算符和表达式 59 3 按位异或 两个运算量相应的位不同 则该位的结果值为1 否则为0 4 按位取反 将运算量的每一位取反 5 按位左移 将操作数中的每一位向右移动指定的位数 移出的位被舍弃 空出的位补0或补符号位 如 a 5 b 6 则 a000001010000010100000101b 00000110 00000110 00000110 0000011000000100000001110000001111111001即 a b 4 a b 7 a b 3 b 249 2 3C 数据类型 运算符和表达式 60 2 复合位运算符位运算符与赋值运算符结合可以形成复合位运算符 如表2 10所示 2 3 2 8强制类型转换运算符该运算符的功能是将某一数据从一种数据类型向另一 2 3C 数据类型 运算符和表达式 61 种数据类型进行转换 其使用的一般形式 数据类型标识符 表达式 数据类型标识符 表达式如 inti 2 floata b a float i 将变量i的类型强制转换为浮点型 并将其值赋给变量ab float i 将变量i的类型强制转换为浮点型 并将其值赋给变量b2 3 2 9逗号运算符逗号运算符的运算优先级是最低的 一般形式为 表达式1 表达式2 表达式N 2 3C 数据类型 运算符和表达式 62 在计算逗号表达式的值时 按从左至右的顺序依次分别计算各个表达式的值 而整个逗号表达式的值和类型是由最右边的表达式决定 如 有语句inta 3 b 4 则表达式a b a b的值为9 再如 设有inti 则表达式i 1 i 2 i 1 i 4的值为6 2 3 2 10运算符的优先级与结合性每个运算符都有自己优先级和结合性 当一个表达式中包含多个运算符时 要确定运算的结果 必须首先确定运算的先后顺序 即运算符的优先级和结合性 C 中运算符的优先级和结合性如表2 11所示 2 3C 数据类型 运算符和表达式 63 表2 11C 中运算符的优先级和结合性 64 2 4数据的输入与输出 在C 语言中 数据的输入和结果的输出是分别使用系统所提供的输入流对象cin和输出流对象cout来完成的 在使用过程中 只要在程序的开头嵌入相应的头文件 iostream h 即可 2 4 1数据的输出cout输出流对象输出数据的语句格式为 cout 数据1 数据2 数据n 说明 1 cout是系统预定义的一个标准输出设备 一般代表显示器 是输出操作符 用于向cout输出流中插入数据 2 cout的作用是向标准输出设备上输出数据 被输出的数据可以是常量 已有值的变量或是一个表达式 65 如 include includevoidmain floata 3 b 4 cout Theresultis cout sqrt a a b b 该程序的输出结果为 Theresultis 5 3 可以在cout输出流中插入C 中的转义字符 如 cout thevalueofa n cout a 2 4数据的输入与输出 66 表示输出完字符串Inputthevalueofa 后 在下一行输出变量a的值 4 可以将多个被输出的数据写在一个cout中 各输出项间用 操作符隔开即可 但要注意cout首先按从右向左的顺序计算出各输出项的值 然后再输出各项的值 如 cout valueofa a valueofb b Theresultis sqrt a a b b 再如 设变量i的值为10 则cout i i i 的输出结果为 12 11 10 5 一个cout语句也可拆成若干行书写 但注意语句结束符 只能写在最后一行上 如 对于上面的语句也可写成如下形式 2 4数据的输入与输出 67 cout valueofa 注意行末无分号 a valueofb b Theresultis sqrt a a b b 在此处书写分号 6 在cout中 实现输出数据换行功能的方法 既可使用转义字符 n 也可使用表示行结束的流操作子endl 如 cout ThisisfirstLine n Thisissecondline 上面语句可等价地写为 cout ThisisfirstLine endl Thisissecondline 2 4数据的输入与输出 68 7 在cout中还可以使用流控制符控制数据的输出格式 但使用这些流控制符时 要在程序的头上嵌入头文件 include 常用的流控制符及其功能如表2 12所示 表2 12I O流的常用控制符 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值大时 则数据所占的实际位数输出数据 设置域宽的参数n不再起作用 71 例2 2 cout流控制符setw的使用 include includevoidmain inta 21 b 999 cout setw 3 a setw 4 a setw 5 a endl cout setw 3 b setw 4 b setw 5 b endl cout setw 3 a b setw 4 a b setw 5 a b endl 其输出结果是 21 21 21 程序中第一个cout的输出结果999 999 999 程序中第二个cout的输出结果10201020 1020 程序中第三个cout的输出结果 2 4数据的输入与输出 72 设置域内填充字符 在默认情况下 当被输出的数据未占满域宽时 会自动在域内靠左边填充相应个数的空格符 但我们也可以设置在域内填充其他的字符 方法是利用cout的fill方法cout fill c 或setfill c cout fill c 上和setfill c 可以对所有被输出的数据起作用 例2 3 在例2 2的基础上增加域内填充字符的功能 include iostream h include iomanip h voidmain inta 21 b 999 cout fill 设置域内填充字符为 字符cout setw 3 a setw 4 a setw 5 a endl 2 4数据的输入与输出 73 cout setw 3 b setw 4 b setw 5 b endl cout fill 将域内填充字符改为 字符cout setw 3 a b setw 4 a b setw 5 a b endl 其输出结果是 21 21 21 程序中第一个cout的输出结果 未占满域宽的部分填充 字符 999 999 999 程序中第二个cout的输出结果10201020 1020 程序中第三个cout的输出结果 未占满域宽的部分填充 字符 2 4数据的输入与输出 74 当采用流控制符设置填充字符时 上面程序代码也可等价地改为 include includevoidmain inta 21 b 999 cout setw 3 setfill a setw 4 a setw 5 a endl cout setw 3 b setw 4 b setw 5 b endl cout setw 3 setfill a b setw 4 a b setw 5 a b endl 2 4数据的输入与输出 75 设置输出数据的进位计数制 在默认情况下 被输出的数据按十进制格式输出 但可以使用流控制符hex和oct控制数据的输出格式为十六进制和八进制 一旦设置成某种进位计数制后 数据的输出就以该种数制为主 可利用流控制符dec将数制重新成十进制 例2 4 在例2 2的基础上增加域内填充字符的功能 include includevoidmain inta 21 b 999 设置以十六制格式输出数据 2 4数据的输入与输出 76 cout setw 3 setfill hex a setw 4 a setw 5 a endl cout setw 3 b setw 4 b setw 5 b endl cout setw 3 setfill a b setw 4 a b setw 5 a b endl 设置以八制格式输出数据cout setw 3 setfill oct a setw 4 a setw 5 a endl cout setw 3 b setw 4 b setw 5 b endl cout setw 3 setfill a b setw 4 a b setw 5 a b endl 设置以十制格式输出数据cout setw 3 setfill dec a setw 4 a setw 5 a endl cout setw 3 b setw 4 b setw 5 b endl cout setw 3 setfill a b setw 4 a b setw 5 a b endl 2 4数据的输入与输出 77 程序的输出结果为 15 15 15 以十六进制格式输出数据3e7 3e7 3e73fc 3fc 3fc 25 25 25 以八进制格式输出数据17471747 174717741774 1774 21 21 21 以十进制格式输出数据999 999 99910201020 1020 2 4数据的输入与输出 78 设置浮点数的输出格式 对于浮点数 既可以用小数格式输出 也可以用指数格式输出 这可以分别通过setiosflags ios fixed 和setiosflags ios scientific 来控制 例2 5 已知圆的半径r 6 779 计算并输出圆的周长和面积 要求分别用指数和小数两种格式输出 include includevoidmain constdoublepi 3 14159 doubler 6 779 c s c 2 0 pi r 计算圆的周长s pi r r 计算圆的面积 2 4数据的输入与输出 79 以指数格式输出圆的面积和周长cout 圆的周长 指数 为 setiosflags ios scientific c endl cout 圆的面积 指数 为 s endl 以小数输出圆的面积和周长cout 圆的周长 小数 为 setiosflags ios fixed c endl cout 圆的面积 小数 为 setiosflags ios fixed s endl 程序的输出结果如下 圆的周长 指数 为 4 259368e 001圆的面积 指数 为 1 443713e 002圆的周长 小数 为 42 5937圆的面积 小数 为 144 371 2 4数据的输入与输出 80 2 4 2数据的输入cin在C 程序中 数据的输入通常采用cin流对象来完成 其格式如下 cin 变量名1 变量名2 变量名n 说明 1 cin是系统预定义的一个标准输入设备 2 cin的功能是 当程序在运行过程中执行到cin时 程序会暂停执行并等待用户从键盘输入相应数目的数据 用户输入完数据并回车后 cin从输入流中取得相应的数据并传送给其后的变量中 3 操作符后除了变量名外不得有其他数字 字符串或字符 否则系统会报错 2 4数据的输入与输出 81 如 cin x x 错误 因含有字符串 x cin x x 错误 因含有字符 x cin x 10 错误 因含有常量10 4 cin后面所跟的变量可为任何数据类型 若变量为整型数据类型 则在程序运行过程中从键盘输入数据时 可分别按十进制 八进制或十六进制输入该整数 但要注意 当按十进制格式输入整数时 可直接输入数据本身即可 若以十六进制输入整数时 数据前要冠以0 x或0X 若按八进制格式输入整数时 数据前要冠以数字0 若cin后面的变量为浮点类型 单精度或双精度 时 可分别按小数或指数的格式表示该浮点数 若cin后面的变量为字符类型时 可直接输入字符数据而不能在字符的两端加单引号 2 4数据的输入与输出 82 5 当程序中用cin输入数据时 最好在该语句之前用cout输出一个需要输入数据的提示信息 以正确引导和提示用户输入正确的数据 如 cout x 6 当一个cin后面同时跟有多个变量时 则用户在输入数据时的个数应与变量的个数相同 各数据之前用一个或多个空格隔开 输入完后按回车键 或者 每输入一个数据按回车键也可 如对于以下程序段 intx doublea charc1 cout 输入一个整数 一个浮点数和一个字符 2 4数据的输入与输出 83 cin x a c1 cout 整数 x 浮点数 a 字符 c1 运行过程中 屏幕上显示 输入一个整数 一个浮点数和一个字符 用户输入数据的格式可以是 100 3 14 a或者 100 3 14 a或者 1003 14a最后程序的输出结果为 整数 100浮点数 3 14字符 a 2 4数据的输入与输出 84 2 5 1C 语句概述语句 statement 是程序中最小的可执行单位 一条语句可以完成一种基本操作 若干条语句组合在一起就能实现某种特定的功能 C 中语句可以分为以下三种形式 1 单一语句在任何一个表达式后面加上分号 就构成了一条简单的C 语句 例如 c a b b a b a b cout HelloC endl 等等 2 5C 的控制语句 85 2 空语句仅由单个分号构成的语句 即 称为空语句 空语句不进行任何操作 该语句被用在从语法上需要一条语句 但实际上却又不进行任何操作的地方 3 复合语句复合语句是用一对花括号 括起来的语句块 复合语句在语法上等效于一个单一语句 使用复合语句应注意 1 花括号必须配对使用 2 花括号外不要加分号 2 5C 的控制语句 86 2 5 2C 程序的三种基本结构在程序设计中 语句可以按照结构化程序设计的思想构成三种基本结构 它们分别是顺序结构 分支结构和循环结构 如图2 5所示 顺序结构分支结构循环结构图2 5程序的三种基本结构 2 5C 的控制语句 87 1 顺序结构程序按照语句的书写顺序依次执行 语句在前的先执行 语句在后的后执行 只能满足设计简单程序的要求 2 分支结构在分支结构中 程序根据判断条件是否成立 来选择执行不同的程序段 也就是说 这种程序结构 能有选择地执行程序中的不同程序段 3 循环结构在循环结构中 程序根据判断条件是否成立 来决定是否重复执行某个程序段 程序的执行流程和顺序是由程序中的控制语句来完成的 而控制流程的主要方式是分支和循环 2 5C 的控制语句 88 2 5 3if语句if语句是最常用的一种分支语句 也称为条件语句 if语句有三种形式 单分支if语句 双分支if语句和多分支if语句 如图2 6所示 单分支if语句双分支if语句 2 5C 的控制语句 89 多分支if语句2 5 3 1单分支if语句if 表达式 语句 2 5C 的控制语句 90 其执行过程为 先计算关键字if后面的表达式的值 若为真 则执行if后的 语句 部分 否则跳过该 语句 部分 不管是否执行 语句 部分 最后都要接着 语句 部分的后面 继续执行程序的其它部分 注意 1 括号不能省略 2 在if 表达式 后不能加分号 3 关键字if的后面的表达式可以是任意的表达式 只要表达式的值为非0 即当真值处理 否则当假值处理 4 if语句的内嵌语句可以是单一语句 也可以是复合语句 5 尽量使if语句的内嵌语句比if语句缩进 这是良好编程书写风格 2 5C 的控制语句 91 如 intx 0 y 2 if x 0 y cout x y 运算结束后 变量y的值为2 而不是3 变量x的值为0 2 5 3 2双分支if语句双分支if语句的一般格式为 if 表达式 语句块1else语句块2 2 5C 的控制语句 92 其执行过程为 先判断表达式的值 若为真 则执行语句块1 否则执行语句块2 不管程序执行语句块1还是执行语句块2 最后都要跳到语句块2的后面接着执行程序中后面的语句 注意 1 语句块1 语句块2既可以是单一语句也可以是用 括起来的复合语句 2 else子句必须与if子句配对使用 不能单独使用 3 else子句必须处在if子句的后面 且else语句总是和离它最近的前面未配对的if语句配对 例2 6 输入一个年号 判断是否为闰年 如果是则输出 yes 否则输出 Not 分析 只要满足下列两个条件之一者 即是闰年 2 5C 的控制语句 93 年号能被4整除 但要排除同时能被100整除 年号能被400整除 includevoidmain inty cout y if y 4 0 2 5C 的控制语句 94 2 5 3 3多分支if语句多分支if语句是if语句的嵌套结构 其一般形式为 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式N 语句Nelse语块N 1 2 5C 的控制语句 95 例2 7 输入学生的成绩score 按分数输出其等级 score 90为优 90 score 80为良 80 score 70为中等 70 score 60为及格 scorevoidmain floatscore cout score if score 90 cout 80 cout Good 2 5C 的控制语句 96 elseif score 70 cout 60 cout Pass elsecout Failed 注意 在if语句嵌套中else与if配对关系 else与离它最近的if语句相匹配 2 5 4switch语句switch语句是多分支语句 在C 中 使用switch语句可以更方便 更简洁地实现多分支结构 2 5C 的控制语句 97 switch语句的一般形式为 switch 表达式 case常数1 语句1 break case常数2 语句2 break case常数n 语句n break default 语句n 1 switch语句的执行过程是 计算switch语句后面的表达式的值 当表达式的值与某一个case后面的常量的值相等时 就执行此case后面的语句 若所有的case中的常量的值都没有与表达式的值相匹 2 5C 的控制语句 98 配的 就执行default后面的语句 当没有default语句时 则什么也不执行 执行完一个case后面的语句后 程序执行的流程转移到下一个case继续执行 case常量 只是起语句标号作用 并不是在该处进行条件判断 在执行switch语句时 根据switch后面表达式的值找到匹配的入口标号 就从此标号开始执行下去 不再进行判断 只有当遇到break语句或执行完全部switch内的语句时 才跳出switch语句 例2 8 输入学生的成绩score 按分数输出其等级 score 90为优 90 score 80为良 80 score 70为中等 70 score 60为及格 scorevoidmain 2 5C 的控制语句 99 floatscore inta cout score a score 10 switch a case0 case9 cout Excellent break case8 cout Good break case7 cout Right break case6 cout Pass break default cout Failed 2 5C 的控制语句 100 说明 常数1 常数n必须互不相同 且每一常数后面要有冒号 各case子句和default子句的次序可任意 语句1 语句n 1可以为复合语句 在switch语句中出现的break语句并不是必需的 这要根据程序的需要来决定 在此break语句的作用是跳出switch语句 各case子句后面必须是常数 而不能是变量或表达式2 5 5循环语句C 提供了三种循环结构 while循环语句 do while循环语句和for循环语句 2 5C 的控制语句 101 2 5 5 1while循环语句while语句的一般形为 while 表达式 循环体语句 该语句的执行过程 首先判断while后面的表达式的值 若表达式的值为真 则执行while的内嵌语句 即循环体 一次 然后重复以上过程 直到表达式的值为假时 才退出循环 接着执行循环体语句后面的其它程序语句 例2 9 求 2 5C 的控制语句 102 includevoidmain inti n n 0 i 1 while i 100 n n i i cout n n endl 2 5 5 2do while循环语句do while语句的一般形式为 2 5C 的控制语句 103 do 循环体语句 while 表达式 该语句的执行过程 首先执行do while的内嵌语句 循环体语句 一次 然后再判断while后面的表达式的值 若表达式的值为真 则重复执行do while的内嵌语句 如此反复 直到表达式的值为假时 循环结束 执行while后面的语句 例2 10 求 includevoidmain 2 5C 的控制语句 104 inti n n 0 i 1 do n n i i while i 100 cout n n endl 说明 在循环体相同的情况下 while语句和do while语句的功能基本相同 二者的区别在于 当循环条件一开始就为假时 do while语句中的循环体至少会被执行一次 而while语句则一次都不执行 2 5C 的控制语句 105 2 5 5 3for循环语句for循环语句的一般格式为 for 表达式1 表达式2 表达式3 循环体语句 该语句的执行过程是 执行for后面的表达式1 执行表达式2 若表达式2的值为真 则执行for语句的内嵌语句 即循环体语句 然后执行第 步 若为假 则循环结束 执行第 步 执行表达式3 返回继续执行第 步 循环结束 执行for语句的循环体下面的语句 2 5C 的控制语句 106 例2 11 求 用for语句实现循环 includevoidmain inti n n 0 for i 1 i 100 i n n i cout n n endl 2 5 5 4循环嵌套在一个循环的循环体中又包含另一个循环语句 称为循环嵌套 C 的三种循环语句可以相互嵌套 构成循环 2 5C 的控制语句 107 嵌套 以下几种都是合法的循环嵌套 1 for for 2 while for do while 2 5C 的控制语句 108 3 do fo
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!