Try   HackMD

for 迴圈、流程控制

03.11 鄭余玄
2017 資訊之芽 語法班

while 迴圈複習和技巧


while 複習

  • while (表示式) { ... } 當表示式成立就一直執行
// 執行 10 次
int n = 1;
while (n <= 10) { // 若輸出次數 < 10 則繼續輸出
    std::cout << "我愛資芽" << std::endl;
    n++; // 輸出次數加一, n = n + 1;
}
// 執行 10 次
int n = 10;
while (n > 0) { // 若剩餘次數 > 0 則繼續輸出
    std::cout << "我愛資芽" << std::endl;
    n--; // 剩餘次數減一
}

觀察

int n = 10;
while (n > 0) { // 若剩餘次數 > 0 則繼續輸出
    std::cout << "我愛資芽" << std::endl;
    n--;
}
while (n != 0) { // 若剩餘次數 != 0 則繼續輸出
while (n) { // 若剩餘次數 != 0 則繼續輸出

++ 複習

  • ++a 會將 a 的值加一,並回傳新值
  • a++ 會回傳原有的值,再將 a 值加一
++前置遞增 後置遞增++
原始運算式
a = 5;
++a;
b = a * 7 + 1;
a = 5;
b = a * 7 + 1;
a++;
遞增運算式
a = 5;
b = ++a * 7 + 1;  
a = 5;
b = a++ * 7 + 1;  
結果
a == 6
b == 43
a == 6
b == 36

+1

  • ++ 會改變它所作用的變數的值,+1 不會
遞增運算子 算術運算子
運算
a = 5;
b = ++a;
a = 5;
b = a + 1;
結果
a == 6
b == 6
a == 5
b == 6

結合 while 判斷式

// 執行 ? 次
int n = 1;
while (n++ <= 10) { // 先判斷完,再 n = n + 1
    std::cout << "我愛資芽" << std::endl;
}
// 執行 ? 次
int n = 10;
while (n-- > 0) { // 先判斷完,再 n = n - 1
    std::cout << "我愛資芽" << std::endl;
}
int n = 10;
while (n--) { // 先判斷完 n != 0,再 n = n - 1
    std::cout << "我愛資芽" << std::endl;
}

執行次數

while(n) {  
    S
    n--;
}
while(n--) {  
    S
}
while(--n) {  
    S
}
S 執行次數 n 次 n 次 n - 1 次
迴圈結束後 n 的值 0 -1 0

for 迴圈


流程控制

  • 條件判斷
    • if (表示式) { ... }
    • if (表示式) { ... } else { ... }
  • 重複執行
    • while (表示式) { ... }
    • do { ... } while (表示式);
    • for (初始式; 表示式; 迭帶式) { ... }
  • 迴圈控制
    • breakcontinue

for 迴圈

for (初始式; 表示式; 迭帶式) { ... }
for (int i = 1; i <= 10; ++i) {
    std::cout << "我愛資芽" << std::endl;
}

相當於:

初始式;
while (表示式) {    
    ...
    迭帶式;
}
int i = 1;
while (i <= 10) {
    std::cout << "我愛資芽" << std::endl;     
    ++i;
}

for 迴圈流程圖


警示型迴圈與計數型迴圈

  • 如何決定使用 forwhile 迴圈,按特性:

  • 警示型迴圈 (while):該迴圈的結束條件是在某不明確事件,例如輸入到 -1 (警示值)、讀入到檔案結束 (eof)

  • 計數型迴圈 (for):該迴圈在執行明確次數後會結束的話


練習時間

用 for 來完成 209 - σ.σ 吧!


99 乘法表

for (int i = 1; i <= 9; ++i) {
    for (int j = 1; j <= 9; ++j) {
        cout << i << " * " << j << " = " << i*j << '\t';
    }
    cout << endl;
}

一維陣列遍歷

double l[100], w[100], h[100], volume = 0;
for (int i = 0; i < n; ++i) {
    volume = volume + l[i] * w[i] * h[i];
}
  • 陣列索引是從 0 開始
  • 注意陣列大小
  • 變數初始化

多重表達式

可以使用「,」運算子,加上多重初始式、迭代式

for (int i = 0, j = 100; i < 10 && j < 5; ++i, ++j) {
    std::cout << i << " " << j << std::endl;
}

無窮迴圈

while (true) {
    std::cout << "我愛資芽" << std::endl;
}
for ( ; ; ) {
    std::cout << "我愛資芽" << std::endl;
}

break 和 continue

  • break 強制跳離迴圈
  • continue 跳至下一次迴圈開始
// 判斷 n 是否為質數
int n = 87;
bool is_prime = true;
for (int i = 2; i < n; ++i) {
    if (n % i == 0) {
        is_prime = false;
        break; // 如果是合數,就不用再檢驗
    }
}
// 輸出 1 ~ 10 的奇數
for (int i = 1; i <= 10; ++i) {
    if (i % 2 == 0) continue; // 跳過偶數
    std::cout << i << std::endl;
}