---
# System prepended metadata

title: Ch04 while 迴圈
tags: [程式教學]

---

# Ch04 while 迴圈
> 上一章: [Ch03 if 條件判斷](https://hackmd.io/@sunfrancis12/SJ_9xCjzT) 
> 下一章: [Ch05 for 迴圈](https://hackmd.io/@sunfrancis12/HyL-bCszT)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)

## 什麼是迴圈(Loop)
我們剛剛前面實作了許多程式，像是閏年判斷，假如今天我們需要判斷的不是一筆資料，而是一千筆、一萬筆呢?

我們總不可能把程式複製一千遍、一萬遍吧，這樣就太笨了，而且要是並非每次的資料都是一千筆，有可能是兩、三千筆，那麼直接將程式寫死也太不切實際了。

為此，我們需要一個可以**重複執行而且具有條件判斷**的結構，迴圈的概念也就此誕生。

## While迴圈
While迴圈的用法跟邏輯跟if差不多，只是差別在於執行一次跟多次的差別

While用法:
* 當滿足條件時，在while{}裡的程式將會再執行一次，直到條件不滿足或者程式中斷或終止
```c=
while(條件)
```
假如我們要寫一個可以印出1-10的程式，while的條件可能為如下
```c=
while(num<=10){
    prinf("%d",num);
    num++;
}
```
範例程式:
```c=
#include<stdio.h>

int main(){
    int num=1;

    while(num<=10){
        printf("%d ",num);
        num++;
    }
}
```
輸出結果:
```c=
1 2 3 4 5 6 7 8 9 10
```

<a style="color:orange">【例題】</a>
> 輸入一個大於0的整數n，並印出1-n的所有數字，而且以10個數字為一排
> 範例測資:
> 
> 輸入:
>13
> 輸出:
> 1 2 3 4 5 6 7 8 9 10
> 11 12 13

範例程式:
```c=
#include<stdio.h>

int main(){
    int num;
    scanf("%d",&num);

    int count=1;
    while(count<=num){
        printf("%d ",count);
        if(count%10==0) printf("\n");
        count++;
    }
}
```
輸入內容:
```c=
51
```
輸出結果:
```c=
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51
```

<a style="color:orange">【例題】</a>
> 輸入一個數字，並判斷其是否為質數
> 範例測資:
> 輸入:
> 17
> 輸出:
> 17是質數

範例解答:
```c=
#include<stdio.h>

int main(){
    int num;

    printf("請輸入一個數字: ");
    scanf("%d",&num);

    int count=2,sum=0; //sum為因數(扣掉1和自己)的數量
    while(count<num){
        if(num%count==0) sum++; //當1~num之間有數字可以整除num，則sum++
        count++;
    }

    if(sum>0 || num==1) printf("%d 不是質數",num);
    else printf("%d 是質數",num);
}
```
輸入內容(依次輸入):
```c=
17
63
1
```
輸出結果(依次輸出):
```c=
請輸入一個數字: 17
17 不是質數
請輸入一個數字: 63
63 不是質數
請輸入一個數字: 1
1 不是質數
```

## 特殊條件迴圈

我們可以寫一個迴圈，把輸入的數字印出來

```c=
#include<stdio.h>

int main(){
    int num;

    printf("請輸入一個數字: ");
    while(scanf("%d",&num)){
        printf("輸入的數字為: %d\n",num);
        printf("請輸入一個數字: ");
    }
}
```
:::info
更多關於迴圈的技巧以及條件會在之後的章節提到
:::
輸入內容:
```c=
12
13
47
38430
```
輸出結果:
```c=
請輸入一個數字: 12
輸入的數字為: 12
請輸入一個數字: 13
輸入的數字為: 13
請輸入一個數字: 47
輸入的數字為: 47
請輸入一個數字: 34840
輸入的數字為: 34840
```

我們也可以結合上一張學到的`Condition`來寫個無窮迴圈
```c=
#include<stdio.h>

int main(){
    int num=1;

    while(1){
        printf("%d ",num);
        num++;
    }
}

```
## 跳脫、跳過迴圈
我們再利用迴圈跑程式時候，常常會遇到某些可以跳過執行，或者跳出迴圈的情況。
我們需要兩個指令: 
* `continue`(跳過執行)
* `break`(跳脫迴圈)

通常我們會搭配if()做使用:
```c=
if(....)
    continue; //跳過下方將要的執行的程式，回到while判斷條件

if(....)
    break; //跳出整個現在的迴圈
```
使用`continue`跳過可以被三整除的數字:
```c=
#include<stdio.h>

int main(){
    int num;

    printf("請輸入一個數字: ");
    scanf("%d",&num);

    while(num>0){
        if(num%3==0){
            num--;
            continue;
        }

        printf("現在num的值是%d\n",num);
        num--;
    }

}
```
輸入內容:
```c=
10
```
輸出結果:
```c=
請輸入一個數字: 10 
現在num的值是10
現在num的值是8
現在num的值是7
現在num的值是5
現在num的值是4
現在num的值是2
現在num的值是1
```
當輸入為0，用`break`跳出迴圈:
```c=
#include<stdio.h>

int main(){
    int num,sum=0;

    printf("請輸入一個數字: ");
    while(scanf("%d",&num)){
        if(num==0) break;

        printf("輸入的數字為: %d\n",num);
        printf("請輸入一個數字: ");
        sum++;
    }

    printf("總共輸入了%d個數字",sum);
}
```
輸入內容:
```c=
6
3
6
8
2
4
9
0
```
輸出結果:
```c=
請輸入一個數字: 6
輸入的數字為: 6
請輸入一個數字: 3
輸入的數字為: 3
請輸入一個數字: 6
輸入的數字為: 6
請輸入一個數字: 8
輸入的數字為: 8
請輸入一個數字: 2
輸入的數字為: 2
請輸入一個數字: 4
輸入的數字為: 4
請輸入一個數字: 9
輸入的數字為: 9
請輸入一個數字: 0
總共輸入了7個數字
```

<a style="color:orange">【例題】</a>
> 輸入一個數字，並判斷其是否為質數
>
> 範例測資:
> 輸入:
> 17
> 24
> 46
> 59
> 
> 輸出:
> 17是質數
> 24 不是質數
> 46 不是質數
> 59 是質數

範例解答:
```c=
#include<stdio.h>

int main(){
    int num;

    printf("請輸入一個數字: ");
    scanf("%d",&num);

    int count=2,sum=0; //sum為因數(扣掉1和自己)的數量
    while(count<num){
        if(num%count==0){
            sum++;
            break;
        }
        count++;
    }

    if(sum>0 || num==1) printf("%d 不是質數",num);
    else printf("%d 是質數",num);
}
```


---

> 上一章: [Ch03 if 條件判斷](https://hackmd.io/@sunfrancis12/SJ_9xCjzT) 
> 下一章: [Ch05 for 迴圈](https://hackmd.io/@sunfrancis12/HyL-bCszT)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)