[音乐播放] 戴维·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。 我们会看到你在星期三。 [音乐播放]