C 语 言“switch 语 句” 的 使 用 技 巧---- C 语 言 作 为 国 际 上 流 行 的 计 算 机 语 言 已 经 和 正 在 被 广 大 的 计 算 机 用 户 使 用。 凡 是 使 用 过 的 人 都 会 有 同 样 的 感 觉 — —C 语 言 的 使 用 灵 活 这 个 特 点 既 是 优 点 又 是 缺 点, 因 为 对 精 通C 语 言 的 用 户 来 讲, 灵 活 就 意 味 着 编 程 可 以 无 拘 无 束, 甚 至 随 心 所 欲; 但 对 初 学 者 或 者 是 尚 未 摸 着 规 律 的 用 户 来 说, 有 时 候 就 会 觉 得C 程 序 设 计 有 点 象 雾 里 看 花, 摸 不 着 头 脑。 因 为 灵 活 就 意 味 着 没 有 一 个 标 准。 而 实 际 上,C 语 言 和 其 它 计 算 机 语 言 一 样, 只 要 你 真 正 掌 握 了 该 语 言 的 每 一 个 语 句 的 特 点, 理 解、 运 用 就 不 难 掌 握 了。 下 面 就C 语 言 中switch 语 句 的 使 用 特 点 谈 谈 自 己 的 体 会。
---- switch 语 句 的 格 式 如 下: switch( 表 达 式) {case 常 量 表 达 式1: 语 句1 case 常 量 表 达 式2: 语 句2 case 常 量 表 达 式3: 语 句3 case 常 量 表 达 式n: 语 句n default : 语 句n+1 }
---- 从 表 面 上 看 来,switch 语 句 与PASCAL 语 言 中 的case 语 句 以 及FOXBASE 中 的do case 语 句 非 常 类 似, 只 是 关 键 字 有 所 不 同: 一 个 是switch; 而 另 一 个 是
case 或do case。 但 如 果 仔 细 阅 读 过 教 材 或 有 关 参 考 书 的 话, 就 绝 不 会 有 此 想 法。 从 语 句 的 功 能 上 来 看,PASCAL 和case 语 句 或FOXBASE 的do case 语 句 中 的 常 量 表 达 式 是 用 来 与case 后 面 的 表 达 式 比 较 以 确 定 执 行 哪 一 个 语 句, 一 旦 执 行 了 某 一 语 句, 则 会 自 动 地 结 束 这 一case 后 的 语 句; 而C 的switch 语 句 则 不 然。 首 先,switch 语 句 中 的 常 量 表switch的用法c语言 达 式 只 是 起 到 一 个 入 口 作 用, 一 旦 执 行 了 相 应 的 语 句 后, 只 要 没 有 强 迫 中 断 语 句(break), 它 就 会 一 直 按 顺 序 继 续 执 行 下 去, 也 就 是 会 执 行 其 它case 后 面 的 语 句, 直 到 遇 到“}” 符 号 才 停 止。 乍 看 觉 得 有 点 不 可 事 议, 但 若 仔 细 回 味 且 切 身 编 程 体 会, 那 么 就 会 感 司 到C 的switch 语 句 的 独 到 之 处。 接 下 来 就 几 个 具 体 例 子 来 剖 析:switch 语 句 的 特 点 以 及 区 别 于 其 它 语 言 中 的 相 应 语 句 的 妙 处。
---- 第 一 个 例 子: 根 据 输 入 的 百 分 制 成 绩, 然 后 给 出‘A’ ~‘E’ 相 应 的 等 级 符(90-100 为‘A’、80-89 为‘B’、70-79 为‘B’、60-69 为‘C’、0-59 为‘E’)。 主 要 的 处 理 程 序 段 如 下:(temp、score、grade 皆 为 整 型 变 量) temp=score/10; switch(temp) {case 9:grade=‘A’; case 8:grade=‘B’; case 7:grade=‘C’; case 6:grade=‘D’; case 5:grade=‘E’; } printf(“the grade is %c”,grade);
---- 仔 细 阅 读 这 段 程 序( 根 据C 语 言 的 特 点), 就 会 发 现 有 很 多 错 误。 首 先, 对100 分 和 低 于50 分 的 情 况 没 有 考 虑; 其 次,C 语 言 的switch 特 点 是 顺 序 执 行, 那 么 这 段 程 序 不 输 入 的 分 数 如 何, 最 后 的 输 出 都 将 是‘E’。 因 此, 修 改 这 段 程 序, 可 以 得 到 一 个 正 确 答 案 是: temp=score/10; switch(temp) {case 10: case 9:grade=‘A’;break; case 8:grade=‘B’;break; case 7:grade=‘C’;break; case 6:grade=‘D’;break; case 5: case 4: case 3: case 2: case 1: case 0:grade=‘E’; } printf(“the grade is %c,grade”);
---- 但 这 么 一 个 结 果 还 不 算 是 一 个 好 的C 程 序, 因 为 它 只 是 能 得 到 正 确 的 解, 没 有 真 正 用 到C 的 特 点。 如 果 将C 的 特 点 运 用 到 这 段 程 序 中, 则 程 序 将 优 化 成 如 下: grade=‘A’; temp=score/10; switch(temp) {case 0: case 1: case 2: case 3: case 4: case 5:grade++; case 6:grade++; case 7:grade++; case 8:grade++; case 9: case 10: } printf(“the grade is %c,grade”);
---- 从 这 段 程 序 中, 我 们 可 以 体 会 到 前 面 所 说 的 该 语 句 的 特 点。
-
--- 第 二 个 例 子: 运 输 公 司 对 用 户 计 算 运 费。 距 离(s) 越 远, 每 公 里 运 费 越 低。 具 体 标 准 如 下: s < 250 (km) 没 有 折 扣 250 < =s < 500 (km) 2% 折 扣 500 < =s < 1000 (km) 5% 折 扣 1000 < =s < 2000(km) 8% 折 扣 2000 < =s < 3000(km) 10% 折 扣 3000 < =s (km) 15% 折 扣
---- 设 每 公 里 每 吨 货 物 的 基 本 运 费 为p, 货 物 重 为w, 距 离 为s, 折 扣 为d, 则 总 运 费 计 算 公 式 为:
---- f=p*w*s*(1-d)
---- 分 析 此 问 题, 折 扣 的 变 化 是 有 规 律 的: 折 扣 的“ 变 化 点” 都 是250 的 倍 数(250,500,1000,2000,3000)。 利 用 这 一 特 点, 可 以 再 设 一 变 量c, 它 代 表250 的 倍 数。 当c<1 时, 无 折 扣;1<=c<2 时, 折 扣 为d=2%;2<=c<4 时,d=5%;4<=c<8 时,d=8%;8<=c<12 时,d=10%; c>=12 时,d=15%。 所 以 可 以 有 如 下 没 有 错 误 的 程 序 段: scanf(“%f,%f,%d”,&p,&w,&s); if(s>=3000)c=12 else c=s/250 switch(c) {case 0:d=0;break; case 1:d=2;break; case 2: case 3:d=5;break; case 4: case 5: case 6: case 7:d=8;break; case 8: c
ase 9: case 10: case 11:d=10;break; case 12:d=15; } f=p*w*s*(1-d/100.0); printf(“freight%15.f”,f);
---- 如 同 前 一 个 题 目, 这 个 程 序 段 也 完 全 可 以 利 用switch 特 点, 改 进 优 化 得 到 如 下 程 序 段: d=0 scanf(“%f,%f,%k”,&p,&w,&s); if(s>=3000)c=12 else c=s/250 switch(c) {case 12:d+=5; case11: case 10: case 9: case 8:d+=2; case 7: case 6: case 5: case 4:d+=3; case 3: case 2:d+=3; case 1:d+=2; case 0: } f=p*w*s*(1-d/100.0); printf(“freight%15.4f”,f);
---- 从 上 面 两 个 例 子 分 析, 使 我 们 可 以 比 较 清 楚 地 看 见C 语 言 中switch 语 句 与 其 它 语 言 中 相 应 语 句 的 区 别。 尽 管 在 学 习 和 教 计 算 机 语 言 的 过 程 中, 我 们 始 终 认 为 语 言 是 相 通 的, 这 样 便 于 学 习 一 门 新 的 语 言。 但 是 真 正 要 把 某 一 门 计 算 机 语 言 学 好, 非 得 掌 握 它 的 特 点。
---- 这 里 仅 仅 是 自 己 在 编 程 实 践 过 程 中 的 一 点 体 会, 有 错 误 的 地 方 恳 请 批 评 指 正。
希望对你有帮助!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论