>> [音乐播放]
戴维·J·马兰：好吧。
这是CS50，这 是2周的开始。
所以，让我们开始今天的错误。
当然是一个错误，是一个 错误的程序，
你会得到很 熟悉这个概念
如果你从来没有编 前。 pset0现在PSET1。
但是，让我们考虑的东西 一点简单的在第一。
这个程序在这里，我 扔一块儿了，
我说这应该打印 10星用printf在屏幕上，
但它显然Buggy在某种方式。
>> 由于规范 它应该打印10分，
但它并不明显，什么 你会宣称是错误吗？
是吗？
所以，这是一个关闭一个错误， 和你是什么意思？
行。
优秀的。
因此，我们已经指定了 开始的零值，因为我，
我们已经指定了10的n值， 但我们使用小于或等于。
其原因，这是二 字符，并且不只是一个符号
就像在数学书， 是你没有
表达的一种方式 一个字符等效的。
>> 因此，这意味着小于，但 如果你从零开始计数，
但你算一路 透过和等于10，
你当然要去的 算上11事总。
所以你要打印11星。
那么，什么可能是这个修复？
是吗？
>> 因此，只要调整比较少 或等于刚小于，
这里面的，我要求，或许 另一种解决方案，也。
什么可能，否则你做什么？
是吗？
>> 所以启动它等于1，且 离开大于或等于以下。
坦率地说，我会要求 ，对于一个典型的人，
这可能是更直接的。
从1开始计数， 经过10计数。
从本质上讲做你的意思。
>> 但实际情况是在 编程，正如我们所看到的，
计算机科学家和程序员 一般都从零开始计数。
因此，这是一次精品 你要去适应它。
你的情况一般会 是这样的不足。
所以，一个简​​单的逻辑 的错误，我们现在可以
修复并最终重新编译 这一点，得到的只是10。
>> 以及怎么样在这里这个bug？
在这里，再一次，我要求我有 打印10 stars--的目标
每行这段时间的，但事实并非如此。
之前我们提出什么 该修复程序，这是什么
打印的视觉，如果我是编译 并运行这个程序，你觉得呢？
是吗？
>> 星。
因此，所有的星星 同一条线路是我听到的，
，然后换行字符。
所以让我们尝试。
因此，让越野车-1，输入， 我看到了铿锵的命令
我们谈到了最后一次。
./buggy-1，而事实上我看到的所有10位明星 上，即使我要求在同一行
在我的标准只是一个注释之上 我打算做一元的代码
线。
但是，这看起来是对的。
>> 现在，第15行它看起来像我 打印一个明星，然后行16
它看起来像我打印 新行字符，
和他们俩都是这么缩进 我是清楚的循环里面。
所以我不应该做的明星，新的 行，明星，新的生产线，明星，新的生产线？
是吗？
>> 是啊，不像语言类 Python的，如果你是熟悉，
压痕不 不管到计算机。
它只关系到人类。
所以，在这里，而我发明线 15 16--，看起来很美，
但计算机不关心。
计算机在乎 实际上有大括号
围绕这些代码行。
>> 因此，它的clear--就像在 Scratch--那些两行代码
应该被执行。
像那些黄色的划痕难题1 件再，再而三。
>> 所以，现在如果我重新运行该 program-- ./buggy-2--嗯。
我现在有一个错误。
什么我忘了怎么办？
是啊，所以我没有编译它。
因此，让越野车-2。
因为我没有没有这样的文件 实际编译的第二个版本。
所以，现在有趣 未声明的变量 - 不是2。
我们正在做的1。
让越野车，1-- ./buggy-1--现在 其中的每一种在同一行上。
>> 现在有一个例外 我的这个假设索赔
你需要这些大括号。
当实际上是OK--如果你 注意到，在部分或textbooks--
省略大括号？
是吗？
>> 没错。
当只有一个 行代码，你
要与相关的 环路中的第一实施例。
这是完全合法的 省略花括号
就像那种方便的 从编译器给你。
是吗？
这个问题问得好。
这是否算是一种风格的错误？
我们会promote--在CS50 风格指南，网址为这
在pset1--总是 使用花括号。
当然，如果你是新来编程。
现实情况是我们不 要禁止你
在做这些的便利。
但如果你刚开 事物的摇摆，
绝对只是一直用花 牙套，直到你得到它的窍门。
这个问题问得好。
>> 好吧。
使当时的错误。
至少在一些相当简单的。
然而，你可能会认为这 是相当简陋的，对不对？
这是排序第一周 看着语言
像，看到你的错误在其中。
但现实是这些 实际上代表
一些很可怕的问题 可能出现在真实世界中。
>> 所以，有些人可能还记得 如果你遵循科技新闻，
或者甚至抓 这个二月的风
过去这一年，苹果已经对 在内部监督办公室做了一点错误，
在操作系统上 他们的电话，并且还
的Mac OS，操作系统 在他们的台式机和笔记本电脑。
而你看到这样的头条新闻，因为这。
此后，苹果 答应来修复这个bug，
并很快做了修复它在iOS中， 但最终固定在它的Mac OS
为好。
>> 现在，所有这些头条实在孤独 揭示了什么潜在的问题是，
但这个错误最终被减少到 在SSL中的一个bug，安全套接字层。
而且长话短说， 这是软件
我们的浏览器和其他 用软件做什么？
>> 如果我说，SSL是 参与，只要你
参观以https开头的URL， 那么什么样的SSL可能涉及到？
加密。
因此，我们将讨论 这在未来的日子里。
加密的艺术 扰码信息。
>> 不过长话短说，苹果 前一段时间做了一个错误
在实施SSL，则对 软件，最终实现
如HTTPS或最大的网址 连接也有。
其结果是，你的 连接可能潜在地
被截获。
和你的联系十分 不一定加密
如果你有一些坏家伙之间 你和目标网站谁
知道如何利用这一点。
>> 现在，苹果最终发布 一种用于此修复最后，
和描述 他们修复了这一点。
安全可靠的运输无法验证 连接的可靠性。
这个问题是由处理 恢复丢失的验证步骤。
>> 所以这是一个很有一手波浪的解释 对于简单的说，我们搞砸了。
从字面上有1 那是bug的代码行
在他们的SSL实现，并 如果你去网上搜索这个
你其实可以找到 原来的源代码。
举例来说，这是一个屏幕截图 只是一个相当大的文件的一部分，
但是这是一个很明显的功能称为 SSL验证签名的服务器密钥交换。
它采用了一堆 参数和输入。
而且我们不会把重点 太多的细节在那里，
但如果你专注于里面的代码 在最上面的函数 - 让我们的
放大了。
你可能已经怀疑 什么样的错误可能
甚至，如果你不知道 最终你要找什么样的。
有一种异常的 在这里，这是什么？
>> 是的，我真的不喜欢 两转到了一下失败。
坦白说，我真的不知道该怎么转到 失败的方法，但有两个人
背靠背。
那种只是蹭到了我 理智上走错了路，
而事实上，如果我们放大 只是那些线条，这是C。
>> 所以很多苹果的代码 本身是用C写的，
这显然​​是 真是equivalent--
不是那个漂亮的压痕 版本，但如果你承认这个事实
那有没有花括号，是什么 苹果真的写的是看起来代码
像这样。
所以我已经缩小了，我只是 固定在这个意义上的压痕
如果没有大括号，即 第二页转到失败那是在黄
将要执行的无论什么。
它没有关联 如果条件上面。
>> 因此，即使再次，如果你不是很 明白这可能可能
是干什么的，知道每种 条件 - 每个行
是一个非常重要的步骤 在检查的过程
如果您的数据实际上是加密的。
所以跳过这些中的一个 步骤，不是最好的主意。
>> 但是因为我们有这个 黄第二的goto失败，
因为一旦我们 那种美感
它移动到左边的地方 在逻辑上是目前，是什么
这是否意味着该行 以下是第二页转到代码
失败，你会想到什么？
它总是会被跳过。
所以goto方法是在一般不赞成 对于原因，我们也不会真的去成，
而其实在CS50，我们往往不 教这一说法跳转，
但你能想到的后藤 失败的意思去跳
在代码的其它部分。
>> 换句话说跳过 最后一行共，
所以这个愚蠢的结果 简单的错误，只是
大概有人的结果 复制并粘贴1太
多次的是，在整个 的iOS和Mac OS的安全性
是很容易被截获 坏家伙相当长的一段时间。
直到苹果最终解决了这个问题。
>> 现在，如果你们中的一些实际上是 运行旧版本的iOS或Mac OS中，
你可以去gotofail.com这 是一个网站，有人成立
基本上确定 编程
如果你的电脑仍然是脆弱的。
坦率地说，如果是这样， 它可能是一个好主意
更新您的手机或 您的Mac在这一点上。
但是，只要证明是多么的 这些较低层次的欣赏
细节及公平 简单的想法真的可以
转化为决策 和问题
affected--在这个case-- 数以百万计的人。
>> 现在的政府的话。
部分将于本星期日。
你会被收到一封电子邮件， 周末约部分，在这一点
切除过程 将开始，如果你已经
意识到你现在有 一些新的矛盾。
所以，这种情况每年都有，而我们 将在未来的日子容纳前来。
>> 办公室hours--做一个守 眼睛在这里时间表。
本周改变一点点， 特别是在开始时间
和位置，所以咨询 在前往上班时间前
任何在未来四年夜。
现在就评估一个字， 特别是当你潜入问题
设置一个和超越。
>> 所以每说明书中， 这些通常是
轴沿 我们评估你的工作。
范围指的是什么 程度的代码实现
所需的功能 我们的规范。
换句话说，有多少 一块一套做你咬掉。
你做了它的三分之一， 半吧，它100％。
即使是不正确的， 你有多少尝试？
以便捕获水平 的努力和量
为您咬下了 问题集中的问题。
>> Correctness--这其中，以 什么程度，是你的代码
与我们一致 规格和免费的错误。
所以它正常工作？
如果我们给它一些投入，做它 给我们，我们期待的输出？
设计 - 现在，这是第 特别是在定性的人，
或者需要人为判断的人。
事实上，这就是为什么我们有一个工作人员 这么多的教学研究员，当然
助理。
到什么程度是你的 代码写得好？
>> 而这同样是一个非常 定性评估
这将与您合作 双向的几周里。
所以，当你得到不 只有数字得分，但也
书面的分数，或键入反馈， 或书面反馈的英语单词。
这就是我们将用它来驱动你 对实际编写更好的代码。
并在演讲和节中，我们将尝试 来点out--因为我们can--经常
是什么让一个程序，不仅 正确的和功能良好，
同时也精心设计。
最有效的可能是，或 即使是最美丽也可以是。
>> 这使我们的风格。
风格最终是 审美判断。
你选择好 名称的变量？
你有没有适当的缩进你的代码？
它是否好看，因此， 是很容易让另一个人
看你们各自的 它的正确性。
>> 现在一般按教学大纲，我们得分 这些东西对一个五点量表。
让我费尽心思点 这三个确实是不错的。
很快做伙计 开始做算术。
当他们得到四分之三的 五张正确性一些PSET
他们认为该死的，我要60％ 它本质上是一个D或大肠
>> 这是没有办法的办法，我们 认为这些数字。
一个三确实不错，而我们 普遍预期在开始
这个词的是，如果你要 一堆three's--的，也许一对夫妇
展览会，一对夫妇的fours--或 一对夫妇的两岁，一对夫妇fours--的
这是一个良好的开端。
所以，只要我们看到 向上的轨迹随着时间的推移，
你在一个特别好的地方。
>> 我们使用公式 重的东西基本上是
这每教学大纲， 这只是意味着我们
给予更多的权重正确性。
因为它往往正确性 这需要的时间最多。
现在相信我。
你会find--至少 在一个pset--你
花90％的时间 处理问题的10％。
>> 和一切形式的作品 除了一个或两个错误，
而这些都是错误的 迟到让你彻夜难眠。
这些是那些 那种逃避你。
不过，睡在它之后， 或参加工作时间
或问问题网上，被 当你到了100％的目标，
这就是为什么我们重 正确之最。
设计有点少，和 款式比少一点。
但请mind--风格 也许是最简单的
这些咬掉 按风格指南。
>> 而现在，一个更严重 注意，学术诚信。
CS50拥有的不幸区别 是AD板的最大生产国
案件几乎每年都有历史。
这并不是因为学生作弊 CS50任远远超过其他类，
但因为由工作性质， 事实上，它是电子，
事实上，我们寻找它， 其实我们是计算机科学家，
我可以说，我们是不幸的 在检测是非常好的。
>> 那么这意味着什么实质？
所以，按照教学大纲， 课程的理念
确实归结为是合理的。
之间有此线 做一个人的工作，在自己的
并获得一点点 从朋友合理的帮助下，
和彻底的做这件工作你 朋友，或者送他（她）你的代码
因此，他或她可以简单地 采取或借用它的权利。
和横交线 我们在课堂上画。
>> 你看，教学大纲 最终的行
我们画的是合理的 不合理的行为，
但它确实熬 下到实质
你的工作需要，以 是你到底自己。
现在，随着中说， 有一种启发式。
因为你可能imagine-- 从办公时间和视觉效果
和影片，我们已经 由此显示far-- CS50
的确意味着是作为协作 并为合作和社会
越好。
由于协作，因为它是严格的。
>> 但是，与此说，启发式， 您将在教学大纲看，
是，你有一些问题的时候。
你必须在你的代码中的一些错误，你 解决不了，这是合理的你
展现你的代码给别人。
有朋友甚至在课堂上，一个朋友 坐在办公室时间在你旁边，
或工作人员中的一员。
但他们可能不是他们的代码给你看。
>> 换句话说，一个 回答你的question--
我需要帮助 - 是不是哦，这是我的代码。
看看这个和 从中推断出你的意愿。
当然，现在，有 办法明确，以游戏
这个制度，我会告诉你 我有一个问题，之前的代码。
您能告诉我，我的代码 之前，有一个问题。
但再次看到教学大纲为 的这条线是精细度。
>> 只是现在画的图片， 分享尽可能透明
在这里我们是在近年来 这是AD板的个案数目
该CS50拥有超过 在过去的七年。
有14个情况下，这最新的秋季。
在所涉及的学生而言， 这是一些20多名学生
过去的这个秋天。
有33峰 学生在几年前。
其中许多人是不幸的 这里不再在校园里。
>> 由于所涉及的百分比学生 类历史上从0％不等
到5.3％，这是唯一的说 每年，这是一个挑战。
而为了实现这一目标，有什么 我们想要做的是传达1
我们dd--只是FYI--在比较 公平性，以谁的学生
在下面的相应行。
我们做的比较全电流 提交对所有过去的任务
从过去的许多年。
>> 我们也知道如何围绕谷歌 并找到代码库
在网上，论坛 在线招聘网站在线。
如果一个学生能找到它，就一定能够 发现它就像我们遗憾地做。
所以，你会在看大纲 虽然这是遗憾的条款。
我可以肯定的 明白了，我们都有
工作人员已经做了类似课程 这一点，或者这个本身随着时间的推移，
当然知道是什么感觉时， 生活变得在当你有办法
一些深夜deadline-- 不仅在这个类中，
但another--你的时候 完全丧失，压力太大了，
拥有过多数量 其他的事情要做。
你会在某个时刻 生活中肯定是不好的，也许迟
晚上的决定。
>> 所以每教学大纲， 有这一条款，
这样，如果在72小时内作出的 一些贫穷的决定，你自己到它
并伸出手给我， 的过程中的一个头
我们会好好聊聊。
我们会处理事情 在内部的希望
它变得更加的 教学时刻或生命的教训，
而不是用 特别厉害的后果
你可能对这些图表在这里看到。
>> 所以这是一个非常严肃的口气。
让我们停下来只有几 秒打破了紧张局势。
>> [音乐播放]
>> 戴维·J·马兰：好吧， 因此，如何是一个SEGUE？
今天的主要话题。
其中第一个是抽象。
另外，其中将要成为 数据，其中坦白的表示
是说如何在真干，才能 去解决问题和思考
对解决问题？
所以，你看到的划痕，而且你已经 用C见过也许已经在PSET1
你不仅可以使用 函数，如printf，
其他人在 过去几年里为你写的。
您也可以编写自己的函数。
>> 而且即使你可能没有 C语言中PSET1做到了这一点，并坦言
你并不真的需要写你 自己的功能，因为problem--
而或许是艰巨的 第一glance--你会看到
可最终被解决 不是所有的多行代码。
但随着中说，在条件 编写自己的功能，
意识到ç确实给 你这种能力。
>> 我要进去了今天的源代码， 它可已在网上，
而我要继续前进，开 一个调用的函数0.C程序，
和在功能零 我们会看到一些东西。
在通过第18行 23是我的主要功能。
而现在，我们正在开始阅读 我们不是写在飞行中的代码，
而是我已经写了提前 或者你在一个问题集
可能会收到有 被预先写入。
一个很好的方式开始 阅读别人的代码
为寻找主要功能。
找出其中的条目 点是要运行的程序，
然后从那里跟随它在逻辑上。
>> 所以，这个方案显然版画 你的名字后面加上冒号。
然后，我们使用的GetString 从CS50库
得到一个字符串，或一个单词或词组 从设置在键盘的用户。
再有就是这个 事情这里 - PrintName。
>> 现在PrintName不是 功能自带的三
这不是标准的io.h.
这不是在CS50.h.
这是相当在同一个文件。
请注意，如果我向下滚动 àbit--线25 27--
它的评论只是一个漂亮的方式 用星星和斜线你的代码。
这是一个多行 评价，而这仅仅是
我的蓝色说明 这个函数的作用是什么。
>> 由于线28到31， 我写了一个超级简单的功能
他的名字是PrintName。
这需要多少 论证会说什么？
因此，人们argument--，因为有一 参数括号内上市。
它的类型为String。
这是说PrintName 是这样的黑盒子
或函数，它接受 输入一个字符串。
>> 而该字符串的名称 方便地将名称。
不是S，而不是N，但名称。
那么什么是PrintName办？
这是不错的简单。
正如一行代码 中的printf，但显然它
打印出“你好，”某某。
凡某某 来自说法。
>> 现在，这是不是在这里一个巨大的创新。
说真的，我已经采取了一个程序，可以 已被写入同一个代码行
通过把这个在这里， 并改变了它的东西
这涉及到一些六，七左右 代码行一路下来这里。
>> 但它的执业 原则被称为抽象。
一种封装的新内 函数，有一个名字，更好地
但这个名字从字面上 称它做什么。
我的意思是printf--这不是 尤其是描述性的。
如果我想创建一个 拼图，或者如果我
要创建一个函数 在打印一个人的名字，
这样的美 是，我实际上可以
给该函数的名称 这说明它的作用。
>> 现在只需要在输入该 我随便叫的名字，
但同样是精彩的描述 而不是被多一点
一般像S。和 无效，现在，只表示
这个函数不 把我带回点什么。
它不喜欢的GetString的 从字面上递给我回一个字符串
就像我们用纸片做 上周你的同学，
而是它只是有一个副作用。
它打印的东西在屏幕上。
>> 所以在一天结束时，如果我 不要让功能-0，./function-0，
我们会看到，它要求我的名字。
I型大卫，这类型的我的名字。
如果我再这样做了罗布， 它会说“你好，罗布。”
因此，一个简单的想法，但也许 从这个推断精神
随着你的计划得到 稍微复杂一点，
你想写一大块 代码和调用代码 - 调用
该代码 - 一些描述 名称如PrintName，
C那样被提供给我们这种能力。
>> 这里还有一个简单的例子。
举例来说，如果我打开了一个 从今天呼吁return.c文件，
请注意我在这里所做的。
大部分的主要功能是printf的。
我第一次随意初始化 变量名为x为数字2。
然后，我打印出来的“X现在 ％I“传递x的值。
所以，我只是说那是什么。
>> 现在，我只是大胆 自称与printf的。
我魔方的值x，我 通过调用一个函数这样做
所谓的魔方传球 在x作为参数，
然后将输出保存 在变量X本身来说。
所以我重挫x的值。
我重写 X带的什么价值
调用的结果 这个立方体功能。
然后，我只是打印出一些 毛绒绒的东西在这里说，我所做的。
>> 那么，什么话是立方体？
注意什么是根本 这里不同。
我已经给了函数 一个名字和以前一样。
我指定一个名称的参数。
这一次，这就是所谓的n，而不是名称， 但我可以把它叫做什么是我想要的。
但是，这是不同的。
这个东西在左边。
以前是什么样的关键字？
男生。
现在，这显然INT。
>> 那么，什么是可能的带走？
之类的，而无效表示 虚无，这是事实。
PrintName返回任何内容。
它做了什么，但 它没有把我背
东西，我可以把上 等号的左边
就像我在这里的第22行完成。
>> 所以，如果我说成线30， 那是什么可能暗示
什么魔方确实给我吗？
是吗？
它返回一个整数。
因此，递给我回来了，为 例如，一张纸
在其撰写的答案。
2立方，或3立方，或4个 cubed--不管我传递，
而我怎么实现呢？
那么，就n次n次Ñ 就是我怎么可能多维数据集中的值。
如此反复，超级简单 的想法，但示范
现在我们怎么能写功能 实际上我们有背
这可能是感兴趣的值。
>> 让我们来看看最后一个例子 这里所谓的功能之一。
在这个例子中，它启动 以获得更引人注目。
因此，在功能之一，这 program--最终通知
调用一个名为GetPositiveInt功能。
GetPositiveInt不是 在CS50库函数，
但我们决定我们 希望它存在。
>> 因此，如果我们在后面的文件中向下滚动， 请注意我是如何去落实有关
得到正整数，而我 说这是更引人注目
因为这是一个体面的 代码的行数。
这不只是一个愚蠢的 小玩具程序。
它实际上有一些错误检查 并做一些更有用。
>> 所以，如果你从来没见过的演练 影片我们已经嵌入在PSET1，
知道，这是一种类型的 循环在C中，在精神上类似于
对各种事情划痕可以做。
做说做到这一点。
打印出来。
然后继续前进，让N-- 得到一个整数，并将其存储在N，
并保持一而再，再而这样做 再次，只要n是小于1。
>> 因此n是将要小于一 只有在人的不配合。
如果他或她打字 在0或-1或-50，
这个环是要保持 执行一遍又一遍。
最终发现，我 简单的返回值。
所以，现在我们有一个函数 这会一直很好
如果CS50将实施 CS50.h和CS50.c你，
但在这里，我们现在可以 实现这个自己。
>> 但在一些关键的细节两点意见。
埃德蒙顿为什么我宣布INT N，你认为，第29行
而不是仅仅做 这这里，这是
用更一致 我们上周做？
是吗？
一个好的想法。
所以，如果我们把它 在这里，就好像我们
继续一次又一次地宣布它。
这本身是 没有问题的，本身
因为我们只需要 的值一次，然后
我们将得到一个新的反正。
但一个好的想法。
是吗？
>> 关闭。
所以，因为我已经声明氮对 第29行的循环外，
这是整个访问 这整个功能。
没有其他的功能，因为 n是仍然这些卷曲的内
牙套这里。
So--肯定。
>> 没错。
因此，这更是给了点。
如果我们不是声明 n右此间线32条，
这是有问题的，因为猜测 还有什么地方我需要访问它？
上线34和 拇指简单的规则就是
你只能使用一个变量 最近的大括号内
在你宣称它。
>> 不幸的是，34行 是一条线为时已晚，
因为我已经关闭 第33行的大括号
对应于该 大括号上线30。
所以这是一个跟你说 这个变量int的作用范围，
可以这么说，只有内 这些大括号。
它只是没有人以外的存在。
>> 所以，事实上，如果我这样做 错了，让我保存代码
因为它is--正确书写。
让我继续前进，不要让 函数-1，和notice--错误。
使用未声明的标识符的n 在第35行，也就是在这里。
如果我们向上滚动 进一步，另一个。
使用未申报 标识符氮对线34。
>> 所以编译器，锵， 已经注意到，它只是
即使不存在 显然它的存在视觉。
因此，一个简单的解决方法是宣布它在那里。
>> 现在让我来滚动 该文件的顶部。
什么跳出你的 是有一点不同
从东西，我们看了上周？
不仅我的名字，不仅做到 我有一些尖锐，包括向上顶，
我有一些我 调用的原型。
现在，这看起来非常像什么 我们只是看到了刚才的第27行。
>> 因此，让我们从不同的推断 错误信息，为什么我这样做。
让我继续前进， 删除这些行那里。
因此，我们一无所知的原型。
重拍此文件。
使功能之一。
而现在，该死的，四个错误。
让我们向上滚动到第一个。
>> 函数隐式声明 得到肯定int是在C99无效。
C99仅仅意味着1999年 版本的语言的
C，这就是我们的确使用。
所以，这是什么意思？
以及C--更具体ç compilers--是非常愚蠢的计划。
他们只知道你做了什么 告诉他们，这是
实际上专题较上周。
>> 问题是，如果我去 有关实施的名字在这里，
而我所说的被调用的函数 GetPositiveInt这里线20条，
该功能在技术上不 存在，直到编译器看到27行。
不幸的是，编译器是 做事前，下，左，右，
所以，因为它没有看到 实施GetPositiveInt的，
但是看到你尝试 在这里使用它，
它只是要bail--骂 你有一个错误message--也许
隐蔽，并且实际上不 编译文件。
>> 因此，所谓的原型了 这是无可否认的是多余的。
从字面上看，我去了这里，我抄 贴这个，我把它在这里。
虚空会比较合适，所以我们 从字面上复制，这一次粘贴。
我简直复制和粘贴它。
真的只是因为像面包屑。
>> 有一点线索编译器。
我不知道这是什么呢 然而，但我看好你
它会存在也说不定。
这就是为什么这个line--中 行16--以分号结束。
它是多余的设计。
是吗？
>> 如果没有你的链接库 到the--哦，好问题。
夏普包含头文件包含。
需要be--应该差不多 总是在最高层
对于similar--的文件 正是由于同样的原因，是的。
因为在标准 IO.H是名副其实的行
像这样，但用的字的printf和 其参数和返回类型。
所以做犀利包括了 在这里，你是什么字面上做
是复制和粘贴的内容 别人的东西写了上面。
从而cluing代码到 事实上，这些功能确实存在。
是吗？
>> 当然可以。
所以有一个非常聪明和正确的 解决办法是，你知道吗？
我不知道什么是 原型是的，但我知道
如果我知道，C是刚 哑和反思从上到下。
好了，让我们给它想要的东西。
让我们来削减该代码，粘贴起来 顶了，现在主要推楼下。
这也将解决这个问题。
>> 但是你可以很容易地拿出 一个场景，其中A需要调用B，
也许B调用回答：这 一些所谓的递归，
我们会回来的。
它可能是也可能不是一个好 的事情，但你绝对可以
打破这种溶液。
>> 而且，我会 声称曲风，
尤其是当你的程序 成为这个漫长而漫长，
它只是超方便 把主要的顶部
因为它的东西最 程序员要关心。
因此，这是一个有点清洁， 可以说，这样做的方式
我本来就 与原型甚至
虽然它看起来有点 多余的第一眼。
是吗？
对不起，你可以说它更响亮？
>> 如果开关的位置 实施和原型？
所以这是一个很好的问题。
如果重新申报下来 在这里，让我们看看会发生什么。
所以，如果我把这个降 在这里，你说的。
哦，对不起。
再大一点？
更响。
哦，好问题。
难道失效的功能？
你知道，毕竟这些年来，我 从来没有把原型之后。
因此，让我们做制作功能 - 1 以后这样做。
>> [嘀咕]
戴维·J·马兰：哦，等等。
我们还是得把一切都往上顶。
因此，让我们做到这一点在这里，如果我 正确理解你的问题。
我把一切，包括 上述主要原型，
但我把原型 下面的执行。
>> 所以，如果我做一个，我越来越 回一个error--未使用的变量n。
哦，还有。
谢谢。
让我们来看看，我们摆脱了这一点。
这是一个不同的错误， 所以让我们忽略了这一点。
让我们真的很快重拍这个。
>> 好了，数据的说法不 使用格式字符串
N--哦，那是因为 我改变了这些在这里。
好吧，我们知道答案是什么 会to--没事，我们开始吧。
嗯，谢谢你的肯定。
好吧，我会解决这个问题的代码 after--忽视这个特殊的bug
因为这was--它的工作原理就是答案。
>> 因此，它不会覆盖 你刚刚完成的。
我怀疑编译器 被写入以这样的方式
它无视你的原型 因为身体，可以这么说，
的功能有已 已经实施了较高。
我会以实际咨询 编译器的手册
以了解是否有任何其他 言下之意，但乍一看
只是尝试和实验， 似乎有任何影响。
这个问题问得好。
>> 现在让我们锐意进取，动 远离副作用
是函数，这样做 视觉上的printf在屏幕上，
但不返回值。
和功能有回报 像我们价值观刚才看到几个。
我们已经看到的范围这个概念， 我们会一次又一次地看到这一点。
但是现在，再次， 用经验法则
一个变量只能用于 的最近打开里面
与封闭的大括号，因为我们 在那个特殊的例子中看到。
>> 正如你所指出的， 有一个ability--
你能解决其中的一些问题 通过将全局变量
在文件的最上方。
但在几乎所有情况下 我们看不惯的是，
而事实上，即使不走 到了现在的解决方案。
因此，现在的外卖是， 变量的作用域这个概念。
>> 但是，现在让我们来看看另一个 实际上是在寻找干地
在一些非常有趣的 实施细则。
我们怎么可能代表的信息。
我们已经看了这 在类的第一个星期。
纵观二进制文件，并 提醒小数的自己。
>> 但是从上周还记得C有 不同的数据类型和多束，
但最有用的 现在可能是这些。
一个CHAR或字符，这恰好 是一个字节或8位总。
这就是说，尺寸 一个char的仅仅是一个字节。
一个字节是8比特，所以这意味着 我们可以代表多少个字符。
多少个字母或 键盘上的符号
如果我们有一个字节或8位。
回想零一周。
如果你有8位， 多少总价值
可以代表与 零和一的模式？
埃德蒙顿不止于此。
所以，如果你总256 从零开始计数。
所以，如果你有八个bits--所以如果我们 再有我们的二进制泡在这里，
我们可以把这些灯泡上 和关闭在任何256个独特的图案。
>> 现在，这是有点问题的。
没有那么多的英语， 浪漫的语言，但可以肯定
当你介绍，为 例如，亚洲语言，这
比喜欢更符号 26个英文字母。
实际上，我们可能需要 大于一个字节以上。
幸好在 近年来社会
使用采用了其它标准 每次充电多于一个字节。
>> 不过，现在在C中，默认 仅仅是一个字节或8位。
一个整数，同时，在4 字节，否则称为32位。
这意味着什么是最大的可能 数，我们可以用一个int代表
显然？
有十亿。
所以它的四大十亿给予或采取。
2至第32的功率，如果我们 不承担任何负数
而只使用一切积极 号，这四个十亿
给予或采取可能性。
浮点型，同时，在不同类型的 数据类型C.它仍然是一个数目，
但它是一个实数。
东西带小数点。
而事实证明， C也可以用四个字节
来表示浮点值。
>> 不幸的是有多少浮动 点值是存在的世界？
多少个实数有哪些？
有一个无限 号，并为这一问题
有一个整数无限次数。
所以我们种已 在这里自己挖一个洞。
由此显然computers--在 用C写的关于他们 - 至少计划
只能算作高 four十亿而奋斗，
和浮点值 只能明显
有一定的精度有限的。
只有这么多位数后 他们的小数点。
>> 因为，当然，如果 你只有32位，
我不知道我们要如何去 代表真正的numbers--可能
与不同类型的图案。
但是有一定的有限 这样的图案的数目，
所以在这里也一样，这是有问题的。
>> 现在我们可以稍微避免此问题。
如果您不使用浮动， 你可以使用一个双
在C中，它给你八个字节，这 是零的方式更可能的模式
及的。
但它仍然是有限的，这是怎么回事 如果你写的软件有问题
图形或花哨 数学公式。
所以，你可能真的想 以计数大于。
长long--愚蠢named-- 也是8个字节或64位，
这是两次只要一个int， 它是一个长整型值。
>> 玩转fact--如果一个int是4个字节， 多久是一个长期在C中一般？
另外四个字节，但 长长的8个字节，
这是由于历史原因。
>> 但现在的外卖 就是这样的数据有
在computer--这是可以代表 与电物理设备，
它一般驾驶 这些零和ones--
同的精度有限的量。
那么，有什么问题呢？
>> 那么有一个问题 的整数溢出。
不只是在C，但在 电脑一般。
例如，如果此 是一个字节值得一bit--
因此，如果这是8 bit--所有 这些都是一等一的。
什么号码是这 较，如果我们假设
它是二进制的所有正面的价值观？
>> 255，这不是256，因为 零是最小的数字。
所以255是最高的 之一，但问题
是假设，我想 增加此变量
，以8位总 如果我要增加它。
>> 好吧，只要我添加 一到所有的这些的，
你或许可以想像visually--刚 就像拿着一个用decimals--
有什么地方要流向左侧。
事实上，如果我加号 一到这一点，什么在二进制情况
是，它溢出回零。
>> 所以，如果你只use--不是一个整数， 但一个字节数的整数
在程序中，只要default-- 你到了250，251，252，253，254，
255-- 0 255来后， 这可能不是什么
用户会期望。
>> 现在同时在浮点运算的世界， 你也有类似的问题。
没有那么多的大number-- 虽然这仍然是一个问题。
但随着精度的量 你可以代表。
因此，让我们来看看这个例子 这里也从今天的源代码 -
浮法0.c。
>> 并注意到这是一个超级 简单的程序，
显然应该打印出什么样的价值？
那你打赌这是怎么回事打印 即使有一点新的语法
在这里吗？
所以希望0.1。
这样的十分之一，相当于 因为我在做1除以10。
我存储的答案 在一个变量称为F。
该变量是float类型，哪 就是我刚才提出了一个关键字存在。
>> 我们还没有看到过，但 这是一种简洁的方式在printf中
指定多少个数字，你 希望以后小数点看到的。
所以，这个符号的意思只是 这里是一个占位符。
这是一个浮点 值了，呵呵，顺便说一下，
小数点与表现出来 小数点后一个数字。
所以这是数 的显著数字，
可以这么说，你可能想要的。
>> 因此，让我继续做 使浮球-0，./float-0，
显然1除以10是0.0。
现在，这是为什么？
>> 好了，电脑正在 我从字面上看，我已经写了1
我写的10，并以此来猜测什么 对于这两个假定的数据类型
值？
一个int，它在技术上 东西有点不同。
这通常是一个漫长的，但它 最终的积分值。
不是一个浮点值。
>> 这是说，如果这 是一个int，这是一个int，
的问题是，计算机 不具有的能力
即使存储小数点。
所以当你做1分 10使用整数
对于这两种分子和 分母，答案应该是0.1。
但computer--因为 这些都是integers--
不知道做什么用的0.1。
>> 那么，什么是很清楚在做什么？
它只是把它扔了， 而我所看到的最终
0.0只是因为我坚持 printf的告诉我小数点后一位数。
但问题是，如果 由一个整数除以一个整数，
你会被定义get-- 的C--的整数。
而且它不会做 东西不错，方便
像圆起来的 最近的一个向上或向下。
这将截断 小数点后的一切。
>> 所以只是凭直觉， 什么可能是一个修复？
什么是这里的简单的解决办法？
是吗？
没错。
为什么我们不把这些作为 有效浮点值
把他们变成浮筒或双打。
现在，如果我这样做让花车-0， 或者，如果我编译的花车-1，
这是相同的 什么只是建议。
现在我做花车-0，现在我得到我的0.1。
>> 现在，这是惊人的。
但现在我该怎么办 东西有点不同。
我很好奇，想看看什么是真正 正在进行的引擎盖下面，
我要去把它打印出来 出到28位小数。
我想真正看到 0.1000--的infinite--
在0.1之后[听不清] 27零。
>> 那么让我们来看看这是 我确实得到。
请彩车-0相同的文件。
./floats-0。
让我们放大了戏剧性的答案。
这一切的时候，你一直在思考 1除以10为10％，或0.1。
它不是。
至少到目前为止为 电脑的关注。
>> 现在why--确定，这是完整的 谎言1除以10是0.1。
但why--即不 外卖今天。
那么，为什么在电脑认为， 不像我们大家在房间里，
即1除以10是 实际上是疯狂的价值？
什么是电脑做显然是？
那是什么？
>> 它不会溢出，本身。
溢出通常是当 您环绕的值。
这是这个问题的不精确 在浮点值
在你只有32 或者甚至64位。
但是，如果有一个无限 实numbers--数
带小数点的数字 和数字thereafter--肯定
你不能代表所有的人。
所以电脑给 我们最接近的匹配
到的值可以表示使用该 很多位，其实我想要的值，
这是0.1。
>> 不幸的是，如果 开始做数学，或者你
开始涉及这些类型的浮动 在重要的programs--点值
财务软件， 军用软件 - 什么
其中知觉 可能是非常重要的。
而你开始添加 这样的数字，并且开始
运行软件 与真正的大投入
或大量的时间和地段 年天或大量的，
这些小小的失误 一定可以积少成多随着时间的推移。
>> 现在，顺便说一句，如果你曾经 看过超人3或办公空间
你可能还记得 如何将这些家伙偷了
大量的资金从他们的计算机 使用浮点值
并加入了少许 余，希望那部电影
现在更有意义。
这是他们 暗指在那部电影。
事实上，最 公司不会看
在一定次数后， 小数位，
但这些都是仙分数。
所以，你开始增加起来， 你开始赚了很多钱
在您的银行帐户。
这就是办公空间解释。
>> 现在，不幸的是超越 办公空间，有
有一些令人不安的合法 和显著影响
这些种的 基本的设计决策，
的原因，事实上1 我们使用C语言在使用过程中
是这样，你真的有这个理由 最多的电脑如何工作的了解，
软件是如何工作的，并没有 拿任何东西是理所当然的。
>> 事实上不幸的是，即使有 这个基本的了解，
我们人类犯错误。
而我想我会分享的是 这八年分钟的视频在这里拍摄
从现代奇迹的插曲，这是 教育展上是如何工作的
该画两张图片 当不当使用
和谅解 浮点值
导致一些显著 不幸的结果。
让我们一起来看看。
[视频回放]
- 我们现在回到“工程 在现代奇迹灾害“。
电脑。
我们都来接受 往往令人沮丧的问题，
得到了他们 - 臭虫，病毒和 小型软件价格glitches--
支付的便利性。
但在高科技和高速 军事和航天计划的应用，
可以最小的问题 被放大成灾难。
>> 1996年6月4日，科学家准备 发动无人机阿丽亚娜5型火箭。
它携带的科学 卫星设计
建立精确的如何 地球磁场的相互作用
与太阳风。
火箭是专为 欧洲航天局，
和从它的设施升空 在法属圭亚那的海岸。
>> -at约37秒进入 飞行中，他们首先
发现了一些打算错了。
该喷嘴被旋转 在某种程度上，他们真的不应该。
大约40秒后进入飞行 明确车辆遇到了麻烦，
而当他们做的 决定摧毁它。
范围内安全官员，与 巨大的胆量，按下按钮
并炸毁了火箭，才能够 成为危害公众安全。
>> - 这是少女 阿丽亚娜5号的航程，
其破坏了 地方，因为这个安全漏洞
嵌入火箭的软件。
在-The问题 阿丽亚娜是，有
是一个数字，需要 64位来表示，
他们想转换 它以一个16位的数字。
他们假定数 永远不会很大。
大多数的这些数字中 64位数字是零。
他们错了。
>> 一-The无力 软件程序来接受
所产生的那种数 另一种是在失败的根源。
软件开发已经成为一个 的新技术非常昂贵的部分。
阿丽亚娜火箭4有 是非常成功的。
这么多的创造了软件 它也被用在阿丽亚娜5。
>> -The基本问题 这是阿丽亚娜5。
是faster--加速更快， 该软件并没有占到一点。
>> 火箭-The破坏 是一个巨大的金融灾难。
所有因分软件错误。
但是，这不是第一次 实时数据转换问题
困扰了现代火箭技术。
>> - 在1991年的开始 第一次海湾战争中，
爱国者导弹 经历了相似类型
一些转换问题。
其结果是28 people-- 28 美国soldiers--被打死，
约百人受伤。
当爱国者，这本来是 防止进入的飞毛腿导弹，
没有发射导弹。
>> - 当伊拉克入侵科威特，美国和 在1991年年初推出沙漠风暴，
爱国者导弹部署 保护沙特阿拉伯和以色列
来自伊拉克的飞毛腿导弹袭击。
爱国者是美国中程 表面 - 空气系统
由雷神公司制造。
>> 爱国者的-The大小 拦截itself--
它是关于大约20英尺长， 而它的重量约2000磅。
它承载着约弹头， 我认为这是大约150磅。
而弹头本身 高爆发力，这
有他周围的碎片。
因此，弹头的外壳是 设计为像一个大型铅弹。
>> -The导弹进行 4每个集装箱，
并通过一辆半挂车运送。
>> -The爱国者反导系统 回到现在，至少20年。
它最初的设计 作为防空导弹
击落敌方飞机。
在第一次海湾战争 当战争来了，
陆军希望用它来 击落飞毛腿导弹，不是飞机。
伊拉克空军 没有那么多的问题，
但陆军担心飞毛腿导弹。
因此，他们试图 升级爱国者。
>> -Intercepting敌人 导弹在5马赫旅行
将要被足够的挑战性。
但是，当爱国者 被送往投入服务，
军队并不知道 伊拉克修饰
使他们的飞毛腿近 不可能的。
>> - 什么事是飞毛腿的 要来的是不稳定的。
他们摇摇晃晃。
这样做的原因是Iraqis-- 为了得到600公里出
300公里的范围内missile--的 把重量从前面的弹头，
并提出了弹头更轻。
所以，现在爱国者的苦思 在飞毛腿，而大部分的时间 - 的
绝大多数的 时间 - 它只是由飞毛腿飞。
>> - 一旦爱国者系统运营商 实现了爱国者错过了目标，
他们引爆了爱国者的战斗部 为避免可能出现的人员伤亡，如果它
被允许倒在地上。
>> - 即是大多数人所看到的 在天空的大火球，
和误解成 飞毛腿弹头的拦截。
>> - 虽然在夜晚的天空，爱国者 似乎是成功地破坏
飞毛腿，在达兰可以有 不要误会，它的性能。
有爱国者的雷达系统 轨道传入飞毛腿的损失
从不因推出 一个软件缺陷。
>> 是谁最先发现的以色列人 该系统不再是上，
更大的时间差异成为。
由于嵌入式时钟 在系统的计算机。
>> - 关于前两周 悲剧发生在宰赫兰，
以色列人报 国防部
该系统是浪费时间。
经过大约八个小时 磨合，他们发现
该系统的变 明显地较不准确。
国防部回应 告诉所有的爱国者电池
不要离开系统 在很长一段时间。
他们从来不说什么了很长时间了。
8个小时，10个小时，上千小时。
没有人知道。
>> -The爱国者电池 驻扎在军营
在宰赫兰及内部缺陷 时钟已经对超过100小时
2月25日的夜晚。
>> - 它跟踪的时间精度 的约十分之一秒。
第二，现在的十分之一 是一个有趣的数字
因为它不能表示 二进制确切地说，这
意味着它不能准确地表达 在任何现代数字计算机。
很难相信，但 用这个作为一个例子。
>> 让我们数的三分之一。
三分之一不能 正是以十进制表示。
三分之一是0.333 持续了无穷大。
有没有办法做到这一点与 绝对精度的小数。
这正是这类问题 发生在爱国者。
该系统运行更长的 更糟糕的一次错误成为。
>> -after运行100小时后， 在错误的时间只有大约三分之一
第二。
但在靶向方面 导弹在5马赫旅行，
这导致跟踪 的600多米的错误。
这将是一个致命的错误 对于战士在宰赫兰。
>> - 什么事是飞毛腿发射是 通过预警卫星探测，
他们知道飞毛腿来了 在他们的大方向。
他们不知道有人来了。
这是现在到雷达 爱国者系统的组成部分
卫冕达兰定位和保持 跟踪来袭的敌方导弹。
>> -The雷达是非常聪明的。
它实际上跟踪 飞毛腿的位置
然后预测的地方 它很可能是
在下一次 雷达发出的脉冲输出。
这就是所谓的距离门。
>> - 那么一旦爱国者 决定有足够的时间具有
传递回去检查下 位置，该检测对象
它可以追溯到。
因此，当它回到了错 地方，然后看见没有对象。
并且它决定，没有任何对象。
这有一个错误的检测 它的下降轨道。
>> -The传入飞毛腿消失 从雷达屏幕上，
几秒钟后，它 撞上了军营。
飞毛腿打死28。
这是最后一个发射 在第一次海湾战争。
可悲的是，更新后的软件 抵达黎明翌日。
该软件有漏洞 是固定的，封闭
在陷入困境的一章 爱国者导弹的历史。
>> [完视频回放]
>> 戴维·J·马兰：这就是它的CS50。
我们会看到你在星期三。
>> [音乐播放]