---
# System prepended metadata

title: 這是C課程的共筆

---

# 這是C課程的共筆
請慢慢享用 d\(\`･∀･)b 

## 輸出輸入
scanf("輸入資料型態",儲存用的變數)
資料型態可在下文的 ***輸出格式->百分比符號%***  找到
儲存的變數前面要加 **&** 

printf("輸出的文字",變數)

範例程式如下 :
```c=
//輸入
int input_number; //設定變數
scanf("%d",&input_number) //輸入input_number的值
    
//輸出
printf("My IG is leo.is.an.egg")
    //輸出 My IG is leo.is.an.egg
printf("The number is %d",input_number)
    //輸出 The number is [x]  ([x]為輸入的值)
```

---

## 設定變數

在任何程式語言中，我們都要設定變數
以下 C 語言設定變數的方式
```c=
//資型型態 變數名稱 
int number;

//建立變數值後，我們可以設定其數值
number = 1  //設定 number 為 1
number += 1 //number 加 1
number -= 1 //number 減 1
scanf("%d",&number) //輸入number的值
    
//也可以這樣直接在設立變數時設定數值
int answer = 100; 
```
:::warning
變數常見型態
| 資料型態| 關鍵字 |資料最大值|
| -------- | -------- | -------- |
|很小的整數|short|+-2^16^|
|整數|int|+-2^32^|
|更大的整數|long|+-2^63^|
|超大的整數|long long|+-2^127^|
|浮點數|float|+-10^38^|
|更大的浮點數|double|+-10^308^|
|字元|char|一個字符|
:::
(注意:char字元只能有一個英文字母或符號，你可以用char[50]來輸入字串) 

此外，變數也全域變數和區域變數兩種，全域變數可使用在任何地方，區域變數通常只能使用在一個函式內

```c=
#include <stdio.h>

int ans = 1; //全域變數

void print(){
    printf("%d",ans); //1
    printf("%d",ans1);
    //* 函式出錯，因為 ans1 為區域變數，無法運用在此函式中 *//
}
int main(void) {
    printf("%d",ans); //1
    int ans1 = 2; //區域變數
    print()
}
```

---

## 陣列

若一次要輸入多個元素，可以使用陣列
在此筆記中，只會出現正規的陣列使用方法以方便理解

### 一維陣列

變數型態 陣列名稱[ 陣列長度 ] = { 陣列內容 } ;
```c=
#include <stdio.h>

int main(){
    int list[];   //建立一個二維陣列，不宣告起始長度值
    /* 此陣列可像 c++ vector 一樣自動添加儲存空間*/
    
    list[0] = 1; list[1] = 2; list[2] = 3; //設定陣列的值
    
    int list1[3] = {1,2,3}; //建立一個陣列,宣告起始長度為3,起始元素為{1,2,3}
    
    printf("%d - %d - %d",list[0],list1[1],list[2]) //列印陣列中的值 
    // 1 - 2 - 3
        
    /*陣列也可拿來建立字串*/
    char word[] = "pizza";
    printf("%s",word); //列印字串
    // pizza
    
}
```

### 多維陣列

```c=
#include <stdio.h>

int main(){
    int list1[][];  //建立一個二維陣列
    int list2[][][]; //建立一個三維陣列
    
    list1[0][0] = 1; list1[0][1] = 2;
    list1[1][0] = 3; list1[1][1] = 4;
    //設定陣列中的值
    
    //陣列內的值如下
    // +---+---+
    // | 1 | 2 |
    // +---+---+
    // | 3 | 4 |
    // +---+---+
    
    int list3[2][2]={{1,2},{3,4}};  //建立一個二維陣列，並設定裡面的數值
    char list4[2][]={"pizza","hamburger"};  //建立一個一維字串陣列，並設定裡面的字串
    
    printf("%d - %d",list1[0][0],list3[0][0]); // 1 - 1
    printf("%s and %s",list4[0],list4[1]); // pizza and hamburger

}
```

## 輸出與輸入格式

### 反斜線 \  (字元字面常量)
字元字面常量是以單引號來包括一個字元，例如 'A'、'1' 都表示一個字元字面常量，而有一些字元與C中所使用的相同，例如 “、'、\ 等，要在程式中 表現這些字元則要使用轉義序列（escape sequence），即 \"、\'、\\，其他還有一些不可見字元，也要以轉義序列來表示
:::spoiler 這是常見的轉譯序列格式 :
* \n：換行、新行（newline）
* \t：水平定位點（horizontal tab）
* \v：垂直定位點（vertical tab）
* \b：退回一格（backspace）
* \r：返回（carriage return）
* \f：換頁（formfeed）
* \a：嗶聲（alert bell）
* \\：倒斜線（backslash）
* \?：問號
* \'：單引號
* \"： 雙引號
* \nnn：nnn 為一到三個 8 進位數字，表示字元編碼，例如 \115
* \xnn.：nn 為多個 16 進位數字，表示字元編碼，通常用兩個數字，例如 \xb4\xfa，
* \unnnn：Unicode 碼點 U+nnnn 表示（C99）
* \Unnnnnnnn：Unicode 碼點 U+nnnnnnnn 表示（C99）
:::
(初學者基本只會用到 \n XD )

.
### 百分比符號 % (格式指定字)
如果在使用 printf 時要指定整數、浮點數、字元等進行顯示，要配合格式指定字（format specifier）

:::spoiler 以下列出幾個可用的格式指定碼：
%c：以字元方式輸出
%d：10 進位整數輸出
%o：以 8 進位整數方式輸出
%u：無號整數輸出
%x、%X：將整數以 16 進位方式輸出
%f：浮點數輸出
%e、%E：使用科學記號顯示浮點數
%g、%G：浮點數輸出，取 %f 或 %e（%f 或 %E），看哪個表示精簡
%%：顯示 %
%s：字串輸出
%lu：long unsigned 型態的整數
%p：指標型態
:::



---

## 運算字和邏輯門
對於變數，我們可以使用邏輯門去判斷大小、資料是否相等 等等資料
:::warning
C語言中沒有布林值，所以一般 true = 1 , false = 0
true也可以是>0的數字,fasle也可以是<=0的數字

C++有布林值，True跟False

:::

### 大於小於等於

|大於|小於|等於|
|-|-|-|
|>|<|=|
|大於等於|小於等於|不等於|
|>=|<=|!=|

:::spoiler 以下是範例程式碼 :
```c=
#include <stdio.h>

int main() {
  int x=1,y=2;
  printf("%d",x>y);  //0
  printf("%d",x>=y); //0
  printf("%d",x<y);  //1
  printf("%d",x<=y); //1
  printf("%d",x==y); //0
  printf("%d",x!=y); //1
}
```
:::

### 邏輯門


| 名稱 | 使用方式 | 特性 |
| ---- | -------- | ---- |
| 且門 | && |   當兩者都是true時輸出true, 兩者其中之一不是true時, 輸出false   |
| 或門 | \| \|  | 當兩者其中之一是true時輸出true, 兩者都不是true時, 輸出false|
| 反或門| ^  |當兩者都是true/false時輸出true, 其餘輸出false|
| 非門 | !| 輸入是 true 時輸出 false, 輸入是 false 時輸出 true |

:::spoiler 以下是範歷程式碼:

```c=
#include <stdio.h>

int main(void) {
  x=1,y=0 //1=true 0=false
  printf("%d",x&&x); //1
  printf("%d",x&&y); //0
  printf("%d",y&&y); //0
  printf("%d",x||x); //1
  printf("%d",x||y); //1
  printf("%d",y||y); //0
  printf("%d",!x);   //0
  printf("%d",!y);   //1
}
```
:::


---


## 條件判斷式
### if else
當判斷式內的內容為 True，執行函式內的內容，否則跳到下一個else處


```c=
#include <stdio.h>

int main(void) {
  int x=0;
  if(x==0){printf("A");}      //因為 x==0 輸出 A
  else if(x==1){printf("B");} //不會輸出
  else{print("C")}            //不會輸出
  
  int x=1;
  if(x==0){printf("A");}      //因為 x!=0 不會輸出，並跳到下一個else
  else if(x==1){printf("B");} //因為 x==1 輸出 B
  else{print("C")}            //不會輸出
    
  x=2;
  if(x==0){printf("A");}      //因為 x!=0 不會輸出，並跳到下一個else
  else if(x==1){printf("B");} //因為 x!=1 不會輸出，並跳到下一個else
  else{print("C")}            //由於上面的if都不成立，執行else內的函式
}
```


### switch

還沒教到，我之後再補 by 睿瑜  \^-^


---

## 迴圈

:::info
迴圈有兩種 for 跟 while
for 通常用於有限迴圈, while 通常用於無盡迴圈
兩者皆可通用
:::


### for迴圈
當判斷式內容成立，執行for迴圈 
for迴圈常用於 **執行有限/指定做n次** 的迴圈
```c=
for (初始變數; 判斷式; 遞增式) { 
    陳述句一; 
    陳述句二; 
}
```
也可以這樣寫
```c=
for (初始變數; 判斷式; 遞增式) 陳述句一; 
    陳述句二; 

//在迴圈內只會執行陳述句一,跑完迴圈後才會執行陳述句二
```

### while迴圈
跟 for 迴圈一樣，當判斷式的內容成立，執行while迴圈內的內容
但是沒有初始變數跟遞增式，只有判斷式
常用於寫 **無盡/不知道要執行多少次** 的迴圈

```c=
while(條件式){
    陳述句一;
    陳述句二;
}
```
也可以寫成 do...while變種
程式會優先執行一次迴圈在進入判斷式
```c=
do{
    陳述句一;
    陳述句二;
}while(條件式);
```
請記得加入讓迴圈中斷的邏輯
不然他會變成無盡迴圈,程式會跑不完
必須使用無盡迴圈的程式 : Ardiuno,遊戲程式

例如下方程式
```c=
#include <stdio.h>

int main(){
    int i=0;
    while(i<5){
        i++;
    }
}
```
每次執行while迴圈時 i 的值都會 +1
當 i >= 5 時會中斷程式，總共會執行 5 次迴圈

### 迴圈中斷 break/contiune
可以使用break讓迴圈強制中斷
例如下方程式
```c=
#include <stdio.h>

int main(){
    int i=0;
    while(i<5){
        i++;
        if(i>3){break;}
    }
    printf("i=%d",i); // i=4
}
```
因為在 i=4 的時候觸發了第 7 行的 break 函式
所以迴圈強制中斷，列印出 i=4

此外，可以使用continue讓迴圈直接重跑
例如下方程式
```c=
#include <stdio.h>

int main(){
    int i=0;
    while(i<5){
        i++;
        if(i % 2 == 0){continue;}
        printf("%d ",i);
    }
}
```
觸發到 continue 之後 , printf("&d",i) 就不會執行
所以輸出為 1 3
## 副程式
有兩種定義函式的方法
【巨集】類似 python 的 lambda 函數，是簡單定義副程式的方法
【函式】可以自訂義一大串功能，在跑迴圈或演算法時很好用

### 巨集
使用方法如下 :
```c=
#define 副程式名(輸入變數) 執行程式
```
define會直接將　(　)　的內容丟入函式中
```ｃ=
#include <stdio.h>
#define function(x) x * x

int main(){
    printf("%d",function( 10 )) //100
    printf("%d",function( 8 + 2 )) //26 
    //* 因為函式會將其視為 ( 8 + 2 * 8 + 2 ) = 26 *//
    printf("%d",function( ( 8 + 2 ) ) //100
    //* ( ( 8 + 2 ) * ( 8 + 2 ) ) = 100 *//
}
```

### 副程式
使用方法如下
```c=
//不回傳數值
void 副程式名(輸入變數){
    執行程式內容;
}

//需要回傳數值
int 副程式名(輸入變數){
    
}
```
## 