Functions
蔡銘軒 @ Sprout 2021 C/C++語法班
What we already know
int a = 3, b = 5;
std::swap(a, b);
std::cout << a << ' ' << b << "\n";
char s1[10] = "hello";
char s2[10] = "World";
int len1 = strlen(s1);
int len2 = strlen(s2);
Why Functions?
Function 的用途/好處
- 減少重複編寫同樣的程式碼
- 編寫程式時邏輯更流暢
- 增加程式的可讀性
- 使 debug 更容易
Functions How To
type function_name(parameters) {
/* do something */
return variable;
}
- type: function 會回傳什麼型別的變數
- function_name: function 的名字
- parameters: function 的參數
- return: function結束並回傳變數
Functions How To
int plus_one(int number) {
return number + 1;
}
範例
- type: 回傳一個整數
- function_name: 命名為 plus_one
- parameters: 傳入一個整數 number
- return: function 結束並回傳 number + 1
Return Type
Function 可以回傳數值/變數
需要定義 Function 的回傳型別
bool is_positive(int number) {
return number > 0;
}
double get_circle_area(int radius) {
const double PI = 3.14;
return radius * radius * PI;
}
Return Type
可以作為變數型別的,也都可以作為 Return Type
但...如果沒有要回傳任何東西呢?
int a = 3, b = 5;
std::swap(a, b);
std::cout << a << ' ' << b << "\n";
Return Type
void
只能作為 Return Type,不能作為變數的型別
void print_hello() {
std::cout << "hello\n";
}
void 即沒有回傳變數,連 return 都可以省略
Parameters
傳入一維陣列
int sum_array(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
return sum;
}
int arr[100] = {1, 2, 3};
int sum = sum_array(arr, 100);
Parameters
傳入二維陣列
int sum_2d_array(int arr[][100], int n, int m) {
int sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
sum += arr[i][j];
return sum;
}
int arr[100][100];
int sum = sum_2d_array(arr, 100, 100);
Parameters
Pass by value
void swap(int a, int b) {
int c = a;
a = b;
b = c;
}
int a = 3, b = 5;
swap(a, b);
std::cout << a << ' ' << b << "\n";
試試看,結果是什麼?
Parameters
Pass by value
一般傳參數的時候,數值是被複製進去的
void swap(int a, int b) {
...
}
int c = 3, d = 5;
swap(c, d);
c的值被複製給a
d的值被複製給b
但c跟a(d跟b)是不同變數
Parameters
Pass by reference
void swap(int& a, int& b) {
int c = a;
a = b;
b = c;
}
int a = 3, b = 5;
swap(a, b);
std::cout << a << ' ' << b << "\n";
試試看,結果是什麼?
Parameters
Pass by reference
加上 '&' 讓參數不再是複製品
void swap(int& a, int& b) {
...
}
int c = 3, d = 5;
swap(c, d);
a被視為跟c是同一個變數
操作a時會影響到c
b跟d亦同
Parameters
題外話
void plus_one(int arr[]) {
arr[0]++;
}
int arr[10] = {0};
plus_one(arr);
std::cout << arr[0] << "\n";
試試看,結果是什麼?
Parameters
題外話
傳遞陣列時,其實也是Pass by value
但並不是複製一個新的陣列
之後課程教到 指標 時就會明白
先把陣列當成例外:
傳遞陣列時,更改陣列內容會影響到外面
Parameters
Default parameters
可傳可不傳的參數
int increment(int num, int delta=1) {
return num + delta;
}
int n = 3;
int inc1 = increment(n);
int inc2 = increment(n, 2);
Parameters
Default parameters
非 default 的參數,一定要傳入數值
default 的參數一定要放在最後面
int increment(int num, int delta=1);
int increment(int delta=1, int num);
Return
Function 結束(並回傳)
當 Function Type 不是 void 時,就要搭配return
return的功能:
- 結束 Function 的執行
- 回傳數值給呼叫者
Return
結束 Function 的執行
int divide(int a, int b) {
if (b == 0)
return -1;
return a / b;
}
void 也可以 return
void print() {
return;
std::cout << "will not print\n";
}
Return
回傳數值給呼叫者
int get_one() {
return 1;
}
int one = get_one();
std::cout << one << "\n";
Return
回傳數值給呼叫者
一個 Function 可以回傳兩個以上數值嗎
int quadratic(int a, int b, int c) {
// solve...
return x1, x2;
}
例:解一元二次方程式
Return
回傳數值給呼叫者
如果需要回傳多個數值怎麼辦?
- struct
- std::pair
- std::tuple
之後的課程(可能)會教到
Practice
Note on Functions
Function 必須在使用前宣告
int main() {
int a = 3, b = 5;
swap(a, b);
}
void swap(int a, int b) {
...
}
void swap(int a, int b) {
...
}
int main() {
int a = 3, b = 5;
swap(a, b);
}
Note on Functions
Or... Forward Declaration
void swap(int a, int b);
int main() {
int a = 3, b = 5;
swap(a, b);
}
void swap(int a, int b) {
...
}
Note on Functions
一個 Function 只做一件事
int find_max_and_min_and_median(int arr[]);
int find_max(int arr[]);
int find_min(int arr[]);
int find_median(int arr[]);
Practice
Sprout 2021 Function
By JT
Sprout 2021 Function
- 1,054