Semorphe

函式

給一段程式取個名字,之後就叫得動它。 · ⏱ 約 30 分鐘

你會學到三件事

  1. 怎麼自己做一個函式(而 main 一直都是一個)
  2. 參數和回傳值:東西怎麼進去、答案怎麼出來
  3. 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;

* 自己 這件事你寫了三遍。 現在把它改成算「立方」:你要改三個地方,而漏掉一個不會有人告訴你。

到編輯器試試看:先試試看:同一件事寫三遍

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、做一個

照著打上這一段:

1int square(int n) {2    return n * n;3}
變數n變數n×回傳定義函式 回傳型別int(整數)square(參數int(整數)n)12

四個部位:

int    square    (int n)     { return n * n; }
 ↑        ↑         ↑                ↑
回傳     名字      參數            身體
什麼               ——進去的東西

用它:

1cout << square(5) << endl;    // 25
5呼叫函式square()換行0回傳印出定義函式 回傳型別int(整數)main使用命名空間std引入函式庫iostream(輸入輸出)1

square(5) 的意思是「跑一次 square,把 5 當成 n」, 而整個 square(5) 就變成 25 這個值。

積木盤上那顆寫著「呼叫函式 …(…)」。

現在回頭看「先試試看」那一段:改成立方只要改一個地方。

⚠️ 函式要寫在 main 外面。

二、return 有兩個作用

那一行 return 做的是兩件事:

1return n * n;
變數n變數n×回傳1

它同時做兩件事:

  1. 把 n * n 算出來的值交出去
  2. 立刻結束這個函式,後面的行不會跑

所以 return 之後寫東西是沒有意義的。 (第 1 課那個「印不出來」的坑就是這個。)

不需要交出東西的函式,回傳型別寫 void:

1void say() {2    cout << "hi" << endl;3}
"hi"換行印出定義函式 回傳型別void(無回傳)say使用命名空間std引入函式庫iostream(輸入輸出)12

void 的函式不寫 return,用它的時候也不能拿來當成一個值—— cout << say(); 是錯的,要單獨寫成一行 say();。

三、參數可以不只一個

照著打上這一段:

1int add(int a, int b) {2    return a + b;3}
變數a變數b+回傳定義函式 回傳型別int(整數)add(參數int(整數)a,int(整數)b)12

⚠️ 每一個參數都要各自寫型別: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}
變數n變數n×回傳5呼叫函式square()換行0回傳印出定義函式 回傳型別int(整數)main定義函式 回傳型別int(整數)square(參數int(整數)n)使用命名空間std引入函式庫iostream(輸入輸出)1234789

把積木打散,自己排回去:排回去:把剛才那支程式的積木排好

換你了

再做兩個函式:add(a, b) 回傳相加、mul(a, b) 回傳相乘。 用 3 和 4 各叫一次,把兩個答案各印一行。

到編輯器做這一題:練習:再做兩個函式

換一種東西進去

函式的參數不一定是數字。做一個 void hello(string name), 讀進一個名字,印出 hi, 那個名字。

⚠️ 裁判餵的是 Semorphe,所以它要看到 hi, Semorphe。

🔴 這裡有一個值得先想一下的問題:hello 要不要有回傳值? 它沒有要交出任何東西給別人用,它自己就把字印掉了。

到編輯器做這一題:練習:跟名字打招呼

做一個

華氏轉攝氏的公式是 C = (F - 32) × 5 ÷ 9。 做一個函式 toC(int f),讀進一個華氏溫度,印出攝氏。

⚠️ 裁判餵的是 212(水的沸點)。 🔴 想一下:(F - 32) * 5 / 9 和 (F - 32) / 9 * 5 在 C++ 裡答案不一樣。 你覺得是哪一個對?跟旁邊的人對一下,再回頭看第 6 課的整數除法。

到編輯器做這一題:做一個:華氏轉攝氏

這一課你做了什麼

如果卡住了

你看到 多半是因為
說函式沒宣告 函式寫在 main 後面了。往前搬到 main 上面
int add(int a, b) 編不過 第二個參數也要寫型別:int a, int b
少了一個 return 卻能編譯 C++ 不一定會攔。而拿到的值是垃圾
cout << say(); 編不過 say 是 void,它不是一個值。單獨寫一行 say();
在編輯器打開這一課 →