DOUG LLOYD：好吧。
所以，現在讓我們來處理一個 真正的大話題，功能。
到目前為止，在使用過程中，所有的 我們一直在寫程序
已被寫入的主內。
他們是很簡單的程序。
你不需要把所有這些 分支機構和東西正在進行。
我們只要適應這一切 它裡面的主
沒有得到非常熱烈。
但是，隨著場的推移和 當你開始制定方案
獨立，他們很可能會 開始得到了很多10餘項
或15行。
你可能會得到數百或數千 行的代碼幾萬。
這真是不 那個瘋狂的思想。
因此，它可能不是一個好主意 保持所有主內。
它可以得到一個有點難以找到 你要找如果你這樣做為了什麼。
>> 幸運的是，雖然C，和幾乎 所有其他編程語言
可能與工作，允許 我們寫的功能。
而我只是要 採取快速一邊在這裡
更何況，其功能是 一個地區的計算機科學。
你會看到更多的人 多個點的過程中
如果你繼續。
哪裡有很多的 同義詞相同單詞。
因此，我們調用的函數。
但是，你也可能聽到他們 稱為程序，
或方法，尤其是，如果你曾經 做過任何面向對象的編程
before--不用擔心 如果你還沒有，不
大deal--但在 審計面向對象語言
經常調用的方法。
有時，他們正在調用的子程序。
但他們真的都指 到相同的基本思想。
>> 讓我們來看看這個想法是什麼。
什麼是功能？
好一個功能是真的 沒有什麼比一個黑盒子。
一個黑盒子，有一組零 或多個輸入和一個輸出。
因此，例如，這 可能是一個功能。
這是一種稱為FUNC函數。
它需要三個輸入的a，b，和c。
並在該黑盒子，我們 不知道到底是什麼呢，
但它處理輸入 以某種方式，然後將其
給出了一個單一的輸出，在這種情況下，Z。
現在讓它一點點 不那麼抽象，我們
可以說，也許我們 有一個調用的函數
補充說，有三個輸入A，B，和 c和處理以某種方式輸出
裡面的黑匣子 產生單一的輸出。
因此，在這種情況下，如果 添加需要3，6和7。
某處內部 添加的功能，我們會
期望他們加在一起 以產生輸出，該輸出
是3加6加7或16。
>> 同樣，你有一個調用的函數 MULT採用兩個輸入a和b，
以某種方式，例如處理它們 該函數的輸出
是兩個輸入的乘積。
這兩個輸入相乘。
圖4和5通過成為多重峰 出了事，我們預計產量
20。
為什麼我們把它叫做一個黑盒子？
那麼，如果我們不寫 自己的功能，這
我們已經做了相當多至今CS50。
我們已經看到打印樓為例，它 是我們沒有寫一個函數
我們自己，但我們用所有的時間。
如果我們不寫 該功能我們自己，
我們並不真正需要知道它是如何 引擎蓋下的實際執行。
>> 因此，例如，所述黑盒我 剛才給你看的乘法，
MULT的a，b可以是 defined--而這僅僅是
一些pseudocode--可能 定義為輸出乘以B。
有意義的，正確的。
如果我們有一個調用的函數 MULT這有兩個輸入端。
我們預期的產量將 是兩個輸入相乘，
A乘以B。
但多重峰也可以是 這樣的實施，
我們有一個計數器變量 得到MULT的內部設置為0。
隨後，我們重複此過程 b乘以一個添加到櫃檯。
舉例來說，如果我們用乘以3A 5B，我們可以說計數器設置為0，
重複五次，加3計數器。
因此，我們從0開始，然後我們做 這五次3，6，9，12，15。
這是同樣的結果。我們 仍然獲得3次5只
實施是不同的。
>> 這就是我們的意思 當我們說一個黑盒子。
這只是意味著我們真的不關心 它是如何在引擎蓋下實現的
只要輸出是我們所期望的。
事實上，這是合同的組成部分 使用功能，特別是
功能別人寫的。
行為總是會 是典型的，不可預測的
基於功能的名稱。
這就是為什麼它是真的 重要的，當你寫的函數
或者當其他人寫的 你可以使用的功能，
這些職能有 明確的，比較明顯的名字，
並且有據可查。
這是肯定的情況下， 對於像打印f函數。
>> 那麼，為什麼我們使用的功能呢？
那麼正如我剛才所說，如果我們寫 我們所有的代碼，主要裡面的東西
能得到真正麻煩的 並且非常複雜。
功能讓我們的能力 組織的事而分手
一個非常複雜的問題分解成 很多更易於管理的子部分。
功能也讓我們 簡化編碼過程。
這是一個更容易調試10 線功能與100​​線
功能或1000線功能。
如果我們只需要調試 小件的時間，
或者寫小片的時候， 這使得該編程經驗
好了很多。
相信我在那一個。
>> 最後，如果我們寫的功能我們 可重複使用的各個部分。
功能可循環使用。
它們可被用 一個程序或其他。
你已經寫 該功能，你
需要做的就是告訴程序 在哪裡可以找到該功能。
我們一直在循環使用 打印的f超過40年。
但當時只寫了一次。
非常有用的，正確的。
好的。
因此，功能是巨大的。
我們知道這一點。
現在，讓我們開始寫他們。
讓我們開始獲得 他們進入我們的節目。
為了做到這一點，在第一 我們做的事情就是聲明函數。
在聲明函數 什麼你基本上是在做
告訴編譯器， 哎，只是讓你知道，
我要編寫 後來一個函數
這裡就是它會是什麼樣子。
這樣做的原因是 因為編譯器能夠
如果做一些奇怪的事情 他們看到一組符號
他們是不熟悉的。
所以，我們只是給編譯器 抬起頭來，我創建一個函數
並且它會做到這一點。
函數聲明一般如果 你組織你的代碼的方式
其他人將能 了解和利用，
您通常希望把所有 你的函數聲明
在你的代碼的最頂部，右 你開始寫主之前。
方便，還有 一個非常標準的形式
每一個函數聲明如下。
他們都非常期待這樣的。
有三部分功能 聲明，返回類型，名稱，
和參數列表。
>> 現在，返回類型是什麼樣的 變量函數將輸出。
因此，例如，如果我們想回 分鐘前到乘法2
號碼功能，我們期待什麼，如果 我們用一個整數乘以整數
輸出將是 可能是一個整數，對吧。
乘兩個整數 在一起，你會得到一個整數。
因此，返回類型 功能將是int。
名字是你想要的 打電話給你的功能。
這可能是最重要的 函數聲明的一部分，
在功能方面。
但實際上可能是1 最重要的部分
無論在函數聲明 知道什麼實際的作用
確實。
如果你的名字你函數f和g或 H或神秘，或類似的東西，
你可能會得到 一個小絆倒努力
要記住這些函數的功能。
因此，它給重要的是你 功能的有意義的名稱。
>> 最後，參數列表 逗號分隔的列表
的全部投入到你的函數， 每個都具有一個類型和名稱。
所以，你不僅需要 指定變量是什麼類型的
該功能將輸出， 你也想​​說明
什麼類型和種類的變量 功能將被接受作為輸入。
因此，讓我們做一個例子在這裡。
就讓我們一起來看看 在一個更具體的之一。
所以這裡有一個函數的例子 聲明一個函數，
將兩個整數相加在一起。
兩個整數之和要 是一個整數為好，因為我們剛剛
討論。
這樣一來，返回類型， 這裡的綠色，將是int。
這只是告訴我們，增加兩個整數 將要在這一天結束時，
輸出或吐回 出來給我們，一個整數。
鑑於這是什麼功能呢，我們 想給它一個有意義的名字。
添加兩個整數似乎 相應的，在考慮
我們正在採取兩個整數作為輸入 並希望將它們放在一起。
這可能是一個有點繁瑣 名稱並坦言這個功能
可能是沒有必要的 因為我們有加
運營商，如果你還記得我們的 討論運營商，之前。
但是，讓我們只說為求 參數，這個功能非常有用
所以我們就叫它添加兩個整數。
最後，這個函數有兩個輸入端。
其中每一個是一個整數。
因此，我們有這個逗號 輸入分隔的列表。
現在，我們一般要 他們每個人給一個名字
以便它們可用於 內的功能。
的名稱是不是非常重要的。
>> 在這種情況下，我們並不一定 附加有任何意義。
因此，我們可以叫他們a和b。
這是完全正常。
但是，如果你發現 自己的情況
其中變量的名稱 實際上可能是重要的，
你可能想打電話給他們 東西比a和b其他
給他們更多的東西 象徵意義。
但是，在這種情況下，我們真的不 知道什麼對的功能。
我們只是想增加兩個整數。
所以我們只需要調用 這些整數a和b。
這是一個例子。
>> 你為什麼不拿第二 想想這一塊，
你會如何編寫一個函數 聲明一個函數，
將兩個浮點數？
你還記得什麼 浮點數是？
什麼將這項功能 聲明是什麼樣子？
事實上，我建議你暫停視頻 在這裡，把你需要多少時間。
想想這是什麼 函數的聲明會是什麼？
什麼會返回類型是什麼？
什麼有意義的名稱是什麼？
什麼投入呢？
那麼，為什麼你在這裡暫停視頻 並寫了一個函數聲明
因為這將成倍功能 兩個浮點數在一起。
希望你暫停視頻。
>> 因此，讓我們來看看一個例子 的一個可能的聲明。
浮法MULT 2雷亞爾浮動的x，浮法年。
兩種產品 浮點數
這還記得是怎麼我們 代表實數
或具有在C十進制值號碼， 將是一個浮點數。
當你乘一個 十進制轉換成十進制，
你可能會得到一個小數。
你想給它一個相關名稱。
將兩個實數似乎罰款。
但是，你真的可以稱之為 MULT兩個浮點數，或MULT浮動。
類似的東西，只要它 提出了一些實際的意義是什麼
這個黑盒子的打算。
再次，在這種情況下，我們不 似乎有什麼意義連接
到的名字 變量，我們正在傳遞，
所以我們只是叫他們x和y。
現在，如果你打電話給他們的東西 否則，這是完全罰款。
事實上，如果你這樣做 該聲明代替
用雙打，而不是 彩車，如果你還記得
雙打是一個不同的 的方式來更精確地
指定實數或 浮點變量。
這是完全正常了。
無論是其中的一個就可以了。
實際上，有幾個 不同的組合
辦法宣稱此功能。
但是，這是兩個非常好的。
我們聲明的函數，這是偉大的。
我們已經告訴編譯器是什麼 是，我們要怎麼做。
現在，讓我們實際寫的功能。
讓我們給它一個定義， 使裡面的黑盒子
可預測的行為發生。
事實上，我們正​​在成倍兩個實 數字加在一起，或添加號
在一起，或做不管它是什麼 我們要求我們的函數來完成。
>> 所以，事實上，讓我們嘗試並確定 將兩個實數，我們剛
談到一秒鐘前。
現在開始 函數定義
看起來幾乎一模一樣 作為一個函數聲明。
我有他們兩個在這裡。
在頂部是函數聲明， 類型，名稱，逗號隔開說法
列表中，分號。
分號表明， 這是一個函數聲明。
該函數的開始 定義看起來幾乎一模一樣
同樣，類型，名稱，逗號分隔 參數列表，別無分號，
打開大括號。
花括號，就像 我們一直在做與主，
意味著我們現在 開始確定
暗箱內發生的事情是 我們已經決定把MULT 2雷亞爾。
這是實現它的一種方式。
我們可以說，我們可以宣布一個新的 float類型叫做產品變動
並指定該變量 到值x乘以y。
然後返回產品。
這是什麼意思返回這裡。
那麼回報的方式 我們表明，是如何
我們傳遞的輸出退了出去。
所以返回的東西，是一樣的， 這是黑盒的輸出。
所以，這就是你如何做到這一點。
這裡是另一種方式來實現它。
我們可以只返回X乘以y。
x是一個浮動。
y是一個浮動。
所以x次Ÿ也是浮動。
我們甚至不需要到 創建另一個變量。
所以這是一個不同的方式來 實行完全相同的黑盒子。
>> 現在花一點時間， 再次暫停視頻，
和嘗試，並定義添加兩個整數， 這是其他函數，我們
剛才講到。
同樣在這裡，我已經把功能 報關等分號，
和開放的大括號 和封閉的捲曲
括號來表示，我們將填寫 在內容添加兩個整數，
讓我們定義的特定 行為裡面的黑盒子。
因此，暫停視頻。
並採取盡可能多的時間 你需要嘗試和定義
的實現添加兩個整數，比如 當函數輸出值，
確實如此，實際上，回 的兩個輸入端的總和。
所以，就像前面的例子， 有幾種不同的方式
你可以實現添加兩個整數。
這裡有一個。
在這裡橙色我有 只是有一些comments--
我只是增加了一些 意見指出
什麼在每一行代碼。
所以，我聲明一個變量 所謂類型為int的總和。
我說的總和等於a與b。
這就是我們實際上做 工作添加A和B一起。
我回到總和。
這是有道理的，因為 總之是一個int類型的變量。
什麼是數據類型，這 功能告訴我這是怎麼回事輸出？
詮釋。
所以我回國總和，這 是一個整型變量。
這是有道理的給予我們所 聲明和定義我們的函數
這樣做。
>> 現在，您也可以定義 該功能通過這種方式，
INT總和等於加b--跳過 第一step--然後返回總和。
現在，你可以有也 實現這種方式，
我強烈不推薦。
這是不好的風格一 的事情，真的很糟糕的設計，
但它確實，實際上工作。
如果你把這個代碼，這為int 加上糟糕的加法點C，並使用它。
它實際上確實增加 兩個整數在一起。
這是一個非常糟糕的實現 這種特定的行為。
但它確實工作。
它只是在這裡說明 我們真的不點
關心會發生什麼內 黑盒子，只要
因為它具有我們希望的輸出。
這是一個設計不當的黑盒子。
但在最後一天，但它確實 仍然輸出的a與b之和。
好的。
因此，我們聲明的函數。
而我們定義的功能。
所以，這真的很好。
現在，讓我們開始使用功能 我們已經宣布，我們已經定義。
要調用function--它實際上 漂亮easy--所有你需要做的
是它傳遞合適的參數， 該數據類型的參數
它預計，和 然後分配收益
該函數的值 和this--藉口我 -
分配一個函數的返回值 的東西正確的類型。
>> 因此，讓我們來看看 這在實踐中的文件
所謂加法器1點C，這 我在我的CS50的IDE。
因此，這裡是加法器1個點以下。
在開始的時候你看我有 我包括，一斤包括，
標準IO和CS50點小時。
然後，我有我的函數聲明。
這就是我 告訴編譯器，我
要編寫一個 函數調用添加兩個整數。
這將輸出 整型變量。
這就是這部分就在這裡什麼。
然後，我有兩個輸入給它的 和b，其各自是一個整數。
裡面的主，我詢問用戶 說輸入，給我一個整數。
而系統會提示他們忘記 int，它是一個函數，
包含在CS50庫。
而這被存儲在 X，整數變量。
>> 然後，我們提示他們輸入另一個整數。
我們得到另一個整數 並存儲y中。
然後，在這裡第28行，是 在這裡，我們讓我們的函數調用。
我們說，INT z等於 加2個整數x逗號年。
你明白為什麼這是有道理的？
x為整數變量類型和 y是一個整數類型的變量。
所以這是很好的。
有意義的什麼我們的函數 聲明在第17行的樣子。
用逗號分隔的輸入列表 預計兩個整數，a和b。
在這種情況下，我們可以調用 他們可以隨心所欲。
它只是需要兩個整數。
和x為整數，y為整數。
這一工程。
>> 我們知道，函數是怎麼回事 輸出一個整數為好。
因此，我們的存儲 函數的輸出，
添加兩個整數，在整型 變量，我們稱之為ž。
然後，我們可以說，總和 我百分之百分之和我是百分之我。
分別的x，y和z 填寫這些百分比我的。
的定義是什麼 添加兩個整數是什麼樣子？
這是很簡單的。
它是那些一個大家 剛剛看到一秒鐘前，
INT總和等於a與b的回報總和。
工作的呢？
讓我們來保存文件。
然後放在這兒我的終端 我會做加法器1，
我清楚我的屏幕。
我要放大，因為我知道， 這是一個有點難以看到。
>> 因此，我們編譯這個程序是加法器1。
因此，我們可以做點斜線加法器1。
給我一個整數，10。
給我另一個整數，20。
的10和20的總和為30。
所以我們做了一個成功的函數調用。
您可以再次運行該功能，負 10，17和的負10和17是7。
此功能。
它的行為 我們期待它。
所以，我們做了一個成功的 函數的定義，聲明，
而一個成功的函數調用。
情侶雜 關於功能點
我們結束本節之前。
回想一下我們的 數據類型的討論中，
先前，該功能 有時可以不取輸入。
如果是這樣的話，我們 聲明函數
為具有空參數列表。
你還記得什麼 最常用的功能
我們到目前為止看到的需要 一個void參數列表？
它的主要。
有時還記得那個函數 實際上並沒有輸出。
在這種情況下，我們聲明函數 為具有void返回類型。
讓我們通過結束本節 解決實踐問題。
>> 因此，這裡的佈局問題。
我要你寫一個函數 所謂有效的三角形。
這是什麼功能應該做的 是採取三個實數
代表三個的長度 一個三角形作為其參數的兩側，
或者它的參數，或者其 inputs--另一組同義詞
你可能會遇到的問題。
這應該功能 無論是輸出真或假
這取決於這三個長度 有能力作出一個三角形。
你還記得的數據類型 我們用來表示真的還是假的？
現在，你如何實現這一點？
都知道有一對夫婦 關於三角形規則
這實際上是需要了解的。
三角形只能有 兩面帶正長度。
這是有道理的。
你可能會說，真不錯。
另外要注意的 雖然，是總和
的任何長度的 三角形的兩邊
必須大於 長度的第三邊的。
這是真的。
你不能有邊1的三角形， 2和4中，例如，因為1加2
是不大於4。
因此，這些都是規則 確定是否三
輸入可以設想形成一個三角形。
因此，需要一兩分鐘 並宣布再定義
這個功能稱為有效 實際上三角形，使得其
在這裡有規定的行為。
>> 它會輸出真實的，如果這三個方面 能夠包括一個三角形，
否則為假 準備看你怎麼做？
這裡有一個實施 有效的三角形。
這不是唯一的一個。
你可能會略有不同。
但是，這一次呢，其實，有 我們期望的行為。
我們宣布我們的函數在 極頂，布爾有效的三角
浮x浮動Ÿ浮動ž。
如此反复，該功能 有三個實數
它的參數，浮動 點值的變量，
並輸出真或假 值，這是一個布爾值，召回。
所以這就是為什麼返回類型為布爾。
然後，我們定義的功能。
我們做的第一件事是檢查，以確保 所有的邊都是正的。
如果x小於或等於 為0，或如果y等於0，
或者如果z為小於或等於0， 這不可能是一個三角形。
它們不具有正面側。
因此，我們可以返回 假在這種情況下。
接下來，我們檢查以確保 每對輸入
大於第三個。
>> 所以如果x加y是少 大於或等於z，
或者如果x加z是少 大於或等於y，
或者如果y加z為小於或等於 的x，也不能有效的三角形。
因此，我們返回false了。
假設我們通過兩個檢查 雖然，那麼我們就可以返回true。
由於這三面 能夠returning--的
中創建一個有效的三角形。
就是這樣。
現在，您已經聲明和定義。
你也許可以現在 使用和調用此函數。
偉大的工作。
我是道格·勞埃德。
這是CS50。