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;

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

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

一、做一個

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;

同時做兩件事:

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

所以 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}
變數n變數n×回傳5呼叫函式square換行0回傳印出定義函式 回傳型別int(整數)main定義函式 回傳型別int(整數)square(參數int(整數)n使用命名空間std引入函式庫iostream(輸入輸出)1234789

到編輯器照著做一次:跟著做

換你了

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

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

換一種東西進去

函式的參數不一定是數字。做一個 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 課的整數除法。

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

這一課你做了什麼

如果卡住了

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