资源描述
1第 三 章 程 序 设 计 语 言 初 步 2程 序 设 计 语 言 : 用 于 书 写 计 算 机 程 序 的 语 言 , 用于 表 达 和 描 述 要 加 工 的 数 据 以 及 求 解 问 题 的 步骤 和 过 程 。 是 根 据 预 先 定 义 的 规 则 ( 语 法 ) 、由 一 个 有 限 字 母 表 上 的 字 符 构 成 的 字 符 串 的 总体 。程 序 设 计 语 言 的 基 本 成 分 : 数 据 成 分 。 用 以描 述 程 序 中 所 涉 及 的 数 据 。 运 算 成 分 。 用 以描 述 程 序 中 所 包 含 的 运 算 。 控 制 成 分 。 用 以表 达 程 序 中 的 控 制 构 造 。 传 输 成 分 。 用 以 表达 程 序 中 数 据 的 传 输 。 3 提 纲标 识 符 数 据 类 型变 量常 量输 入 和 输 出表 达 式语 句函 数 本 章 结 合 C语 言向 大 家 介 绍 结 构化 程 序 设 计 语 言的 基 本 概 念 数 据 成 分传 输 成 分运 算 成 分控 制 成 分 4 先 聊 点 C语 言u是 一 种 高 级 语 言u相 对 于 低 级 语 言 而 言 , 在 一 个 高 的 级 别 上 进 行 编 程u历 史 悠 久 , 战 勋 卓 著u诞 生 于 20世 纪 70年 代 初 , 成 熟 于 80年 代 ( C89) , 修 订 于 90年 代( C99) , 很 多 重 量 级 软 件 用 C编 写 u上 天 入 地 , 无 所 不 能u几 乎 没 有 不 能 用 C写 出 的 软 件 , 没 有 不 支 持 C的 系 统u很 多 流 行 语 言 、 新 生 语 言 都 借 鉴 了 C的 思 想 、 语 法uC+,Java,C#,PHP等 , 几 乎 都 是 用 C编 写u现 状 u嵌 入 式 领 域 和 系 统 级 编 程 占 主 流 , 桌 面 应 用 次 之 5 6数 据 总 线 控 制 路 线 输 入 设 备 输 出 设 备存 储 器中 央 处 理 器 ( CPU)运 算 部 件控 制 部 件 地 址 总 线 实 例 : 编 一 个 程 序 , 从 键 盘 读 入 两 个 整 数 ,要 求 在 屏 幕 上 输 出 相 乘 运 算 结 果 。处 理 步 骤 :1.控 制 部 件 发 命 令 从 键 盘 读取 数 据 并 存 储 到 内 存 储 器 中( 输 入 ) 。2.控 制 部 件 发 命 令 从 内 存 储器 中 取 出 这 两 个 数 置 入 运 算部 件 的 寄 存 器 中 , 让 运 算 器执 行 乘 法 运 算 , 运 算 结 果 写回 存 储 器 中 ( 处 理 ) 。 3.控 制 部 件 发 命 令 将 存 储 在内 存 储 器 中 的 结 果 输 出 到 显示 器 上 ( 输 出 ) 。需 要 考 虑 的 问 题 :1.输 入 : 如 何 从 键 盘 读 取 这 两 个 数 并 将 其 存 放到 内 存 中 ? 程 序 如 何 约 束 输 入 的 必 须 是 整 数 ?2.处 理 : 计 算 时 如 何 读 取 内 存 中 的 这 两 个 数 ?如 何 实 现 计 算 ? 计 算 结 果 如 何 写 回 内 存 ?3.输 出 : 如 何 将 内 存 中 的 计 算 结 果 输 出 到 显 示器 ? 7数 据 总 线 控 制 路 线 输 入 设 备 输 出 设 备存 储 器中 央 处 理 器 ( CPU)运 算 部 件控 制 部 件 内 存 中 数 据的 存 取 :变 量 、常 量 、数 据 类 型输 入 :输 入语 句 输 出 :输 出语 句 地 址 总 线 计 算 的 实 现 :运 算 符表 达 式语 句函 数 8标 识 符 是 由 程 序 员 定 义 的 单 词 , 用 来 给 程 序中 的 数 据 、 函 数 和 其 他 用 户 自 定 义 对 象 命 名。 程 序 设 计 语 言 本 身 会 定 义 一 些 专 用 名 称 , 称之 为 保 留 字 或 关 键 字 , 它 们 具 有 特 定 含 义 ,程 序 员 不 能 另 做 他 用 。 如 : C语 言 规 定 了 32个 关 键 字 。 3.1 标 识 符 9C语 言 规 定 的 32个 关 键 字 :auto double int struct break else long switch case enum register typedefchar extern return union const float short unsigned continue for signed void default goto sizeof volatiledo if static while 10 #include main() int number1; /*变 量 声 明 */ int number2; int result; printf(“ please input the two numbers:n” ); /*显 示 提 示 信 息 */ scanf(“ %d%d” , /*从 键 盘 读 取 2个 整 数 */ result = number1 * number2; /*赋 值 运 算 */ printf( “ the result is : %dn ” , result) ; /*输 出 结 果 */ return 0; 用 户 自 定 义标 识 符C语 言关 键 字 3.1 标 识 符 11u 不 同 的 程 序 设 计 语 言 标 识 符 格 式 可 能 不 同 。u C语 言 规 定 : 标 识 符 由 大 写 字 母 A到 Z、 小 写 字 母a到 z、 数 字 0到 9和 下 划 线 组 成 , 且 第 一 个 字 符 必须 是 字 母 或 下 划 线 , 随 后 的 字 符 必 须 是 字 母 、 数字 或 下 划 线 。 且 大 小 写 敏 感 , 如 age和 Age是 两 个不 同 的 标 识 符 。u PASCAL语 言 规 定 : 和 C语 言 类 似 , 只 是 要 求 第一 个 字 符 只 能 是 字 母 ( 比 C语 言 约 束 更 强 ) 。 3.1 标 识 符思 考 : 以 下 哪 些 是 合 法 的 C语 言 标 识 符age, _class_no , name1, name1 , 2name,#age 12数 据 是 计 算 机 处 理 的 对 象 。数 据 依 据 其 本 身 的 特 点 可 以 归 为 不 同 的 类 : 整 数、 小 数 、 字 符 、 字 符 串 等 。( 高 级 程 序 语 言 特 点 : 按 照 人 对 于 数 据 的 表 达 方 式 ) 程 序 设 计 语 言 应 该 具 备 区 分 各 种 类 型 数 据 的 能 力, 于 是 引 入 了 数 据 类 型 的 概 念 。数 据 类 型 包 括 两 层 含 义 : 定 义 了 一 系 列 的 值 (属 于该 类 型 的 数 据 能 够 取 值 的 范 围 ) 以 及 能 应 用 于 这些 值 上 的 一 系 列 操 作 ( 数 据 操 作 ) 。 3.2 数 据 类 型 13u 整 数 是 由 符 号 和 一 个 或 多 个 数 字 组 成 的 正 数 、0或 负 数 , 又 称 为 带 符 号 的 自 然 数 , 如 +12,-38。u 注 意 : 在 数 学 中 , 整 数 是 一 个 无 限 集 合 , 但 对于 计 算 机 来 说 , 只 能 表 示 它 的 一 个 有 限 子 集( 取 决 于 存 储 空 间 的 大 小 ) 。整 型 3.2 数 据 类 型程 序 设 计 语 言 一 般 包 含 四 种 标 准 数 据 类 型 :整 型 、 字 符 型 、 浮 点 型 和 布 尔 型 ( 补 充 ) 。 14 3.2 数 据 类 型 整 型整 型 数 据 占 用 的 内 存 单 元 数 :u C语 言 中 整 型 数 据 细 分 为 四 类 : short int、 int、long int和 long long int。 ( 和 教 材 不 同 )u C语 言 标 准 没 有 规 定 每 一 种 整 数 类 型 占 用 的 内存 空 间 大 小 ( 即 数 的 范 围 ) , 只 是 约 束 到 :short int和 int至 少 要 占 据 16位 ( 2字 节 ) , 而long数 据 至 少 要 有 32位 ( 4字 节 ) ; 且 数 据 长度 上 , short int=int=long int = long long int 。 u 每 一 种 整 数 类 型 占 用 的 内 存 字 节 数 由 编 译 器 根据 所 用 机 器 的 硬 件 情 况 来 决 定 。 15整 型 数 据 所 允 许 的 运 算 包 括 : 二 目 算 术 运 算 : +、 -、 *、 /、 ( 取 余 ) ; 注 意 : 两 个 整 数 进 行 二 目 运 算 后 结 果 还 是 整 数 如 : 125 / 10 = 12( 余 数 5被 舍 弃 ) , 125 % 10 = 5 单 目 算 术 运 算 : 取 负 值 等 ; 关 系 运 算 : , , =, = =(相 等 ) , !=( 不 相 等 )C语 言 中 关 系 运 算 结 果 为 1( 真 ) 或 0( 假 ) 3.2 数 据 类 型 整 型 16字 符 型u字 符 数 据 包 括 26*2个 字 母 ( 大 小 写 ) +10个 数字 +其 它 显 示 符 号 , 总 共 95种 ; 还 有 33种 控 制符 号 , 总 共 128种 符 号 ; u字 符 型 数 据 在 内 存 中 的 存 储 : 实 际 存 放 的 是 一个 整 数 值 。 多 数 计 算 机 系 统 采 用 ASCII( American Standard Code for Information Interchange) 标 准 编 码 模 式 来 对 字 符 进 行 编 码 。每 个 字 符 占 用 8位 内 存 ( 1个 字 节 ) ; 3.2 数 据 类 型 17 ASCII表L H 0000 0001 0010 0011 0100 0101 0110 01110000 NUL DLE SP 0 P p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 “ 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAK % 5 E U e u 0110 ACK SYN K k 1100 FF FS N n 1111 SI US / ? O _ o DEL2000H2002H2004H2003H2001H01000001存 储 空 间该 存 储 区存 放 字 符 A思 考 : 若 从 键 盘 上 输 入 字 符 存 储 到 内 存 , 字 符到 二 进 制 编 码 的 转 换 是 由 什 么 部 件 来 实 现 的 ? 18ASCII( A) =65 A的 ASCII值 是 65ASCII( a) =97 规 律 : 大 写 字 母 的 ASCII编 码 32 小 写 字 母 的ASCII编 码 3.2 数 据 类 型 字 符 型 19 3.2 数 据 类 型 字 符 型关 系 运 算 ( 按 照 ASCII大 小 ) :, , =, = =, !=例 如 : A a 结 果 为 真 , 因 为 A 的ASCII是 65 , a 的 ASCII是 97 , 6597字 符 型 所 允 许 的 运 算 包 括 ( 将 字 符 型 数 据 当 作 整 型 数 据对 待 ) :算 术 运 算 : ch2=ch1-32 (若 ch1值 为 b,则 ch2为 B) ch2=ch1-1 (若 ch1值 为 b,则 ch2为 a) ch2=ch1 1 (若 ch1值 为 b,则 ch2为 c) 20浮 点 型u 浮 点 型 是 带 小 数 部 分 的 数 字 类 型 , 如 3.14,1.575E5( 科 学 计 数 法 , 即 1.575* )。u抽 象 地 讲 , 浮 点 型 数 据 的 值 域 是 全 体 实 数 , 但 是 由于 计 算 机 表 示 方 面 的 原 因 , 计 算 机 只 能 表 示 它 的 一 个有 限 子 集 。u 同 样 由 于 计 算 机 表 示 方 面 的 原 因 , 实 数 在 计 算 机内 部 的 表 示 有 时 是 不 准 确 的 。 例 如 , 存 储 圆 周 率 时 ,只 能 表 示 成 近 似 的 值 。 3.2 数 据 类 型510 21 3.2 数 据 类 型u C语 言 支 持 三 种 不 同 长 度 的 浮 点 数 据 类 型 :float、 double和 long double。 其 中 float一 般 占32位 ( 字 节 ) ; double一 般 占 64位 ( 8字 节 ) , long double占 96位 ( 12字 节 ) 。u 三 者 区 别 : 越 后 面 的 类 型 运 算 精 度 越 高 , 值 域越 大 , 但 占 用 的 内 存 单 元 越 多 。 22浮 点 型 所 允 许 的 运 算 包 括 : 二 目 算 术 运 算 : +、 -、 *、 /;浮 点 型 数 据 进 行 二 目 运 算 结 果 还 是 浮 点 型 。 如 : 12.0/5.0=2.4 单 目 算 术 运 算 : 取 负 值 关 系 运 算 : , , =, = =, != 3.2 数 据 类 型 浮 点 型注 意 : 要 避 免 做 两 个 实 数 相 等 或 不 相 等 的 比 较 。 由 于 计 算机 表 示 方 面 的 近 似 性 , 会 使 得 本 来 应 该 相 等 的 两 个 数 不 等 。建 议 在 比 较 两 个 浮 点 数 X和 Y是 否 相 等 时 使 用 |X-Y|,其 中是 一 个 绝 对 值 较 小 的 正 浮 点 数 。 23 3.2 数 据 类 型 布 尔 型 ( 补 充 ) 布 尔 类 型 数 据 : 取 值 只 有 两 种 , 真 ( True) 或者 假 ( False) 。 允 许 的 运 算 包 括 : 与 、 或 、 非 。 绝 大 多 数 程 序 设 计 语 言 中 有 布 尔 类 型 这 种 数 据类 型 , 如 Pascal语 言 。 但 是 C语 言 没 有 定 义 这种 数 据 类 型 。布 尔 型 24标 准 类 型 是 原 子 的 、 不 可 再 分 的 。 程 序 员可 以 以 标 准 类 型 为 基 本 构 件 , 构 造 出 复 杂的 数 据 类 型 。 如 C语 言 有 : 结 构 、 数 组 、 联合 、 文 件 等 复 杂 数 据 类 型 ; PASCAL语 言 有: 结 构 、 数 组 、 集 合 、 文 件 等 复 杂 数 据 类型 。 3.2 数 据 类 型 复 杂 数 据 类 型 25 3.3 变 量 数 据 总 线 控 制 路 线 输 入 设 备 输 出 设 备存 储 器中 央 处 理 器 ( CPU)运 算 部 件控 制 部 件 输 入 数 据 、 中 间 运算 结 果 、 最 终 结 果 程 序 需 要 将 输 入数 据 、 中 间 运 算结 果 以 及 最 终 结果 暂 时 保 存 在 内存 单 元 中 。 地 址 总 线 程 序 如 何 实 现从 内 存 单 元 存取 数 据 ? 26 3.3 变 量 程 序 运 行 时 , 通 过 内 存 地 址 对 内 存 数 据 进 行 读写 ; 程 序 员 写 源 程 序 时 , 如 果 也 是 直 接 使 用 内 存 地址 来 读 写 内 存 数 据 , 会 很 麻 烦 ! 如 果 用 名 字 来 代 替 地 址 , 在 程 序 中 出 现 的 是 代表 内 存 空 间 的 名 字 , 让 编 译 器 来 跟 踪 数 据 实 际存 放 的 物 理 内 存 地 址 , 就 可 以 简 化 编 程 变量 ; 27变 量 用 来 代 表 内 存 存 储 空 间 , 该 存 储 空 间 用 来 存放 被 加 工 的 数 据 或 处 理 的 结 果 。 源 程 序 中 对 变 量的 操 作 ( 读 和 赋 值 ) 实 际 上 是 对 存 储 空 间 的 读 写操 作 。变 量 具 有 三 个 重 要 属 性 : 名 称 、 值 和 数 据 类 型 。2000H2002H2004H2005H2007H2006H2003H2001Hsexagescore内 存 用 sex代 表 地 址 为 2001H的 内 存 单元 , score代 表 地 址 为 2004H2007H的 一 片 内 存 空 间 。 用 变 量来 实 现 对 这 些 内 存 空 间 数 据 的 存取 。 3.3 变 量 28一 、 变 量 定 义 u 使 用 变 量 来 对 内 存 数 据 进 行 存 取 前 , 必 须 先 定 义变 量 , 目 的 是 建 立 变 量 和 存 储 空 间 的 对 应 关 系 。u 变 量 定 义 指 明 变 量 的 名 称 和 数 据 类 型 ( 变 量 代 表的 存 储 空 间 存 放 的 数 据 的 类 型 ) 。 变 量 的 名 称 要 遵循 标 识 符 命 名 原 则 , 虽 然 可 以 为 任 意 长 度 , 但 C编译 器 只 认 为 前 31个 字 符 有 效 。 变 量 类 型 可 以 告 诉 编译 器 留 出 适 量 的 用 于 保 存 数 据 的 内 存 。u 不 同 语 言 中 变 量 定 义 的 写 法 不 一 样 , C语 言 格 式 :数 据 类 型 变 量 名 1,变 量 名 2, ; 3.3 变 量思 考 : 变 量 定 义 时 要 指 明 哪 些 内 容 ?char sex;int age1,age2;float score;数 据 类 型 变 量 名分 号 必 须多 个 同 类 型 变量 用 逗 号 分 割 29注 意 , 变 量 定 义 仅 引 起 内 存 存 储空 间 分 配 , 但 此 时 变 量 中 存 储 的值 一 般 是 无 意 义 的 ( 特 殊 情 况 除外 ) !变 量 定 义 将 引 起 内 存 空 间 的 分 配 。 定 义 后 , 变 量 就用 来 代 表 内 存 中 的 一 片 存 储 单 元 ( 存 储 单 元 个 数 取决 于 变 量 类 型 ) 。 3.3 变 量2000H2002H2004H2005H 2007H2006H2003H2001Hsexagescore 存 储 空 间char sex;int age;float score; 30二 、 变 量 赋 值 3.3 变 量C语 言 示 例 : char sex; int age; float score;变 量 赋 值 : 把 一 个 值 写 入 变 量 代 表 的 存 储 空 间 。C语 言 变 量 赋 值 格 式 : 变 量 名 =表 达 式sex=F;age = 18; score= 89.5; 2000H2002H 2004H2005H2007H2006H2003H2001Hsexagescore 存 储 空 间ASCII( F )=77) 771889.5 变 量 的 值 31 3.3 变 量 变 量 使 用 特 点 先 定 义 , 后 使 用 。 int age; 定 义 一 个 变量 为 整 数 类 型 。 如 未 定 义 , 则 在 编 译 时 被 查出 , 认 为 非 法 。 变 量 未 被 赋 值 前 , 值 一 般 是 无 意 义 的 。 对 变 量 赋 值 过 程 是 “ 覆 盖 ” 过 程 , 用 新 值 去替 换 旧 值 。 读 取 变 量 代 表 的 存 储 空 间 数 据 ( 又 称 读 取 变量 的 值 ) : age=age+1; 读 取 变 量 的 值 时 , 该 变 量 保 持 不 变 。 32C语 言 允 许 变 量 在 定 义 时 进 行 初 始 化 。 初 始化 语 句 用 来 给 变 量 赋 初 始 值 。 (?)例 如 :char sex;int age = 16;float score; 3.3 变 量2000H2002H2004H 2005H2007H2006H2003H2001H16存 储 空 间sexagescore 33 3.3 变 量试 解 释 下 列 操 作 的 含 义 读 取 变 量 的 值 写 入 变 量 给 变 量 赋 值 修 改 变 量 的 值 34 #include main() int number1; /*变 量 声 明 */ int number2; int result; printf(“ please input the two numbers:n” ); /*显 示 提 示 信 息 */ scanf(“ %d%d” , /*从 键 盘 读 取 2个 整 数 */ result = number1 * number2; /*赋 值 运 算 */ printf( “ the result is : %dn ” , result) ; /*输 出 结 果 */ return 0; 3.3 变 量 35 3.3 变 量u 找 出 下 述 变 量 定 义 的 错 误 : float f; char A , B ; 36char sex;int age;float score;变 量 类 型 变 量 名总 结 :变 量 三 要 素 : 变 量 名 ( 存 储 空 间 ) 、 数 据 类 型 ( 存 储空 间 存 放 的 数 据 的 类 型 ) 、 变 量 值 ( 存 储 内 容 ) 3.3 变 量2000H2002H 2004H2005H2007H2006H2003H2001H701889.5存 储 空 间 变 量 的 值sexagescore 37一 、 文 字 常 量 文 字 常 量 是 指 在 程 序 中 未 被 命 名 的 值 。例 : circumference = 2 * ( length + width) ; 其 中 2就 是 一 个 文 字 常 量 , length和 width是 变 量三 类 常 量 : 文 字 常 量 、 命 名 常 量 、 符 号 常 量 3.4 常 量 38二 、 命 名 常 量和 变 量 类 似 , 命 名 常 量 也 是 内 存 存 储 空 间 的 名字 , 代 表 一 片 内 存 存 储 空 间 , 但 一 般 不 允 许 程序 去 改 变 该 存 储 空 间 中 的 数 据 。 C语 言 中 定 义 一 个 命 名 常 量 : main( ) const float pi = 3.14; 3.4 常 量2000H2002H 2004H2005H2007H2006H2003H2001H3.14存 储 空 间pi说 明 pi是 个 命名 常 量 ; 39 #include main() const float pi=3.14;/*常 量 定 义 */ float radius; /*变 量 定 义 */ float area; printf(“ please input the radius:n” ); /*显 示 提 示 信 息 */ scanf(“ %f” , /*从 键 盘 读 取 半 径 */ area = pi * radius * radius; /*赋 值 运 算 */ printf(“ the area is : %fn ” , area); /*输 出 结 果 */ system(“ pause” ); return 0; 40 符 号 常 量 是 仅 含 有 符 号 名 称 的 值 。C语 言 符 号 常 量 定 义 : #define 标 识 符 替 换 文 本 #define PI 3.14 area = PI* radius * radius; 编 译 时 , 预 处 理 程 序 能 够 将 所 有 出 现 该 符 号 名 称的 地 方 用 值 替 换 : area = 3.14 * radius * radius ; 使 用 符 号 常 量 的 好 处 : 使 程 序 易 读 性 好 、 容 易 维护 。 三 、 符 号 常 量 3.4 常 量 41 3.4 常 量#include #define PI 3.14 /常 量 定 义 , 注 意 结 束 处 无 分 号 , 在 主 函数 之 前main() float radius; /*变 量 定 义 */ float area; printf(“ please input the radius:n” ); /*显 示 提 示 信 息 */ scanf(“ %f” , /*从 键 盘 读 取 半 径 */ area = PI* radius * radius; /*赋 值 运 算 */ printf(“ the area is : %fn ” , area); /*输 出 结 果 */ system(“ pause” ); return 0; 42四 、 常 量 的 类 型和 变 量 一 样 , 常 量 也 有 类 型 。 大 多 数 程 序 设 计 语 言 使 用 整型 、 浮 点 型 、 字 符 型 和 字 符 串 型 常 量 。C语 言 中 四 种 常 量 :15 整 型 常 量15.4 浮 点 型 常 量 A 字 符 型 常 量 ( 用 单 引 号 括 起 字 符 )“ Hello” 字 符 串 型 常 量 ( 用 双 引 号 括 起 字 符 序 列 )文 字 常 量 和 符 号 常 量 的 值 体 现 了 常 量 的 类 型 3.4 常 量 43 如 果 整 型 常 量 以 0开 头 , C编 译 器 会 认 为 该 常 量是 八 进 制 数 。 如 040即 十 进 制 的 32。 如 果 整 型 常 量 以 0 x开 头 , C编 译 器 会 认 为 该 常量 是 十 六 进 制 数 。 如 0 xFF即 十 进 制 的 255。#include #define X 040#define Y 0XFFmain() printf(“ X=%d,Y=%d” , X,Y); system(pause); return 0; 3.4 常 量X=32,Y=255请 按 任 意 键 继 续 . . . 44 常 量 小 测 试 下 述 常 量 定 义 哪 些 是 错 误 的 ? 为 什 么 ?#define ratio =1/3 #define ratio 1/3;#define 1st_character $#define if 7 1. 不 能 有 号 ; 否 则 会 用=1/3替 换 ratio2. 不 能 有 语 句 结 束 符 ; 号3. 标 识 符 只 能 以 字 符 或 者下 划 线 开 头4. If是 C语 言 规 定 的 关 键字 , 有 特 定 含 义 , 用 户不 能 随 便 使 用5. 习 惯 上 , 常 量 名 一 般 采用 大 写 字 母 。 45数 据 总 线 控 制 路 线 输 入 设 备 输 出 设 备存 储 器中 央 处 理 器 ( CPU)运 算 部 件控 制 部 件 地 址 总 线 3.5 输 入 和 输 出 ( I/O)一 个 真 正 有 用 的 程序 一 般 会 从 输 入 设备 接 收 数 据 、 并 将运 算 结 果 输 出 到 输出 设 备 中 。为 了 实 现 和 输 入 输 出设 备 的 通 信 , 程 序 必须 要 有 输 入 和 输 出 语句 。 一 个 既 无 输 入 又无 输 出 的 程 序 是 没 有用 的 。 46输 入 和 输 出 语 句 最 基 本 的 功 能 在 于 从 外 界 环 境 将值 读 入 一 个 变 量 , 或 者 将 一 个 值 写 出 到 外 界 环境 中 。 3.5 输 入 和 输 出 ( I/O) 47一 、 输 入 通 过 输 入 语 句 或 者 预 先 定 义 的 函 数 可 以 从 外 界 接 收 值 。C语 言 输 入 函 数 举 例 : scanf(格 式 控 制 串 , 输 入 项 地 址 表 );格 式 控 制 串 : 含 有 各 种 以 百 分 号 开 头 的 格 式 控 制 符 。输 入 项 地 址 表 : 有 逗 号 分 隔 开 的 若 干 输 入 表 项 组 成 , 每 一 个表 项 是 一 个 变 量 的 地 址 。scanf函 数 的 作 用 : 从 标 准 输 入 设 备 ( 键 盘 ) 上 读 取 一 系 列 数据 , 按 格 式 控 制 串 的 要 求 进 行 转 换 并 送 到 输 入 项 地 址 表 所 列的 逐 变 量 中 。 3.5 输 入 和 输 出 ( I/O) 48 scanf(“ %d” ,u当 程 序 执 行 该 语 句 时 , 等 待 用 户 从 键 盘 输 入 数 据 并转 换 成 一 个 整 数 , 存 储 到 变 量 number1中 。u d: 转 换 说 明 符 ( conversion specifier) , 用 于 告诉 程 序 键 入 的 数 据 要 转 换 成 一 个 整 数 ;u 若 希 望 ch得 到 字 符 值 2 , age得 到 整 型 值 0, sex得 到字 符 值 M , height得 到 浮 点 值 1.65, 则 函 数 调 用 为 : scanf(“ %c%d%c%f” , 50用 scanf语 句 从 键 盘 同 时 读 入 年 龄 和 性 别 :scanf(“%d %c”,scanf(“%d,%c”, 3.5 输 入 和 输 出 ( I/O)10 S10, S格 式 控 制 串 中 除 了 转 换 说 明 符 , 还 可 以 包 含 其 他 字 符 。从 键 盘 输 入 的 内 容 要 和 格 式 控 制 串 匹 配 。 如 果 在 格 式控 制 串 中 除 了 转 换 说 明 符 以 外 还 有 其 它 字 符 , 则 在 输入 数 据 时 应 输 入 与 这 些 字 符 相 同 的 字 符 。 如 : 空 格scanf(“age=%d, sex=%c”,age=10, sex=S 51二 、 输 出 通 过 语 句 或 者 预 先 定 义 的 函 数 可 以 将 值 输 出 到 外 界 。C输 出 函 数 举 例 :功 能 : 将 字 符 串 显 示 在 标 准 输 出 设 备 ( 一 般 为 显 示器 ) 上 。 程 序 员 可 以 将 常 量 、 变 量 、 表 达 式 、 函 数调 用 作 为 待 输 出 字 符 串 的 一 部 分 。格 式 控 制 串 : 包 含 了 某 些 要 直 接 显 示 的 字 符 , 也 包含 一 些 转 换 说 明 符 。输 出 项 表 : 可 以 是 常 量 、 变 量 、 表 达 式 、 函 数 调 用 。 3.5 输 入 和 输 出 ( I/O) 52如 : printf( ”Your age is : %d”,age) ;注 意 , 在 输 出 时 转 换 说 明 符 %d不 输 出 , 而 是 被 变 量age的 值 代 替 。 假 设 变 量 age的 值 是 18, 则 显 示 器 上将 输 出 字 符 串 “ Your age is : 18” 注 意 : 此 处 变 量 age前 面 没 有 输 出 将 是 怎 样 ? 53 3.5 输 入 和 输 出 ( I/O)可 以 用 printf语 句 输 出 常 量 、 变 量 、 表 达 式 、 函数 调 用 的 值 :printf(“ the agerage score is %d” ,SCORE);/输 出 常 量printf(“ your age is %d” ,age); /输 出 变 量printf(“ the value of (2+3)10 is:%dn” ,(2+3)10);/输 出表 达 式 的 值 ( ? )printf(“ the size of int is :%d” ,sizeof(int); /输 出 函 数 返回 值 54若 想 同 时 输 出 年 龄 和 性 别 , 则 语 句 可 写 为 :printf( “ Your age is : %d, your sex is : %c”,age,sex) ;显 示 器 上 将 输 出 字 符 串 “ Your age is : 18, your sex is : F” 3.5 输 入 和 输 出 ( I/O)输 入 输 出 后 面 会 再 详 细 讲 解 , 有 兴 趣 的 同 学 可 参 见 C程序 设 计 教 程 的 9.3和 9.11。 55 找 出 以 下 程 序 的 错 误1. include2. main()3. 4. ( 未 定 义 变 量 )5. printf(“ input i and jn” );6. scanf(“ i=%d” , 7. scanf(“ %d” ,8. printf(“ i=%d, j=%d” ,i, j);/输 出 2个 变 量 的 值9. return 0;10. 1. 变 量 i和 j未 定 义 就 使 用 ;2. scanf(“ i=%d” ,3. printf(“ i=%d, j=%d” , i, j); 56 修 正 后 的 程 序 includemain() int i,j;/变 量 定 义 printf(“ input i and jn” ); /输 入 提 示 scanf(“ i=%d” , /键 盘 输 入 变 量 i的 值 scanf(%d, printf(“ i=%d, j=%d” ,i,j);/输 出 2个 变 量 的 值 system(pause); return 0; 运 行 结 果 :input i and ji=1020i=10, j=20请 按 任 意 键 继 续 . . . 57#include main() int number1; /*存 放 整 数 1*/ int number2; /*存 放 整 数 2*/ int result; /*存 放 结 果 */ printf(“ please input the two numbers:n” ); /*显 示 提 示 信 息 */ scanf(“ %d %d” , /*读 取 整 数 */ result = number1 * number2; /*赋 值 运 算 */ printf( “ the result is : %dn ” , result) ; /*输 出 结 果 */ return 0; 2000H2004Hresult 2002H2005H2007H2006H2003H2001H存 储 空 间number1number210 20please input the two numbers:the result s : 200 1020200 任 务 描 述 : 输 入 两 个 整 数 ,求 两 数 之 积 并 输 出 。 /*/:注 释 main( ) 函 数 变 量 定 义 部 分 操 作 部 分编 译 后 , 源 程 序 中 出现 number1、 number2和 result的 地 方 将 会 用内 存 相 对 地 址 ( 非 真正 物 理 地 址 ) 替 换 。思 考 : 何 时 、 在 哪 里得 到 真 正 的 物 理 地 址 ?编 译 程 序 怎 么 处 理 变量 ? 操 作 系 统 怎 么 分配 内 存 ? 如 何 得 到 物理 地 址 ? 深 入 学 习 : 编 译 原 理 操作 系 统 计 算 机组 成 原 理 假 设 操 作 系 统 已 经 分 配 如 下 内存 空 间 用 于 存 放 操 作 数 和 结 果程 序 运 行 过 程 演 示 58 输 入 输 出 练 习 : 定 义 三 个 变 量 , 分 别 是 整 型 、浮 点 型 、 字 符 型 。 要 求 从 键 盘 输 入 三 个 值 存 放到 这 三 个 变 量 里 , 并 且 输 出 这 三 个 变 量 。 #includemain() int i; float f; char c; scanf(“ %d,%f,%c” , printf(“ the result is:n” ); printf(“ i=%d,f=%f,c=%c” ,i, f, c); system(“ pause” ); return 0; 59 #includemain() int i; float f; char c; printf(input i,fn); scanf(%d,%f, printf(input cn); scanf(“%c”, (空 格 是 一 个 字 符 值 ? ) printf(the result is:n); printf(i=%d,f=%f,c=%c,i,f,c); system(pause); return 0; 请 同 学 们 观 察 本 程 序 的 输 出 是 什 么 ?input i,f10,3.14input cthe result is: i=10,f=3.140000,c=请 按 任 意 键 继 续 . . .程 序 并 没 有 给 用 户 输 入 字符 数 据 的 机 会 。 为 什 么 ? 【 链 接 】 60 解 决 方 法 : 用 getchar函 数 来 读 取 回 车 符main() int i; float f; char c; printf(input i,fn); scanf(%d,%f, getchar(); /*将 存 于 缓 冲 区 的 回 车 符 读 入 */ printf(input cn); scanf(%c, printf(the result is:结 果 是 n); printf(i=%d,f=%f,c=%c,i,f,c); system(pause); ( 为 什 么 此 程 序 没 有 return 0?) input i,f10,3.14input cythe result is: i=10,f=3.140000,c=y请 按 任 意 键 继 续 . . .结 果 正 确 !此 外 , 还 可 以 用 fflush函 数来 清 空 键 盘 缓 冲 区 。 见 实验 讲 义 附 录 1的 第 16个 错 误( 第 130页 ) , 要 求 自 学 。 61u 表 达 式 是 由 运 算 符 、 操 作 数 和 括 号 组 成 的 、 计 算 求 值的 基 本 单 位 。u 操 作 数 可 以 是 : 常 量 、 变 量 、 函 数 调 用 和 表 达 式 ;u 表 达 式 举 例 :u 2 表 达 式 无 运 算 符 , 操 作 数 为 常 量u i 表 达 式 无 运 算 符 , 操 作 数 为 变 量u sizeof(int) 表 达 式 无 运 算 符 , 操 作 数 为 函 数 调 用u 2 + i 操 作 数 为 常 量 和 变 量u i * sizeof(int) 操 作 数 为 变 量 和 函 数 调 用u 2+ i * sizeof(int) 加 法 运 算 的 第 2个 操 作 数 仍 为表 达 式 3.6 表 达 式 62 3.6 表 达 式u 典 型 的 几 类 运 算 符 和 表 达 式 :算 术 运 算 符 和 算 术 表 达 式 ; 关 系 运 算 符 和 关 系 表 达 式 ;逻 辑 运 算 符 和 逻 辑 表 达 式 ;赋 值 运 算 符 和 赋 值 表 达 式 ; 63 3.6 表 达 式一 、 算 术 运 算 符 和 算 术 表 达 式算 术 运 算 符 : 、 、 、 /、 (取 余 ) 等 ;算 术 表 达 式 : 由 算 术 运 算 符 、 操 作 数 和 括 号 构 成 的表 达 式 。 如 : ( 2 + 8.2 / 3) * 4 , 10 4( 余 数 为 2)+ (加 ) -( 减 )*( 乘 ) /( 除 , 取 商 )%( 取 模 ) + (自 加 , 加 1)-( 自 减 , 减 1) 64 3.6 表 达 式 算 术 表 达 式(b*b-4*a*c)/(2*a)2aac4b2要 注 意 编 程 序 式 , 程 序 中 对 算 术 表 达 式 的 书 写 和平 时 的 书 写 方 式 可 能 是 不 一 样 的 :在 程 序 中 要 写 成 65 在 C语 言 中 , 算 术 运 算 的 操 作 数 可 以 是 整 数 、 字符 或 者 浮 点 数 。 如 果 表 达 式 中 的 操 作 数 全 是 字 符或 者 整 数 , 则 表 达 式 的 值 为 整 数 ; 如 果 操 作 数 至少 有 一 个 是 浮 点 数 , 则 表 达 式 的 值 为 浮 点 数 。 3.6 表 达 式 算 术 表 达 式求 以 下 表 达 式 的 值 :1) 102/202) 102%203) 1/24) 1.0/25) x= A +32( x是整 型 变 量 )求 以 下 表 达 式 的 值 :) =5) =2) =0 值 为 整 数) =0.5 值 为 浮 点 数) x 97 提 示 : 字 符 数 据 总 是先 转 换 成 整 型 数 据 ,再 参 与 运 算 的 。 66 3.6 表 达 式 算 术 表 达 式 C语 言 中 , 整 型 、 字 符 型 、 浮 点 型 数 据 可 以 进行 混 合 运 算 . 如 : 5+1.0+A=71.000000混 合 运 算 涉 及 到 数 据 类 型 的 转 换 , 具 体 将 在 以后 介 绍 。 自 加 运 算 符 +和 自 加 运 算 符 -是 C语 言 特 有 的运 算 符 , 将 在 以 后 介 绍 。 67 3.6 表 达 式二 、 关 系 运 算 符 和 关 系 表 达 式 关 系 运 算 符 : 用 于 比 较 两 个 数 据 的 大 小 关 系 。 关 系 表 达 式 : 用 关 系 运 算 符 将 两 个 表 达 式 连 接 起来 构 成 的 表 达 式 , 如 (2 3)10 ; 运 算 结 果 是 逻辑 “ 真 ” 或 者 “ 假 ” 。 在 C语 言 中 , 若 运 算 结 果 是 逻 辑 “ 真 ” , 则 关 系表 达 式 的 值 为 1; 若 为 逻 辑 “ 假 ” , 则 值 为 0。 (小 于 ) ( 大 于 ) =( 大 于 等 于 ) ( 等 于 ) ! ( 不 等 于 ) 68 3.6 表 达 式 关 系 表 达 式思 考 : 以 下 语 句 的 输 出 结 果 是 什 么 ?printf(the value of (2+3)10 is:%dn,(2+3)10);printf(the value of (2+3)=10 is:%dn,(2+3)=10);the value of (2+3)10 is:1the value of (2+3)=10 is:0 69 3.6 表 达 式三 、 逻 辑 运 算 符 和 逻 辑 表 达 式逻 辑 运 算 符 : 与 、 或 、 非 printf(“ a=%d,b=%d,c=%dn,a,b,c); f=(ab) printf(“ f=(ab) printf(f=(ab)|(bc),f为 %dn,f); printf(!(ab) is: %dn,!(ab); printf(! a is: %dn,! a); system(pause); return 0; 输 出 结 果 ?a=1,b=2,c=4f=(ab)/* A 、 a 、 S 的 ASCII分 别 是 65, 97, 83*/ printf(%c , %dn,ch1,ch1); printf(%c , %dn,ch2,ch2); printf(%c, %dn, ch1+32, ch1+32); printf(%dn, ch1 a ( 一 个 表 达 式 语 句 , 但 无 意 义 )i = i + 10 * j;( 赋 值 表 达 式 语 句 ) printf(“age=%d” ,age);( 表 达 式 语 句 , 表 达 式 为 函 数调 用 ) 3.7 语 句 80如 果 表 达 式 涉 及 到 赋 值 ( 存 在 赋 值 运 算 符 或 运 算符 +或 -, 如 i = i + 10 * j; ) , 则 将 计 算 得 到 的值 保 存 到 变 量 中 。如 果 不 涉 及 赋 值 ( 如 语 句 ij;) , 则 值 将 被 丢 弃 . 3.7 语 句 81二 、 复 合 语 句 复 合 语 句 是 包 含 零 个 或 多 个 语 句 的 代 码 单 元 , 使 得一 组 语 句 成 为 一 个 整 体 , 也 被 称 为 块 。在 C语 言 中 , 复 合 语 句 由 一 个 左 大 括 号 、 可 选 语句 段 、 一 个 右 大 括 号 组 成 。 如 : i = 1;j = 2 * i; 3.7 语 句 82三 、 选 择 语 句 3.7 语 句u 在 写 程 序 时 , 有 时 往 往 需 要 测 试 某 一 个 条 件 是 否 成 立 , 然 后 根 据 测 试 结 果 来 控 制 程 序 后 续 执行 路 径 。 此 时 要 用 到 选 择 语 句 。u C语 言 中 选 择 语 句 有 : 1) if-else 语 句 2) switch语 句 (以 后 再 讲 ) 831) if-else 实 现 双 路 选 择 if (表 达 式 ) 语 句 1else 语 句 2b) C语 句a) 流 程 图表 达 式 语 句 1 语 句 2真 ( 非 0) 假 ( 为 0) 3.7 语 句 84 3.7 语 句1. if-else语 句 中 的 “ 表 达 式 ” 必 须 用 “ (” 和 “ )”括 起 来 ; 表 达 式 可 以 是 任 一 种 表 达 式 , 关 系 表达 式 和 逻 辑 表 达 式 较 常 见 ; 表 达 式 的 值 为 非 零时 , 为 “ 真 ” , 否 则 为 “ 假 ” 。2. 语 句 可 以 是 任 何 语 句 : 表 达 式 语 句 、 复 合 语 句 、选 择 语 句 和 循 环 语 句 。3. else子 句 是 if语 句 的 一 部 分 , 必 须 与 if配 对 使 用 ,不 能 单 独 使 用 。4. 可 以 没 有 else子 句 ( 但 必 须 有 if子 句 ) , 即 :if(表 达 式 ) 语 句 85 例 3.3 输 入 一 个 整 数 , 判 别 它 是 否 能 被 3整 除 。若 能 被 3整 除 , 输 出 YES; 若 不 能 被 3整 除 , 输 出NO。#include这 是 条 件 语 句 中 典 型 的 程 序 设 计 !main( ) int n; /*变 量 n用 于 存 放 输 入 的 整 数 */ printf(“ input n: ” ); /*输 入 提 示 */ scanf(“ %d” , /*输 入 整 数 到 变 量 n中 */ if (n%3 = = 0) /*判 断 n能 否 被 3整 除 */ printf(“ n=%d YESn” ,n);/*若 n能 被 3整 除 , 则 输 出 “ YES” */ else printf(“ n=%d NOn” ,n); /*若 n不 能 被 3整 除 , 则 输 出 “ NO” */ system(“ pause” ); return 0; input n: 20n
展开阅读全文