# [C語言] 基本觀念語法
本章節內容主要是幫助由Python作為第一次學習程式語言的學生,快速了解C語言的語法與觀念,以面對APCS考試的命題方式。
## C語言的歷史
C 前身為B語言, 在美國Bell Lab (貝爾實驗室),由當時的研究員 Dennis Ritchie發展,目的是為了開發[UNIX作業系統](https://zh.wikipedia.org/wiki/UNIX), 替代部份`組合語言`的所完成的系統功能, 並可在不同的環境上開發系統與執行。
## 基本程式結構
C語言的格式中預設程式執行時,從主程式`main()`開始執行,int main()中的`int`代表程式執行結束後,會傳回一個整數(integer)值
```c=
#include <stdio.h> /*宣告I/O函式庫*/
int main(void) { /*程式執行進入點由main函式開始*/
printf("Hello World\n");
return 0;
}
```
## 資料輸入輸出
### 輸出資料
使用`printf()`函式,進行資料輸出。
要使用這個函式,必須加入它的宣告,定義在`stdio.h` 這個檔案中,所以要在程式碼最前頭進行宣告
```c=
#include <stdio.h>
int main(void) {
printf("Hello World\n");
return 0;
}
```
### 輸入資料
使用`scanf()`來讓使用者可以輸入資料到程式中。
請先宣告變數,請注意C語言是靜態語言,宣告變數須預先宣告型態
```c=
#include <stdio.h>
int main(void) {
int age;
printf("please enter your age> ");
scanf("%d", &age);
printf("You are %d\n",age);
return 0;
}
```
## C語言內建的資料型態
以下是 C 語言的資料型態:
- 基礎型態 (fundamental types)
- **布林數 (boolean)**
- **整數 (integer)**(unsigned/signed)
- `short`
- `int`
- `long`
- **浮點數 (floating-point number)**
- `float`
- `double`
- `long double`
- **字元 (character)**
- `char`
- 複數 (complex number)
- 列舉 (enumeration)
- 衍生型態 (derived types)
- **陣列 (array)**
- **結構體 (structure)**
- **指標 (pointer)**
- **函式 (function)**
- 聯合體 (union)
## 流程控制:迴圈
### for迴圈
```clike=
for(int i=0; i < 10; i++){
...
}
```
### while迴圈
有兩種,do-while跟while-do
```clike=
int i = 0;
while(i < 10){
...
i++;
}
```
```clike=
int i = 0;
do {
...
i++;
} while(i < 10)
```
### 隨堂練習
1. 請使用for迴圈,列印1,3,5,7,9
2. 請使用while迴圈,列印2,4,6,8,10
## 流程控制:條件判斷
### Switch-Case
```c=
switch(變數名稱或運算式) {
case 符合數字或字元:
陳述句一;
break;
case 符合數字或字元:
陳述句二;
break;
default:
陳述三;
break;
}
```
### if-else
```clike=
if( 條件 ) {
如果條件成立時做什麼...
}
else {
否則做什麼...
}
```
> 練習題:請讓使用者輸入成績(1~100)
> 如果使用者輸入90~100的數字: 顯示結果“You Got A”
> 如果使用者輸入80~89的數字: 顯示結果“You Got B”
> 如果使用者輸入70~79的數字: 顯示結果“You Got C”
> 如果使用者輸入60~69的數字: 顯示結果“You Got D”
> 如果使用者輸入60~0的數字: 顯示結果“You Got F”
> 如果使用者輸入範圍以外的數字,顯示結果“請輸入正確範圍數字”
### Break/Continue
在迴圈敘述中,我們可以使用`break`指令讓它強制離開迴圈,或是用 `continue`指令來忽略下面的指令而繼續下一次的迴圈
#### break示範使用:猜數字
```clike=
count = 1 ;
while (true)
{
printf ("第 %d 次猜測:\n", count) ;
printf ("請猜測一數:") ;
scanf ("%d", &guess) ;
if (guess > num){
printf ("太大!\n") ;
}
else if (guess < num){
printf ("太小!\n") ;
}
else{
printf ("猜中了!\n") ;
break ;
}
count++ ; // 如果猜中了則此行不會執行
} // while loop
```
#### Continue示範使用
範例:將 2到100中的偶數相加,但必須排除10的倍數,也就是2+4+6+8+12+14+.....,最後印出總和。
```clike=
sum = 0 ;
for (x=2 ; x<=100 ; x+=2)
{
/* 如果 x是10的倍數則閃過後面的 sum = sum + x; 敘述 */
if (x % 10 == 0)
continue ;
sum = sum + x;
}
printf("總和:%d \n", sum) ;
```
### 隨堂練習
請設計一個程式,讓使用者輸入數字1~3
* 如果使用者輸入1: 顯示結果“你輸入的是選項1”
* 如果使用者輸入2: 顯示結果“你輸入的是選項2”
* 如果使用者輸入2: 顯示結果“你輸入的是選項3”
* 如果使用者輸入非1~3的數字: 顯示結果“請輸入正確範圍數字”
## 函式
我們使用`函式(Function)`將重複出現的程式碼,通常是一系列的程序,做成函式,可以隨時呼叫使用,增加開發效率、以及讓程式碼更容易維護。
主要好處如下:
* 減少撰寫重覆的程式碼
* 將程式碼以有意義的方式組織起來
* 相同的流程下,可藉由參數調整程式的行為
* 藉由函式庫可組織和分享程式碼
* 做為資料結構 (data structures) 和物件 (objects) 的基礎
### 函式的宣告
#### 函式的類型
函式分成兩種類型,有`回傳值`與`無回傳值`。
請參考以下範例程式碼:
```c=
#include<stdio.h>
/*無回傳值*/
void function1(){
printf("Hello\n");
}
/*有回傳值*/
int function2(){
int a = 0;
a++;
return a;
}
int main(){
int x = 0;
/* 呼叫function 1 */
function1();
/* 呼叫function 2 */
x = function2();
printf("%d\n", x);
return 0;
}
```
#### 函式的參數
函式可以帶入`參數`,在函式內使用該參數進行運算,但也可以不帶入參數。
```c=
#include<stdio.h>
/*無參數*/
int function1(){
int a = 0;
int b = 0;
a += 1;
b = a;
return b;
}
/*有帶入參數*/
int function2(int a){
int b = 0;
a += 2;
b = a;
return b;
}
int main(){
int x = 0;
int y = 0;
//呼叫function 1
y = function1();
printf("%d\n", y);
//呼叫function 2
y = function2(x);
printf("%d\n", y);
return 0;
}
```
### 隨堂練習
請使用遞迴設計程式,計算階乘5!的值
###### tags: ` C/C++程式語言觀念`