# 程式設計培訓 - 複習 ### 輸入輸出 基本架構 : ```cpp= scanf("格式", &變數) printf("格式", 變數) ``` 幾個地方要特別注意 : * ```scanf```後 ```&```的地方只能放變數,不能再加其他東西 * ```printf```後放變數的地方不能加 ```&``` * 逗號要注意 * 其實格式如果沒有太奇怪也可以用 ```cin```, ```cout``` ### if-else 基本架構 : ```cpp= if(條件A){ 要執行的內容A; } else if(條件B){ 要執行的內容B; } else{ 要執行的內容C; } ``` 若條件A符合,則執行「要執行的內容A」,若A條件不符合但B條件符合,則執行「要執行的內容B」,若條件A與條件B皆不符合,則執行「要執行的內容C」。 --- 結構不同的if : ```cpp= if(條件A){ 要執行的內容A; } else if(條件B){ 要執行的內容B; } ``` 若條件A與條件B同時符合,則只執行「要執行的內容A」,「不」執行「要執行的內容B」。 v.s ```cpp= if(條件A){ 要執行的內容A; } if(條件B){ 要執行的內容B; } ``` 若條件A與條件B同時符合,則「要執行的內容A」與「要執行的內容B」都會執行。 --- 例題1 : 判斷某個數是不是偶數。 ```cpp= #include<iostream> using namespace std; int main() { int n; scanf("%d", &n); //cin >> n; if(n % 2 == 0){ printf("YES"); } else{ printf("NO"); } return 0; } ``` --- 例題2 : 若某個字母是A,則輸出A,若它是B,則輸出B,若是其他字母,則輸出C。 ```cpp= #include<iostream> using namespace std; int main() { char ch; //宣告一個字元 scanf("%c", &ch); //cin >> ch; if(ch == 'A') //要注意字元必須加上單引號 '',否則會分不出你是在指字母還是變數 { printf("A"); } else if(ch == 'B') { printf("B"); } else { printf("C"); } return 0; } ``` --- 要注意的幾個地方 : * 在 if-else 裡面,「等於」一定要用「==」,「且」一定要用「&&」,「或」一定要用「||」 。 * if(0<n<100)是不合法的,要分成兩個條件 if(n>0 && n<100)。 --- ### 迴圈 基本架構 : ```cpp= for(資料型態 變數名稱;要執行迴圈必須符合的條件;遞增/減){ 要重複執行的內容; } for(int i=0;i<3;i++){ printf("%d", i); } //輸出 : 0 1 2 while(條件){ 要重複執行的內容; } i = 2; while(i >= 0){ printf("%d", i); } ``` --- 迴圈內與迴圈外宣告的地方不一樣,意義也不一樣 : ```cpp= int i, n = 1; for(i=0;i<3;i++){ printf("%d ", n); } printf("\n"); //換行 printf("%d", i); //輸出 : 1 1 1 // 3 ``` 我們會發現,i 的值除了迴圈變動以外,它「在迴圈外也可以使用」! v.s ```cpp= int n = 1; for(int i=0;i<3;i++){ printf("%d ", n); } printf("\n"); //換行 printf("%d", i); ``` 會發現我們編譯時跑出 "error: 'i' was not declared in this scope",也就是 "i 並沒有在這個範圍被宣告",所以它是「僅可以在迴圈內被使用」! --- 例題1 : 輸出 10~35,中間用空格隔開。 ```cpp= #include<iostream> using namespace std; int main() { for(int i=10;i<36;i++){ printf("%d ", i); } return 0; } //輸出 : 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 ``` --- 例題2 : 從 1 加到 n。 ```cpp= #include<iostream> using namespace std; int main() { int sum = 0, n; scanf("%d", &n); //cin >> n; 把 n 讀進來 for(int i=1;i<=n;i++){ sum = sum + i; } printf("%d", sum); } ``` 要注意的是,一開始我們務必要「初始化」sum 這個變數,因為若沒有初始化,sum會是亂數(宣告後沒有給值),它便不能被疊加。 --- 例題3 : 輸入一正整數,分別輸出每一位數的值 (中間有空格) ```cpp= #include<iostream> using namespace std; int main() { int n; scanf("%d", &n); while(n > 0) { int digits = n % 10; printf("%d ", digits); n = n / 10; } } //輸入 : 3126 //輸出 : 6 3 1 2 ``` 假設輸入 ```3126``` ,則 ```3126%10=6``` 輸出後,再做 ```3126/10=312```,之後重複做 ```312%10=2```,再做 ```312/10=31```->```31%10=1```->```31/10=3```->```3%10=3```->```3/10=0```,此時因為 ```n>0``` 這條件不成立,就跳出迴圈。 --- 例題3-plus : 數字倒轉 ```cpp= #include<iostream> using namespace std; int main() { int n, ans = 0; scanf("%d", &n); while(n > 0) { ans = ans*10 + n%10; n = n / 10; } printf("%d", ans); } ``` 假設輸入 ```3126```,則 ```0*10+6=6```->```6*10+2=62```->```62*10+1=621```->```621*10+3=6213```。 --- 例題3-plus-plus : 依照順序輸出每一位數 ```cpp= #include<iostream> using namespace std; int main() { int n, digits = 1; //digits是要用來10的幾次方的(至少一位) scanf("%d", &n); int n_tmp = n; //因為要算位數,所以先用一個數代替 n,避免更動到n的值 while(n_tmp > 0) { digits = digits*10; n_tmp = n_tmp / 10; } digits = digits / 10; //因為多計算了一位,所以要扣掉 //cout << digits << "\n"; while(n > 0) { int num = n / digits; //100是三位數,但它是10的2次方,所以次方數是位數減1 printf("%d ", num); n = n % digits; digits = digits / 10; //消去一位 } } //輸入 : 1234 //輸出 : 1 2 3 4 ``` --- ### 陣列 基本架構 : ```cpp= 資料型態 陣列名稱[大小] int num[10]; char ch[10]; ``` --- 例題1 : 讀入一個陣列大小為n的整數陣列,並將它的值顛倒輸出 ```cpp= #include<iostream> using namespace std; int main() { int n; scanf("%d", &n); int num[n]; for(int i=0;i<n;i++) { scanf("%d", &num[i]); //讀入陣列的值 } for(int j=n-1;j>=0;j--) { printf("%d ", num[j]); } } /*輸入 : 6 1 2 3 4 5 6 輸出 : 6 5 4 3 2 1 */ ``` 這裡要特別注意的是,要先讀入n,再宣告大小,為甚麼不能先宣告呢?如果我們先 ```int num[100]```,但只要有一個測試資料的大小大於100就會超過(不夠放了),例如 ```n=101```。 --- 例題2 : 輸入一個大小為n的整數陣列,並把陣列裡的值相加 ```cpp= #include<iostream> using namespace std; int main() { int n, sum = 0; //sum記得要歸零 scanf("%d", &n); int num[n]; for(int i=0;i<n;i++) { scanf("%d", &num[i]); } for(int j=0;j<n;j++) { sum = sum + num[j]; } } /* 輸入 : 4 21 22 31 10 輸出 : 84 ``` --- 例題3 : 計算一個大小為n的整數數列中,有幾個數大於10 ```cpp= #include<iostream> using namespace std; int main() { int n, cnt = 0; scanf("%d", &n); int num[n]; for(int i=0;i<n;i++) { scanf("%d", &num[i]) if(num[i] > 10) { cnt++; } } printf("%d", cnt); } /* 輸入: 4 1 2 31 14 輸出: 2 ``` --- 例題4 : 費式數列 ```cpp= #include<iostream> using namespace std; int main() { int n; scanf("%d", &n); int num[n]; num[0] = 1; num[1] = 1; for(int i=2;i<n;i++) { num[i] = num[i-1] + num[i-2]; } } ```