## ASCII碼 ---- <style> .reveal .slides { text-align: left; } </style> 每個字元也都代表一個數字...。 ---- ![](https://i.imgur.com/4Y7CNrS.png) ---- Example ```cpp= #include<iostream> using namespace std; int main() { char ch1 = 'A', ch2 = 'B'; printf("%d %d\n", ch1, ch2); printf("%d", ch2 - ch1); return 0; } ``` ---- ![](https://i.imgur.com/H1iQT8V.png) ---- ### 迴圈 ---- 到目前為止,我們都是重複地做**單一的動作**,那如果我們想多做幾次該怎麼做呢?多寫幾遍嗎? ---- 其實C語言裡面有很方便的**迴圈結構**可以用,它能重複性的執行程式內容,來簡化整個程式。 ---- 通常使用for迴圈,都是基於我們知道使用次數,例如,當我們想輸出五次 *hello world*。 ---- 用已知所學寫法: ```c= printf("hello world\n"); printf("hello world\n"); printf("hello world\n"); printf("hello world\n"); printf("hello world\n"); ``` ---- 貌似還能完成題目所要求的,那如果是請你輸出100次 *hello world* 呢? ---- ### for 迴圈 ---- for迴圈的架構 : ```c= for(初始化動作;執行條件;遞增/減動作){ 程式內容; } ``` 首先我們進行**初始化動作**。 再來每次跑迴圈之前,都會確認一次執行條件,**若符合,則持續進行迴圈動作,若不符合,則跳出迴圈。** ---- ```C= for(int i=0;i<100;i++){ printf("hello world\n"); } /*輸出 hello world*100 */ ``` 第一段,我們宣告i變數為**計數器**,並給它0的值,這裡要注意,它是在迴圈內被宣告的,所以出了迴圈外後i便不能被使用。 ---- ```C= for(int i=0;i<100;i++){ printf("hello world\n"); } /*輸出 hello world*100 */ ``` 第二段,**在i<100這個條件成立時,迴圈會持續執行,那當條件不成立(ex:i=100)時,便會跳出迴圈。** ---- ```C= for(int i=0;i<100;i++){ printf("hello world\n"); } /*輸出 hello world*100 */ ``` 第三段,每當迴圈執行一次,i便會加1,**i++** 就像我們前面所介紹的一樣。 ---- 那問題來了,每次i的值都會變嗎?以例子來看好了: ---- ```c= for(int i=0;i<3;i++){ printf("%d ", i); } /*輸出 0 1 2 */ ``` 會發現其實 i 的值是有跟著變動的,而且正如我們所寫的 **i++** 一樣,那一定每次只能加1嗎?No!其實可以自己設定的,能加也能減,不過一定都會呈現**遞增或遞減**。 ---- ```c= for(int i=0;i<5;i+=2){ printf("%d ", i); } printf("\n"); //換行 for(int j=4;j>=0;j--){ printf("%d ", j); } /*輸出 0 2 4 4 3 2 1 0 */ ``` ---- Example : 輸入一個正整數n,並輸出1~n的總和。 ```cpp= #include<iostream> int main() { int n, sum = 0; //n是輸入的值,sum是總和(須先歸零) scanf("%d", &n); //輸入n for(int i=1;i<=n;i++){ sum = sum + i; } printf("%d\n", sum); } /* 輸入: 5 輸出: 15 */ ``` ---- ### while 迴圈 ---- 相較於 for迴圈 比較重視 「次數」。 while迴圈 比較重視 「條件」。 ---- while迴圈的基本架構: ```c= while(條件){ 程式內容; } ``` **先測試條件,再執行敘述** 意思是只要條件成立,就會一直執行敘述。 所以 while 迴圈的使用時機為:達成某個條件時就一直做某件事情的時候。 ---- Example : 輸出1~10。 ```c= int i=1; //宣告i是整數1 while(i<=10){ printf("%d ", i); i++; } /*輸出 1 2 3 4 5 6 7 8 9 10 */ ``` ---- 那如果你想要設立當某個條件成立時就停止時,可以利用**break**指令,而相對的,如果你要讓他繼續運行的話,就利用**continue**指令。 ---- Example : 從1數到10,如果遇到8就跳出迴圈。 ```c= #include<stdio.h> int main() { int i=1; while(i<=10) { printf("%d ", i); if(i == 8) break; i++; } return 0; } /*輸出 1 2 3 4 5 6 7 8 */ ``` ---- ### do-while 迴圈 ---- **會先執行一次迴圈的敘述部分,再測試條件並決定是否繼 續執行迴圈,所以迴圈的敘述部分至少會執行一次。** while架構: ```c= do{ 程式內容; }while(條件) ``` ---- Example : 計算一個正整數的位數。 ```cpp= #include<iostream> int main() { int digits = 0, n; printf("輸入一個正整數:"); scanf("%d", &n); do { n /= 10; digits++; } while (n>0); printf("這個整數是 %d 位數\n", digits); return 0; } /* 輸入: 230 輸出: 這個整數是 3 位數 */ ``` ---- 如果我們單純使用 while(n>0) 的迴圈的話,那輸入 0 會顯示 0 位數,但答案應該是 1 位數,這時候使用 do-while 迴圈就可以解決這個問題了。 ---- ### 雙重迴圈 ---- 先跑裡面...,再跑外面...。 ---- if能夠有if包if,那for迴圈也能包for迴圈變雙重迴圈,那這裡的重點就是**最裡面的迴圈最先執行。** ---- 用一個範例來說明: ```c= for(int i=1;i<=2;i++){ for(int j=1;j<=2;j++){ printf("%d %d", i, j); printf("\n"); } } /*輸出: 1 1 i=1,j=1 1 2 i=1,j=2 2 1 i=2,j=1 2 2 i=2,j=2 */ ``` 至於**三層迴圈**、**四層迴圈**...也跟雙重迴圈是一樣的道理。
{"metaMigratedAt":"2023-06-17T04:32:03.794Z","metaMigratedFrom":"YAML","title":"程式設計培訓 - (4)","breaks":true,"slideOptions":"{\"theme\":\"solarized\",\"transition\":\"fade\"}","contributors":"[{\"id\":\"1dfd0d36-665c-414c-a3ba-995f194a8cb9\",\"add\":3771,\"del\":1}]"}
    156 views
   Owned this note