C語(yǔ)言探索之旅 | 第一部分第十一課:函數(shù)

作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)。
轉(zhuǎn)載請(qǐng)注明出處。
原文:http://www.itdecent.cn/p/148564646b7f

《C語(yǔ)言探索之旅》全系列

內(nèi)容簡(jiǎn)介


  1. 前言
  2. 函數(shù)的創(chuàng)建和調(diào)用
  3. 一些函數(shù)的實(shí)例
  4. 總結(jié)
  5. 第一部分練習(xí)題預(yù)告

1. 前言


上一課是 C語(yǔ)言探索之旅 | 第一部分第十課:第一個(gè)C語(yǔ)言小游戲 。

這一課我們將會(huì)用函數(shù)這個(gè)重中之重來(lái)結(jié)束《C語(yǔ)言探索之旅》的第一部分(基礎(chǔ)部分),而第二部分將要迎接我們的就是 C語(yǔ)言的高級(jí)技術(shù)了。

第二部分會(huì)比較難,不過(guò)不用擔(dān)心,我們會(huì)循序漸進(jìn),一點(diǎn)點(diǎn)地學(xué)習(xí)。只要方向?qū)?,肯花時(shí)間,C語(yǔ)言一點(diǎn)也不可怕。

這一課里我們也會(huì)給大家講 C語(yǔ)言程序所基于的原則。

我們將要學(xué)習(xí)如何將程序分塊管理,有點(diǎn)像樂(lè)高積木。

其實(shí)所有 C語(yǔ)言的大型程序都是小程序塊的集合,而這些小程序塊我們稱(chēng)之為函數(shù)。函數(shù)的英語(yǔ)是 function,function 表示“功能;[數(shù)]函數(shù)”。

在面向?qū)ο蟮恼Z(yǔ)言(如 Java,C++)里面,函數(shù)又被稱(chēng)為方法(method)。當(dāng)然這里我們只討論 C語(yǔ)言(面向過(guò)程的語(yǔ)言),不討論面向?qū)ο蟮恼Z(yǔ)言。

2. 函數(shù)的創(chuàng)建和調(diào)用


在之前的課程中我們已經(jīng)學(xué)過(guò):所有的 C語(yǔ)言程序都是由 main 函數(shù)開(kāi)始運(yùn)行的。那時(shí)候我們也展示了一個(gè)概要圖,里面有一些術(shù)語(yǔ):

最上面的部分我們稱(chēng)之為“預(yù)處理指令”,很容易辨識(shí),因?yàn)橐?# 號(hào)開(kāi)頭,而且通??偸欠旁诔绦虻淖钋懊?。

下面的部分就是我們要學(xué)習(xí)的函數(shù)了,這里的示例是 main 函數(shù)。

前面說(shuō)過(guò),C語(yǔ)言的程度都是以 main 函數(shù)為入口函數(shù)的。一個(gè) C程序要運(yùn)行,必須要有 main 函數(shù)。只不過(guò),目前為止我們寫(xiě)的所有程序,包括上一課的小游戲,也只是在 main 函數(shù)里面搗鼓而已,我們還沒(méi)跳出過(guò) main 函數(shù)過(guò)。

那你也許會(huì)問(wèn):“這樣不好嗎?”

答案是:并不是說(shuō)這樣不好,但這并不是 C語(yǔ)言的程序員通常所做的。幾乎沒(méi)有程序員會(huì)只在 main 函數(shù)的大括號(hào)內(nèi)部寫(xiě)代碼。

到目前為止我們所寫(xiě)的程序都還比較短小,但是想象一下如果程序變得很大,代碼幾千幾萬(wàn)甚至上百萬(wàn)行,難道我們還把這些代碼都塞在 main 函數(shù)里面嗎?

所以我們現(xiàn)在來(lái)學(xué)習(xí)如何更好地規(guī)劃我們的程序。我們要學(xué)習(xí)將程序分成很多小塊,就像樂(lè)高積木的每一個(gè)小塊一樣,這些小塊搭起來(lái)卻可以組成很多好玩的形狀。

這些程序小塊我們稱(chēng)之為函數(shù)(function)。

一個(gè)函數(shù)會(huì)執(zhí)行某些操作,并返回一個(gè)值。程序就是一個(gè)代碼序列,負(fù)責(zé)完成特定的任務(wù)。

一個(gè)函數(shù)有輸入和輸出,如下圖所示:

