# 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.夏季電費計算

```
夏季電費,請輸入用電度數: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個等級,折扣方式如下圖所示:

(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聽不懂逆";
}
}
```

### 05-27 猜數字遊戲(自行設計)
下列程式為一個猜數字遊戲(假設答案為7),遊戲會發出提示訊息要使用者輸入
所要猜的數字(1~10),若猜錯,遊戲會繼續進行,直到猜對為止。
若使用者未猜到答案時,要給予使用者提示(再大一點或再小一點),直到使用者猜對為止,該如何改寫程式呢?
(提示:在while迴圈中加入if條件判斷敘述。)
執行畫面:
程式碼:
```
```
### 05-28 2的n次方
執行畫面:

程式碼:
```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)在感情中你很缺乏安全感,有時候會忍不住通過試探或考驗的方式去確認對方是否愛你。
其他輸入: 亂輸入,活該一輩子舔狗命!!!
執行畫面:

```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為正數,則在第二象限。
執行畫面:

```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的應用)
執行畫面:

```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)(必考)
執行畫面:

程式碼:
```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)
執行畫面:

程式碼:
```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次,無法登入。
執行畫面:

程式碼:
```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字):