C++语言和面向对象程序设计课件.ppt_第1页
C++语言和面向对象程序设计课件.ppt_第2页
C++语言和面向对象程序设计课件.ppt_第3页
C++语言和面向对象程序设计课件.ppt_第4页
C++语言和面向对象程序设计课件.ppt_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

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

文档简介

2020年1月27日星期一 C 面向对象程序设计 第2章C 语言基础 2 1数据类型和基本输入输出2 2运算符和表达式2 3基本控制结构2 4函数2 5构造类型2 6指针项目设计1控制台程序的人机界面设计 2020年1月27日星期一 C 面向对象程序设计 2 1数据类型和基本输入输出 2 1 1基本数据类型2 1 2常量2 1 3变量2 1 4基本输入 输出 2020年1月27日星期一 C 面向对象程序设计 2 1 1基本数据类型 基本数据类型是C 系统的内部数据类型 包括bool 布尔型 int 整型 char 字符型 float 单精度浮点型 double 双精度浮点型 以及基本数据类型中short 短型 和long 长型 signed 有符号 和unsigned 无符号 之分 的数据类型如下图所示 2020年1月27日星期一 C 面向对象程序设计 2 1 1基本数据类型 2020年1月27日星期一 C 面向对象程序设计 2 1 1基本数据类型 使用基本数据类型要注意两点 无符号 unsigned 和有符号 signed 的区别在于数值最高位的含义 int型在16位系统中和在32位系统中 所占用字节数是不一样的 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 所谓常量是指在程序运行的整个过程中其值始终不可改变的量 也就是直接使用符号 文字 表示的值 例如10 6 2 3 5 7 A b 都是常量 整型常量整型常量就是整型常数 整型常量可以用以下三种形式表示 十进制整数 十进制整数没有前缀 例如 237 568 65535 1627 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 八进制整数 八进制整数要以数字0开头 即以0作为八进制数的前缀 例如 015 十进制为13 0101 十进制为65 0177777 十进制为65535 十六进制整常数 十六进制整数要以数字0 x或0X开头 即以0 x作为十六进制数的前缀 例如 0X2A 十进制为42 0XA0 十进制为160 0XFFFF 十进制为65535 实型常量实型常量也称为实数或者浮点数 实数只采用十进制 它有二种形式 小数形式和指数形式 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 十进制数的形式 由数码0 9和小数点组成 例如 0 0 25 0 5 789 0 13 300 267 8230等均为合法的实数 注意 实型常量中必须含有小数点 指数形式 由十进制数 加阶码标志 e 或 E 以及阶码 只能为整数 可以带符号 组成 例如 2 1E5 等于2 1 105 3 7E 2 等于3 7 10 2 2 8E 2 等于 2 8 10 2 实型常量默认都按双精度double型处理 但可以添加后缀 f 或 F 即表示该数为单精度浮点数 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 字符常量字符常量是用单引号括起来的一个字符 例如 a b 有以下特点 字符常量只能用单引号括起来 不能用双引号或其它括号 字符常量只能是单个字符 不能是字符串 字符可以是字符集中任意字符 但数字被定义为字符型其含义就发生了变化 如 5 和5是不同的 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 转义字符是一种特殊的字符常量 转义字符以反斜线 开头 后跟一个或几个字符 转义字符具有特定的含义 不同于字符原有的意义 故称 转义 字符 例如 n 就是一个转义字符 其意义是 回车换行 转义字符主要用来表示那些用一般字符不便于表示的控制代码 广义地讲 字符集中的任何一个字符均可用转义字符来表示 字符串常量 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 字符串常量是由一对双引号括起的字符序列 例如 CHINA Cprogram 12 5 等都是合法的字符串常量 字符串常量和字符常量是不同的量 它们之间主要有以下区别字符常量由单引号括起来 字符串常量由双引号括起来字符常量只能是单个字符 字符串常量则可以含一个或多个字符字符常量占一个字节的内存空间 字符串常量占的内存字节数等于字符串中字节数加1 增加的一个字节中存放字符 0 ASCII码为0 这是字符串结束的标志 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 布尔常量布尔型常量只有两个 true 真 和false 假 符号常量除了前面讲过的直接用文字表示常量外 也可以为常量命名 这种代替常量本身的标识符称为符号常量 C 中用const定义符号常量 符号常量在使用之前一定要首先声明 常量声明语句的形式为 const数据类型说明符常量名 常量值 2020年1月27日星期一 C 面向对象程序设计 2 1 2常量 符号常量在声明时一定要赋初值 而在程序中间不能改变其值 2020年1月27日星期一 C 面向对象程序设计 2 1 3变量 在程序的执行过程中其值可以变化的量称为变量 变量是需要用名字来标识的 变量的定义就像常量具有各种类型一样 变量也具有相应的类型 变量在使用之前需要首先声明其类型和名称 变量名应是合法的标识符 变量声明语句的形式如下 2020年1月27日星期一 C 面向对象程序设计 2 1 3变量 变量的初始化在声明一个变量的同时 也可以给它赋以初值 而这实质上就是给对应的内存单元赋值 这一过程称为初始化 例如 inta 3 b 5 指定a b为整型变量 a的初值为3 b的初 值为5C 中变量的初始化还有另一种形式 例如 inta 3 b 5 需要注意的是 一个未初始化的变量不是没有数值 而是取决于变量所在系统中的存储形式 它可能是系统的默认值或无效值 2020年1月27日星期一 C 面向对象程序设计 2 1 4基本输入 输出 C 中使用标准输入流cin和标准输出流cout来实现数据的输入与输出 输出流 cout 通过cout可以输出一个整数 实数 字符及字符串 cout中的插入符 可以连续写多个 每个后面可以跟一个表达式 该表达式通常是获得输入值的变量或对象 2020年1月27日星期一 C 面向对象程序设计 2 2运算符和表达式 2 2 1算术运算符和算术表达式2 2 2赋值运算符和赋值表达式2 2 3逗号运算符和逗号表达式2 2 4关系运算符和关系表达式2 2 5逻辑运算符和逻辑表达式2 2 6 与sizeof运算符2 2 7位运算符2 2 8三目运算符 2020年1月27日星期一 C 面向对象程序设计 2 2运算符和表达式 2 2 9运算符的优先顺序2 2 10运算式中的类型转换 2020年1月27日星期一 C 面向对象程序设计 2 2 1算术运算符和算术表达式 C 中由算术运算符 操作数和括号构成的表达式称为算术表达式 C 中基本算术运算符有 加法 减法或负号 乘法 除法 求余 这些算术运算符和数学运算的概念及运算方法是一致的 但有几点需要说明 减法运算 即是双目运算符又是单目运算符 作单目运算符时 是求负运算 例如 5 x等 2020年1月27日星期一 C 面向对象程序设计 2 2 1算术运算符和算术表达式 除法运算 当参与相除运算的两个操作数均为整型时 其结果也为整型 取商的整数部分 舍去小数 因此表达式1 2的结果为0 如果两个操作数中有一个是实型 则结果为双精度实型 求余运算 要求参与运算的操作数均为整型 例如 表达式a b 其值等于两数相除后的余数 即a被b除的余数 符号与a相同 优先级和结合性 在一个包含多种算术运算的混合运算中 先乘除 后加减的运算规则是由运算符的优先级来保证的 在算术运算符中 除单目运算符外 其余运算符的结合性都是自左向右 2020年1月27日星期一 C 面向对象程序设计 2 2 2赋值运算符和赋值表达式 C 中赋值运算符 是一个双目运算符 运算的结合性为自右向左 带有赋值运算符的表达式被称为赋值表达式 其作用就是将赋值符右边表达式的值赋给左边的操作数 例如 x a b就是一个赋值表达式 在赋值符 之前加上其它双目运算符可构成复合赋值符 C 提供了10种复合赋值运算符 例如 a 5等价于a a 5 2020年1月27日星期一 C 面向对象程序设计 2 2 3逗号运算符和逗号表达式 在 语言中逗号 也是一种运算符 称为逗号运算符 逗号运算符是优先级最低的运算符 其形式为 表达式1 表达式2 表达式n在计算时 C 将自左向右逐个计算每个表达式 最终整个表达式的结果是最后计算的那个表达式的类型和值 例如 j i 12 i 8 表达式值为20 2020年1月27日星期一 C 面向对象程序设计 2 2 4关系运算符和关系表达式 比较两个量的运算符称为关系运算符 关系运算符将两个数据进行比较 判定两个数据是否符合给定的关系 例如 x y 中的 表示一个大于关系运算 C 提供了6种关系运算符 大于 大于等于 等于 不等于 2020年1月27日星期一 C 面向对象程序设计 2 2 4关系运算符和关系表达式 有几点需要注意 等于 关系运算符是两个等号 而不是一个等号 赋值运算符 在6个关系运算符中 前4个优先级相同 后2个也相同 且前4个高于后2个 关系运算符的优先级 低于算术运算符 但高于赋值运算符 用关系运算符将两个表达式连接起来 进行关系运算的式子就是关系表达式 2020年1月27日星期一 C 面向对象程序设计 2 2 4关系运算符和关系表达式 关系表达式的值为逻辑值即 真 或 假 在C 编译系统中 往往将 真 表示为 true 或1 将 假 表示为 false 或0 而任何不为0的数被认为是 真 0被认为是 假 例如设x1 1 x2 2 x3 3 则 x1 x2 x3 表达式为1 2020年1月27日星期一 C 面向对象程序设计 2 2 5逻辑运算符和逻辑表达式 逻辑运算符用于将多个关系表达式或逻辑量 真 或 假 组成一个逻辑表达式 C 提供了下列三种逻辑运算符 逻辑与 逻辑或 逻辑非例如 下面的表达式都是逻辑表达式 x 1 x5 x 0 2020年1月27日星期一 C 面向对象程序设计 2 2 5逻辑运算符和逻辑表达式 逻辑运算符的运算规则如下 双目运算符 当且仅当两个操作数的值都为 真 时 运算结果为 真 否则为 假 等价于 同时 的含义 双目运算符 当且仅当两个操作数的值都为 假 时 运算结果为 假 否则为 真 等价于 或者 的含义 单目运算符 当操作数的值为 真 时 运算结果为 假 当操作数的值为 假 时 运算结果为 真 等价于 否定 的含义 例如 设x 5 则 x 0 x5 的值为 假 2020年1月27日星期一 C 面向对象程序设计 2 2 5逻辑运算符和逻辑表达式 逻辑运算符的优先级如下 逻辑非的优先级最高 逻辑与次之 逻辑或最低 即 非 与 或 与其它种类运算符的优先关系 算术运算 关系运算 赋值运算 2020年1月27日星期一 C 面向对象程序设计 2 2 6 与sizeof运算符 自增 自减运算符单目运算符自增 和自减 的作用是使整型变量的值增1或减1 这两个运算符都有前置和后置两种使用形式 例如 i与i 的作用相当于i i 1 i与i 的作用相当于i i 1 这里需要注意的是 自增 和自减 运算符只能用于变量 而不能用于常量或表达式 如3 或 a b 都是不合法的 2020年1月27日星期一 C 面向对象程序设计 2 2 6 与sizeof运算符 和 的结合性是 自右至左 若自增 和自减 仅用于某个变量的增1和减1 则前置和后置两种使用形式是等价的 但如果将自增 和自减 和其他运算符组合在一起 则前置和后置两种使用形式在求值次序上就会产生不同 i i 在使用i参与其他运算之前 先使i的值加 减 1 i i 在使用i参与其他运算之后 再使i的值加 减 1 2020年1月27日星期一 C 面向对象程序设计 2 2 6 与sizeof运算符 sizeof运算符sizeof运算符用于计算操作数在内存中所占的字节数 它使用的语法形式为 sizeof sizeof 运算结果返回值为 数据类型 所指定的类型或 表达式 的结果类型所占的字节数 例如 sizeof int 计算整型int所占内参的字节数sizeof hello 计算字符串常量的实际长度 2020年1月27日星期一 C 面向对象程序设计 2 2 7位运算符 位运算符是对操作数按其在计算机内表示的二进制数逐位地进行逻辑运算或移位运算 C 语言提供了6种位运算 位逻辑运算符 按位与 运算符 运算规则 参加运算的两个操作数 如果两个数相应位的值都是1 则该位的结果值为1 否则为0 例如 如果要保留整数a的低字节 屏蔽掉其高字节 只需要将a和b进行按位与运算即可 其中b的高字节每位置为0 低字节每位置为1 即0010101001010010 0000000011111111 0000000001010010 2020年1月27日星期一 C 面向对象程序设计 2 2 7位运算符 按位或 运算符 运算规则 参加运算的两个操作数 如果两个数相应位的值都是0 则该位的结果值为0 否则为1 例如 如果把a的第10位置为1 而且不要破坏其它位 可以对a和b进行 按位或 运算 其中b的第10位置为1 其它位置为0 即0010000001010010 0000001000000000 0010001001010010 按位异或 运算符 运算规则 参加运算的两个操作数 如果两个数的相应位的值不同 则该位的结果值为1 否则为0 例如 如要把a的奇数位翻转 可以对a和b进行 按位异或 运算 其中b的奇数位置为1 偶数位置为0 即0000000001010010 0101010101010101 0101010100000111 2020年1月27日星期一 C 面向对象程序设计 2 2 7位运算符 按位取反 运算符 运算规则 对一个操作数的每一位都取反 即将1变为0 0变为1 移位运算符左移运算符 运算规则 对运算符 左边的操作数的每一位全部左移右边运算量表示的位数 右边空出的位补0 左移1位相当于该数乘以2 左移n位相当于该数乘以2n 例如 chara 0 x21 则a 2的过程00100001 2 10000100即a 2的值为0 x84 2020年1月27日星期一 C 面向对象程序设计 2 2 7位运算符 右移运算符 运算规则 对运算符 左边的运算量的每一位全部右移右边运算量表示的位数 右边低位被移出去舍弃掉 空出的高位补0还是补1 分两种情况对无符号数进行右移时 空出的高位补0 这种右移称为逻辑右移 例如 unsignedchara 0 x8a a 10001010等于十进制数138a 1 010001010等于十进制数69补0舍弃对带符号数进行右移时 空出的高位全部以符号位填补 即正数补0 负数补1 这种右移称为算术右移 2020年1月27日星期一 C 面向对象程序设计 2 2 7位运算符 例如chara 0 x8a a 10001010等于十进制数 118a 1 110001010等于十进制数 59补1舍弃位赋值运算符位运算符与赋值运算符结合可以组成位赋值运算符 2020年1月27日星期一 C 面向对象程序设计 2 2 8三目运算符 C 中唯一的三目运算符是条件运算符语法格式为 条件表达式 是C 中可以产生 真 和 假 结果的任何表达式 如果条件表达式的结果为 真 则执行表达式1 否则执行表达式2 例如 n a b 1 0 如果a b成立 则n的 值为1 否则为0 2020年1月27日星期一 C 面向对象程序设计 2 2 9运算符的优先顺序 运算符优先顺序如下表 2020年1月27日星期一 C 面向对象程序设计 2 2 9运算符的优先顺序 2020年1月27日星期一 C 面向对象程序设计 2 2 10运算式中的类型转换 当表达式中出现了多种类型数据的混合运算时 往往需要进行类型转换 表达式中的类型转换分为两种 自动转换和强制转换 自动转换自动转换的基本原则是将数据类型按照从低到高的顺序进行转换 类型越高 数据的表示范围越大 精度也越高 各种类型的高低顺序如下 char short int unsigned long unsignedlong float double 2020年1月27日星期一 C 面向对象程序设计 2 2 10运算式中的类型转换 自动转换遵循以下规则若参与运算量的类型不同 则先转换成同一类型 然后进行运算 转换按数据长度增加的方向进行 以保证精度不降低 如int型和long型运算时 先把int量转成long型后再进行运算 所有的浮点运算都是以双精度进行的 即使仅含float单精度量运算的表达式 也要先转换成double型 再作运算 char型和short型参与运算时 必须先转换成int型 在赋值运算中 赋值号两边量的数据类型不同时 赋值号右边量的类型将转换为左边量的类型 如果右边量的数据类型长度比左边量的数据类型长度长时 将丢失一部分数据 这样会降低精度 丢失的部分按四舍五入向前舍入 2020年1月27日星期一 C 面向对象程序设计 2 2 10运算式中的类型转换 强制转换强制类型转换是通过类型说明符和括号来实现的 其一般形式为 或 例如 float a 把a转换为实型 int x y 把x y的结果转换为整型 2020年1月27日星期一 C 面向对象程序设计 2 3基本控制结构 2 3 1表达式语句 空语句和复合语句2 3 2选择控制语句2 3 3循环控制语句2 3 4break和continue语句实训2程序控制结构的应用 2020年1月27日星期一 C 面向对象程序设计 2 3 1表达式语句 空语句和复合语句 顺序结构程序就是由顺序执行语句组成的 程序运行是按照书写的顺序进行 不发生控制转移 所以它是最简单的 表达式语句表达式语句由表达式后加一个分号构成 例如 a b num 3 空语句空语句仅由一个分号构成 例如 就是一个空语句复合语句复合语句是由一对大括号 括起来的两条或两条以上的语句构成的 2020年1月27日星期一 C 面向对象程序设计 2 3 1表达式语句 空语句和复合语句 例如 需要注意的是 在复合语句中定义的变量只作用于该复合语句的范围 而在复合语句外 这些变量却不能被调用 voidmain t x x y y t 复合语句 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 选择结构是用来判断所给定的条件是否满足 并根据判定的结果 真或假 决定哪些语句被执行 用if语句实现选择结构if语句是专门用来实现选择结构的语句 它根据给定的条件进行判断 以决定执行某个分支程序段 其语法形式为 if else 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 例如 if x y max x elsemax y if语句中的语句2可以为空 当语句2为空时 else可以省略 if语句的嵌套处理多分支的情况时 C 语言允许在if或if else中的 语句1 或 语句2 部分中再使用if或if else语句 这种设计方法称为嵌套 if语句的嵌套中 else部分总是与前面最靠近的 还没有配对的if配对 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 例如 比较两个数的大小 includeusingnamespacestd voidmain intx y cout x y if x y if x y couty endl elsecout x y endl elsecout x y endl 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 如果if语句的嵌套都是发生在else分支中 就可以应用if elseif语句 语法形式为 if elseif elseif 例如 求分段函数y f x 的值 f x 的表达式如下 x2 1 x1 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 includeusingnamespacestd voidmain floatx y cout x if x 1 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 switch语句C 语言提供了直接实现多分支选择结构的语句 switch语句 称为多分支语句 也叫开关语句 switch语句的语法形式如下 switch case 语句1 break case 语句2 break case 语句n break default 语句n 1 break 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 使用switch语句需要注意的是 switch后面的表达式可以是整型 字符型 枚举型 而case后面的常量表达式的类型必须与其匹配 每个case后面常量表达式的值必须各不相同 各case及default子句的先后次序不影响程序执行结果 每个case分支可以有多条语句 但不必用 case后面的常量表达式仅起语句标号作用 并不进行条件判断 系统一旦找到入口标号 就从此标号开始执行 不再进行标号判断 所以必须加上break语句 以便结束switch语句 否则会从入口点开始一直执行到switch结构的结束点 当若干分支需要执行相同操作时 可以使多个case分支共用一组语句 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 例如 用switch语句实现计算器的简单功能 includeusingnamespacestd voidmain floatx y 运算数charoper 运算符cout x oper y 2020年1月27日星期一 C 面向对象程序设计 2 3 2选择控制语句 switch oper case cout x y x y endl break case cout x y x y endl break case cout x y x y endl break case if y 0 cout divisoriszero n break cout x y x y endl break default cout operatorhasnoeffect n 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 C 中提供了三种循环控制语句 while语句 do while语句和for语句 while语句while语句的语法形式如下 while 其中表达式是循环条件 语句为循环体 执行顺序是 先判断表达式的值 当表达式为真时便开始执行while循环体中的语句 然后反复执行 每次执行都会判断表达式是否为真 直到有一次执行循环体后条件表达式的值为假时终止 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 例如 用while语句求100以内的奇数之和 includeusingnamespacestd voidmain inti 1 sum 0 while i 100 sum i i 2 cout sum sum endl 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 使用while语句需要注意的有 如果循环体有多个语句时 要用大括号 把它们括起来 以复合语句形式出现 循环体中必须有修改条件表达式的语句 可以使条件由成立转为不成立 从而结束循环 否则如果开始时条件为真 就会永远为真 使循环体永远重复执行下去 称为 死循环 do while语句do while语句的语法形式如下 dowhile 执行顺序是 先执行循环中的语句 然后再判断表达式是否为真 如果为真则继续循环 如果为假 则终止循环 因此 do while循环至少要执行一次循环语句 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 例如 用do while语句求100以内的奇数之和 includeusingnamespacestd voidmain inti 1 sum 0 do sum i i 2 while i 100 cout sum sum endl 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 for语句for语句的语法形式如下 for 表达式1 表达式2 表达式3 其中 表达式1 给循环控制变量赋初值 表达式2 循环条件 是一个逻辑表达式 它决定什么时候退出循环 表达式3 循环变量增值 规定循环控制变量每循环一次后按什么方式变化 for语句的执行流程是 首先计算一次表达式1的值 再计算表达式2 循环控制条件 的值 并根据表达式2的值判断是否执行循环体 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 例如 用for语句求100以内的奇数之和 includeusingnamespacestd voidmain inti sum sum 0 for i 1 i 100 i 2 sum i cout sum sum endl 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 使用for语句需要注意的是 表达式1 表达式2 表达式3都可以省略 但分号 不能省略 若表达式1省略或者是与循环条件无关的其他表达式 则应该在for语句之前给循环控制条件赋初值 若表达式2省略 则循环将无终止地进行下去 若表达式3省略或者是与循环条件无关的其他表达式 则应该在循环体中另有语句改变循环条件 以保证循环能正常结束 表达式1和表达式3可以是一个简单的表达式 也可以是逗号表达式 既可以是给循环变量赋初值 也可以是与循环变量无关的其它表达式 例如 for i 1 sum 0 i 100 sum i i 2 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 循环结构与选择结构的嵌套循环结构与选择结构可以互相嵌套 以实现复杂算法 例如 输入一个整数 求出它的所有因子 includeusingnamespacestd voidmain intn k cout n cout Number n Factors for k 1 k n k if n k 0 cout k cout endl 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 例如 编写程序打印以下图案 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 includeusingnamespacestd voidmain inti j n 4 for i 1 i n i 输出前4行图案 在图案左侧空30列for j 1 j 30 j cout for j 1 j 8 2 i j cout for j 1 j 2 i 1 j cout cout endl 2020年1月27日星期一 C 面向对象程序设计 2 3 3循环控制语句 for i 1 i n 1 i 输出后3行图案 在图案左侧空30列for j 1 j 30 j cout for j 1 j 7 2 i j cout cout endl 2020年1月27日星期一 C 面向对象程序设计 2 3 4break和continue语句 C 转移语句包括break continue goto和return语句 转移语句的作用是改变程序的顺序执行流程 将程序执行流程转移到程序其他地方 break语句break语句可用在switch多分支结构和循环结构中 在switch结构中 break语句用于跳出switch结构 在循环结构中 break语句用于跳出循环 即程序遇到break语句时提前结束循环 执行循环外的下一条语句 2020年1月27日星期一 C 面向对象程序设计 2 3 4break和continue语句 例如 用穷举法找出1 10之间的质数并显示出来 代码见教材P29 P30continue语句continue语句只用于循环结构 当遇到continue语句时 程序只跳过continue语句后的其余语句 即仅结束本次循环 并直接进入下一次循环 例如 输出100以内能被3整除且个位数为6的所有整数 代码见教材 例2 18 2020年1月27日星期一 C 面向对象程序设计 实训2程序控制结构的应用 实训说明在实训中 我们要实现的功能是验证哥德巴赫猜想 即任一充分大的偶数可以用两个素数之和表示 程序分析先不考虑怎样判断一个数是否为素数 而从整体上对这个问题进行考虑 我们可以这样做 读入一个偶数num 将它分成p和q两部分 使得num p q 那么怎样分呢 可以令p从2开始 每次增加1 而令q num p 如果p q均为素数 则正为所求 否则令p p 1再试 2020年1月27日星期一 C 面向对象程序设计 实训2程序控制结构的应用 算法如下 读入大于3的偶数num p 1do p p 1 q num p 判断p是否素数 判断q是否素数 while p q有一个不是素数 输出num p q 接下来分析第5 6步 怎样判断一个数是否为素数要判断一个数i是否为素数 方法是用小于等于i的平方根的数依次去除i 看能否除尽 若都除不尽则i必为素数 反之则不是 程序员代码见教材实训2 2020年1月27日星期一 C 面向对象程序设计 2 4函数 2 4 1函数的定义和调用2 4 2函数的参数传递2 4 3函数参数的引用传递2 4 4带默认形参值的函数2 4 5函数的嵌套与递归调用2 4 6内联函数2 4 7函数的重载实训3函数的应用 2020年1月27日星期一 C 面向对象程序设计 2 4 1函数的定义和调用 函数的定义函数定义的一般形式如下 函数类型规定了所定义函数返回值的类型 函数名是一个有效的C 标识符 同一个文件中的函数不能同名 函数体是一个语句序列 用于实现函数的具体功能 2020年1月27日星期一 C 面向对象程序设计 2 4 1函数的定义和调用 例如 定义一个函数 求二个数中最大者 intmax intx inty 定义函数max intz if x y z x elsez y returnz 2020年1月27日星期一 C 面向对象程序设计 2 4 2函数的参数传递 C 中函数的参数传递有两种方式 一种是按值传递 另一种是地址传递或引用传递 这里先来说明按值传递的参数传递方法 按值传递方法是把实参的值拷贝给形参 即调用函数向被调用函数传递的参数是变量本身值 在内存中 由于形参与实参占用不同的存储单元 这时形参值的变化将不影响实参的值 2020年1月27日星期一 C 面向对象程序设计 2 4 2函数的参数传递 例如 交换函数的两个参数的值 includeusingnamespacestd 交换函数swap 用于交换x和y的值voidswap intx inty inttemp temp x x y y temp cout x x y y endl 2020年1月27日星期一 C 面向对象程序设计 2 4 2函数的参数传递 值传递的最大好处是保持函数的独立性 在值传递的情况下 函数只有通过return来返回某个类型的值 voidmain inta 10 b 20 cout a a b b endl swap a b cout a a b b endl 2020年1月27日星期一 C 面向对象程序设计 2 4 3函数参数的引用传递 引用引用是C 提供的一种特殊类型的变量 定义引用类型变量实质上是给一个已定义的变量起一个别名 系统不会为引用类型变量分配内存空间 只是使引用类型变量与其相关联的变量使用同一个内存空间 定义引用类型变量的一般格式为 ra就是一个引用 它是变量a的别名 2020年1月27日星期一 C 面向对象程序设计 2 4 3函数参数的引用传递 例如 为变量i声明一个引用r 在程序中分别对r和i进行计算 includeusingnamespacestd voidmain inti 10 int 2020年1月27日星期一 C 面向对象程序设计 2 4 3函数参数的引用传递 在使用引用时 需要注意的是 定义引用类型变量时 必须将其初始化 而且引用变量类型必须与为它初始化的变量类型相同 一旦一个引用被初始化后 就不能改为指向其他变量 当引用类型变量的初始化值是常量时 则必须将该引用类型定义成const类型 2020年1月27日星期一 C 面向对象程序设计 2 4 3函数参数的引用传递 函数的引用传递引用也可作为形参 如果将引用作为形参 则在函数中对形参所做的更改对主函数中的实参有效 例如 引用作为函数参数的调用方式 使两数成功地进行交换 includeusingnamespacestd 2020年1月27日星期一 C 面向对象程序设计 2 4 3函数参数的引用传递 voidswap int 2020年1月27日星期一 C 面向对象程序设计 2 4 4带默认形参值的函数 C 允许在函数声明或定义中给一个或多个参数指定默认值 例如 下面声明一个带默认值参数的函数fun voidfun intval 10 则如下的函数调用把实参值20传递给形参 fun 20 而如果函数调用用省略实参 则把默认值10传递给形参 如下所示 fun 等同于fun 10 2020年1月27日星期一 C 面向对象程序设计 2 4 4带默认形参值的函数 在设置函数的默认参数值时要注意 当函数既有声明又有定义后 不能在函数定义中指定默认参数 如果函数有多个形参 在声明和定义函数时 必须将带默认值的形参放在参数表的右部 即默认参数应按从右到左的顺序定义 在带默认值的形参右边不能有未指定默认值的形参 在函数调用时 系统按从左到右的顺序将实参与形参结合 当实参的数目不足时 系统将按照同样的顺序用声明或定义中的默认值来补齐所缺少的参数 2020年1月27日星期一 C 面向对象程序设计 2 4 5函数的嵌套与递归调用 嵌套调用函数允许嵌套调用 所谓嵌套调用就是在调用一个函数并执行该函数中 又调用另一个函数的情况 例如 编写一个计算组合数的程序 计算组合数的公式如下 2020年1月27日星期一 C 面向对象程序设计 2 4 5函数的嵌套与递归调用 在本例中 组合数的计算用函数functionA 进行 而它需要的阶乘计算由函数functionB 进行 主函数main 调用函数functionA 而函数functionA 三次调用函数functionB 计算m n m n 计算结果返回给主函数进行输出 m和n由键盘输入 源程序代码见教材 例2 23 2020年1月27日星期一 C 面向对象程序设计 2 4 5函数的嵌套与递归调用 例子中函数的调用如下图所示 2020年1月27日星期一 C 面向对象程序设计 2 4 5函数的嵌套与递归调用 递归调用函数可以直接或间接地调用自身 称为递归调用 递归调用分两个阶段 第一阶段 递推 将原问题不断分解为新的子问题 逐渐从未知向已知推进 最终达到已知条件 即递归结束的条件 这时递推阶段结束 例如求4 可以这样分解 4 4 3 3 3 2 2 2 1 1 1 0 0 1 2020年1月27日星期一 C 面向对象程序设计 2 4 5函数的嵌套与递归调用 第二阶段 回归 从已知条件出发 按照递推的逆过程 逐一求值回归 最后达到递归的开始处 结束回归阶段 完成递归调用 例如求4 的回归阶段如下 4 4 3 24 3 3 2 6 2 2 1 2 1 1 0 1 0 1递归部分实例及代码见教材 例2 24 和 例2 25 2020年1月27日星期一 C 面向对象程序设计 2 4 6内联函数 当函数被调用时 若把函数体直接嵌入函数调用处 则可消除附加的现场处理的时间开销 提高程序的运行效率 当然 这样将会加大代码占用内存的空间开销 C 提供了实现上述嵌入功能的函数 这种函数称为内联 inline 函数 内联函数一般适用于代码较短的函数 定义一个内联函数只需在函数头前加入关键字inline 2020年1月27日星期一 C 面向对象程序设计 2 4 6内联函数 例如 用内联函数计算圆的面积 includeusingnamespacestd inlinedoubleCalArea doubleradius 内联函数 计算圆的面积 return3 14 radius radius voidmain doublearea r 2 0 r是圆的半径area CalArea r 调用内联函数求圆的面积 编译时此处被替换为 CalArea函数体语句cout area endl 2020年1月27日星期一 C 面向对象程序设计 2 4 7函数的重载 C 中允许功能相近的函数在相同的作用范围内以相同函数名定义 从而形成重载 函数的重载指的是两个以上的函数 取相同的函数名 但是形参的个数或者类型不同 编译器根据实参和形参的类型及个数的最佳匹配 自动确定调用哪一个函数 函数重载例子及代码见教材 例2 27 2020年1月27日星期一 C 面向对象程序设计 2 4 7函数的重载 函数重载要注意的是 重载函数必须具有不同的参数个数或不同的参数类型 若只有返回值的类型不同是不行的 例如 intadd intx inty intadd inta intb 错误 编译器不以形 参名来区分函数 intadd intx inty voidadd intx inty 错误 编译器不以 返回值来区分函数不要将不同功能的函数定义为重载函数 以免出现对调用结果的误解 混淆 例如避免出现下述重载函数定义 intadd intx inty returnx y floatadd floatx floaty returnx y 2020年1月27日星期一 C 面向对象程序设计 实训3函数的应用 实训说明在实训中 我们要实现的是古典的数学问题 Hanoi 汉诺 塔问题 问题的描述是 古代有一个梵塔 塔内有3个座A B C 开始时A座上有64个盘子 盘子大小不等 大的在下 小的在上 如图2 4 有一个老和尚想把这64个盘子从A座移到C座 但每次只允许移动一个盘 且在移动过程中在3个座上都始终保持大盘在下 小盘在上 移动过程中可以利用B座 现在有N个按大小顺序摆放的盘子放在A座上 请利用B座 按照汉诺塔问题限定的要求 每次移动小盘始终都在最上面 将A座上的N个盘子移到C座上 程序要求用函数实现盘子的移动操作 并能打印出每次盘子的移动步骤 2020年1月27日星期一 C 面向对象程序设计 实训3函数的应用 程序分析为了解决 个圆盘的汉诺塔 可以按下面方式进行操作 将 杆上面的N 1个盘子 借助 杆 移到 杆上 将 杆上剩余的 号盘子移到 杆上 将 杆上的N 1个盘子 借助 杆 移到 杆上 根据以上分析 设计移动N个盘子的递归函数 voidhanoi intn charone chartwo charthree 设计打印输出移动步骤函数 voidmove chargetone charputone 设计主函数 输入盘子数n 调用以上函数 输出结果 程序源代码见教材实训3 2020年1月27日星期一 C 面向对象程序设计 2 5构造类型 2 5 1数组与字符串2 5 2结构体2 5 3共用体2 5 4枚举类型2 5 5用typedef定义类型 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 数组是一组具有相同类型数据的有序集合 其中每个数据称为数组的元素 数组的定义定义数组的一般形式为 其中 数据类型是任一种基本数据类型或构造数据类型 数组名是用户定义的数组标识符 方括号中的常量表达式表示数据元素的个数 也称为数组的长度 例如 inta 10 floatb 2 3 inta 6 2 3 5 constintSIZE 18 intb SIZE 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 数组元素的引用数组元素引用的一般形式为 下标表达式1 下标表达式1 例如 a 5 a i j a i 都是合法的数组元素使用时需要注意的是 数组元素的下标表达式可以是整型常量或整型表达式 且引用的元素下标个数应与数组定义的维数一致 数组的下标总是从0开始 但下标一定要小于数组定义时的大小 即长度为n的数组 其下标范围为0 n 1 例如 inta 5 数组a的元素下标应从0 4 而没有 a 5 这个数组元素实例及代码见教材 例2 28 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 数组的存储数组元素在内存中是按顺序 连续存储的 即在内存中占据一组连续的存储单元 数组名是数组的内存首地址 也是数组第一个元素的内存地址 一维数组是简单地按照下标的顺序连续存储 各元素是按下标从小到大的顺序连续存放在计算机内存单元中 例如 intarray 5 在内存中的存放顺序如下所示 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 二维数组可以看作是数学上的矩阵 第一个下标称为行标 第二个下标称为列标 例如 定义一个二维数组 intM 2 3 在内存中的存放顺序如下所示 第一行第二行数组的初始化数组的初始化就是在定义数组的同时给部分或全部的元素赋初值 例如 inta 5 1 2 3 4 5 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 表示将整数1 2 3 4 5分别赋于数组a的各个元素 注意要将这些初值用大括号 括起来 它与下列的赋值语句的结果是相同的 a 0 1 a 1 2 a 2 3 a 3 4 a 4 5 对于将全部元素都初始化的情况 可以不用指明数组的长度 例如上例数组a的初始化可写成 inta 1 2 3 4 5 系统将根据数值的个 数自动定义数组a的长度5 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 数组中也可以只给其中的一部分元素进行初始化 但数组元素的个数必须明确标出 例如 intb 5 1 2 表示定义一个有5个元素的整型数组 给前2个元素b 0 b 1 分别赋于1 2的值 对于二维或多维数组也可同样进行初始化 例如 intc 2 3 1 2 3 4 5 6 以数组元素的排列 顺序依次列出元素或intc 2 3 1 2 3 4 5 6 以行为单位依 次列出元素的值 分行用大括号 括起来这两种形式的初始化是等价的 其结果都是使c 0 0 1 c 0 1 2 c 0 2 3 c 1 0 4 c 1 1 5 c 1 2 6 但第二种形式的可读性强 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 数组中若只对部分元素赋初值 依次列出部分元素的值 没有明确列举元素值的元素 其值均为0 例如 intc 2 3 1 2 3 等价于intc 2 3 1 2 3 0 0 0 或intm 3 4 1 2 3 4 5 6 等价于 intm 3 4 1 2 0 0 3 0 0 0 4 5 6 0 2020年1月27日星期一 C 面向对象程序设计 2 5 1数组与字符串 在程序中对某个或所有数组元素进行赋值或其他处理时 它的操作与变量是一样的 因为每一个数组元素都可以看成是一个与数组类型相同的变量 实例及代码见教材 例2 29 字符串字符串是用一对双引号括起来的字符序列 C 语言没有提供字符串类型 字符串变量是作为一维字符数组来处理

温馨提示

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

评论

0/150

提交评论