---
title: 程式設計培訓 - 筆記(1) # 簡報的名稱
tags: presentation # 簡報的標籤
slideOptions: # 簡報相關的設定
theme: solarized # 顏色主題
transition: 'fade' # 換頁動畫
# parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'
---
<style>
.reveal .slides {
text-align: left;
}
</style>
## 函式
C 語言中,可以把需要重複寫的程式提出來寫成函式(function),而需要的時候直接呼叫這個函式就好,也就是模組化的概念。
什麼叫模組化?簡單來說,就是把特定功能分出來當成一個模組,需要的時候只要呼叫這個模組就好;而需要修正的時候也只要修正模組即可。
架構:
```cpp=
型態 函式名稱(參數){
程式區塊;
}
```
例如,我們可以把**輸出hello world**寫成一個函式,格式如下:
```cpp=
#include<iostream>
void printhello(){
printf("hello world");
}
int main()
{
printhello();
return 0;
}
/*輸出:
hello world
*/
```
第一,**函式要寫在主函式(main)外**,第二,**最好寫在主函式下方**,第三,**要在標頭檔下方就先宣告**,第四,**函式可以呼叫很多次**,第五,**參數要對好**。
那其實函式也有分型態,甚麼意思呢?
我們再來看一次函式的架構:
```cpp=
資料型態 函式名稱(參數)
{
程式內容
}
```
那代表函式也有所謂的"資料型態",那其實也只是分**是否有回傳值**。
* 有回傳值 : int, bool, ...。
* 沒回傳值 : void 。
那有回傳的資料型態我們要怎麼判斷呢?
由**回傳值**判斷,若回傳值是一個整數,那函式的資料型態就會是**int**,如果是布林值,則資料型態就會是**bool**...依此類推,那回傳我們會利用**return**。
那沒回傳值只是單純要跑函式內的程式呢?我們就會利用上面出現過的**void**來宣告資料型態。
我們舉一個例子,今天我們寫一個a+b的函式,也就是傳入a與b,並回傳a+b。
```cpp=
#include<iostream>
using namespace std;
int add(int a, int b); //這是宣告
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
c = add(a, b);
printf("%d", c);
return 0;
}
int add(int a, int b)
{
return a+b;
}
/*輸入=
1 2
輸出=
3
*/
```
是的,我們必須再使用一個變數去接收函式所回傳的值,也就是我們的 **c**。
如果函式中參數名字與主函式不同也沒關係,不過在函式內運算的話還是得利用函式所宣告的參數。
小提醒 : **return**後,後面的程式都不會執行喔!
那假設 ```void``` 函式若不回傳,則傳進去的值會改變嗎?
```cpp=
#include<iostream>
using namespace std;
void add(int a, int b, int c);
int main()
{
int a, b, c = 0;
scanf("%d %d", &a, &b);
add(a, b, c);
printf("%d", c);
}
void add(int a, int b, int c)
{
c = a + b;
}
/*
輸入 : 1 2
輸出 : 0
*/
```
這代表即使把```C```傳進去函式內了,但```void```不會回傳,所以```C```的值在函式內改變了,在主函式也不會改變。