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。