我們可以把函數(shù)想象成一臺(tái)制作香腸的機(jī)器,在輸入那一頭你把豬裝進(jìn)去,輸出那一頭就出來(lái)香腸了。這酸爽,不言而喻~

函數(shù)就像香腸制造機(jī)

當(dāng)我們?cè)诔绦蛑姓{(diào)用一個(gè)函數(shù)的時(shí)候,會(huì)依次發(fā)生三個(gè)步驟:

  1. 輸入:給函數(shù)傳入一些信息(通過(guò)給函數(shù)一些參數(shù))。
  2. 運(yùn)算:使用輸入里傳進(jìn)去的信息,函數(shù)就可以完成特定任務(wù)了。
  3. 輸出:做完運(yùn)算后,函數(shù)會(huì)返回一個(gè)結(jié)果,被稱(chēng)為輸出或者返回值。

舉個(gè)例子,比如我們有個(gè)函數(shù)叫做 multipleTwo,作用是將輸入乘以二,如下所示:

函數(shù)的目的是為了讓源代碼更加結(jié)構(gòu)分明,也節(jié)省源代碼數(shù)目,因?yàn)槲覀兙筒挥妹看味驾斎胫貜?fù)的代碼片段而只需要調(diào)用函數(shù)就好了。

再設(shè)想一下:

之后我們可能會(huì)想要?jiǎng)?chuàng)建一個(gè)叫 showWindow(“顯示窗口”)的函數(shù),作用是在屏幕上顯示一個(gè)窗口。

一旦函數(shù)寫(xiě)好之后(當(dāng)然寫(xiě)的過(guò)程是最難的),我們就只需要說(shuō):“那個(gè)誰(shuí),給我去打開(kāi)一個(gè)窗口”,showWindow 函數(shù)就會(huì)為我們?cè)谄聊簧巷@示一個(gè)窗口。

我們也可以寫(xiě)一個(gè) displayCharacter(“顯示角色”) 的函數(shù),作用是為我們?cè)谄聊簧巷@示一個(gè)游戲角色。

函數(shù)的構(gòu)成


我們?cè)谥暗恼n中已經(jīng)接觸過(guò)函數(shù)了,就是非常重要的 main 函數(shù)。不過(guò)我們還是需要介紹一下一個(gè)函數(shù)的構(gòu)成到底是怎么樣的。

下面是函數(shù)的語(yǔ)義學(xué)的結(jié)構(gòu),這是一個(gè)需要了解的模板:

類(lèi)型 函數(shù)名(參數(shù))
{
    // 函數(shù)體,在這里插入指令
}

關(guān)于這個(gè)模板我們需要掌握四點(diǎn):

  1. 函數(shù)類(lèi)型:對(duì)應(yīng)輸出類(lèi)型,也可以把其看做函數(shù)的類(lèi)型。和變量類(lèi)似,函數(shù)也有類(lèi)型,這類(lèi)型取決于函數(shù)返回值的類(lèi)型。如果一個(gè)函數(shù)返回一個(gè)浮點(diǎn)數(shù)(帶小數(shù)點(diǎn)的),那么自然我們會(huì)將函數(shù)類(lèi)型定為 float 或者 double;如果返回整數(shù),那么我們一般會(huì)將類(lèi)型定為 int 或 long。但是我們也可以創(chuàng)建不返回任何值的函數(shù)。

  2. 函數(shù)名:這是你的函數(shù)的名字。你可以給你的函數(shù)起任意名字,只要遵從給變量命名的相同的規(guī)則就好。

  3. 函數(shù)的參數(shù)(對(duì)應(yīng)輸入):參數(shù)位于函數(shù)名之后的圓括號(hào)內(nèi)。這些參數(shù)是函數(shù)要用來(lái)做操作(運(yùn)算)的數(shù)據(jù)。你可以給函數(shù)傳入任意數(shù)量的參數(shù),也可以不傳入任何參數(shù)。

  4. 函數(shù)體:大括號(hào)規(guī)定了函數(shù)的起始和結(jié)束范圍。在大括號(hào)中你可以寫(xiě)入任意多的指令。對(duì)于上面的 multipleTwo 函數(shù),需要寫(xiě)入將輸入的數(shù)字乘以 2 的相關(guān)操作指令。

根據(jù)函數(shù)類(lèi)型,函數(shù)可以分為兩類(lèi):

  1. 返回一個(gè)值的函數(shù)。這樣的函數(shù),我們將其類(lèi)型定為對(duì)應(yīng)的值的類(lèi)型(char,int,long,double,等)。

  2. 不返回任何值的函數(shù)。這樣的函數(shù),我們將其類(lèi)型定為 void(void
    表示“空的,無(wú)效的”)。

