程式設計實習
編輯 大意 Preface
一、本書依據民國九十七年教育部修正發布之職業學校機械群「機械基 礎實習」課程綱要編輯而成,供機械群第一學年第一學期每週授課 三節,共三學分使用。
二、本書附圖畫採用目前最新之機器、工具及量具…等,使學生學習不 致與現實脫節。
三、本書各章附有課後習題,可作為學生自我評量或教學評量之用。
四、本書各章相關重要技能實習,皆附有技能實習範例,提供學生體驗 技能。
五、本書教材內容豐富,若教學時數不足時,任課教師可依實際教學需 要斟酌減授。
六、本書雖力求嚴謹,但疏漏之處在所難免,尚祈諸先進惠予指正。
本書 特色 Features
一、全新的內容編排,提供學生視覺上的增強學習與閱讀的便利性。
二、各章節所安排章節大綱、學習目標及內容簡介,提供學生課前掌握 學習重點。
三、全書圖例採用標準元件、規格及機能性標準設計,讓學生準確學習, 提升學習效率。
四、每章附有課後習題提供學生課後即時評量,達到自我評量功能。
五、每一章後的學習摘要,提升學生掌握全章關鍵觀念,提升學習效果, 但不能取代閱讀本章。
六、關鍵名詞均以粗體字標示出,同時也彙整在附錄中,俾利查閱。
七、本書附有資料搜尋的方法,鼓勵學生利用資訊科技進一步學習,培 養學生自學興趣。
本書 導覽 Instructions 學習目標
學習目標是幫助學生了解各章節學習 之重點所在。
程式步聚
逼真的向量圖解,全書圖示均為 標註向量彩色插畫或照片,藉以
強化學生對力學問題的連結以及 更具體了解問題背後所隱藏的概 念。
程式習作
例題是用來加強說明課文內容的 相關主題,幫助學生對學習內容 更深一層的理解。
延伸閱讀
擴充課文所討論的主題,提供活 潑生動有趣的內容,有助於學生 了解重要概念。
目錄 Contents
CH1 工廠安全衛生及 程式應用介紹 1-1 實習工廠設施介紹 1-2 工業安全及衛生 1-3 消防安全 1-4 程式應用介紹
03 03 03 03
CH2 C/C++ 程式架構 2-1 應用實例說明 2-2 C/C++ 語言架構
03 03
2-3 C/C++ 專案架構介紹 03 03 2-4 開發環境介面
CH3 變數與常數 03 3-1 程式架構介紹 3-2 基本輸入/輸出 (I/O) 03 函式介紹 3-3 變數和常數宣告 3-4 變數和常數應用
03 03
CH4 資料型態 4-1 資料型態實習 4-2 資料型態轉換實習
03
4-3 資料型態應用實例
03
03
CH5 運算式及運算子 5-1 運算式實習 5-2 運算子實習 5-3 運算式與運算子 應用實例
03 03 03
CH6 流程指令及迴圈 6-1 流程指令實習 6-2 迴圈指令實習 6-3 流程指令與迴圈 應用實例
03
CH7 陣列及指標 7-1 陣列實習 7-2 指標實習
03 03
7-3 陣列與指標應用實例 03
CH8 公用函式及 函式應用
03
8-1 公用函式實習 8-2 函式實習
03
03
8-3 函式應用實例
03
03
CH9 結構及類別 9-1 結構實習 9-2 類別實習 9-3 物件導向程式設計 實例
03 03 03
chapter
6
流程指令及迴圈
時數約 9 小時
本章節次
學習目標
6-1 流程指令實習 6-2 迴圈指令實習 6-3 流程指令與迴圈應用實例
• 學習目標學習目標學習目標學習目標學 習目標學習目標 • 學習目標學習目標 • 學習目標學習目標學習目標
6-1
流程指令實習
6-1 .1 關係運算子 一般而言,程式碼若是由上而下(top-down)依序逐一執行時,這樣的程式邏輯 我們稱之為循序設計法。然而純粹循序設計法的程式並不多見,實務上常常需要結合 「流程判斷」才能夠完成比較複雜的功能需求。在 C++ 語法中,流程判斷所使用的 運算子稱之為關係運算子,常見的關係運算子共有六個(表 6 - 1 ): 表 6-1
程式設計實習
8
名稱
符號
等於
==
不等於
!=
大於
>
大於等於
>=
小於
<
小於等於
<=
基本上,由關係運算子所構成的運算式稱之為條件運算式,它主要是用來比較兩者 之間的關係,其輸出結果也只有 true(真)或是 false(偽)兩種。範例程式中,我們定 義了六個條件運算式,分別由這六個關係運算子所組成,並觀察其個別運算後之結果。
程式碼
"<<v1<<endl; "<<v2<<endl; "<<v3<<endl; "<<v4<<endl; "<<v5<<endl; "<<v6<<endl;
執行結果
圖 6-1
由上述程式執行結果可知: 1 由於條件運算式的輸出結果只有 true 與 false 兩種,因此變數資料型態必須宣告為 布林(bool)型態。
chapter 6 流程指令及迴圈
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; using std::boolalpha; main() { int num1,num2; bool v1,v2,v3,v4,v5,v6; cout<<" 請輸入第 1 個數字 :"; cin>>num1; cout<<" 請輸入第 2 個數字 :"; cin>>num2; v1=(num1==num2); v2=(num1!=num2); v3=(num1>num2); v4=(num1>=num2); v5=(num1<num2); v6=(num1<=num2); cout<< boolalpha; cout<<num1<<"=="<<num2<<",條件運算式結果為 cout<<num1<<"!="<<num2<<",條件運算式結果為 cout<<num1<<"> "<<num2<<",條件運算式結果為 cout<<num1<<">="<<num2<<",條件運算式結果為 cout<<num1<<"< "<<num2<<",條件運算式結果為 cout<<num1<<"<="<<num2<<",條件運算式結果為 system("Pause"); }
9
2 若無特別設定時,則條件運算式的結果會以 1 或 0 的方式呈現;若是為了讓輸出 結果顯示 true 或 false,則需要加上 boolalpha 指令。
6-1 .2 if 指令敘述 If 指令敘述主要是以條件運算式判斷的結果來控制程式的流程:當條件運算式的 結果為 true 時,編譯器會執行區塊內的程式碼;反之,則略過不執行。其格式如下: 語法
if ( 條件運算式 ) { // 當條件運算式為 true 時,執行的程式碼撰寫於此 } If 指令敘述之後必須以一對大括弧來包住所有的區塊程式碼,若程式碼僅有一行 時,則大括弧可忽略不使用。 程式設計實習
10
例如 只有當分數 (score) 小於
60 分時,條件運算式的結果為 true,編譯器才會執行
下一行敘述,輸出 " 成績不及格 ";反之,則略過不執行。 程式碼
If (score<60) cout<<" 成績不及格 "<<endl;
6-1 .3 if-else 指令敘述 在前一小節中,if 指令敘述只會執行當條 件運算式為 true 的情況。然而,如果我們希望 無論條件運算式成立與否,都能執行指定的敘 述;if-else 指令敘述可以滿足這樣的需求。也 就是說,當條件運算式成立時,編譯器會執行 區塊 A 程式碼;而當條件運算式不成立時,編 譯器則執行區塊 B 程式碼。
執行流程
語法
if ( 條件運算式 ) { 區塊 A 程式碼 // 當條件運算式為 true 時,執行的程式碼撰寫於此 } else { 區塊 B 程式碼 // 當條件運算式為 false 時,執行的程式碼撰寫於此 } 例如 當 分 數 (score) 小 於
60 分 時, 條 件 運 算
執行流程
式 的 結 果 為 true, 編 譯 器 會 執 行 區 塊 A 程 式 碼, 輸 出 " 成 績 不 及 格 "; 反 之, 若 條 件 運 算 式 的 結 果 為 false, 編 譯 器 則 執 行 區 塊 B 程 式 chapter 6 流程指令及迴圈
碼,輸出 " 成績及格 "。
11 程式碼
If (score<60) cout<<" 成績不及格 "<<endl; else cout<<" 成績及格 "<<endl; 此外,條件運算式除了可以是簡單的關係運算子之外,也可以同時結合算術運算 子與邏輯運算子來進行更複雜的條件判斷。 例如 欲判斷西元年是否為閏年?其規則如下:
1 西元年可以被 4 整除且不被 100 整除者,為閏年。 2 西元年可以被 400 整除者,為閏年。 以上只要滿足其中一項規則,此西元年即為閏年。不過,你會發現判斷的規則比 先前的例子複雜許多,除了要判斷是否可以整除之外,還要判斷交集與聯集的問題。 首先,我們使用取餘數的技巧來判斷是否可以整除?若是能夠整除時,則餘數必為 0 。 至 於 如 何 判 斷 規 則 中 的 且 (and) 或 (or) ? 則 必 須 使 用 邏 輯 運 算 子 實 現 之。 假 設 宣 告 year 整數變數代表西元年,則完整的條件運算式可表示為: (year% 4 == 0 && year% 100 != 0 || year % 400 == 0 )
程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int year; cout<<" 請輸入西元年份 :"; cin>>year; if (year%4==0 && year%100!=0 || year %400==0) cout<<" 西元 "<<year<<" 年為閏年 "<<endl; else cout<<" 西元 "<<year<<" 年為平年 "<<endl; system("Pause"); } 程式設計實習
執行結果
12
圖 6-2
再者,當條件運算式必須使用到多組的 if-else 指令敘述來判斷同一種情況時, 可以使用 elseif 指令敘述做連續性的判斷以簡化程式碼的結構。 例如 當成績紀錄的方式是採用等第分數給分,且已知等第分數的轉換規則定義如下: 表 6-2
分數 (score)
等第分數
90 x 100
A
80 x <90
B
70 x <80
C
60 x <70
D
x<60
F
此時,如果使用 if-else 指令敘述來撰寫時,必須使用五組的 if-else 指令敘述才 能完成。若是以 elseif 指令敘述來改寫程式,則程式碼將會更為精簡、結構化。
程式碼
chapter 6 流程指令及迴圈
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int score; cout<<" 請輸入學生成績 :"; cin>>score; if (score>=90) cout<<" 學生等第分數為 A"<<endl; else if (score>=80) cout<<" 學生等第分數為 B"<<endl; else if (score>=70) cout<<" 學生等第分數為 C"<<endl; else if (score>=60) cout<<" 學生等第分數為 D"<<endl; else cout<<" 學生等第分數為 F"<<endl; system("Pause"); }
13
執行結果
圖 6-3
6-1 .4 if 巢狀結構 當 if 指令敘述中包含另外一個 if 指令敘述時,我們稱之為巢狀結構。 語法
if ( 條件運算式 A) { if ( 條件運算式 B) { // 當條件運算式 A、B 皆為 true 時,執行此片段程式碼 } }
例如 已知三角形的三邊長,如何判斷三角形的種類?其判斷的規則如下:
1 先判斷三邊長是否可以構成三角形? 2 如果符合 1 的規定,再判斷為何種三角形? 從上述的說明可知規則 2 的執行條件必須建立在規則 1 成立時,這就是一個很 明顯的巢狀結構範例, 程式碼
程式設計實習
14
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int c,b,a; cout<<" 請輸入三角形的三邊長 ( 由長邊到短邊,以空格區隔 )"; cin>>c>>b>>a; cout<<" 三角形的種類為:"; if (a+b>c) { if (c*c==a*a+b*b) cout<<" 直角三角形 "<<endl; else if (c*c<a*a+b*b) cout<<" 銳角三角形 "<<endl; else cout<<" 鈍角三角形 "<<endl; } else{ cout<<" 輸入的三邊長無法構成三角形 "<<endl; } system("Pause"); } 執行結果
圖 6-4
6-1 .5 switch 指令敘述 switch 指令敘述與 if 指令敘述皆屬於流程控制的指令。不同的是,switch 指令 敘述主要是用於多個選項中擇一執行的流程控制。 語法
switch 指令透過條件敘述的選擇,決定執行以下哪一個區塊內的程式碼;關鍵字 break 的功能則是用於結束 switch 指令敘述,如果沒有加上 break,編譯器會依序執 行下去;而關鍵字 default 則是用於捕捉剩餘狀況。當條件敘述選擇的項目眾多且資 料形態皆相同時,採用 switch 指令敘述來進行程式設計是最有效的方法。 例如 設計一個簡易型的四則計算器時,四則運算中的運算子(加、減、乘、除)即
可直接當作 switch 指令條件敘述的選項。
chapter 6 流程指令及迴圈
switch ( 條件敘述 ) { case 1: //case1 執行的程式碼撰寫於此 break; case 2: //case2 執行的程式碼撰寫於此 break; case 3: //case3 執行的程式碼撰寫於此 break; case 4: //case4 執行的程式碼撰寫於此 break; default: // 除上述例子,剩餘狀況的程式碼撰寫於此 }
15
程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int num1,num2,op; bool loop;
程式設計實習
loop=1; while (loop) { cout<<" 請依序輸入 2 個數字 (0 0 確認離開 ):"; cin>>num1>>num2; if (num1==0 && num2==0) break; cout<<" 請選擇運算方式 (1) 加法 (2) 減法 (3) 乘法 (4) 除法:"; cin>>op; cout<<" 運算結果 :"; switch (op) { case 1: cout<<num1<<"+"<<num2<<"="<<num1+num2<<endl<<endl; break; case 2: cout<<num1<<"-"<<num2<<"="<<num1-num2<<endl<<endl; break; case 3: cout<<num1<<"*"<<num2<<"="<<num1*num2<<endl<<endl; break; case 4: cout<<num1<<"/"<<num2<<"="<<num1/num2<<endl<<endl; break; default: cout<<" 輸入錯誤,無法運算。" <<endl<<endl; } }
16
system("Pause"); }
執行結果
chapter 6 流程指令及迴圈
圖 6-5
17
6-1
迴圈指令實習
6-2 .1 for 迴圈指令敘述 當我們使用循序設計法來設計程式時,為了重複執行某些程式片段,相同或類 似的程式碼將會不斷重複出現,這樣的程式碼不僅冗長難以閱讀,而且也非常難以維 護。在 C++ 語法中,可以透過 for 迴圈指令敘述來設計重複執行的程式片段。 語法
for ( 初始運算式 ; 條件運算式 ; 控制運算式 ) { // 重複執行的程式碼請撰寫於此 } for () 之後需要以一對大括弧來包住所有的程式區塊,當程式碼只有一行敘述時, 程式設計實習
18
則大括弧可忽略不使用。小括弧內的三個運算式分別代表不同的意義,透過適當的定 義,可以明確知道迴圈所要執行的次數,詳細說明如下: 1 初始運算式:初始運算式在進入迴圈指令後只執行一次,用來初始化迴圈控制變 數。 2 條件運算式:決定迴圈是否繼續執行的運算式。當結果為 true 時,迴圈繼續執行; 反之,則離開迴圈。 3 控制運算式:用來改變迴圈控制變數的運算式。在運算式計算之後,條件運算式 會再次執行,以判斷迴圈是否繼續。控制運算式通常為遞增或遞減運算,我們可 以結合 5 - 2 . 1 章節中的遞增、遞減運算子,來進行迴圈的控制。 迴圈控制變數的設計彈性很大,如以下範例程式,雖然迴圈控制變數的數值變化 情形不同,但是都可以達到相同的迴圈控制次數。 程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; using std::setw; 當需要撰寫比較複雜的程式碼時,必須同時結合迴圈控制指令與流程控制指令, 以完成特殊功能之需求。 例如 求解
1 到 n( 自然數 ) 之間, 7 或 11 的倍數有哪些,我們先利用迴圈指令敘述來
設計重複執行的程式片段,然後於程式區塊內使用 if 指令敘述設定條件運算式,以
符合功能之要求。程式碼如下:
6-2 .4 巢狀迴圈 當迴圈內又包含著其它的迴圈時,通常稱之為巢狀迴圈。從架構上來看,最外圍 的迴圈稱作外迴圈;內部的迴圈稱作內迴圈。構成巢狀迴圈的迴圈指令敘述也不一定 要是同一種類型,它可以混合 for()、while() 或 do-while() 來使用。一般而言,巢狀 迴圈主要應用於多個變數的程式設計中,例如:九九乘法表。外迴圈可以用來控制「乘 數」的變化,而內迴圈則是用來控制「被乘數」的變化。 程式碼
chapter 6 流程指令及迴圈
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::setw; using std::endl; main() { int i,j; for (i=1;i<10;i++) { // 變數 i 是外迴圈的控制變數,控制乘數的變化 for (j=1;j<10;j++) // 變數 j 是內迴圈的控制變數,控制被乘數的變化 cout<<setw(3)<<j<<"*"<<setw(1)<<i<<"="<<setw(2)<<j*i; cout<<endl; } system("Pause"); } 執行結果
圖 6-11
由上述程式執行結果可知:外迴圈變化 1 次時,內迴圈會執行 9 次,因此在第一 列的數值可以看到乘數都固定是 1 ,被乘數則從 1 變化到 9 ,其餘狀況依此類推。巢
19
狀迴圈也常應用於主控台應用程式的圖形介面設計上,因為螢幕資料的呈現本來就是 二維平面,只要透過巢狀迴圈的控制,就可以把螢幕當成畫布,呈現出我們想要的圖 案。 例如 我們將上述九九乘法表的巢狀迴圈的內迴圈輸出修改成 cout<<"*"; ,可以得到
一個 9 * 9 的正方形圖案。 執行結果
程式設計實習
20
圖 6-12
續上題,若是將內迴圈的條件運算式修改為 i=1; ,則螢幕資料的呈現可以得到 一個由「*」所構成的直角三角形。程式碼如下: 程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int i,j; for (i=1;i<10;i++) { for (j=1;j<=i;j++) cout<<" * "; cout<<endl; } system("Pause"); }
執行結果
圖 6-13
chapter 6 流程指令及迴圈 21
6-1
流程指令與迴圈應用實例
6-3 .1 應用實例(一):主控台應用程式繪圖 【99 學年度工科 技藝競賽】 題目說明 請撰寫一輸入 / 輸出程式,由使用者決定三角形的底邊長度,再從螢幕輸出一個 以星號所構成的實心 / 空心等腰三角形。 實心等腰三角形,輸出範例:
程式設計實習
22
圖 6-14
解析 求解圖形的第一個步驟是先分析其組成的方式,再從中找尋出規則。假設輸入值
n=9 時,則會有 5 層 (n/2+1) 輸出,分析步驟如下: 第 0 層 4 個空白符號 +1 個星號 第 1 層 3 個空白符號 +3 個星號 第 2 層 2 個空白符號 +5 個星號 第 3 層 1 個空白符號 +7 個星號 第 4 層 0 個空白符號 +9 個星號 根據上述的分析可知,我們使用外迴圈 ( 變數 i) 來控制螢幕輸出的層數,再使用 內迴圈 ( 變數 j) 來控制每一層輸出的個數,而每一層的輸出狀況如下: 1 空白符號:輸出的數量是隨著層數的增加而遞減,使得輸出的個數為: j=n/2-i 。 2 輸出星號:星號的數量是以奇數方式遞增,使得輸出的個數為: j=2*i+1 。
程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int i,j,n;
chapter 6 流程指令及迴圈
cout<<" 請輸入三角形底邊數量:"; cin>>n; for (i=0;i<(n/2+1);i++) { for (j=0;j<(n/2-i);j++) cout<<" "; for (j=0;j<(2*i+1);j++) cout<<" * "; cout<<endl; } system("Pause"); } 空心等腰三角形,輸出範例:
23
圖 6-13
空心等腰三角形,分析步驟如下: 假設輸入值 n=9 時,則會有 5 層 (n/2+1) 輸出,每層的分析如下: 第 0 層 4 個空白符號 +1 個星號 第 1 層 3 個空白符號 +1 個星號 +1 個空白符號 +1 個星號 第 2 層 2 個空白符號 +1 個星號 +3 個空白符號 +1 個星號 第 3 層 1 個空白符號 +1 個星號 +5 個空白符號 +1 個星號 第 4 層 0 個空白符號 +9 個星號 根據上述的分析可知,我們使用外迴圈 ( 變數 i) 來控制螢幕輸出的層數,再使用
內迴圈 ( 變數 j) 來控制每一層輸出的個數,而每一層的輸出狀況如下: 1 空白符號:輸出的數量是隨著層數的增加而遞減,使得輸出的個數為: j=n/2-i 。 2 輸出星號:當 i=0 ,輸出 1 個星號;當 i=(n/2) ,輸出 n 個星號;至於其它狀況, 則輸出 1 個星號 + 空白符號 (2*i-1) 個 +1 個星號。 程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int i,j,n; 程式設計實習
cout<<" 請輸入三角形底邊數量:"; cin>>n; for (i=0;i<(n/2+1);i++) { for (j=0;j<(n/2-i);j++) cout<<" "; if (i==0) cout<<" * "; else if (i==n/2) for (i=0;i<n;i++) cout<<" * "; else { cout<<" * "; for(j=0;j<(2*i-1);j++) cout<<" "; cout<<" * "; } cout<<endl; } system("Pause");
24
}
6-3 .3 應用實例(三):數字迴文判斷 【電腦軟體設計丙級技 術士檢定考題】 題目說明 假設某一個數字從左邊讀起與從右邊讀起的結果相同時,我們稱這個數字為迴文。
12321 。請撰寫一輸入 / 輸出程式,由使用者輸入一個數字,並判斷該數字是否
例如
為迴文?輸出範例如下:
圖 6-21
解析 基本上,迴文的定義是某一個數字 d 從左邊讀起與從右邊讀起的結果皆相同。因 此,只要先將數字反向讀取並以 d_rev 來表示,再比較 d 與 d_rev ,即可知道數字
d 是否為迴文?而數字反轉的過程可以分解成以下兩個步驟: 步驟一: 由右而左讀取每個數字,每次取出最右邊的數字 ( 個位數 ) 。而方法就是將
d 除以 10 取餘數,即 temp=d%10 。當最右邊的數字取出後,必須重新設 定 d 的數值,再將最右邊的數字去除,即 d=d/10 。不斷重複此步驟,直到
d=0 為止。 步驟二: 在取出每個數值之後,可以透過數學運算式將這些數字重組,其數學運算式 為: d_rev=(d_rev*10)+temp ;也就是在每一次新的數字重組之前,先將 舊的數字乘以 10 使其左移一個位元,再加上新的 ( 個位數 ) 數字。 如本題範例:假設我們輸入的數字為 d=12321 ,其演算過程如下:
chapter 6 流程指令及迴圈
圖 6-20
25
表 6-?
d
執行步驟
temp=d%10
12321
0
1
12321
1
1232
0*10+1=1
2
1232
2
123
1*10+2=12
3
123
3
12
12*10+3=123
4
12
2
1
123*10+2=1232
5
1
1
0
1232*10+1=12321
程式設計實習
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { int d,d_rev,d_bak,temp; cout<<" 請輸入數字 :"; cin>>d; d_bak=d; d_rev=0; do { temp=d%10; d_rev=d_rev*10+temp; d=d/10; } while (d!=0); if (d_rev==d_bak) cout<<d_bak<<" 是迴文 "<<endl; else cout<<d_bak<<" 不是迴文 "<<endl; system("Pause"); }
d_rev
初始設定
程式碼
26
d=d/10
程式實作
6
工作項目 1 題目說明 決策系統的概念是少數服從多數,已知有一個 3 人決策系統,若 2 人以上同意時 決策結果應為同意;反之,決策的結果應為不同意。請撰寫一基本輸入 / 輸出程式, 以為 3 人決策系統之用。 解析
表 6-?
A 的意願
B 的意願
C 的意願
結果
0
0
0
不同意
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
2 請問該決策系統的邏輯運算式為何? y= 3 請參考上述之解析,完成以下部分程式碼:
chapter 6 流程指令及迴圈
1 請依少數服從多數的概念,完成下表:
27
。
6
程式實作 程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl; main() { bool a,b,c,y;
程式設計實習
cout<<"A 生意願 :"; cin>>a; cout<<"B 生意願 :"; cin>>b; cout<<"C 生意願 :"; cin>>c; // 決策的邏輯運算式 ; if (y) cout<<" 結果 : 同意 "<<endl; else cout<<" 結果 : 不同意 "<<endl; system("Pause");
28
} 執行結果
圖 6-22
工作項目 2 題目說明 已 知: 一 元 二 次 方 程 式 可 以 表 示 為 f(x) = ax 2 + bx + c, 其 判 別 式 的 定 義 為 D=b 2 – 4 ac。根據判別式的情況,一元二次方程式的解有以下三種情形: 1 若 D> 0 時,則一元二次方程式有 2 個解,分別是 x_ 1 = □ ((-b+ √ (b^ 2 - 4 ac))/ 2 a) 及 x_ 2 = □ ((-b- √ (b^ 2 - 4 ac))/ 2 a)
程式實作
6
2 若 D= 0 時,則一元二次方程式有 1 個解 ( 重根 ),則 x= □ ((-b)/ 2 a) 3 若 D< 0 時,則一元二次方程式為無解。 請撰寫一基本輸入 / 輸出程式,以求解一元二次方程式。 解析 依據上述之規則,一元二次方程式的流程控制的分析如下: 若 (if) 判別式 D>0 ,則可以求解出 2 個解; 否則若 (elseif) 判別式 D= 0 ,則可以求解出 1 個解;
請參考上述之解析,完成以下部分程式碼: 程式碼
#include<iostream> #include<iomanip> #include<cmath> using std::cin; using std::cout; using std::endl; main() { float a,b,c,d,x1,x2; cout<<" 請依序輸入一元二次方程式的係數 (a b c):"; cin>>a>>b>>c; d= ; if ( ) { x1= ; x2= ; cout<<" 方程式有解:x="<<x1<<" 或 x="<<x2<<endl; } ) elseif ( { x1= ; cout<<" 方程式有解:x="<<x1<<"( 重根 )"<<endl; } else cout<<" 無解 "<<endl; system("Pause"); }
chapter 6 流程指令及迴圈
否則 (else),一元二次方程式無解。
29
6
程式實作 執行結果
圖 6-23
圖 6-24
程式設計實習
30
圖 6-25
工作項目 3 題目說明 體質指數 BMI 是常用在評估人體肥胖程度的一種指標,其計算公式為體重除以 身高的平方: BMI= 體重 ( 公斤 ) ⁄ [ 身高 ( 公尺 )] 2 一般而言,正常體重的 BMI 值範圍應介於 18 . 5 ~ 24 之間,我們可以結合流程控 制的指令,判斷 BMI 值屬於哪一種類型的體位。依據世界衛生組織的定義,BMI 的 數值可以細分成體重過輕、健康體位、過重、輕度肥胖、中度肥胖及重度肥胖,其定 義如下: 表 6-?
成人肥胖定義
BMI 值
體位異常
體重過輕: BMI < 18.5
健康體位
健康體位: 18.5 BMI < 24
體位異常
過重: 24 BMI < 27 輕度肥胖: 27 BMI < 30 中度肥胖: 30 BMI < 35 重度肥胖: BMI 35
程式實作
6
成請參考上述表格之定義,完成以下部分程式碼: 程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl;
cout<<" 請輸入您的身高 ( 公分 ):"; cin>>v1; v3=(float) v1/100; // 將公分換成公尺 cout<<" 請輸入您的體重 ( 公斤 ):"; cin>>v2; v4=v2/pow(v3,2); bmi=v4+0.5; // 小數點後第一位四捨五入 cout<<" 您的 BMI 值為 "<<bmi; if (bmi<18.5) cout<<"( 體重過輕 )"<<endl; ) else if ( cout<<"( 健康體位 )"<<endl; ) else if ( cout<<"( 過重 )"<<endl; ) else if ( cout<<"( 輕度肥胖 )"<<endl; ) else if ( cout<<"( 中度肥胖 )"<<endl; else ; system("Pause");
} 執行結果
圖 6-26
chapter 6 流程指令及迴圈
main() { int v1,v2,bmi; float v3,v4;
31
6
程式實作 工作項目 4 題目說明 已知:季節與月份的關係如下表所示,請撰寫一基本輸入 / 輸出程式,由使用者 輸入月份,程式輸出季節的判斷結果。 表 6-?
春
3 月、 4 月、 5 月
夏
6 月、7 月、8 月
秋
冬
9 月、10 月、11 月 12 月、1 月、2 月
解析 程式設計實習
32
1 本題屬於流程控制的題型,可以使用 if-else 指令敘述,或是使用 switch 指令敘 述來完成。 2 switch 指令敘述有一種特殊的程式寫法,可以實現程式共享的概念。一般而言, 每一個 case 都會搭配一個 break 用來跳離 switch 多條件敘述的判斷,但若是將
break 移除時,程式則會依序執行,直到遇見 break 為止。我們可以利用這樣的 特性,來實現程式共享的概念,程式碼如下:
程式實作
6
程式碼
#include<iostream> #include<iomanip> using std::cin; using std::cout; using std::endl;
執行結果
圖 6-27
chapter 6 流程指令及迴圈
main() { int month; cout<<" 請輸入月份 :"; cin>>month; switch (month) { case 3: case 4: case 5: cout<<month<<" 月是春天 "<<endl; break; case 6: case 7: case 8: cout<<month<<" 月是夏天 "<<endl; break; case 9: case 10: case 11: cout<<month<<" 月是秋天 "<<endl; break; case 12: case 1: case 2: cout<<month<<" 月是冬天 "<<endl; break; } system("Pause"); }
33
6
學習評量
一、 選擇題: ( ) 1 . 下列哪一個運算子,可以得知不同資料型態的變數,所占的記憶體空間大小? (A) typeid (B) sizeof (C) new (D) auto。 ( ) 2 . 已知宣告如下:char X; 則 X 之值的範圍為何? (A) - 128 ~ + 127
(B) - 256 ~ + 255
(C) - 32768 ~ + 32767
(D) - 65536 ~ + 65535 。
( ) 3 . 在 C++ 語言中,當兩個不同資料型態的數值彼此做運算時,下列何者錯誤? (A) 編譯器會自動將運算元轉換成相同的資料型態再做運算 (B) 優先權較低的資料型態會被自動轉換成優先權較高的資料型態 程式設計實習
(C) 可以強迫的方式將某一種資料型態轉換成另外一種 (D) 出現警告訊息而無法運算。 ( ) 4 . 已知列舉資料型態宣告如下:enum Four_Season {Spring, Summer, Autumn, Winter }; 則 Summer 的值為何?
34
(A) 1 (B) 2 (C) 3 (D) 4 。 ( ) 5 . 已知宣告如下:int v 1 = 2 ; float v 2 = 2 . 5 f; double v 3 ; 若 v 1 =int (v 2 + 0 . 3 );,則 v 1 的值為? (A) 2 (B) 2 . 8 (C) 3 (D) 3 . 0 。 ( ) 6 . 續上題,若 v 3 =v 1 +v 2 ;,則 v 3 的值為? (A) 4 (B) 4 . 5 (C) 5 (D) 5 . 0 。
7
學習評量
二、 問答題: 1 . 有一家電影院票價資訊如下表: 優待票
全票
會員票
EarlyBird
Student
Adult
Member
2D 數位版票價
NT$ 250
NT$ 280
NT$ 310
NT$ 240
3D 版票價
NT$ 320
NT$ 350
NT$ 380
NT$ 310
不拘
學生及軍警
一般成人
持有會員卡者
適用對象 備 註
一、 二、 三、
凡購買優待票者,請出示有效證件。 持有會員卡者,得以會員價購買票券。 以上票價如有變動,以現場公告為主。
請撰寫一基本輸入 / 輸出程式,以為電影院票務系統之用。
chapter 6 流程指令及迴圈
早場票 票 別
35
NOTE
程式設計實習
6