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