# 20231016 課堂作業(CH5流程控制) ## 1. if 條件判斷控制 ### 語法 - if條件式 ```cpp= if ( 條件運算式 ) { 如果條件成立時做什麼... } ``` ### 語法 - if-else條件式 ```cpp= if( 條件運算式 ) { 如果條件成立時做什麼... } else { 否則做什麼... } ``` ### 語法 - 巢狀if…else ```cpp= if (條件運算式1){ if (條件運算式2) 程式區塊1 else 程式區塊2 } else{ if (條件運算式3) 程式區塊3 else 程式區塊4 } ``` ### 語法 - if…else if ```cpp= if (條件運算式1){ {程式區塊1} // 條件運算式1成立時 else if (條件運算式2) {程式區塊2} // 條件運算式2成立時 else if (條件運算式n) {程式區塊n} // 條件運算式n成立時 else {程式區塊m} // 其他狀況 } ``` ### 語法 - 條件運算子 ``` (條件運算式) ? (敘述1) : (敘述2) ``` ## 2.switch多條件分支敘述 ```cpp= switch(條件運算式){ case 條件值 1: 程式區塊1 break; case 條件值 2: 程式區塊2 break; case 條件值 N: 程式區塊N break; default: } ``` ## 3.迴圈 ### 語法 - for ``` for(初始運算式; 條件運算式; 控制運算式){ 迴圈內的敘述; } ``` ### 語法 - while ``` while(條件運算式){ 迴圈內的敘述 } ``` ### 語法 - do while ``` do{ 敘述... // 先執行一次迴圈 }while(條件運算式); // 再檢查條件運算式是否成立 ``` ### 語法 - for ``` for(初始運算式; 條件運算式; 控制運算式){ 迴圈內的敘述; } ``` ## 綜合練習 ### 1.夏季電費計算 ![](https://hackmd.io/_uploads/rJgDaR0bT.png) ``` 夏季電費,請輸入用電度數:800 本月電費為:2836.8 元 ``` ``` 夏季電費,請輸入用電度數:600 本月電費為:1773.8 元 ``` ```cpp= int main() { int n; float money; cout << "夏季電費,請輸入用電度數:"; cin >> n; if (n<=120) money = n*1.63; else if (n>=121 && n<=330) money = 120*1.63 + (n-120)*2.38; else if (n>=331 && n<=500) money = 120*1.63+(330-120)*2.38+(n-330)*3.52; else if (n>=501 && n<=700) money = 120*1.63+(330-120)*2.38+(500-330)*3.52+(n-500)*4.8; else if(n>=701 && n<=1000) money = 120*1.63+(330-120)*2.38+(500-330)*3.52+(700-500)*4.8+(n-700)*5.83; else money = 120*1.63+(330-120)*2.38+(500-330)*3.52+(700-500)*4.8+(1000-700)*5.83+(n-1000)*7.69; cout<<"本月電費為:"<<money<<endl; } ``` ### 2.成績計算 將使用者輸入的成績以do…while迴圈進行加總,直到使用者輸入-1,才顯示總分。 ```cpp= #include <iostream> using namespace std; int main() { int sum = 0, n = 0; do{ sum = sum + n; cout << "請輸入成績:"; cin >> n; } while(n != -1); cout << "總分為:" << sum; } ``` ### 3.判斷奇數或偶數 請撰寫一個程式,使用if比較運算式,判斷使用者輸入的數值為奇數或偶數 ```cpp= #include<iostream> using namespace std; int main() { int i; cout << "請輸入一個整數:"; cin >> i; if ( i % 2 == 0 ) { cout << i << "為偶數"; }else{ cout << i << "為奇數"; } } ``` ### 4.可被3整除得總和+ 請撰寫一個程式,可計算出1到某正整數(由使用者輸入)間,所有可被3整除的數值之總和。並請加上可讓使用者決定是否再算一次的功能。 ```cpp= #include <iostream> using namespace std; int main(){ int num, total; cout << "請輸入一正整數以求得1到該數值可被3整除的數值之總和:"; cin >> num; while ( num!=0 ) { if ( num % 3 == 0 ) total = total + num; num--; if ( num == 0 ) { cout << total << endl; cout << "是否要再算一次(要請輸入數值,不要則輸入0):"; cin >> num; total = 0; } } } ``` ### 5.購物折扣 某購物網網站在使用者購物時,會依據使用者的身份(會員或非會員)給予不同等級的折扣,而會員又可分3個等級,折扣方式如下圖所示: ![](https://hackmd.io/_uploads/ryFS0R0W6.png) (1) 由使用者輸入商品訂價、是否為會員(輸入1為會員、2為非會員) (2) 再判斷會員等級(輸入1為鑽石會員、2為白金會員、3為普通會員),鑽石會員可打7折、白金會員可打8折、普通會員可打9折 (3) 非會員可選擇是否加入會員(輸入1為加入會員、2為不加入會員),加入會員後即為普通會員,可打9折,若不加入會員則以原價購買商品。 ```cpp= #include<iostream> using namespace std; int main(){ float price; //價格 int level; //會員等級 int member; //判別是否為會員 int join; //判別是否要加入會員 cout << "請輸入商品訂價:"; cin >> price; cout << "請問是否為會員(是=1,否=2):"; cin >> member; if (member == 1){ cout << "請輸入會員等級(鑽石為1、白金為2、普通為3):"; cin >> level;; if ( level == 1){ cout << "您為鑽石會員,您的商品價格為" << price * 0.7; }else if ( level == 2 ) { cout << "您為白金會員,您的商品價格為" << price * 0.8; }else { cout << "您為普通會員,您的商品價格為" << price * 0.9; } } else { cout << "請問是否要加入會員(是=1,否=2):"; cin >> join; if (join == 1) cout << "您現在為普通會員,您的商品價格為" << price * 0.9; else cout << "您不是本購物網會員,您的商品價格為:" << price; } } ``` ### 6.計算全班平均 請設計可輸入全班成績(人數不固定)的程式,此程式可完成以下工作: (1) 請同學輸入全班人數 (2) 再輸入每位同學的成績 (3) 計算全班平均成績、及格人數、與不及格人數(60分為及格),並將其輸出 ```cpp= #include<iostream> using namespace std; int main(){ int number; //全班人數 float total; //計算平均的累加成績 int a; //成績 int b = 0; //及格人數 cin >> number; for(int i = 1; i <= number; i++){ cin >> a; total = total + a; if ( a >= 60 ) b++; } cout << "全班平均:"<< total/number << endl; cout << "及格人數:"<< b << endl; cout << "不及格人數:"<< number-b; } ``` ### 7.取絕對值 ``` 請輸入一整數:-10 -10 的絕對值是 10 ``` ```cpp= #include <iostream> using namespace std; int main() { int x, y; cout << "請輸入一整數:"; cin >> x; y = (x < 0) ? (-x) : (x); cout << x << " 的絕對值是 " << y << endl; } ``` ### 8.雞兔同籠 學生家佑最近在數學課學到了雞兔同籠問題,請建立C程式使用while迴圈幫家佑解雞兔同籠問題,目前只知道在籠子中共有40隻雞或兔,總共有100隻腳,請問雞兔各有多少隻? ``` 雞:30兔:10 ``` ```cpp= #include<iostream> using namespace std; int main() { int rab, cock, feet; cock = 1; while (cock <= 40) { rab = 40 - cock; feet = cock * 2 + rab * 4; if (feet == 100) { cout<<"雞:"<<cock<<"\t兔:"<<rab; } cock = cock + 1; } } ``` ## 本章應用實例 (HW) ### 05-24電影分級制度 下列程式將依據年齡層來判斷可觀賞的影片等級(0~5歲:普遍級、6~11歲:普 遍級及保護級、12~17歲:限制級以外的影片、18歲(含)以上:各級影片)。 ```cpp= #include<iostream> using namespace std; int main() { int age_range; cout << "請輸入年齡(0~120)"; cin >> age_range; switch(age_range){ case 0 ... 5: cout << "可看普遍級" ; break; case 6 ... 11: cout << "可看普遍級 保護級" ; break; case 12 ... 17: cout << "可看限制級以外ㄉ影片"; break; case 18 ... 120: cout << "全部都能看!"; break; default: cout << "0~120聽不懂逆"; } } ``` ![](https://hackmd.io/_uploads/Byc_vs7G6.png) ### 05-27 猜數字遊戲(自行設計) 下列程式為一個猜數字遊戲(假設答案為7),遊戲會發出提示訊息要使用者輸入 所要猜的數字(1~10),若猜錯,遊戲會繼續進行,直到猜對為止。 若使用者未猜到答案時,要給予使用者提示(再大一點或再小一點),直到使用者猜對為止,該如何改寫程式呢? (提示:在while迴圈中加入if條件判斷敘述。) 執行畫面: 程式碼: ``` ``` ### 05-28 2的n次方 執行畫面: ![](https://hackmd.io/_uploads/rJTFdomzp.png) 程式碼: ```cpp= #include<iostream> using namespace std; int main() { int n,p =1, i=1; cout<<"輸入N求2^n值:" cin>>n; while(i<=n){ p=p*2; i++ } cout<<"2的"<<n<<"次方是:"<<p; } ``` ## 課後練習 ### 1.心理測驗 (if…else if 應用) 發生船難,你選擇留下什麼? 選擇(1)留下老人和孕婦 選擇(2)留下老人和嬰兒 選擇(3)留下老人和金銀珠寶 選擇(4)留下孕婦和嬰兒 選擇(5)留下孕婦和金銀珠寶 選擇(6)留下嬰兒和金銀珠寶 輸入各選擇後回應如下: (1)你的情感很細膩,善於觀察細節。在感情中,相比於戀人的甜言蜜語,你更在乎對方實際的行動。 (2)在感情中,你不僅洞察力超好,第六感也很強,越是親近的人這種直覺越敏銳,所以另一半對你很難有所隱藏,因為你可以憑借著蛛絲馬跡得到你想要知道的消息。 (3)你是個典型的顏控,在擇偶時很注重另一半的外表和身高。 (4)面對感情你很承盾,一方面你很感性,渴望浪漫熱烈的愛情;另一方面你又很理性,明白現實的殘酷和金錢的重要性 (5)在感情方面你很挑剔,所以很難遇到心動的對象。不過在戀愛時你卻很專一,一旦喜歡上某個人,你就會全心全意的對他好,所以和你談戀愛是一件很幸福的事。 (6)在感情中你很缺乏安全感,有時候會忍不住通過試探或考驗的方式去確認對方是否愛你。 其他輸入: 亂輸入,活該一輩子舔狗命!!! 執行畫面: ![](https://hackmd.io/_uploads/B1m65Q9-T.png) ```cpp= //資訊一乙 21 張家笛 #include <iostream> using namespace std; int main() { cout << "發生船難,你選擇留下什麼?\n"; cout << "選擇(1)留下老人和孕婦\n"; cout << "選擇(2)留下老人和嬰兒\n"; cout << "選擇(3)留下老人和金銀珠寶\n"; cout << "選擇(4)留下孕婦和嬰兒\n"; cout << "選擇(5)留下孕婦和金銀珠寶\n"; cout << "選擇(6)留下嬰兒和金銀珠寶\n"; int a; cin >> a; if (a==1) cout << "你的情感很細膩,善於觀察細節。在感情中,相比於戀人的甜言蜜語,你更在乎對方實際的行動。"; else if (a==2) cout << "在感情中,你不僅洞察力超好,第六感也很強,越是親近的人這種直覺越敏銳,所以另一半對你很難有所隱藏,因為你可以憑借著蛛絲馬跡得到你想要知道的消息。"; else if (a==3) cout << "你是個典型的顏控,在擇偶時很注重另一半的外表和身高。"; else if (a==4) cout << "面對感情你很承盾,一方面你很感性,渴望浪漫熱烈的愛情;另一方面你又很理性,明白現實的殘酷和金錢的重要性"; else if (a==5) cout << "在感情方面你很挑剔,所以很難遇到心動的對象。不過在戀愛時你卻很專一,一旦喜歡上某個人,你就會全心全意的對他好,所以和你談戀愛是一件很幸福的事。"; else if (a==6) cout << "在感情中你很缺乏安全感,有時候會忍不住通過試探或考驗的方式去確認對方是否愛你。"; else cout << "搞耍人??"; } ``` ### 2.判斷座標(x,y)在第幾象限。 (巢狀if…else 應用) 下列程式將讓使用者輸入x、y值,判斷(x, y)在第幾象限。若x與y皆為正數是在第一象限;皆為負數是在第三象限;若x為正數、y為負數,在第四象限;若x為負數、y為正數,則在第二象限。 執行畫面: ![](https://hackmd.io/_uploads/S1IAbEc-a.png) ```cpp= //資訊一乙 21 張家笛 #include <iostream> using namespace std; int main() { float x,y; cout << "請輸入x值(不可輸入0):"; cin >> x; cout << "請輸入y值(不可輸入0):"; cin >> y; if (x>0) if(y>0) cout << "(" << x << "," << y << ") 在第一象限"; else cout << "(" << x << "," << y << ") 在第四象限"; else if(y<0) cout << "(" << x << "," << y << ") 在第三象限"; else cout << "(" << x << "," << y << ") 在第二象限"; } ``` ### 3.用*組成三角形(for迴圈的應用) 輸入層數n即輸出層的*三角形。 執行畫面: ``` 請輸入層數:4 * ** *** **** **** *** ** * * ** *** **** **** *** ** * ``` 程式碼: ```cpp= #include<iostream> using namespace std; int main() { int s,t; cout << "請輸入層數:"; cin >> s; //正直角三角形 for(int i=1; i<=s; i++) { for(int k=1; k<=i; k++) { cout<<"*"; } cout<<endl; } cout<<endl; //倒直角三角形 for(int i=1; i<=s; i++) { for(int k=1; k<=s-i+1; k++) { cout<<"*"; } cout<<endl; } cout<<endl; //空白正直角三角形 for(int i=1; i<=s; i++) { for(int j=1; j<=s-i; j++) { cout<<" "; } for(int k=1; k<=i; k++) { cout<<"*"; } cout<<endl; } cout<<endl; //空白倒直角三角形 for(int i=1; i<=s; i++) { for(int j=1; j<=i-1; j++) { cout<<" "; } for(int k=1; k<=s-i+1; k++) { cout<<"*"; } cout<<endl; } } ``` ### 4.十二生肖查詢(switch…case的應用) 執行畫面: ![](https://hackmd.io/_uploads/S1WsI49b6.png) ```cpp= //資訊一乙 21 張家笛 #include <iostream> using namespace std; int main() { int yy; cout << "請輸入民國(年):"; cin >> yy; switch (yy%12) { case 1: cout << "鼠"; break; case 2: cout << "牛"; break; case 3: cout << "虎"; break; case 4: cout << "兔"; break; case 5: cout << "龍"; break; case 6: cout << "蛇"; break; case 7: cout << "馬"; break; case 8: cout << "羊"; break; case 9: cout << "猴"; break; case 10: cout << "雞"; break; case 11: cout << "狗"; break; case 0: cout << "豬"; break; } } ``` ### 5.閏年 除以 4 能整除,且除以 100 不能整除 如果剛好是 100 的倍數,且除以 400 能整除 舉例來說 2000 年是 100 的倍數且除以 400 能整除,所以是 2000 年是閏年,例如 2100 年雖然是 4 的倍數,但除以 100 能整除,所以 2100 年是平年。 執行畫面: ``` 請輸入一個西元年:2000 2000年是閏年 ``` ``` 請輸入一個西元年:1990 1990年非閏年 ``` 程式碼: ```cpp= #include <bits/stdc++.h> #include <bits/stdc++.h> using namespace std; int main(){ int y; cout<<"請輸入一個西元年:"; while(cin >> y){ if(y % 4 == 0 && y % 100 != 0) cout <<y<< "年是閏年\n"; else if(y % 400 == 0) cout <<y<< "年是閏年\n"; else cout <<y<< "年非閏年\n"; } } ``` ### 6.重複計算BMI(while 迴圈)(P.129)(必考) 執行畫面: ![](https://hackmd.io/_uploads/HkOzLjsMa.png) 程式碼: ```cpp= #include <iostream> using namespace std; int main() { char go_again = 'Y'; float height, weight; while (go_again == 'Y' || go_again == 'y') cout<<"請輸入身高(cm):"; cin >>height; cout<<"請輸入體重(kg)"; cin >>weight; cout<<"你的BMI為:"<<weight/(height*height)*10000 <<endl; cout<<"do u want again?"<<"\n[y/n]"; cin>>go_again; return 0; } ``` ### 7. 計算兩整數的最大公因數(while 迴圈)(P.131)(20231023) 執行畫面: ![](https://hackmd.io/_uploads/BkzvBjozT.png) 程式碼: ```cpp= #include <iostream> using namespace std; int main() { int num1,num2,temp; cout<<"計算兩整數最大公因數\n"; cout<<"請輸入第一個數字:"; cin >>num1; cout<<"請輸入第二個數字:"; cin >>num2; while (num2!=0) { temp = num1%num2; num1 = num2; num2 = temp; } cout<<"最大公因數是:" << num1; } ``` ### 8. 密碼檢驗程式(P.133)(自行設計)(20231023) 請設計一個密碼輸入次數不可大於三次的密碼檢驗程式,密碼=123,當密碼輸入正確請顯示:歡迎進入本系統。密碼輸入錯誤3次,無法登入。 執行畫面: ![](https://hackmd.io/_uploads/rkp7Sojza.png) 程式碼: ```cpp= #include <iostream> using namespace std; int main() { int pwd, jst = 0; do { cout << "請輸入密碼: "; cin >> pwd; if (pwd != 123) { ++jst; cout << "已錯誤" << jst << "次" << endl; } if (jst >= 3) { cout << "密碼輸入錯誤3次,無法登入"; break; } } while (pwd != 123); if (pwd == 123) { cout << "歡迎進入本系統"; } return 0; } ``` ## 心得感想(至少100字):