# 程式設計培訓 - 複習
### 輸入輸出
基本架構 :
```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];
}
}
```