創(chuàng)建函數(shù)


還是用一個(gè)實(shí)例來(lái)說(shuō)明吧,用的還是我們上面提過(guò)的 multipleTwo 這個(gè)函數(shù):

這個(gè)函數(shù)的輸入是一個(gè)整型 int,輸出也是 int 類(lèi)型的數(shù)。

int multipleTwo(int number)
{
    int result = 0;
    result = 2 * number;  // 我們將提供的數(shù)乘以 2
    return result;  // 我們將 2 倍的數(shù)返回
}

這就是你的第一個(gè)除了 main 以外的函數(shù),自豪不?

return result; 這句話(huà)一般放在函數(shù)體的最后,用于返回一個(gè)值。這句話(huà)意味著:“函數(shù)你給我停下,然后返回這個(gè)值”。這里的 result 必須是 int 類(lèi)型的,因?yàn)楹瘮?shù)類(lèi)型是 int,所以返回值也必須是 int 類(lèi)型。

result 這個(gè)變量是在 multipleTwo 函數(shù)中聲明/創(chuàng)建的,所以它只能在這個(gè)函數(shù)里面用,不能在另一個(gè)函數(shù)(比如 main)中使用,所以是 multipleTwo 函數(shù)的私有變量。

但上面的代碼是不是最簡(jiǎn)單的呢?

不是,還可以簡(jiǎn)化,如下:

int multipleTwo(int number)
{
    return 2 * number;
}

上面的代碼做的是一樣的事情,寫(xiě)起來(lái)也更簡(jiǎn)單,函數(shù)體內(nèi)只有一句話(huà)。

通常來(lái)說(shuō),我們寫(xiě)的函數(shù)都會(huì)有多個(gè)變量,以便做運(yùn)算,multipleTwo這個(gè)函數(shù)算是相當(dāng)簡(jiǎn)單的了。

多個(gè)參數(shù),或沒(méi)有參數(shù)


多個(gè)參數(shù)

我們的 multipleTwo 函數(shù)只有一個(gè)參數(shù),但是我們也可以創(chuàng)建有幾個(gè)參數(shù)的函數(shù),比如下面這個(gè)加法函數(shù) addition:

int addition(int a, int b)
{
    return a + b;
}

可以看到,只需要用一個(gè)逗號(hào)來(lái)分隔參數(shù)就好了。

沒(méi)有參數(shù)

有些函數(shù)可能會(huì)沒(méi)有參數(shù)。例如一個(gè)用來(lái)顯示 Hello(“你好”)的函數(shù):

void hello()
{
    printf("Hello");
}

如上所示,這個(gè)函數(shù)沒(méi)有任何參數(shù)。此外,可以看到我們還把函數(shù)類(lèi)型定為了 void,所以也沒(méi)有 return 語(yǔ)句用于返回一個(gè)值,所以這個(gè)函數(shù)也沒(méi)有返回值。

調(diào)用函數(shù)


現(xiàn)在我們來(lái)看一個(gè)程序,復(fù)習(xí)一下我們之前學(xué)的內(nèi)容。

我們要用到我們的 multipleTwo 函數(shù),來(lái)計(jì)算一個(gè)數(shù)的兩倍的值。

我們暫時(shí)把 multipleTwo 函數(shù)寫(xiě)在 main 函數(shù)之前,如果放在 main 函數(shù)之后會(huì)出錯(cuò),以后的課程我們會(huì)解釋為什么。

#include <stdio.h>

int multipleTwo(int number)
{
    return 2 * number;
}

int main(int argc, char *argv[])
{
    int initial = 0, twice = 0;

    printf("請(qǐng)輸入一個(gè)整數(shù)... ");
    scanf("%d", &initial);

    twice = multipleTwo(initial);
    printf("這個(gè)數(shù)的兩倍是 %d\n", twice);

    return 0;
}

我們的程序是從 main 函數(shù)開(kāi)始運(yùn)行的,這個(gè)大家已經(jīng)知道了。

我們首先請(qǐng)求用戶(hù)輸入一個(gè)整數(shù),將其值傳遞給 multipleTwo 函數(shù),并且把 multipleTwo 函數(shù)的返回值賦給 twice這個(gè)變量。

仔細(xì)看下面這一行,這是我們最關(guān)心的一行代碼,因?yàn)檎沁@一行調(diào)用了我們的 multipleTwo 函數(shù)。

twice = multipleTwo(initial);

