




已阅读5页,还剩325页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 C程序设计 2 C语言程序设计 第一章第二章第三章第四章 第五章第六章第七章 3 第一章C语言概述 C语言 既可作为系统软件的程序设计语言 又可作为应用软件的程序设计语言 尤其是当今计算机应用极为广泛 软件的设计 编写质量要求高 经常与硬件部分打交道 如 界面设计等 所以用C语言编写是最理想的 因而C语言也是当前计算机语言中用得最广泛的语言之一 4 1 1C语言出现的历史背景 一 操作系统的设计语言 O S 操作系统 为用户使用计算机提供一个操作环境 系统命令 语言编程等 如 DOS UNIX 以前 O S 软件用汇编指令编写 汇编语言 一种二进制指令代码的符号表示 既繁琐 又易出错 可读性差 改进 用C语言编写 既提高了程序的可读性 又可与硬件打交道 5 二 发展过程 1960年出现了Algol60语言 但该语言主要面向问题 与硬件较远 故英国剑桥大学推出了CPL CombinedProgrammingLanguage 1967年 MatinRichards对CPL进行改进 简化 推出了BCPL BasicCombinedProgrammingLanguage 1970年 美国贝尔实验室KenThomson以BCPL为基础 再次简化推出了B语言 并写了第一个UNIX系统 6 美国贝尔实验室D M Ritchie在B语言基础上设计出了C语言 并用其将UNIX系统全部改写并实现 经进一步改进 至1977年出现了与具体机器无关的C编译文本 从而使C语言广泛应用 各种机器皆可使用 1978年 美国BrainW Kernighan与Dennis M Ritchie联合出版一书 TheCProgrammingLanguage 成为ANSIC之基础 7 1983年 美国标准化协会 ANSI 制定了ANSIC ANSIC为基础 不同机器有不同版本 尤其是函数均应参考相应的机器 8 1 2C语言的特点 只有通过学习 方可理解C之特点 先简叙之 1 简洁 紧凑 方便 灵活32个关键字 9种控制语句 主要用小写字母 压缩一切不必要成分 2 运算符丰富除了最基本的 等运算外 还将括号 赋值 类型强制转换等均作为运算符 共有34种运算符 9 3 数据结构丰富除基本类型外 有指针 结构体 共同体等类型 4 具有结构化的控制语句模块完整 控制中的语句可完整化 5 语法严格 但有灵活性如 数据类型可相互通用 整型 字符型通用 10 6 可与机器硬件打交道 直接访问内存地址 具有 高 低 级语言之功能 7 生成目标代码质量高 执行效率高 8 可移植性优于汇编语言 11 1 3简单的C程序介绍 为了更好 更快地掌握C程序 我们先看几个C语言程序 例1 main printf Thisisacprogram n 12 例2 main 求两个数之和 inta b sum 这是定义变量 a 123 b 456 sum a b printf sumis d n sum 13 例3 main 主函数 inta b c 定义变量 scanf d d 输出c的值 14 intmax x y intx y 对形参x y作类型定义 intz max函用到的变量z 也要加以定义 z y if x y z x return z 将z的值返回 通过max带回调用处 15 通过分析 初步看到 1 C程序全部由一个一个的函数构成 至少有一个主函数main 其它函数可被主函数调用或相互调用 其它函数可为C函数库中函数 也可为自己编的函数 上述特点称为程序的模块化 16 2 函数的构成 函数说明 函数体 函数体 变量定义与执行语句 可允许空函数 dump 函数说明包括 函数名 类型 属性 参数等 17 3 函数的执行一定从main 开始 尽管main 函数位置可自由 4 书写自由 一个语句可多行 一行可多个语句 5 每一条语句必须有一个分号 6 C语言的输入 出均以函数形式出现 scanf printf 7 可用 对C语言加注释 18 主讲教师 刘丹 19 第二章数据类型 运算符与表达式 2 1 数据类型 著名计算机科学家沃思提出 程序 数据结构 算法 20 所以 存放数据的方式直接反映了一种语言的数据表达能力 数据的存储方式又称之为 数据类型 举一个例子 以考生各科成绩及总分排队问题为列 成绩的存放 以数组形式 排队方法 算法 21 前面已述 C数据类型丰富 分为 基本类型 构造类型 指针类型 空类型 整型 字符型 实型 单精度 双精度 数组 结构体 共用体 数据有常量 变量之分 均为其中一种类型 本章先学习基本类型 枚举 22 2 2常量与变量 2 2 1常量和符号常量 常量 程序运行过程中不能被改变的量 一般的数据显式写法均表示常量 如程序中 20 整型常量15 8 实型常量 a 字符常量 23 例 definePRICE30main intnum total num 10 total num PRICE printf total d total 还可用一个符号表示一个常量 符号常量 24 符号常量 一般用大写 以区分变量 再如 3 1415629 definePAI3 1415629 definePRICE30 25 2 2 2变量 程序执行中可以改变的量称为变量 变量包括变量名和变量值 变量名 用标识符命名 对应一定数量的内存存贮单元 其单元数视变量类型而定 标识符 由字母 数字 下划线组成且由字母或下划线开头的字符串 26 标识符可用来命名变量及作为常量名 函数名 类型名 文件名等 一个程序内不得有重复名 如 sum sum student name price等 习惯上 变量名 函数名等用小写字母表示 常量名用大写字母表示 以增加可读性 另 需注意标识符长度 视不同系统而定 设允许8个字符 则 student namestudent number为同一名字 27 C语言中 变量须先定义 后使用如 intstudentstudent 30 则若写成student 30 则未定义 编译时指出其错 一旦变量被定义 即可在编译时为其分配相应数量的单元 一旦变量被定义 其类型便确定 则可检查其运算的合法性 如 a b表示a整除以b的余 则a b必须为整型量 28 2 3整型数据 2 3 1整型常量 整型常量 整型常数 C语言提供了三种形式 十进制如 256 308 120等 29 八进制以数字0开头表示的整数例 0235 0146 012等 0235 2 82 3 8 5 157100146 1 82 4 8 6 10210 012 1 8 2 1010 十六进制以 0 x 开头的整型数如 0 x16 0 x28 30 2 3 2整型变量 一 分类 分为四种 基本型 短整型 长整型 无符号型 2 短整型 用 shortint 或 short 定义 3 长整型 用 long 或 longint 定义 1 基本型 用 int 定义 31 4 无符号型 不存放符号 则不带符号数 又分无符号整型 无符号短整型 无符号长整型 上述各种类型所占内存单元数及取值范围视不同机器而不同 详见P13 32 二 定义方法整型变量分别以下列方式定义 2 短整型shortint或shorta b c 3 长整型longint或longa b c 1 基本整型 inta b c 33 4 无符号型unsigneda b c unsignedshorta b c unsignedlonga b c 例 main inta b c d 指定a b c d为整型变量 unsigndu 指定u为无符号整型变量 a 12 b 24 u 10 34 c a u d b u printf a u d b u d n c d 由此看到 不同类型的整型数据可进行算术运算 但有一定规则 见 2 7 运行结果为a u 22 b u 14 35 三 关于整型常量程序中出现的整型常数 系统按以下规则分配变量 内存单元 或赋值给相应变量 2 若超越 而在 2147483648 2147483647之间 则可赋给longint变量 1 当常数 量 在 32768 32767之间 则可赋给int longint变量 36 4 一个非负整数 32768则可赋给unsignedint 5 一个常数后加 l 或 L 表示长整数 如123l 主要用于函数调用时形 实参数传递 3 若int shortint长度相同 则二者皆可赋值 37 2 4实型数据 2 4 1实型常量 有二种表示形式1 十进制形式如 0 126 523 64等 2 指数形式对于较大或较小的数 可用指数形式0 00001261 26E 512600001 26E 6或1 26E6 E e 均可 38 分为单精度型与双精度型 分别为floatx y z 单精度 doublea b c 双精度 一般地 单精度占4字节内存单元 双精度占8字节内存单元 2 4 2实型变量 39 注意 不同机器对实型变量的有效数字长度的限制如 pc机 单精度一般为7位 双精度15位 单精度数值 10 38 1038双精度数值 10 308 10308 于是 floata a 123456 789则实际赋值a 123456 7 40 2 5字符型数据 用一对单引号括起来的单个字符 如 a A 二者不一样 此外 以 开头后接一个字符或n个字符代表了一种特殊字符常量 转义字符 如 n 换行 r 回车 2 5 1字符常量 41 其它如下表 字符形式 n t v b r f ddd xxh 功能 换行 横向跳格 即跳到下一个输出区 竖向跳格 退格 回车 走纸换页 反斜杠字符 单引号 撇号 字符 1到3位8进制数所代表的字符 1到2位16进制数所代表的字符 42 注意 表示ASCII码字符 三位八进制 如 101 表示字母A 又 x 十六进制ASCII字符 x41 表示字母A 43 其定义方式为 charc1 c2 c1 A c2 B 字符变量只占一个字节单元 2 5 2字符变量 用来存放一个字符的变量 44 一个字符存入一个字符变量 其对应单元存放的是其ASCII码 即ASCII码的二进制形式 由此 字符变量中的数据是一整型数据 输出时既可输出字符 亦可输出整数 且字符变量可作整数运算 2 5 3字符数据的实际存放形式 45 例1 main charc1 c2 c1 97 c2 98 printf c c c1 c2 运行结果ab 看如下几个例子 46 例2 main charc1 c2 c1 a c2 b c1 c1 32 c2 c2 32 printf c c c1 c2 运行结果AB 47 例3 main inti charc i a c 97 printf c d n c c printf c d n i i 运行结果 a 97a 97 48 有的系统将一个字节的整型变量的最高位 作为符号 这时对0 127之间的字符可输出正整数 ASCII 但128 255字符最高位为1 则作为负数输出 由此最好用unsignedint存放字符整数 ASCII 注 49 用双引号括起来的字符串 例 GoodMorning 注意 A 与 A 是不同 字符串存放时 在最后加上 0 空字符 于是 GoodMorning 0 2 5 4字符串常量 50 A A 0 但 A A 注意 1 字符串长度 实际字符个数 1 但最后 0不输出 printf GoodMorning 此处不写 0 自动加上 2 单个字符的字符串不能赋给字符变量 例 charc c a 是错误的 51 2 6变量赋初值 C语言允许定义变量时赋予初值 如 inti 6 floatx 8 35 charc 6 也可对某个变量赋初值 inta b c 6 52 不可能将同初值的变量赋初值时写成 inta b c 6 只能 inta 6 b 6 c 6 定义变量时赋初值实际上是在运行时执行一个赋初值语句 inta 6 相当于 inta a 6 53 2 7类数值型数据间的混合运算 C语言允许双精度 单精度 整型及字符数据之间混合运算10 a 1 5 8765 1234 b 是允许的 但有一个规则 先转换成同一类型 再计算 54 double float 高低 图中 表示必定转换 如 a b 先转换为int 结果为int 转换方法 long unsigned int char short 即 既使是同一种类型也按 转换 55 图中 表示低 高型数据运算时 均先转换为高型 例 10 a i f d e 其中 i intf floatd doublee long 56 10 a 转为int 结果为int i f 转为double 结果为double 转为double d e 转为double 转为double 则运算时 57 2 8算术运算符与算术表达式 运算符 运算的符号表示 C语言有丰富的运算功能 先简述之 2 8 1 C运算符 1 算术运算符 等 3 逻辑运算符 2 关系运算符 58 4 位运算符 5 赋值运算符 等 6 条件运算符 等 7 逗号运算符 8 指针运算符 59 11 分量运算符 12 下标运算符 13 其它运算符如函数的调用 9 求字节数运算符sizeof 10 强制类型转换运算符 类型 60 2 8 2算术运算符和算术表达式 一 基本算术运算符 加法正值3 6 3 减法负值6 4 5 乘法3 8 除法8 5 求余7 4的值为3 61 注 两个整型数据相除 结果为整 一般向零靠拢 5 3 1 中 有一个float 则结果为double型 使用时千万注意int int出现数据丢失 62 二 算术表达式及算术运算符的优先级与结合性 运算对象 常量 变量 函数等 优先级 结合性 同一优先级 自左向右 为左结合性 反之为右结合性 例 a b c 1 5 a d e 当类型不同的数据进行运算时 按 2 7介绍的类型转换 算术表达式 用算术运行运算符和括号将运算对象连接起来 且符合C语法规则的式子 63 三 可利用强制类型转换运算符将一个算术表达式转换为所需类型 形式 类型名 表达式 例如 double a将a转换为double int x y 将x y转换为int float 5 3 将5 3转换为float 64 注 1 括号不能省略 如 intx会理解为变量intx 2 转换后的类型数据由系统分配一个中间变量存放 而原变量类型不变 floatx 又如 int x y 若省略 int x y会变成将x转成整型 int x 则x本身仍为实型 而 int x由一个中间变量 整 存放x的整数部分 65 例 main floatx inti x 3 6 i int x printf x d x i 则 x 3 600000 i 3 66 总结以上类型转换 有二种 1 强制 另 强制类型转换运算优先于算术运算符 2 系统自动 如 若x为float 则x 3不合法 但可用 int x 3来解决 附录III介绍了优先级 67 四 自增 自减运算符 设有inti 3 自增1 自减1 则 i i 都会使i变为4 但有区别 i 先使i值 1 再使用i值 i 先使用i值 再使i值 1 j i j 4 i 4 i i 1 j i j i j 3 i 4 j i i i 1 68 同理 i i 均使i值 1 但 又如 printf i d n i 结果 i 3 若 printf i d n i 结果 i 4 i 先使i值 1 再使用i值 i 先使用i值 再使i值 1 i 3 69 几点注意 1 和 运算法只能用于变量 不得用于常量和表达式 2 的结合性为从右至左 而一般算术运算符为从左至右 如 如5 a b 均为不合法 i 和 为同一优先级 i 相当于 i 若i 3 则结果为 3 i为4 主要用于循环变量自增或自减 70 1 要慎用 运算符 五 有关表达式使用中的问题说明 则 先对i进行3次自加 为6 然后三个i相加为18 而i为6 如 表达式 i i i i 3 一般认为 从左至右 3 4 5 12 i 6 但TurboC MSC都是先取三个原值相加 i i i 9i 6 如果表达式数为 k i i i 71 2 在表达式中 有的运算符为一个字符 有的为两个字符 3 在函数调用时 如 一般地 自左至右尽可能多地将若干字符组成一个运算符 例 i j 究竟理解为 i j还是i j printf d d i i 若i 3 若参数计算从左至右 则输出3 3 若从右至左 则输出4 3 上述问题看似复杂 最好上机实践 72 2 9赋值运算符和赋值表达式 符号 为赋值运算符 2 整型数据赋给实型变量 数值不变 但按实数形式存放 1 将实型数据 无论单 双精度 赋给整型变量时 舍弃小数 赋值时 两边类型若不一致 则按以下规则转换 73 4 将int longint 进行符号扩展 即 符号扩展 低16位 long的低16位 5 longint int则高16位截断 3 字符型数据赋给整型变量时 2 字符 带符号整型变量 则字符高位扩展 1 字符 无符号整型变量 则存入低8位 高8位补零 74 6 将unsignedint型 longint高位补0 原值传送 但数据大小不能超值 如 unsignedinta 65535 intb b a 则越界 而位数相同部分赋值unsignedint intunsignedlong longunsignedshort short 75 7 非unsigned型 长度相同的unsigned型数据 原样传送 包括符号位 一 复合赋值运算符 在 号之前加一个其它运算符 C语言规定 凡是二目运算符均可构成复合运算符 例 a 3 相当于a a 3x y 8 相当于x x y 8 x 3 相当于x x 76 一般形式 二 赋值表达式 例 x 10为一赋值表达式其中又可以是一个赋值表达式 例 x y 10 相当于y 10 x y由于赋值号为右结合性 于是 可省略 即为 x y 10 77 例 a a a a 设a 12 又 a 5 c 6 c 6 a 11a b 4 c 6 b 4 c 6 a 10a b 10 c 2 b 10 c 2 a 5 进一步 还可用复合赋值运算符作下列运算 步骤 a a 144 a a a a a a a 12 144 132a 132 a a 132 264 78 2 10逗号运算符和逗号表达式 一般形式 表达式1 表达式2 其计算规则 先计算表达式1 再计算表达式2 最后值为表达式2的值 例 a 3 5 a 4则 先计算3 5 a 15 a 4 60 结果为60 79 又如 a 3 5 a 4 a 5 扩展形式 表达式1 表达2 表达式n 结果为20 作为逗号表达式的值 a 5 a即20 a 3 5 15 a a 4 60 此时a值仍未变 结果为表达式n的值 80 注意 x a 3 6 3 赋值表达式 x 18 x a 3 6 a逗号表达式 x 3 逗号表达式主要用于某些语句中需一次计算多个表达式值的情况 如在循环语句中 函数调用中的实参之间虽然用的是逗号间隔 但不是逗号表达式 如 printf d d d a b c 81 主讲教师 刘丹 C程序设计 82 第三章最简单的C程序设计 3 1C语句概述 C语句全部为可执行语句 对应若干机器操作指命令 C程序由许多源文件组成 分别编译 然后连接 每一个源文件由预编译命令和若干函数组成 每一个函数由说明部分和语句部分组成 83 其结构如图 除说明部分外 重要部分为语句部分 C程序 源程序文件1 源程序文件i 源程序文件n 预编译命令 函数1 函数n 说明部分 执行部分 语句 84 C语句分为五类 1 控制语句 改变语句的执行顺序 共有9种控制语句 if else 条件 for 循环 while 循环 do while 循环 85 continue 结束本次循环 switch 多分支选择 break 中止整个循环 goto 转移 return 函数返回 表示条件 表示语句 86 2 函数调用语句 3 表达式语句 printf 表达式加 如 i i 1 i x y 其函数调用也可理解为表达式语句 87 5 复合语句 4 空语句 任何事情都不做 用 括起来的一系列语句 如 z x y t z 100 printf f t 88 3 2程序的三种基本结构 从结构化程序设计角度出发 程序有三种结构 顺序结构 选择结构 循环结构 89 1 顺序结构 表示 先执行A 再执行B 90 2 选择结构 表示为 存在某条件P 若P为真 则执行A 否则执行B 91 3 循环结构 表示为 1 当型结构当P条件成立时 T 反复执行A 直到P为 假 时才停止循环 有两种结构 当型和直到型 92 2 直到型 先执行A 再判断P 若为F 再执行A 如此反复 直到P为T 93 另外 由选择结构可以派生出另一种基本结构 多分支结构 已证明 上述三种结构组成的程序可以解决全部的问题 所以任何一种高级语言都具备上述三种结构 94 3 3赋值语句 由赋值表达式加分号 构成 与其它高级语言相比有以下不同点 为一运算符 由此 构成一赋值表达式 可出现于表达式能出现的任何地方 if a b 0 t a 95 3 4数据输出 前面已论述 C语言本身无输入 出语句 由函数实现 如printf 等 一般 C语言提供了一些标准的输入 出函数 系统函数 96 形式 putchar c 功能 向终端 一般为显示器 输出一个字符 其中c为字符型或整型变量 注意 用该函数时 须用预编译命令 include stdio h 3 4 1putchar函数 字符输出函数 97 举例 include stdio h main chara b c a B b O c Y putchar a putchar b putchar C 结果 BOY 98 putchar a putchar n putchar b putchar n putchar c putchar n 利用putchar还可输出其它转义字符 结果 BOY putchar 101 输出A putchar 输出 putchar 015 输出 若将最后一行改为 3 4 2printf函数 格式输出函数 一 printf的一般形式 是C语言中使用得最多的一种输出函数 它可一次按格式输出多个不同类型的数据 printf 格式控制序列 输出表列 输出表列 用 号隔开的变量或表达式序列 其变量的值按对应的格式控制符所指定的格式输出 100 格式控制序列 用双引号 括起来的格式符序列 格式控制序列由格式说明符和普通字符组成 2 普通字符原样输出 1 格式说明符 由 接 格式字符组成如 f d等 101 例 a 3 b 4 printf a d b d a b 结果 a 3 b 4 无论a b中位数多少 均为上述形式 a 123b 45 102 二 格式字符 如直接用 d 则将出错 不同类型的数据输出 用不同格式字符 1 d格式符 十进制整数输出 1 d 按数据的实际长度输出 2 md m表示输出字段宽度 若实际位数 m 左边补空格 3 ld 输出长整数 如要指定宽度 则用 mld即可 例 longa 1234567 printf ld a 103 2 o格式符 按八进制形式输出 以1的补码形式 inta 1 printf d o a a 则输出结果 1 177777 注 连符号位一起组成八进制数输出 特例 1存于int单元 如以长整型输出 在 加l 也可指定宽度m mo 104 3 x格式符 以十六进制形式输出整数 例 inta 1 printf x o d a a a 输出结果 ffff 177777 1 105 例 main unsignedinta 65535 intb 2 printf a d o x u n a a a a printf b d o x u n b b b b a 1 177777 ffff 65535 a 65535 b 2 4 u格式符 无符号格式输出整数 b 2 177776 fffe 65534 运行结果为 106 5 c格式符 输出一个字符 注 若有一整型变量 其值在0 255之间 则可以字符形式输出 一个字符型变量亦可以一个整型数据输出 charc a printf c c 107 例 main charc a inti 97 printf c d n c c printf c d n i i 108 运行结果为 a 97a 97 也可以指定输出字符宽度 如果有 则输出 a 即c变量输出占3列 前2列补空格 print 3c c 109 6 s格式符 用来输出一个字符串 1 ms 输出的字符串占m列 如字符串本身长度大于m 则突破m的限制 将字符串全部输出 若串长小于m 则左补空格 允许一定的编辑即允许 ms ms m ns m ns四种形式 每一形式的意义如下 例 printf s CHINA 结果 CHINA 110 3 m ns 输出占m列 但只取字符串中左端n个字符 这n个字符输出在m列的右侧 左补空格 4 ms 其中m n含义同上 n个字符输出在m列范围的左侧 右补空格 如果n m 则m自动取n值 即保证n个字符正常输出 2 ms 如果串长小于m 则在m列范围内 字符串向左靠 右补空格 111 7 f格式符 以小数形式输出单 双精度实数 有以下几种形式 m nf 指定输出的数据共占m列 其中有n位小数 如果值长度小于m 则左端补空格 mn f 与 m nf基本相同 只是使输出的数值向左端靠 右端补空格 f 不指定字段宽度 由系统自动指定 使整数部分全部如数输出 并输出6位小数 f m nf m nf 112 8 e格式符 以指数形式输出单 双精度实数基本形式 e 结果 1 23456 共13列 6例 5例 可有 m ne和 m ne的形式 9 g格式符 根据实数大小自动选择f格式 或e格式输出单双精度实数 e 002 例 printf e 123 456 113 表3 1printf格式字符总结 114 许多情况与具体机器或系统有关 最好机器上一试 表3 2附加格式说明字符 115 3 5数据输入 系统提供了若干函数 以提供从标准输入设备 键盘 上输入数据 3 5 1getchar函数 本节先介绍两个输入函数 形式 getchar 功能 从标准输入装置 键盘 上输入一个字符 要求 有 include stdio h 预编译命令 116 例 include stdio h main charc c getchar putchar c 117 3 5 2scanf函数 功能 在标准输入装置 键盘 上按指定格式输入各种类型的数据 地址表列 变量的地址或字符串首地址 形式 scanf 格式控制序列 地址表列 格式控制序列 同printf 118 例 main inta b c scanf d d d 运行 机器等待你输入 3 4 5 结果3 4 5 119 注意 1 scanf函数顺用地址量接受数据 2 输入数据的间隔为 Tab 空格 不能为 3 允许在格式符中插入附加字符 格式字符及附加字符的定义如下表3 3和表3 4 120 表3 3scanf格式字符 121 表3 4scanf附加的格式说明字符 122 4 对于输入unsigned型数据 不用 u 而用 d o x 5 指定数据长度时 系统自动截取 则当输入123456时 scanf 3d 3d a 12 b 34 123 7 输入数据不能规定精度 6 在 后加 表示跳过相应的数据 则当输入为1234567 则a 12b 67 scanf 2d 3d 2d scanf 7 2f 是错误的 124 8 在格式控制中除格式说明符外若还有其它字符 则应按顺序原样输入 例 scanf d d 则必须输入21 28 又如 scanf a d b d c d 则输入 a 34 b 58 c 100 125 3 6程序举例 例1 输入三角形三边 求三角形面积 例2 输入一个大写字母 要求系统改为小写字母输出 例3 当b2 4ac 0时 求ax2 bx c 0的两个根 126 主讲教师 刘丹 127 在C程序的三种结构中 分支结构是一重要结构 其中的P为条件 第四章逻辑运算和判断选取控制 问题 条件如何表达 逻辑运算 关系运算 128 4 1关系运算符 关系运算 比较运算 如 a 3为一比较运算 当a 5 a 3成立 结果称为 真 否则 如 a 1 a 3不成立 为假 上述表达式a 3称为关系表达式 129 4 1 1关系运算符及其优先次序 1 为同一优先级 等为同一优先级 但前者高于后者 2 关系运算符优先级低于算术运算符 C语言提供了六种关系运算符 优先级为 130 3 关系运算符优先级高于赋值运算符 如下图 举例 c a b c a b a b c a b c a b c a b c a b c a b c 131 4 1 2关系表达式 关系表达式的结果值规定为1或0 如 a b a b b c a 3 b 5 a b a b b c 完整的定义 用关系运算符将两个表达式 算术 关系 逻辑 赋值 字符等表达式 连接起来的式子 1 结果为真 成立 0 结果为假 不成立 132 如 当a 3 b 2 c 1时 a b c成立1 b c a不成立0 d a b则a b值为1 所以d 1 f a b ca b为1 a b c为0 所以f 0 133 4 2逻辑运算符和逻辑表达式 用逻辑运算符将关系表达式 逻辑表达式连接起来的式子 逻辑表达式 134 4 2 1逻辑运算符及优先级 三种 与 或 非 其意义见真值表 135 a b当a b均为1时 才为1 a b当a b中有一个为1时 才为1 a当a为1 a为0 反之为1 由此看到 和 为双目运算符 为单目运算符 136 优先级定义 2 和 低于关系运算符 高于算术运算符 1 非 优先于 与 优先于 即 例 a b x y c a b x y c 137 4 2 2逻辑表达式 1 逻辑表达式的值与关系表达式值一样 真为1 假为0 例 a 4则 a值为0 此处只要a 0 为真 则 a值为0 a 4 b 5a b为1 前面已定义了逻辑表达式 以下看一看逻辑表达式的值及具体的运算 138 4 0 2为1 总之 在逻辑运算中 非0值参加逻辑运算时被看成1处理 a 4 b 5a b为1 a 4 b 5 a b为1 139 2 一个逻辑表达式中的逻辑运算符并不是一定全部执行 一个实际的例子 判断年号是否为润年 如 a b c 则当a 0 假 时 b c不需判断 当a 1 b 0 则不需判c 又如 a b c 当a 1时 b c均不必判别 润年的定义 能被4整除且又能被400整除 年号能被4整除但不能被100整除 140 当 year 4 0 year 100 0 year 400 0 为1时 year为非润年 设用变量year表示年号 当 year 4 0 year 100 0 year 400 0 为1时 year为润年 否则为非润年 如果要判别非润年可在上述表达式前加非 运算符 当 year 4 0 year 100 0 year 400 0 为1时 year为非润年 或者 即 则 141 4 3if语句 条件判断 4 3 1if的三种形式 功能 当表达式值非0时 执行语句A 否则不执行语句A 例如 if x y printf d x 形式1if 表达式 语句A 其流程图 142 形式2if 表达式 语句Aelse语句B 功能 表达式为非0 执行语句A表达式为0 执行语句B 例 if x y printf d x elseprintf d y 143 形式3if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 elseif 表达式n 语句n else语句n 144 流程 表达1 表达2 表达3 表达n 语句1 语句2 语句3 语句n 语句n 语句1 0 0 0 0 0 0 145 如 if 3 prinft o k if a 1 表达式可以是逻辑 关系 甚至是算术表达式 2 上述形式中的语句必须以分号结束 3 上述形式中的语句可以是由 括起来的复合语句 此时 在 外可以不用分号 注意的问题 146 main floata b t scabf f f 例4 1输入两个实数 按代数值由小到大次序输出这两个数 147 3 6 3 2 3 20 3 60 运行情况如下 148 例4 2输入三个数 按大小顺序输出 main floata b c t scanf f f f 149 if b c t b b c c t printf 5 2f 5 2f 5 2f a b c 运行情况如下 3 7 1 1 00 3 00 7 00 150 4 3 2 if语句的嵌套 if 表达式1 内嵌if else 内嵌 注意 else与最近的if配对 一般形式 在上述形式的if语句中 又可以是if语句 称为嵌套 if 表达式2 语句1 if 表达式3 语句3 else语句2 else语句4 151 例 if if 语句2else语句3 if if 语句1 else 所以 必要时加 if 语句1else 152 例4 3有一函数 y 1 x0 编一程序 输入一个x值 输出y值 有以下几种写法 请判断哪些是正确的 程序1 main intx y scanf d 153 if x 0 y 1 elseif x 0 y 0 elsey 1 printf x d y d n x y 程序2 将上面程序的if语句改为 if x 0 if x 0 y 1 elsey 0 elsey 1 154 程序3 将上述if语句改为 y 1 if x 0 if x 0 y 1 elsey 0 程序4 y 0 if x 0 if x 0 y 1 elsey 1 155 4 3 3条件运算符 C语言提供了一个简单的条件赋值语句或条件表达式 问题 当判断条件不论是 真 是 假 均给同一变量赋值时 能否简化语句书写 条件运算符为 三目运算符 156 功能 先判表达式1 若非0 则值为表达式2的值 否则为表达式3的值 一般形式 表达式1 表达式2 表达式3 max a b a b 当a b max a 否则max b 157 注 1 条件运算符优先于赋值运算符 例 max a b a b 可去掉 2 条件运算符低于关系运算符和算术运算符 例 max a b a b 1 max a b a b 1 并不是max a b a b 1 3 条件运算符结合性为从右至左 如 a b a c d c d相当于a b a c d c d 158 4 条件表达式不能取代一般的if语句 只有当if的两个分支为给同一变量赋值时才可替代if if a b printf d a elseprintf d b 由于printf 不是表达式 故不可用条件表达式 但可为 printf d a b a b 159 5 表达式1 表达式2 表达式3可类型不同 main charch scanf c printf c ch 例4 4输入一个字符 判别它是否大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 160 运行结果如下 A a 161 4 4switch语句 开关语句 问题 当某一表达式有n个取值 每一取值执行一语句 则如果用内嵌if十分繁锁 而用switch简单 一般形式 switch 表达式 case常量表达式1 语句1case常量表达式2 语句2 case常量表达式n 语句ndefault 语句n 1 162 例 根据成绩等级打印百分数段 switch grade case A printf 85 100 n case B printf 70 84 n case C printf 60 69 n case D printf 60 n default printf error n 163 根据表达式的取值 判断其与哪一个常量表达式相等 如 表达式i 则自语句i开始执行 直到语句n 1止 若与所有常量表达式值不相等 则从default后的语句开始执行 功能 164 switch 表达式 case常表1 语句1 break 一般形式改为 以上存在一个问题 没有完全起到分支作用 解决办法 增加break语句 使之跳出switch结构 165 case常表2 语句2 break case常表n 语句n break default 语句n 1 请大家修改以上例子 使之正确 166 注 1 常表值必须互不相等 否则二异性 2 case顺序无关紧要 3 不一定非用break不可 有时几种情况合并执行一组语句 167 switch grade case A case B case C printf 60 n break case D printf 60 n break 168 4 5程序举例 例1写一程序 输入年号 判断是否为闰年 1 算法 根据闰年的判断条件 当年号能被4整除但不能被100整除时 它为闰年 当年号能被100整除又能被400整除时 它为闰年 169 设用变量year表示年号 leap为待置值变量 当year为闰年 leap 1 否则leap 0 2 流程图 170 leap 400 0 leap 1 leap 0 打印非闰年 打印是闰年 结束 leap 1 yes No yes No A 171 3 程序 main intyear leap scanf d elseleap 0 172 elseleap 1 elseleap 0 if leap printf dis year elseprintf disnot year printf aleapyear n 173 运行情况如下 2000 2000isaleapyear 1989 1989isnotaleapyear 174 上述条件也可用一个逻辑表达式表示 if year 4 0 例2 求ax2 bx c 0方程的解 例3 P62 请同学们阅读 175 C程序设计 主讲教师 刘丹 176 第五章循环控制 5 1概述 前面已介绍了顺序结构 选择结构 本章介绍循环结构 如 sum 1 2 3 100 实际问题 一组重复执行的语句 177 则用循环结构解决 C语言用四种形式循环 2 while语句 3 do while语句 4 for语句0 1 if语句与goto语句 178 5 2goto语句及与if语句构成循环 1 goto语句 2 与if构成循环 例 求 main inti sum 0 形式 goto标号 功能 无条件转向标号处 标号 用标识符命名 179 i 1 loop if i 100 sum sum i i gotoloop printf d sum 运行结果如下 5050 180 main intsum 0 i 0 loop sum sum i i if i 100 gotoloop printf sum d sum 本例相当于当型循环 若改为直到型 181 5 3while语句 为了使程序的结构化功能强 应尽量少用goto语句 1 形式 while 表达式 语句 2 执行过程 先判断表达式的值 若 0 则执行其后面的语句 否则while执行完毕 专门的当型循环语句 while语句 182 3 流程图 将上述例子用while语句写出while i 100 sum i i 183 语句中应有使表达式 0的语句 否则会出现无限循环 死 循环 注 while后面的语句一般为复合语句 即 加 184 5 4do while语句 一种专门的 直到型 循环语句 2 执行过程 先执行语句 再判表达式的值 若 0 再执行语句 否则结束循环 3 流程 1 形式 do语句while 表达式 185 main inti sum 0 i 1 do sum sum i i while i 100 printf d sum 程序如下 186 while语句与do while语句的区别 当第一次执行时 若表达式 0时 则while语句与do while有所不同 do while执行一次后面的语句 而while不执行 187 5 5for语句 1 形式 首先计算表达式1 接着执行表达式2 若表达式2的值 0 则执行语句 接着计算表达式3 再判断表达式2的值 依此重复下去 直到表达式2的值 0 假 一种形式更为灵活的循环语句 2 执行过程 for 表达式1 表达式2 表达式3 语句 188 3 流程 计算表达式1 求表达式2值 语句 计算表达式3 结束for语句 0 假 0 真 189 用for语句写出上述例子 for用while代替的流程表达式1 while 表达式2 语句表达式3 for i 1 i 100 i sum i for语句完全可以用while代替 但for直观 简单 方便 190 4 for语句的几种特例 例 任意输入两个整数a b 求 main inti j a b sum printf pleaseinputtwonumber n scanf a d b d 可以省略表达式1 但须保留分号 这时在for之前就得赋值给循环变量 191 if a b i b j a for i j i sum sum i printf nsum d sum 192 表达式2一般不可省略 否则为无限循环 相当于 while 1 sum sum i i 例 for i 1 i sum sum i 相当于条件永真 永不为0 若用while表示 193 表达式3亦可省略 但在循环体中须有语句修改循环变量 以使表达式2在某一时刻为0而正常结束循环 例 for sum 0 i 1 i 100 sum sum v i 194 若同时省略表达式1 表达式3 则相当于while 表达式2 语句 相当于while i 100 sum i i 例 for i 100 sum i i 195 三个表达式均省略即for 语句则相当于while 1 语句 表达式1 表达式3可以是逗号表达式 以使循环变量值在修改时可以对其它变量赋值 如for sum 0 i 1 i 100 i i sum 0 for i 1 i 100 i i 2 196 表达式2可以是关系表达式 也可以是数值表达式或字符表达式 只要值 0 即执行循环体 例 for i 0 c getchar n i c 197 5 6循环的嵌套 与其它语言一样 当循环体中又包含了另一个完整的循环语句时 嵌套 C有三种循环语句 均可以相互嵌套 while while 198 for while do while 199 均为正确的嵌套 但 while while for for 会理解为正确的形式 但要注意语句的包含关系 200 5 7几种循环的比较 1 对于同一问题 四种循环可相互替代 但不提倡用goto 2 for循环功能强于while do while 但若不是明显地给出循环变量初终值 或修改条件 则应用while或do while 以增强程序的结构化和可读性
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宿舍说话检讨书
- 四川省宜宾市2024-2025学年七年级下学期期末考试数学试卷(含答案)
- 江苏省常州市钟楼区小学英语五年级下册期末检测卷(含答案)
- 《大数据审计基础》全套教学课件
- 安徽省阜阳市2024-2025学年八年级下学期期末教学质量检测数学试卷(含答案)
- 3D打印:从原理到创新应用知到智慧树答案
- 电商平台消费者隐私数据保护策略研究
- 餐饮行业外卖模式创新案例分析
- “四史”概论知到智慧树答案
- 水银泄露处理课件
- 托盘车充电安全操作规程
- 第五版-FMEA-新版FMEA【第五版】
- 中经堂经络养生运营策划书
- 城轨车辆车门电气原理分析及故障排除
- GB/T 17478-2004低压直流电源设备的性能特性
- GB 18447.1-2008拖拉机安全要求第1部分:轮式拖拉机
- 职业健康培训材料
- 新版食品安全法前后对比-讲义课件
- 《政治经济学》(全套课件)
- 武汉理工大学计算机科学与技术学院课程教学大纲
- 应急疏散培训试题
评论
0/150
提交评论