函式
給一段程式取個名字,之後就叫得動它。 · ⏱ 約 30 分鐘
你會學到三件事
- 怎麼自己做一個函式(而
main 一直都是一個)
- 參數和回傳值:東西怎麼進去、答案怎麼出來
return 同時做了兩件事
開始之前
第 3 課你給一個值取了名字(變數)。
這一課你要給一段程式取名字。
而其實你第 1 課就見過了——main 就是一個函式,
v.push_back() 也是(只是那個是別人寫好的)。
先試試看
假設你要算三個數各自的平方,然後印出來:
int a = 3, b = 5, c = 7;
cout << a * a << endl;
cout << b * b << endl;
cout << c * c << endl;
* 自己 這件事你寫了三遍。
現在把它改成算「立方」——你要改三個地方,而漏掉一個不會有人告訴你。
到編輯器試試看:先試試看:同一件事寫三遍
一、做一個
int square(int n) {
return n * n;
}
四個部位:
int square (int n) { return n * n; }
↑ ↑ ↑ ↑
回傳 名字 參數 身體
什麼 ——進去的東西
用它:
cout << square(5) << endl; // 25
square(5) 的意思是「跑一次 square,把 5 當成 n」,
而整個 square(5) 就變成 25 這個值。
積木盤上那顆寫著「呼叫函式 …(…)」。
現在回頭看「先試試看」那一段:改成立方只要改一個地方。
⚠️ 函式要寫在 main 外面。
二、return 有兩個作用
return n * n;
它同時做兩件事:
- 把
n * n 算出來的值交出去
- 立刻結束這個函式——後面的行不會跑
所以 return 之後寫東西是沒有意義的。
(第 1 課那個「印不出來」的坑就是這個。)
不需要交出東西的函式,回傳型別寫 void:
void say() {
cout << "hi" << endl;
}
void 的函式不寫 return,用它的時候也不能拿來當成一個值——
cout << say(); 是錯的,要單獨寫成一行 say();。
三、參數可以不只一個
int add(int a, int b) {
return a + b;
}
⚠️ 每一個參數都要各自寫型別:int a, int b,不能寫成 int a, b。
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1#include <iostream>2using namespace std;3int square(int n) {4 return n * n;5}6 7int main() {8 cout << square(5) << endl;9 return 0;10}
到編輯器照著做一次:跟著做
換你了
再做兩個函式:add(a, b) 回傳相加、mul(a, b) 回傳相乘。
用 3 和 4 各叫一次,把兩個答案各印一行。
到編輯器做這一題:練習:再做兩個函式
換一種東西進去
函式的參數不一定是數字。做一個 void hello(string name),
讀進一個名字,印出 hi, 那個名字。
🔴 這裡有一個值得先想一下的問題:hello 要不要有回傳值?
它沒有要交出任何東西給別人用,它自己就把字印掉了。
到編輯器做這一題:練習:跟名字打招呼
做一個
華氏轉攝氏的公式是 C = (F - 32) × 5 ÷ 9。
做一個函式 toC(int f),讀進一個華氏溫度,印出攝氏。
⚠️ 裁判餵的是 212(水的沸點)。
🔴 想一下:(F - 32) * 5 / 9 和 (F - 32) / 9 * 5 在 C++ 裡答案不一樣。
你覺得是哪一個對?跟旁邊的人對一下,再回頭看第 6 課的整數除法。
到編輯器做這一題:做一個:華氏轉攝氏
這一課你做了什麼
- 你自己做了一個函式,有參數也有回傳值
- 你知道
return 同時「交出值」和「結束函式」
- 你做過不回傳東西的函式(
void),也做過吃兩個參數的
如果卡住了
| 你看到 |
多半是因為 |
| 說函式沒宣告 |
函式寫在 main 後面了。往前搬到 main 上面 |
int add(int a, b) 編不過 |
第二個參數也要寫型別:int a, int b |
少了一個 return 卻能編譯 |
C++ 不一定會攔。而拿到的值是垃圾 |
cout << say(); 編不過 |
say 是 void,它不是一個值。單獨寫一行 say(); |
在編輯器打開這一課 →