在括號(hào)里,我們將變量 initial 作為輸入傳遞給函數(shù)。也正是 initial 這個(gè)變量,函數(shù)將要用于其內(nèi)部的處理。

這個(gè)函數(shù)返回一個(gè)值,這個(gè)值我們賦給 twice 這個(gè)變量。

其實(shí)這一行中,我們就是“命令”電腦:“讓 multipleTwo 函數(shù)給我計(jì)算 initial 的兩倍的值,并且將結(jié)果儲(chǔ)存到 twice 這個(gè)變量中”。

詳細(xì)的分步解釋


也許對(duì)于初學(xué)者,理解起來(lái)還是有些許困難。

不用擔(dān)心,我相信通過(guò)下面的分步解釋?zhuān)蠹視?huì)明白得更透徹。

這個(gè)特殊注釋的代碼向大家展示了程序的運(yùn)行順序:

#include <stdio.h>

int multipleTwo(int number)  // 6
{
    return 2 * number;  // 7
}

int main(int argc, char *argv[])  // 1
{
    int initial = 0, twice = 0;  // 2

    printf("請(qǐng)輸入一個(gè)整數(shù)... ");  // 3
    scanf("%d", &initial);  // 4

    twice = multipleTwo(initial);  // 5
    printf("這個(gè)數(shù)的兩倍是 %d\n", twice);  // 8

    return 0;  // 9
}

上面的編號(hào)表示執(zhí)行的順序:

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9

  1. 程序從 main 函數(shù)開(kāi)始執(zhí)行;

  2. 在 main 函數(shù)中的命令一行一行地被執(zhí)行;

  3. 執(zhí)行 printf 輸出;

  4. 執(zhí)行 scanf 讀入數(shù)據(jù),賦值給變量 initial;

  5. 讀入指令,調(diào)用 multipleTwo 函數(shù)了,因此程序跳到上面的 multipleTwo 函數(shù)中去執(zhí)行;

  6. 運(yùn)行 multipleTwo 函數(shù),并接受一個(gè)數(shù)作為輸入(number);

  7. 對(duì) number 做運(yùn)算,并且結(jié)束 multipleTwo 函數(shù)。return 意味著函數(shù)的結(jié)束,并且返回一個(gè)值;

  8. 重新回到 main 函數(shù)的下一條指令,用 printf 輸出;

  9. 又一個(gè) return,這次是 main 函數(shù)的結(jié)束,于是整個(gè)程序運(yùn)行完畢。

變量 initial 被傳值給 multipleTwo 的參數(shù) number(另一個(gè)變量),稱(chēng)為值傳遞。

當(dāng)然其實(shí)原理是做了一份變量 initial 的拷貝,把拷貝賦值給了 number,這個(gè)值傳遞的概念以后學(xué)習(xí)指針那一章時(shí)會(huì)再詳述。

這里如果我們把 initial 改名為 number 也是可以的,并不會(huì)與函數(shù) multipleTwo 的參數(shù) number 沖突。因?yàn)閰?shù) number 是屬于 multipleTwo 這個(gè)函數(shù)的專(zhuān)屬變量。

測(cè)試程序


下面是程序運(yùn)行起來(lái)的一個(gè)實(shí)例:

請(qǐng)輸入一個(gè)整數(shù)... 10
這個(gè)數(shù)的兩倍是 20

當(dāng)然你不必將 multipleTwo 函數(shù)的返回值賦給一個(gè)變量,也可以直接將 multipleTwo 函數(shù)的返回值傳遞給另一個(gè)函數(shù),就好像 multipleTwo(intial) 是一個(gè)變量。

仔細(xì)看下面這個(gè)程序,跟上面幾乎是一樣的,但是修改了最后一個(gè) printf 的行為,我們也沒(méi)有使用 twice 這個(gè)變量,因?yàn)椴槐匾?/p>

#include <stdio.h>

int multipleTwo(int number)
{
    return 2 * number;
}

int main(int argc, char *argv[])
{
    int initial = 0, twice = 0;

    printf("請(qǐng)輸入一個(gè)整數(shù)... ");
    scanf("%d", &initial);

    // 函數(shù)的結(jié)果(返回值)直接傳遞給printf函數(shù),而沒(méi)有通過(guò)第三方變量
    printf("這個(gè)數(shù)的兩倍是 %d\n", multipleTwo(initial));

    return 0;
}

我們可以看到,這次的程序直接將 multipleTwo 函數(shù)的返回值傳遞給了 printf 函數(shù)。

