---
# System prepended metadata

title: 20231016 課堂作業(CH5流程控制)

---

# 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字):