## ASCII碼
----
<style>
.reveal .slides {
text-align: left;
}
</style>
每個字元也都代表一個數字...。
----

----
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;
}
```
----

----
### 迴圈
----
到目前為止,我們都是重複地做**單一的動作**,那如果我們想多做幾次該怎麼做呢?多寫幾遍嗎?
----
其實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}]"}