C++语言基础PPT幻灯片课件_第1页
C++语言基础PPT幻灯片课件_第2页
C++语言基础PPT幻灯片课件_第3页
C++语言基础PPT幻灯片课件_第4页
C++语言基础PPT幻灯片课件_第5页
已阅读5页,还剩491页未读 继续免费阅读

下载本文档

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

文档简介

C 语言基础 盐城工学院惠为君 1 C 概述 C 的特点发展历史和未来 C C AT T Java SUN C MS 与其它语言比较 7点 面向对象的概念 数据的封装和隐藏 继承 多态VC上机过程 2 C 的字符集 C 语言使用下列基本字符来构成词法单位 结束 3 第二章 数据类型运算符表达式 2 1VC 的数据类型计算机所处理的数据以一定形式存放在内存中 数据的存储方式以及能够进行的合法运算都与数据类型直接相关 C 的特点之一就是提供了丰富的数据类型 以便处理各种不同的数据 数据类型总是与运算封装在一起 本质上是面向对象的 本章将简要介绍C 中的数据类型及相关运算 以及常量 变量 表达式 语句等 最后介绍简单的输入输出方法 4 2 1 1关键字 5 6 2 1 2标识符 标识符 Identifier ID 是程序员定义的 单词 用来给变量 常量 数据类型 函数等命名 合法标识符由字母或下划线开始 由字母 数字 下划线组成 其有效长度为1 31个字符 长度超过31个字符者只识别前31个字符 VC 标识符长度为1 247个字符 建议使用有一定含义的英文单词或拼音序列作标识符 以提高可读性 另外尽量不用下划线或双下划线打头 以免与系统定义的关键字冲突 ok 7 标识符 例 判断下面哪些是合法的标识符 MyFile Salary94 amount void 94Salary Salary94 amount f3 5 Num of Student 2 1 2结束 8 2 1 3标点符号 标点符号包括 等 标点符号的作用 有一定的语法意义 如字符和字符串常量分别用 和 引起来 对语法符号起分隔作用 如 等 2 1 3结束 9 2 1 5C 的基本数据类型 ok 10 C 对基本数据类型也分别进行了封装 称为内置数据类型 内置数据类型不仅定义了数据类型 还定义了常用操作 本节仅介绍各种基本数据类型的定义 常用操作将在后面介绍 C 为强类型语言 所有数据的使用严格遵从 先说明后使用 的原则 以便编译器进行编译 整型用来存放整数 整数 有符号的整数 在内存中存放的是它的补码 无符号数没有符号位 存放的就是原码 整数占用的字节数与机型有关 32位机上占用4个字节 11 字符型用来保存字符 存储的是该字符的ASCII码 占用一个字节 如大写字母A的ASCII码为65 在对应的一个字节中存放的就是65 字符型数据从本质上说也是整数 可以是任何一个8位二进制整数 由于汉语系字符很多 用ASCII字符集处理远远不够 因此又创立了双字节字符集 DBCS double bytecharacterset 每个字符用两个字节来编码 为便于软件的国际化 国际上一些知名公司联合制定了新的宽字节字符标准 Unicode 该标准中所有字符都是双字节的 不同的语言和字符集分别占用其中一段代码 这种用统一编码处理西文 中文及其它语言符号 就是unicode码 C 同时也支持宽字符类型 wchar t 或称双字节字符型 12 实型和双精度型都用来存放实数 两者表示的实数精度不同 实数在内存中以规范化的浮点数存放 包括尾数 数符和阶码 数的精度取决于尾数的位数 32位机上实型为23位 因规范化数的数码最高位恒为1 不必存储 实际为24位 双精度为52位 逻辑型也称布尔型 其取值为true 逻辑真 和false 逻辑假 存储字节数在不同编译系统中可能有所不同 VC 6 0中为1个字节 布尔型在运算中可以和整型相互转化 false对应为0 true对应为1或非0 无值型主要用来说明函数的返回值类型 将在函数一章中具体介绍 基本数据类型还可以加上一些修饰词 包括 signed 有符号 unsigned 无符号 long 长 short 短 参见下表 13 2 2结束 VC 中所有基本数据类型 14 2 1 6常量 在程序的执行过程中 值保持不变的量称为常量 字面常量 指程序中直接给出的量 常量的值在程序执行过程中保持不变 并且存储在程序区 而非数据区 根据取值和表示方法的不同 可分为以下几种 15 a 整形常量 d 字符串常量 c 字符型常量 b 实型常量 ok 16 a整型常量 十进制表示法 八进制表示法 十六进制表示法 其他表示法 即整数 可以有多种表示方法 ok 17 整数的十进制表示方法 十进制表示与我们熟悉的书写方式相同 如15 24 ok 18 整数的八进制表示 八进制表示以0开始 由数字0 7组成 用来表示一个八进制数 如 012 八进制数12 即十进制数10 0655 八进制数 655 即十进制数 429 ok 19 整数的十六进制表示 十六进制以0X 大小写均可 开始 由数字0 9和字母A F 大小写均可 组成 用来表示一个十六进制数 以下是一些常整数的例子 0 x32A 十六进制数32A 即十进制数810 0 x2fe0 十六进制数 2fe0 即十进制数 12256 ok 20 整数的其他表示方法 整型常量还可以表示长整数和无符号整数 长整型常数以L或l结尾 无符号常整数以U或u结尾 以UL或LU 大小写均可 结尾则可表示无符号长整型常数 例如 84L 十进制长整数 84026U 八进制表示的无符号整数260X32LU 十六进制表示的无符号长整型数32 整数结束 21 b实型常量 1 一般形式与平时书写形式相同 由数字0 9和小数点组成 例如 0 23 125 760 0 46 35 2 指数形式 也称为科学表示法 表示为尾数乘以10的次方形式 由尾数 E或e和阶数组成 指数形式要求在E或e前面的尾数部分必须有数字 后面的指数部分必须为整数 例 判断下列表示是否合法 123E12 34e 2 E4 1 43E3 5 包含小数点和10的幂的数为实型常量 有两种表示方法 实数结束 22 c字符型常量 字符常量是用单引号引起来的单个字符 在内存中保存的是字符的ASCII码值 在所有字符中 有些是可显示字符 通常就用单引号引起来表示 a 字符a 字符 4 字符4 空格字符有些是特殊情况字符 如不可显示的字符等 c 使用转义序列表示方法 如 祥见表2 3 此处略 n 换行 字符 字符常结束 23 d 字符串常量 字符串常量与字符型常量的区别 字符串常量 a 占两个字节 存放 a 和 0 值为0 x6100 字符型常量 a 占一个字节 存放 a 值为0 x61 2 3 2结束 用双引号引起来的若干个字符称为字符串常量 例如 IamaChinese 123 a 24 2标识符常量及常量说明符const 用常量说明符const给字面常量起个名字 标识符 这个标识符就称为标识符常量 因为标识符常量的说明和引用形式很像变量 所以也称常变量 例如 constfloatPI 3 14159 constintNumber of Student 100 常变量必须也只能在说明时进行初始化 常变量初始化之后 不允许再被赋值 常变量必须先说明后使用 常变量存储在数据区 并且可以按地址访问 编译时系统对常变量进行类型检查 C 建议使用常变量 而尽量不使用字面常量 2 3 3结束 25 2 1 7变量 1变量说明 2变量赋初值 变量 在程序中是指可以改变值的量 变量必须用标识符进行标识 称为变量名 变量有类型之分 如整形变量 字符变量等 任何变量都必须先说明后使用 一是便于编译程序为变量分配空间 二是便于编译时进行语法检查 变量使用的第一步 是给变量赋初始值 ok 26 变量说明 在C 中 变量说明的一般格式为 存储类型 数据类型变量名1 变量名2 变量名n 下面是变量说明的几个例子 inti j k 说明三个整型变量i j kfloatx y z 说明三个实型变量x y zcharc1 c2 说明两个字符型变量c1 c2doubledx 说明一个双精度型变量dx 变量说明结束 27 变量赋初值 1 变量说明时直接赋初值 例如 inta 3 b 4 c 5 floatx 3 0 2 用赋值语句赋初值 严格的说 只有前者可称赋初值例如 floatx e x 3 5 e 2 71828 结束 给变量赋初值称为初始化 有两种方法 28 2 2基本运算符 对常量和变量进行运算是通过运算符来实现的 常量和变量通过运算符组成C 表达式 由表达式再组成C 语句 运算符是完成对常量和变量进行运算的符号 把参与运算的对象称为操作数 按照要求的操作数的个数 运算符分为单目 一元 运算符 双目 二元 运算符和三目 三元 运算符 单目运算符只对一个操作数运算 如负号运算符 等 双目运算符要求有两个操作数 如乘号运算符 等 三目运算符要求有三个操作数 三元运算符只有一个 29 1 算术运算符 ok 30 运算符重载 当两个操作数均为整数时 和 重载为整乘和整除 结果为整数 除法运算后舍去小数取整 如 5 4 结果为1 整数 当两个操作数均为整数 定义为求余运算 也称求模运算 结果为两个整数相除后的余数 如果两个整数中有负数 则先用两数绝对值求余 最后结果的符号与被除数相同 例如6 3 结果为06 7 结果为67 6 结果为1 31 C 中算术运算应注意数据溢出问题 即运算结果超出对应数据类型的表示范围 编译程序只会对除法运算时除数为0这种情况提示出错 而特别容易溢出的整数的加 减和乘法运算产生溢出的情况 系统不作为错误处理 程序将继续执行并产生错误的计算结果 因此 程序设计者必须在程序中解决检查并处理整数溢出问题 只要有一个操作数是实数 两个操作数均转换为double型 和 重载为普通的乘和除 结果是实数 5 4 0 结果为1 25 实数 32 2 关系运算符和逻辑运算符 ok 关系运算符都是二元运算符 包括 大于 不小于 小于 不小于 等于 和 不等于 关系运算符完成两个操作数大小的比较 结果为逻辑值true 真 或false 假 每种可比较大小的数据类型 都重载了关系运算符 不同类型 自动转换为同一类型后 采用对应关系运算符进行比较 在C 中这两个逻辑值与整数之间有一个对应关系 真对应1 假对应0 反过来 0对应假 非0整数对应真 所以关系运算结果可以作为整数参与算术运算 关系运算 逻辑运算及其他运算 33 2 关系运算符和逻辑运算符 设有定义floata 3 2 intb 5 则 3 a b 结果是 根据右结合原则其运算过程如下 a 5 b 3 2 3 F 即0 F即0 34 逻辑运算符 35 逻辑运算符用来进行逻辑运算 其操作数和运算结果均为逻辑量 运算结果同样可以作为一个整数参与其他运算 由于逻辑值和整数之间的对应关系 也允许整型和字符型操作数进行逻辑运算 21 0 逻辑与 21与0 结果为假 021 0 逻辑或 21或0 结果为真 1 21 逻辑非 21的非 结果为假 0 逻辑运算符 36 位运算符 1 按位取反运算符 2 左移运算符 4 按位与运算符 5 按位或运算符 6 按位异或运算符 ok c 语言提供字位运算 它对操作数的各个位进行操作 37 1 按位取反运算符 将操作数的每个二进制位取反 即1变为0 0变为1 例如 整数a的值为10011011 则 a的值为01100100 2 左移运算符 运算一般格式为 a n其中a为整数 n为一个正整数常数 语义为将a的二进制数依次向左移动n个二进制位 并在低位补0 左移n位相当于乘以2的n次方 但移位运算的速度比乘法快 3 右移运算符 与左移运算符类同 将左操作数向右移动右操作数指定的二进制位数 忽略移位后的小数部分 并在高位补0 一个整数右移n位相当于除以2的n次方 但比除法快 在VC 6 0中有符号数右移时高位补符号位 严格对应除法 以上三种单目运算不影响数据本身的值 而是只产生一个中间量 这个中间量被引用后即不再存在 38 4 按位与运算符 将两个操作数的对应位逐一进行按位逻辑与运算 运算规则为 对应位均为1时 该位运算结果为1 否则为0 例如 a01001101b00001111a b00001101该运算可用来将整数的某些位置0 而保留所需要的位 上例保留了低四位 5 按位或运算符 将两个操作数的对应位逐一进行按位逻辑或运算 运算规则为 只要有一个数对应位为1 该位运算结果即为1 两个数对应位均为0 该位结果为0 例如 a01001101b00001111a b01001111该运算符可用来将整数的某些位置1 上例高四位不变 低四位全1 39 6 按位异或运算符 将两个操作数的对应位逐一进行按位异或运算 运算规则为 当对应位的值不同时 该位运算结果为1 否则为0 例如 a01001101b00001111a b01000010该运算符可用来将一个整数的某些位取反 或将整型变量的值置0 将整型变量与自身按位异或 上例低四位取反 高四位不变 需要说明的一点是 以上例子中的整数都只取了低8位一个字节 40 4 赋值运算符 ok 将数据存放到相应存储单元中称为赋值 如果该单元中已有值 赋值操作以新值取代旧值 从某个存储单元中取出数据使用 称为引用 引用不影响单元中的值 即一个量可以多次引用 常量只能引用 不能赋值 赋值通过赋值运算符 来完成 其意义是将赋值号右边的值送到左边变量所对应的单元中 赋值号不是等号 它具有方向性 41 C 将变量名代表的单元称为 左值 而将变量的值称为 右值 左值必须是内存中一个可以访问且可以合法修改的对象 因此只能是变量名 而不能是常量或表达式 4 赋值运算符 例如下面的赋值运算是错误的 3 1415926 pi 左值不能是常数x y z 左值不能是表达式constintN 30 N 40 左值不能是常变量 42 5 自增自减运算 运算分前置和后置两种 前置是先增减后引用 即先对变量自加或自减 用新的值参与其他运算 后置则是先引用后增减 即用变量原来的值参与其他运算 然后再对变量进行自加或自减 例如 inti 5 j 5 m n m i 后置 相当于m i i i 1 结果 i的值为6 m的值为5 n j 前置 相当于j j 1 n j 结果 j的值为6 n的值为6 意义 使变量当前值加1或减1 再赋给该变量 要求 操作数只能是变量 不能是常量或表达式 ok 43 sizeof 运算符 用于计算一个操作数类型或一个变量的字节数 一般格式为 sizeof 数据类型 或sizeof 变量名 例如 sizeof int 值为4sizeof float 值为4doublex sizeof x 值为8 结束 44 2 2 2表达式 1算术表达式 2关系表达式 3逻辑表达式和逻辑表达式求值的优化 4赋值表达式与复合赋值表达式 5逗号表达式 ok 45 1 算术表达式 使用时注意 1 表达式中每个变量都有确定的值时才能进行表达式求值 2 考虑到算术运算溢出和精度问题 应避免 1 两个很接近的数直接相减 2 除数是一个很小的数 3 整数的连续乘运算 ok 由算术运算符连接的表达式称为算术表达式 例如 a b 3 46 2 关系表达式 例如 a b c 等同于 a b c 先求a b的值 再将结果0或1与c比较大小 a b c d 等同于 a b c d 结果为0或1 y a b 计算a b的值0或1赋给y y的值为0或1 由关系运算符连接的表达式 值为true或false ok 47 3 逻辑表达式和逻辑表达式求值的优化 由逻辑运算符连接的表达式称为逻辑表达式 逻辑表达式的值为true或false 这个值可对应整数1或0参与其他运算 ok 已知 inta 10 b 20 c 30 floatx 1 8 y 2 4 ay ay a b c t1 1 t2 0 t4 0 t3 0 t5 b t6 1 得整个表达式的值为 1 48 3 逻辑表达式和逻辑表达式求值的优化 在求逻辑表达式值的过程中 一旦表达式的值能够确定 就不再逐步进行下面的运算 称为 求值优化 已知 inta 10 b 20 c 30 求 a b c 结果以及a b c的值 t1 1 整个表达式的值为1 可见 表达式c 已不需要计算所以 c不变仍为30 编程人员在使用逻辑运算时应当加以小心 优化计算固然提高了运算效率 但可能产生副作用 所谓副作用 就是出乎设计人员的意料 得到预想不到的结果 49 4 赋值表达式与复合赋值表达式 赋值表达式的格式为 变量 表达式例如 x 5 6 a b c d 1 在C 中 所有的双目算术运算符和位运算符均可与赋值运算符组合成一个单一运算符 称为复合运赋值算符 包括以下10个 复合赋值运算符的要求与格式与赋值运算符完全相同 表示为 变量复合赋值运算符表达式它等同于变量 变量运算符表达式例如 x 5等同于 x x 5 ok 50 逗号表达式 C 中 逗号既是分隔符 又是运算符 用逗号连接起来的表达式称为逗号表达式 一般格式为 表达式1 表达式2 表达式n逗号表达式中的每一个表达式都会被运算 整个逗号表达式的值为最后一个表达式的值 例如 a x 3 x 6 5 6 a 11x 9 2 5 2结束 51 2 2 3不同类型数据的混合运算和赋值时的类型转换 1不同类型数据的混合运算 2赋值类型转换 ok 运算过程中 当某个二元运算符两边的操作数类型不同但属于类型相容时 系统先将精度低的操作数变换到与另一操作数精度相同 而后再进行运算 所谓类型相容 指的就是类型不同但系统可以自动进行转换 当赋值号的左值和右值类型不一致但属于类型相容时 由系统自动进行类型转换 52 具体规则如下 1 字符可以作为整数参与数值运算 整数值为其ASCII码 2 操作数为字符或短整型时 系统自动变换成整型 3 操作数为实型时 系统自动变换成双精度型 4 其余情况 当两操作数类型不同时 将精度低 或表示范围小 的操作数的数据类型变换到与另一操作数类型相同再进行运算 例如有变量 charc1 c2 inti1 i2 floatx1 x2 则表达式x2 c1 i1 c1 x1 c1 c2的求值过程为 将c1转换成整型 完成c1 i1 结果表示为t1 将c1和x1均转换成双精度型 完成c1 x1 结果表示为t2 将c1和c2均转换成整型 完成c1 c2 结果表示为t3 然后t1转换成双精度型 完成t1 t2 结果表示为t4 将t3转换成双精度型 完成t4 t3 最后结果转为单精度型赋给x2 53 2 赋值类型转换 2 5 3结束 系统自动进行类型转换规则 1 实型数赋给整形变量 取整 注意溢出 2 整型数赋给实型变量 先转换为实型数 3 字符型数赋给整形变量 ASCII码为依据 分为两种情况 符号位是0或1时不同 若符号位为1 则低位字节不变 高位字节全部置1再赋值 4 绝对值较大的数赋给表达范围较小的数据类型时 注意溢出 54 2 5 4强制类型转换运算符 ok 其格式为 形式一或 形式二 作用 将表达式强制转换为类型 但表达式的值及其类型不变 任意数据类型 55 赋值运算中 当左值与右值类型不一致时 系统将按照左值的类型 自动进行强制转换 例如 设有以下定义doublex 2 3 y inti 2 j 1 j 2 3 x 2 3 2 2 1 j x 2 y i 由系统按左值j y类型自动完成强制转换功能 2 y 2 i 2 2 0 2 0 2 5 4强制类型转换运算符 56 第三章 简单输入 输出 3 1cincin用来在程序执行期间给变量输入数据 一般格式为 cin 变量名1 变量名2 变量名n cout实现将数据输出到显示器的操作 一般格式为 cout 57 3 1 1十进制数据的输入输出 请看下例 inti j floatx y cout i j Dcin x y cout则程序输出 i 10j 20 x y 13 1输出时各数据间是无间隔的 因此应当有意输出一些间隔符 ok 58 3 1 2输入字符数据cin与cin get 的区别 1 cin例如 charc1 c2 c3 cin c1 Acin c2 c3 程序执行到A行时 等待用户输入数据 若输入 Abc则cin分别将字符A b c赋给变量c1 c2 c3 cin自动跳过输入的空白字符 包括空格 制表 backspace和回车等 59 2 cin get 例如 charc1 c2 c3 c4 cin get c1 Bcin get c2 cin get c3 程序执行到B行时 若输入 Ab则执行结果是 字符 A 空格 字符 b 分别赋给变量c1 c2 c3 输入行中仍保留回车符 cin get 把从键盘上输入的所有字符 包括空白字符 都作为输入字符赋给字符变量 60 关于字符的输出 请看下例 假定字符c1 c2 c3的值分别为字符 a b 和 c 执行以下语句序列 cout c1 t c2 n cout c3 endl cout O k endl 屏幕上将输出 abcOk输出时字符之间是无间隔的 如果想让字符间有间隔 必须输出间隔符 61 补充 字符串输入输出 向一个字符数组中输入字符串时 用函数getline getline 以用户按下回车键作为结束 在此之前的所有输入都放入字符数组中 cin getline char int 其中第一个参数是已经定义的字符数组名 第二个参数是读入字符的最多个数n 包括字符串结束符 0 ok 常用cout输出字符串 双引号中的字符串常量照原样输出 程序中通常通过输出字符串常量来输出一些提示信息 字符数组将输出串结束符前所有字符 62 补充 字符串输入输出 函数保证在执行时总会为字符串的结束符保留一个字节 当键盘的输入字符 字节 数多于 n 1 时 后面的字符不会进入字符数组 字符串结束符自动加在字符数组的最后一个字节中 当输入字符数少于该值时 字符串结束符自动加在输入到字符数组中的最后一个字符的后面 请看下例 charcity 11 cin getline city 10 输入城市名最多5个中文字cout 城市名 city endl ok 63 如果要求按八进制或十六进制输入输出 在cin或cout中必须指明相应的数据形式 oct为八进制 hex为十六进制 dec为十进制 例如 inti j k l cout oct i 输入为八进制数cin hex j 输入为十六进制数cin k 输入仍为十六进制数cin dec l 输入为十进制数cout hex i hex i endl cout dec j dec j t cout k k endl cout oct l oct l cout dec endl 恢复十进制输出状态 ok 输入输出的格式控制 1 各种进制数据的输入输出 64 执行时输出 Inputi oct j hex k hex l dec 此时从键盘输入 0320 x3f0 xa017则输出结果为 hex i 1adec j 63k 160oct l 21由于已经在cin中指明数制 因此从键盘输入时 八进制和十六进制数可以省略其开头的0和0 x标志 在cin或cout中指明数制后 该数制将一直有效 直到重新指明用其他数制 特别注意 输入数据的格式 个数和类型必须与cin中的变量一一对应 否则不仅使输入数据错误 而且影响后面其他数据的正确输入 65 输入输出的格式控制 为了使数据间隔开 还可以用C 提供的函数setw 指定输出数据项的宽度 例如 inti 2 j 3 floatx 2 6 y 1 8 cout ok 2 设置数据间隔 66 第4章流程控制语句 67 4 1选择结构程序设计 对程序的运行流程进行控制 主要通过执行专门用来控制流程的语句来实现 流程控制语句也称为过程化语句 分支语句是三种基本流程控制语句之一 C 提供以下三种分支语句 if语句条件运算符 swith语句 68 4 2 1if语句 if语句有两种基本格式为 1 if 2 if else 69 if语句 例4 1 输入一个年份 判断是否闰年 算法分析 假定年份为year 闰年的条件是 year 4 0 ok 70 分析 读入三个数 先求出两个数中较大者 再将该大数与第三个数比较 求出最大数 includevoidmain inta b c max cout a b c coutb max a elsemax b if c max cout 最大数为 c endl elsecout 最大数为 max endl if语句 例4 2 从键盘上输入三个整数 输出其中的最大数 ok 71 if语句中 如果内嵌语句又是if语句 就构成了嵌套if语句 if语句可实现二选一分支 而嵌套if语句则可以实现多选一的多路分支情况 嵌套有两种形式 第一种是嵌套在else分支中 if elseif 语句2 elseif else 第二种是嵌套在if分支中为 if if else if语句 72 方法1 采用if中嵌套形式 includevoidmain inta b c max cout a b c coutb if a c max a a b且a celsemax c a b且ac max b acelsemax c a b且b ccout 最大数max max if语句 例3 3 用嵌套if语句完成 例3 2 的任务 ok 73 方法2 采用else中嵌套形式 includevoidmain inta b c max cout a b c coutb if语句 ok 74 要特别注意else和if的配对关系 C 规定了if和else的 就近配对 原则 即相距最近且还没有配对的一对if和else首先配对 按上述规定 第二种嵌套形式中的else应与第二个if配对 如果根据程序的逻辑需要改变配对关系 则要将属于同一层的语句放在一对 中 如第二种嵌套形式中 要让else和第一个if配对 语句必须写成 if 表达式1 if 表达式2 语句1 else语句2 第二种嵌套形式较容易产生逻辑错误 而第一种形式配对关系则非常明确 因此从程序可读性角度出发 建议尽量使用第一种嵌套形式 75 请看以下两个语句 语句1 if n 3 0 if n 5 0 cout n 是15的倍数 endl elsecout n 是3的倍数但不是5的倍数 endl 语句2 if n 3 0 if n 5 0 cout n 是15的倍数 endl elsecout n 不是3的倍数 两个语句的差别只在于一个 但表达的逻辑关系却完全不同 76 例4 4 某商场优惠活动规定 某种商品单价为80元 一次购买5件以上 包含5件 10件以下 不包含10件 打9折 一次购买10件以上 包含10件 打8折 设计程序根据客户的购买量计算总价 if语句 77 算法 1 输入购买件数count 设置单价price 80 元 2 根据count值确定折扣discount 3 实际售价amount price count discount 4 输出amount的值 算法细化 2 1 if count 5 count 10 discount 0 8 ok 78 includevoidmain floatprice 80 discount amount 单价 折扣 总价intcount 购买件数cout count if count 5 discount 1 elseif count 10 discount 0 9 elsediscount 0 8 amount price count discount cout 购买件数 count endl cout 单价 price t 折扣 discount endl cout 总价 amount endl 请在VC 平台上运行 输入不同的件数 使程序所有分支都可以被执行一次 ok 79 例4 5 求一元二次方程ax2 bx c 0的根 其中系数a a 0 b c的值由键盘输入 分析 输入系数a a 0 b c后 令delta b2 4ac 结果有三种情况 若delta 0 方程有两个相同实根 若delta 0 方程有两个不同实根 若delta 0 方程无实根 if语句 80 算法 1 输入系数a a 0 b c 2 令delta b2 4ac 3 根据delta的值求方程的根 4 输出方程的根 算法细化 3 1 if delta 0 方程有两个相同实根 计算 3 2 if delta 0 方程有两个不同实根 计算 3 3 if delta 0 方程无实根 计算 ok 81 include includevoidmain floata b c floatdelta x1 x2 constfloatzero 0 0001 定义一个很小的常数cout a b c cout a a t b b t c c endl delta b b 4 a c 求一元二次方程的根源程序 82 if fabs delta 0 delta sqrt delta x1 b delta 2 a x2 b delta 2 a cout 方程有两个不同实根 cout x1 x1 t x2 x2 endl else delta 0cout 方程无实根 endl 请在VC 平台上运行 输入不同的系数 使程序所有分支都可以被执行一次 83 3 1 2条件运算符 if语句在某些情况下可以用条件运算符 来简化表达 是一个三元运算符 其构成的表达式格式为 执行逻辑 先计算表达式1 若其值为真 或非0 则计算表达式2 不计算表达式3 并将该值作为整个表达式的值 反之 即表达式1的值为假或为0 则计算表达式3 不计算表达式2 并将该值作为整个表达式的值 例如 inta 6 b 7 min a b a b min 6min a b a b min 7a 7b 7min a b a b min 6a 7b 7 ok 84 3 1 3switch语句 用嵌套if语句可以实现多选一的情况 另外C 中还提供了一个switch语句 称为开关语句 也可以用来实现多选一 switch 表达式 case常量表达式 语句序列 break case常量表达式n 语句序列n break default 语句序列 85 switch语句格式 1 各个case 包括default 分支出现的次序可以任意 通常将default放在最后 2 break语句可选 如果没有break语句 每一个case分支都只作为开关语句的执行入口 执行完该分支后 还将接着执行其后的所有分支 因此 为保证逻辑的正确实现 通常每个case分支都与break语句联用 3 每个常量表达式的取值必须各不相同 否则将引起歧义 86 4 允许多个常量表达式对应同一个语句序列 例如 charscore cin score switch score case A case a cout excellent break case B case b cout good break default cout fair 5 从形式上看 switch语句的可读性比嵌套if语句好 但不是所有多选一的问题都可由开关语句完成 这是因为开关语句中限定了条件表达式的取值类型 ok 87 switch语句例子 例3 6 运输公司对所运货物实行分段计费 设运输里程为s 则运费打折情况如下 s 250不打折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣设每公里每吨的基本运费为p 货物重量为w 折扣为d 则总运费f为 f p w s 1 d 设计程序 当输入p w和s后 计算运费f 88 算法 1 输入每吨运费p 货物重量w 运输里程s 2 根据运输里程s计算折扣d 3 计算总运费f p w s 1 d 4 输出计算结果 算法细化 2 根据运输里程s计算折扣d分析 如果用switch语句 必须使表达式符合语法要求 分析发现 里程s的分段点均是250的倍数 因此 将里程s除以250 取整数商 便得到若干整数值 ok 89 switch c s 250 case0 d 0 break case1 d 0 02 break case2 case3 d 0 05 break case4 case5 case6 case7 d 0 08 break case8 case9 case10 case11 d 0 1 break default d 0 15 s 250不打折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣 90 include includevoidmain intc s floatp w d f cout p w s c s 250 switch c case0 d 0 break case1 d 0 02 break case2 case3 d 0 05 break case4 case5 case6 case7 d 0 08 break case8 case9 case10 case11 d 0 1 break default d 0 15 f p w s 1 d cout 运输单价为 p t 重量为 w t 里程为 s endl cout 折扣为 d endl cout 运费为 f endl 请在VC 平台上运行 输入不同的里程 使程序所有分支都可以被执行一次 ok 91 例3 7 设计一个计算器程序 实现加 减 乘 除运算 分析 读入两个操作数和运算符 根据运算符完成相应运算 includevoidmain floatnum1 num2 charop cout num1 op num2 switch op case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break default cout op 是无效运算符 常量表达式采用字符型 上机运行一下 92 循环控制语句是三种基本流程控制语句之一 C 提供以下三种循环语句 while语句do while语句for语句 4 3循环结构程序设计 93 4 3 1while语句 while语句也称为当循环 语句格式为 while 表达式 循环体语句 图3 1while语句的执行流程图 求表达式的值 表达式值为真 是 否 执行循环体语句 94 while语句 例4 8 求1 2 3 4的值 ok N个连续整数相加算法1 设置变量i用来放被加数 变量sum用来放和值 并初始化 2 从第一个数开始 依次将被加数赋给i 并进行操作sum sum i 3 输出sum 细化算法2 while 还有被加数 i 当前被加数 sum i i准备接受下一个被加数 95 源程序如下 includevoidmain inti 1 sum 0 循环初始条件while i 4 sum i i 修改循环条件 cout sum sum endl 在VC 平台上运行 试一试是否正确 ok 96 while语句 注意 在有循环语句的程序中 通常循环开始前对循环条件进行初始化 而在循环体语句中要包含修改循环条件的语句 否则循环将不能终止而陷入死循环 C 表达方式灵活 上例中的循环语句还可以写成 while i n sum i 或者while sum i i n 循环体为空语句修改程序后在VC 平台上运行 看是否正确 97 4 3 2do while语句 do while语句称为直到循环 格式为 do循环体语句while 表达式 否 是 表达式的值为真 执行循环体语句 求表达式的值 图3 2do while语句的执行流程图 98 do while语句 do while语句和while语句的区别 多数情况下可以互相替代 区别是do while语句至少执行一次循环体后再判断循环条件是否满足 while语句先判断条件是否满足 然后才执行循环体 99 例4 9 输入一段文本 统计文本的行数 单词数及字符数 假定单词之间以空格或跳格或换行符间隔 且文本开始没有空行 算法分析 1 逐个读入文本中的字符 直到读到一个输入结束符EOF为止 2 如何算行数 行结束标志为读到字符 n 3 如何算单词数 设一个变量isword 读到字符时isword 1 读到间隔符时isword 0 如果读到一个间隔符而此时isword值为1 则说明刚读完一个单词 如果读到一个字符而此时isword值为0 则说明刚开始读一个单词 4 如何算字符数 do while语句 ok 100 算法 1 设置变量line word ch分别代表行数 单词数 非分隔字符数 并初始化 设置变量isword来辅助统计单词数 2 do 从键盘读入一个字符c if c n line if 是单词开头 word if c不是分隔符 ch while c EOF 3 输出统计结果 将下面的程序在VC 平台上运行 试一试是否正确 101 includevoidmain charc intline 0 word 0 ch 0 ch为非分隔字符数intisword 0 do c cin get if c n line 遇换行符行数 1if c 102 4 3 3for语句 for循环语句的格式为 for ok 103 for语句 while语句 do while语句实现相同的功能 1 2 3 4 inti 1 sum 0 循环初始条件while i 4 sum i i 修改循环条件 inti 1 sum 0 循环初始条件do sum i i 修改循环条件 while i 4 for inti 1 sum 0 i 4 i sum i 习惯上 表达式1 循环初始条件 表达式2 循环终止条件 表达式3 修改循环条件 ok 104 for语句的应用 for语句的几点说明 1 是先判断型的 同while语句 2 使用更为灵活 三个表达式可以是任意表达式 因此他们就可以实现循环初始化 计算 修改循环条件等任务 而不一定非在循环体中进行 105 for语句的应用 例4 11 设计程序输出Fibonacii数列的前20项 要求每行输出5个数据 Fibonacii数列定义如下 算法分析 除了第0项和第1项外 每一项都是由类似方法产生 即前两项之和 所以求当前项时 只需要记住前两项 程序不需要为每一项设置专用变量 属递推算法 106 算法 1 设置变量n表示第几项 变量f1和f2用来记住当前项f3之前的两项 变量初始化n 0 2 while 当前项不到第20项 if 当前项是第0项 f1 0 if 当前项是第1项 f2 1 if 当前项是第2项或更高项 f3 f1 f2 按要求输出f3 f1 f2 f2 f3 记住最近两项当前项后移一位 107 例3 11 设计程序输出Fibonacii数列的前20项 要求每行输出2个数据 Fibonacii数列定义如下 程序如下 文件名 Ex3 11 cpp include includevoidmain intfib0 0 fib1 1 fib2 cout setw 5 fib0 setw 5 fib1 endl for intn 3 n 20 n fib2 fib0 fib1 cout setw 5 fib2 if n 5 0 cout endl 控制每行2个数据fib0 fib1 fib1 fib2 108 for语句的应用 在VC 平台上运行运行结果 01123581321345589144233377610987159725844181 109 例4 12 输入一个不超过5位的整数 将其反向后输出 例如输入247 变成742输出 算法分析 1 将整数的各个数位逐个位分开 用一个数组保存各个位的值 然后反向组成新的整数 2 将整数各位数字分开的方法是 通过求余得到个位数 然后将整数缩小十倍 再求余 并重复上述过程 分别得到十位 百位 直到整数的值变成0为止 for语句的应用 ok 110 数据 1 设置变量num表示输入的整数 整型数组digit 5 用来存放num的各个位 变量i用来表示数组的当前下标 算法 1 输入num 变量初始化 i 0 2 while num 0 num对10取余 得num的当前个位数digit i num整除10 即去掉个位数 十位变个位 百位变十位 i 数组digit准备记录下一位 3 将数组元素按下标从高到低的顺序输出 111 程序如下 includevoidmain intnum subscript intdigit 5 cout num cout0 for inti 0 i subscript i 整数的反向组合num num 10 digit i cout 反向后整数为 num endl 在VC 平台上运行 试一试是否正确 112 4 3 5循环的嵌套 例3 13 打印九九表 打印格式为 123456789112243369 991827364554637281 当循环语句中的循环体中又有循环语句时 就构成了嵌套循环 嵌套层次一般不超过3层 已保证可读性 113 循环的嵌套 分析 1 计算机的输出是按行进行的 因此可以先用一个循环语句输出第一行表头 2 表中各行数据的输出可以用下面的算法描述 for i 1 i 10 i cout i 输出行号输出第i行数据 Acout endl 准备输出下一行 114 3 第A行需要进一步细化 由于第i行数据是一组有规律的数列 每个数的值是其所在行与列的乘积 因此输出第i行可以 for j 1 j 10 j cout setw 4 i j 4 按上述算法输出的每一行都将有九列 即打印出的是矩形表而不是下三角形表 进一步分析发现每一行的列数与所在行数相关 因此要输出三角形表 上面的循环语句需稍作修改 for j 1 j i j cout setw 4 i j 将此语句放到顶层算法的A行即可 循环的嵌套 115 算法 1 输出表头 用一个循环语句即可 2 输出表体 for i 1 i 10 i cout i 输出行号输出第i行数据 Acout endl 准备输出下一行 3 A行细化 for j 1 j i j cout setw 4 i j 循环的嵌套 116 在VC 平台上运行下面的程序 include includevoidmain cout setw 3 setw 4 for inti 1 i 10 i cout setw 4 i 输出表头 乘数 cout endl endl for i 1 i 10 i cout setw 3 i setw 4 输出行号 被乘数 for intj 1 j i j cout setw 4 i j 输出表中数据 乘积 cout endl 准备输出下一行 3 2 4循环嵌套 打印九九表 117 4 4转向语句 4 4 1break语句 4 4 4return语句 4 4 3goto语句 4 4 2continue语句 118 4 4 1break语句 break语句只能用在switch语句和循环语句中 用来跳出switch语句或提前终止循环

温馨提示

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

评论

0/150

提交评论