當(dāng)程序運(yùn)行到這一行會(huì)發(fā)生什么呢?

很簡(jiǎn)單,電腦看到這一行是 printf 函數(shù),所以調(diào)用標(biāo)準(zhǔn)輸入輸出庫(kù)的 printf 函數(shù),向 printf 函數(shù)傳遞我們給的所有參數(shù)。

第一個(gè)參數(shù)是要顯示的語(yǔ)句,第二個(gè)參數(shù)是一個(gè)整數(shù)。

電腦又知道要把這個(gè)整數(shù)值傳遞給 printf 函數(shù),必須先調(diào)用 multipleTwo 函數(shù),所以它就乖乖地去調(diào)用 multipleTwo 函數(shù),做兩倍乘法運(yùn)算,并且直接把結(jié)果傳遞給 printf 函數(shù)。

這就是函數(shù)的層疊式調(diào)用,這樣做的好處是,一個(gè)函數(shù)可以按需調(diào)用另一個(gè)函數(shù)。

只要愿意,我們的 multipleTwo 函數(shù)也可以再調(diào)用其他的函數(shù),只要你肯寫(xiě)。然后這個(gè)函數(shù)也可以再調(diào)用其它函數(shù),依次類(lèi)推。

這就是 C語(yǔ)言程序所基于的原則。所有的代碼都是有規(guī)劃地組合在一起的,類(lèi)似樂(lè)高積木。

最后,最艱難的當(dāng)然是編寫(xiě)函數(shù)了。一旦完成,你就只需要調(diào)用它就好了,不需要太擔(dān)心函數(shù)內(nèi)部所做的運(yùn)算。

使用函數(shù)可以大大降低代碼的重復(fù)度。相信我,你會(huì)非常需要函數(shù)的。

3. 一些函數(shù)的實(shí)例


如果一起學(xué)習(xí)過(guò)之前的課程,你應(yīng)該會(huì)有這種印象:我就是個(gè)“例子狂人”。

是的,因?yàn)槲液芟矚g用實(shí)例來(lái)加深理解。

因?yàn)槲矣X(jué)得理論雖好,但如果只有理論,那我們就不能很好地掌握知識(shí),而且不知道怎么應(yīng)用,那就很可惜了。想起了“勁酒雖好,可不要貪杯哦”那句廣告詞…

所以下面我們會(huì)一起看幾個(gè)函數(shù)的實(shí)例,以便讀者對(duì)函數(shù)有更深入的了解。我們盡量展示不同情況,使大家看到可能出現(xiàn)的各種函數(shù)類(lèi)型。

歐元/人民幣轉(zhuǎn)換


我們來(lái)寫(xiě)一個(gè)函數(shù),用于轉(zhuǎn)換歐元到人民幣。

查了一下最新的匯率:1 歐元 = 7.8553 人民幣元。

#include <stdio.h>

double conversion(double euros)
{
    double rmb = 0;

    rmb = 7.8553 * euros;
    return rmb;
}

int main(int argc, char *argv[])
{
    printf("10 歐元 = %f 人民幣\n", conversion(10));
    printf("50 歐元 = %f 人民幣\n", conversion(50));
    printf("100 歐元 = %f 人民幣\n", conversion(100));
    printf("200 歐元 = %f 人民幣\n", conversion(200));

    return 0;
}

你也可以寫(xiě)一個(gè)人民幣轉(zhuǎn)換為歐元的小程序。

懲罰


接下來(lái)看一個(gè)函數(shù),這個(gè)函數(shù)不會(huì)返回任何值,所以類(lèi)型是 void。這個(gè)函數(shù)會(huì)根據(jù)傳入的參數(shù)在屏幕上顯示一定次數(shù)的信息。

這個(gè)函數(shù)只有一個(gè)參數(shù),那就是顯示懲罰語(yǔ)句的次數(shù):

#include <stdio.h>

void punish(int lineNumber)
{
    int i;

    for (i = 0 ; i < lineNumber ; i++)
    {
        printf("我不應(yīng)該有錢(qián)任性\n");
    }
}

int main(int argc, char *argv[])
{
    punish(5);

    return 0;
}

顯示結(jié)果如下:

我不應(yīng)該有錢(qián)任性
我不應(yīng)該有錢(qián)任性
我不應(yīng)該有錢(qián)任性
我不應(yīng)該有錢(qián)任性
我不應(yīng)該有錢(qián)任性

矩形面積


