第 五 章 條 件 判 斷 式 資 訊 科 技 系 林 偉 川 本 章 簡 介 有 時 所 做 的 事 情, 常 常 會 因 為 不 同 的 條 件, 而 有 不 同 的 做 法, 甚 至 會 產 生 不 同 的 結 果 條 件 判 斷 式 的 功 能 善 用 條 件 判 斷 式 的 功 能, 程 式 便 能 選 擇 以 不 同 路 徑 完 成, 也 就 是 選 擇 性 流 程 : 2 1
條 件 判 斷 (1): if if 的 意 思 就 是 如 果... 就..., 也 就 是 說 當 如 果 的 情 形 成 立 時, 就 會 執 行 接 下 來 的 程 式 描 述 宣 告 語 法 如 下 : if ( 條 件 算 式 ) { 多 動 作 } if ( 條 件 算 式 ) 動 作 ; 3 條 件 判 斷 (1): if 1. if: 會 根 據 條 件 算 式 的 結 果, 來 判 斷 接 下 來 是 否 執 行 動 作 中 的 程 式 如 果 條 件 算 式 結 果 為 真, 則 執 行 動 作 ; 如 果 為 假, 則 跳 過 不 執 行 動 作 2. 條 件 算 式 : 結 果 為 真 或 假 的 算 式, 通 常 由 邏 輯 或 條 件 算 符 組 成, 也 可 以 為 數 值 算 式 的 運 算 結 果 為 0 表 示 結 果 為 假 ; 運 算 結 果 為 1 或 其 他 非 0 的 數 值, 則 表 示 結 果 為 真 3. 動 作 : 可 以 為 任 何 合 法 的 程 式 碼, 如 運 算 式 輸 出 輸 入 等 如 果 需 執 行 的 動 作 只 有 一 行 敘 述, 可 以 省 略 大 括 號 4 2
條 件 判 斷 (1): if 執 行 if 敘 述 時, 若 條 件 為 真, 則 執 行 指 定 的 動 作 ( 程 式 ) 若 條 件 判 斷 式 不 成 立, 則 略 過 該 動 作 而 繼 續 往 下 執 行 : if (gas < 1) { printf( 先 加 油 再 上 路 \n ); } printf( 請 注 意 行 車 安 全 \n ); 5 流 程 圖 如 下 : 條 件 判 斷 (1): if 6 3
計 算 折 扣 商 品 的 售 價 7 計 算 折 扣 商 品 的 售 價 8 4
流 程 圖 第 15~20 行 間 為 條 件 判 斷 式 執 行 程 式 的 流 程 圖 : 9 條 件 判 斷 (2): if-else if-else 的 意 思 是 說 如 果... 就... 否 則 就... 與 if 不 同 的 是, if-else 還 包 含 了 當 if 的 條 件 不 成 立 時, 程 式 所 需 要 執 行 的 動 作, 格 式 如 下 : if ( 條 件 算 式 ) { 多 動 作 1 } else { 多 動 作 2 } 10 5
條 件 判 斷 (2): if-else 當 條 件 算 式 成 為 真, 則 執 行 動 作 1, 然 後 略 過 動 作 2, 接 著 往 下 執 行 ; 如 果 條 件 算 式 為 假, 則 略 過 動 作 1, 執 行 else 的 動 作 2, 然 後 再 往 下 執 行 也 就 是 說, 動 作 1 與 動 作 2 只 會 因 條 件 判 斷 式 的 真 假 而 擇 一 執 行, 不 會 兩 個 都 執 行 比 如 說 : if (age > 18) printf( 您 已 經 成 年 \n ); else printf( 您 還 未 成 年 \n ); 11 流 程 圖 12 6
判 斷 單 數 與 雙 數 13 流 程 圖 14 7
條 件 判 斷 (3): if-else if 條 件 判 斷 式 也 可 以 設 定 兩 個 以 上 的 條 件 算 式, 將 所 有 的 狀 況 分 得 更 細 使 用 if-else if, 意 思 是 說 如 果... 就... 否 則 如 果... 就... 語 法 如 下 : if ( 條 件 算 式 1) { 多 動 作 1} else if ( 條 件 算 式 2) { 多 動 作 2} else { 最 後 多 動 作 } 15 條 件 判 斷 (3): if-else if if-else if 通 常 是 使 用 在 要 將 所 有 可 能 發 生 的 情 況, 細 分 成 三 種 以 上, 比 如 說 學 生 成 績 的 分 級 : 16 8
流 程 圖 17 將 成 績 分 等 18 9
將 成 績 分 等 19 流 程 圖 20 10
條 件 判 斷 (4): 巢 狀 if 巢 狀 if 條 件 判 斷 式 適 用 於 需 要 層 層 過 濾 的 資 料 在 if 條 件 判 斷 式 所 執 行 的 動 作 中 可 以 有 其 他 的 條 件 判 斷 式 存 在, 語 法 如 下 : 21 審 查 工 作 應 徵 者 的 資 格 22 11
審 查 工 作 應 徵 者 的 資 格 23 審 查 工 作 應 徵 者 的 資 格 24 12
流 程 圖 25 條 件 判 斷 (5): switch-case 意 思 是 " 選 擇 合 適 的 個 案 來 執 行 " 我 們 可 以 藉 著 控 制 switch, 從 數 個 個 案 中, 挑 選 出 一 個 來 執 行 swtich-case 是 適 合 多 選 一 的 條 件 判 斷 式 switch 的 語 法 如 下 : switch ( 條 件 算 式 ) { case 條 件 算 式 值 1: 動 作 1; break; case 條 件 算 式 值 2: 動 作 2; break; case default: 最 後 動 作 ; break; } 26 13
條 件 判 斷 (5): switch-case 1. switch: 意 思 是 " 選 擇 " 會 根 據 條 件 算 式 的 結 果, 判 斷 接 下 來 要 執 行 哪 一 個 "case" 內 的 動 作 2. 條 件 算 式 : 結 果 為 數 值 或 字 元 的 算 式, 也 可 以 是 變 數 名 稱 3. 條 件 算 式 值 : 條 件 算 式 可 能 的 結 果 值, 供 switch 根 據 條 件 算 式 的 結 果, 選 擇 符 合 的 值, 並 執 行 其 下 的 動 作 27 條 件 判 斷 (5): switch-case 4. case: 存 在 於 switch 內 的 敘 述, 可 同 時 存 在 兩 個 以 上, 但 是 每 次 只 有 一 個 會 被 執 行 每 個 case 都 帶 有 不 同 的 條 件 算 數 值 與 動 作, 並 且 獨 立 於 其 他 的 case switch 會 根 據 條 件 算 式 的 運 算 結 果, 挑 選 帶 有 相 同 條 件 算 式 值 的 case, 並 執 行 其 所 帶 程 式 碼 5. break: 結 束 case 內 動 作 的 敘 述 6. default: 和 case 一 樣 會 帶 有 一 段 程 式 碼, 但 是 不 會 帶 有 條 件 算 式 值 當 switch 的 根 據 條 件 算 式 值, 找 不 到 符 合 的 case 來 執 行 時, 便 會 執 行 default 內 的 程 式 碼 28 14
條 件 判 斷 (5): switch-case 29 流 程 圖 30 15
查 閱 區 域 號 碼 所 代 表 的 區 域 31 查 閱 區 域 號 碼 所 代 表 的 區 域 32 16
查 閱 區 域 號 碼 所 代 表 的 區 域 33 查 閱 區 域 號 碼 所 代 表 的 區 域 34 17
查 閱 區 域 號 碼 所 代 表 的 區 域 35 執 行 結 果 36 18
條 件 判 斷 (6): s1? s2 : s3 接 下 來 我 們 要 介 紹 的 是 條 件 算 符 條 件 算 符 也 是 由 真 假 來 決 定 程 式 執 行 的 流 程, 所 以 我 們 將 其 歸 類 為 條 件 判 斷 式 條 件 算 符 的 語 法 如 下 : s1? s2 : s3 s1: 條 件 運 算 式, 可 為 變 數 或 算 式 s2 s3: 這 2 個 運 算 元 可 以 為 變 數 算 式 或 數 值 若 s1 的 結 果 為 非 0 的 值 ( 真 ), 則 這 個 條 件 算 符 的 輸 出 值 就 等 於 s2; 若 s1 的 結 果 為 0 ( 假 ), 則 這 個 條 件 算 符 的 輸 出 值 就 等 於 s3 37 流 程 圖 38 19
電 影 票 票 價 計 算 39 電 影 票 票 價 計 算 40 20
執 行 結 果 41 流 程 圖 42 21
綜 合 演 練 判 斷 是 否 可 為 三 角 形 三 邊 長 switch 的 應 用 : 輸 入 選 項 控 制 if 與 switch 的 綜 合 應 用 : 星 座 對 照 表 巢 狀 if:3 個 數 字 的 排 序 條 件 算 符 的 應 用 : 購 車 配 備 43 判 斷 是 否 可 為 三 角 形 三 邊 長 三 角 形 的 兩 邊 長 加 起 來 一 定 大 於 第 三 邊, 應 用 這 個 定 理 寫 一 個 測 試 三 角 形 邊 長 的 程 式 : 44 22
判 斷 是 否 可 為 三 角 形 三 邊 長 45 執 行 結 果 46 23
流 程 圖 47 switch 的 應 用 : 輸 入 選 項 控 制 利 用 此 特 性, 把 需 要 做 相 同 動 作 的 case 選 項 寫 在 一 起 比 如 說, 想 在 一 個 switch 的 條 件 判 斷 式 中, 讓 使 用 者 輸 入 大 寫 或 小 寫 字 母 時, 都 可 以 讓 程 式 接 受, 我 們 就 可 以 藉 著 使 用 沒 有 break; 敘 述 時, case 會 接 續 執 行 的 特 性 來 完 成 48 24
選 項 控 制 49 選 項 控 制 50 25
選 項 控 制 51 流 程 圖 52 26
星 座 名 稱 水 瓶 座 雙 魚 座 白 羊 座 金 牛 座 雙 子 座 巨 蟹 座 獅 子 座 處 女 座 天 秤 座 天 蠍 座 射 手 座 摩 羯 座 一 般 認 知 01 月 20 日 -02 月 18 日 02 月 19 日 -03 月 20 日 03 月 21 日 -04 月 19 日 04 月 20 日 -05 月 20 日 05 月 21 日 -06 月 21 日 06 月 22 日 -07 月 22 日 07 月 23 日 -08 月 22 日 08 月 23 日 -09 月 23 日 09 月 24 日 -10 月 23 日 10 月 24 日 -11 月 21 日 11 月 22 日 -12 月 21 日 12 月 22 日 -01 月 19 日 53 if 與 switch 的 綜 合 應 用 : 星 座 對 照 表 54 27
55 56 28
57 58 29
59 60 30
流 程 圖 61 巢 狀 if:3 個 數 字 的 排 序 62 31
巢 狀 if:3 個 數 字 的 排 序 63 巢 狀 if:3 個 數 字 的 排 序 64 32
巢 狀 if:3 個 數 字 的 排 序 65 流 程 圖 66 33
流 程 圖 67 條 件 算 符 的 應 用 : 購 車 配 備 68 34
條 件 算 符 的 應 用 : 購 車 配 備 69 條 件 算 符 的 應 用 : 購 車 配 備 70 35
條 件 算 符 的 應 用 : 購 車 配 備 71 執 行 結 果 72 36
流 程 圖 73 流 程 圖 74 37
流 程 圖 75 除 錯 if (a>b) then printf( access ); if (a>b) ; printf( t1 ); else ; printf( t2 ); switch (a); { case 1 { b=1; break; } case 2 { b=2; } case 3 b=3; } 76 38
執 行 結 果 已 知 a=0, b=1, 下 列 執 行 結 果 為 何? if (a) printf( %d,a); else printf( %d,b); if (b) printf( %d,a); else printf( %d,b); x=a? a : b; printf( %x,x); if (a b) printf( %d,a); else printf( %d,b); if (a&&b) printf( %d,a); else printf( %d,b); if (!a) printf( %d,a); else printf( %d,b); i=j=k=-1; z=++i && --j ++k; printf("i=%d j=%d k=%d z=%d\n",i,j,k,z);??? i=j=k=1; z=++i --j && ++k; printf("i=%d j=%d k=%d z=%d\n",i,j,k,z);??? 77 作 業 試 寫 一 程 式 輸 入 3 個 整 數 a,b,c, 輸 出 最 大 及 最 小 者 (s1? s2 : s3) 試 寫 一 程 式 輸 入 一 西 元 年, 輸 出 為 該 年 一 月 一 日 星 期 幾? 試 寫 一 程 式 輸 入 3 個 整 數 a,b,c, 判 斷 是 否 可 為 三 角 形 三 邊 長, 若 可 以 請 顯 示 是 何 種 三 角 形? ( 當 a+b>c,b+c>a,c+a>b 都 成 立 時, 才 可 以 構 成 三 角 形, 斜 邊 為 三 邊 中 最 大 邊 ) 斜 邊 平 方 = 股 平 方 + 股 平 方 直 角 三 角 形 3 4 5 斜 邊 平 方 > 股 平 方 + 股 平 方 鈍 角 三 角 形 3 4 6 斜 邊 平 方 < 股 平 方 + 股 平 方 銳 角 三 角 形 4 6 7 三 角 形 三 邊 長 一 樣 為 正 三 角 形 4 4 4 三 角 形 兩 邊 長 一 樣 為 等 腰 三 角 形 3 4 4 78 39
作 業 試 寫 一 程 式 輸 入 1 學 生 成 績, 輸 出 為 學 生 成 績 等 第 (A(90-100) B(80-89) C(70-79) D(60-69) F(<60)) [switch case!! Or if else if] 試 寫 一 計 費 程 式 : 每 月 打 600 分 鐘 以 下, 每 分 鐘 0.5 元 ; 打 601-1199 分 鐘, 所 有 通 話 時 間 費 用 以 9 折 計 算 ; 打 1200 分 鐘 以 上, 所 有 通 話 時 間 費 用 以 79 折 計 算 (if-else if) 試 寫 一 程 式 計 算 員 工 的 週 薪, 輸 入 為 員 工 工 作 時 數, 輸 出 為 給 付 薪 資, 該 員 工 當 週 工 作 不 得 超 過 48 小 時 但 至 少 為 40 小 時, 已 知 : 1. 基 本 工 時 為 40 小 時, 時 薪 為 90 元 ( 會 用 到 if) 2. 第 41-45 小 時 的 部 份, 以 時 薪 1.33 倍 計 算 3. 第 46-48 小 時 的 部 份, 以 時 薪 1.66 倍 計 算 79 作 業 試 寫 一 程 式 判 斷 台 北 市 的 郵 遞 區 號 80 40
BMI 真 正 計 算 的 方 法 試 寫 一 計 算 BMI 程 式 : 已 知 男 生 標 準 體 重 =( 身 高 -80)*0.7, 女 生 標 準 體 重 =( 身 高 -70)*0.6, 輸 入 性 別 (0 or 1) 身 高 體 重, 將 體 重 與 計 算 出 之 標 準 體 重 做 比 較, 相 差 在 +- 標 準 體 重 10% 之 間 為 正 常 體 重 超 過 標 準 體 重 10% 以 上 則 為 過 重 低 於 標 準 體 重 10% 以 上 則 為 過 輕 (if-else if) BMI 如 何 計 算? BMI= 體 重 /[( 身 高 /100)^2] 體 重 過 輕 :BMI < 18.5 正 常 範 圍 :18.5 BMI<24 異 常 範 圍 : 過 重 :24 BMI<27 輕 度 肥 胖 : 27 BMI<30 81 BMI 真 正 計 算 的 方 法 它 的 算 法 是 : 體 重 ( 公 斤 ) 除 身 高 ( 米 ) 的 平 方, 即 (kg/m 2 ) 例 如 一 個 53 公 斤 的 人, 如 果 他 身 高 160 公 分, 則 身 裁 適 中, 如 身 高 180 公 分, 則 太 瘦 了, 如 身 高 140 公 分 則 太 胖 了, 這 就 是 BMI 之 源 由 BMI 的 標 準 及 判 讀 不 同 國 家 有 不 同 之 判 讀 標 準, 但 大 致 上 正 常 值 為 20-25, 如 果 BMI 介 於 26-29 之 間, 判 斷 為 體 重 過 重,BMI 超 過 30 則 為 肥 胖 症, 超 過 40 則 為 嚴 重 或 病 態 性 肥 胖 症 而 如 果 BMI 在 17~19 之 間 為 體 重 過 輕,BMI 少 於 16 則 為 嚴 重 營 養 不 良 82 41