矩形的面積很容易計(jì)算:長(zhǎng) x 寬。
我們來(lái)寫(xiě)一個(gè)求矩形面積的函數(shù),它有兩個(gè)參數(shù):矩形的長(zhǎng)和矩形的寬。返回值是矩形的面積:

#include <stdio.h>

double rectangleArea(double length, double width)
{
    return length * width;
}

int main(int argc, char *argv[])
{
    printf("長(zhǎng)是 10,寬是 5 的矩形面積是 %f\n", rectangleArea(10, 5));
    printf("長(zhǎng)是 3.5,寬是 2.5 的矩形面積是 %f\n", rectangleArea(3.5, 2.5));
    printf("長(zhǎng)是 9.7,寬是 4.2 的矩形面積是 %f\n", rectangleArea(9.7, 4.2));

    return 0;
}

顯示結(jié)果:

長(zhǎng)是 10,寬是 5 的矩形面積是 50.000000
長(zhǎng)是 3.5,寬是 2.5 的矩形面積是 8.750000
長(zhǎng)是 9.7,寬是 4.2 的矩形面積是 40.740000

我們可以直接在函數(shù)里顯示 長(zhǎng),寬和計(jì)算所得的面積嗎?

當(dāng)然可以。這樣的情況下,函數(shù)就不必返回任何值了,函數(shù)計(jì)算出矩形面積,然后直接顯示在屏幕上:

#include <stdio.h>

void rectangleArea(double length, double width)
{
    double area = 0;

    area = length * width;
    printf("長(zhǎng)為 %f 寬為 %f 的矩形的面積是 %f\n", length, width, area);
}

int main(int argc, char *argv[])
{
    rectangleArea(10, 5);
    rectangleArea(3.5, 2.5);
    rectangleArea(9.7, 4.2);

    return 0;
}

我們可以看到,printf 函數(shù)在函數(shù)體內(nèi)被調(diào)用,顯示的結(jié)果和之前把 printf 放在 main 函數(shù)里是一樣的。只不過(guò)我們用的方法不一樣罷了。

菜單


還記得之前的課程中菜單的那個(gè)例子嗎?(“皇上,您還記得大明湖畔的夏雨荷么?”)

這次我們用自定義的函數(shù)來(lái)重寫(xiě)一次,會(huì)更詳細(xì)和優(yōu)化:

#include <stdio.h>

int menu()
{
    int choice = 0;

    while (choice < 1 || choice > 4)
    {
        printf("菜單 :\n");
        printf("1 : 北京烤鴨\n");
        printf("2 : 麻婆豆腐\n");
        printf("3 : 魚(yú)香肉絲\n");
        printf("4 : 剁椒魚(yú)頭\n");
        printf("您的選擇是 ? ");
        scanf("%d", &choice);
    }

    return choice;
}

int main(int argc, char *argv[])
{
    switch (menu())
    {
        case 1:
            printf("您點(diǎn)了北京烤鴨\n");
            break;
        case 2:
            printf("您點(diǎn)了麻婆豆腐\n");
            break;
        case 3:
            printf("您點(diǎn)了魚(yú)香肉絲\n");
            break;
        case 4:
            printf("您點(diǎn)了剁椒魚(yú)頭\n");
            break;
    }

    return 0;
}

這個(gè)程序還可以改進(jìn):

你可以在用戶(hù)輸入一個(gè)錯(cuò)誤的數(shù)字時(shí)顯示一個(gè)錯(cuò)誤信息,而不是直接繼續(xù)讓其點(diǎn)單。

4. 總結(jié)


  1. 函數(shù)之間可以互相調(diào)用,因此 main 函數(shù)可以調(diào)用 C語(yǔ)言系統(tǒng)定義好的函數(shù),例如 scanf 和 printf 等,也可以調(diào)用我們自己定義的函數(shù)。

  2. 一個(gè)函數(shù)接受一些變量作為輸入,我們將其稱(chēng)為函數(shù)的參數(shù)(也有空(void)參數(shù)的函數(shù))。

  3. 函數(shù)會(huì)用這些參數(shù)來(lái)做一系列的操作,之后會(huì)用 return 返回一個(gè)值(也有無(wú)返回值的函數(shù))。

5. 第一部分練習(xí)題預(yù)告


今天的課就到這里,一起加油吧!

下一課:C語(yǔ)言探索之旅 | 第一部分練習(xí)題

下一課我們來(lái)做一些幫助鞏固知識(shí)點(diǎn)的練習(xí)題吧!


我是 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營(yíng)者,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者。
熱愛(ài)生活,喜歡游泳,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容