[音乐播放] 扬声器1:好的,这是CS50, 这就是本周四开始, 正如你可能已经听说过或 看,世界已经结束。 去所有的互联网附近 已经了解和认识 在程序中,一个错误的 编程语言,称为击。 这已经奇妙的品牌 作为Shellshock,或猛砸门, 但像这些文章 尚未少见。 而事实上,很多人把 Heartbleed回的记忆, 您可能已经注意到,在 按回到过去的这个春天,这 同样是相当惊人的。 现在,那些你在这里 今天,你们有多少人有, 即使你不明白 它是所有关于,听说Shellshock吗? 没事了,你们有多少人 有那些易受攻击的计算机? 好吧,应该是远远多动手 了现在,其中的原因,我们将拭目以待。 让我们来看看什么是 在媒体一直在进行 然后解释了一下 在这里,我们在技术上。 扬声器2:安全专家 警告说,严重的缺陷可能 即将影响数百 数以百万计的全球的网络用户。 那么究竟是一直的错误 被称为Shellshock,并且它有什么作用? 好,Shellshock也被称为 Bash的错误,它利用该软件。 黑客利用病毒扫描弱势 运行Linux和Unix系统 操作系统和再感染它们。 Bash是一个命令行shell。 这使用户可以发出命令启动 在软件程序和功能 通过键入文本。 它通常由程序员, 不应该开到更广阔的世界, 虽然Shellshock改变这一点。 好吧,worringly,一些分析师 警告它可能是一个更大的威胁, 因为Shellshock允许完整 受感染机器的控制权, 而Heartbleed只允许 黑客间谍的计算机上。 它是如此严重,它的 被评为10出10 对于由国家严重性 漏洞数据库。 所有Web服务器三分之二是在 风险,包括一些Mac电脑。 好吧,请确保您 现在修补的系统。 任何人托管网站运行 受影响的操作系统 应该尽快采取行动。 任何人谁买得起它应该 他们的监控和Web应用程序 防火墙看出来的任何攻击。 扬声器3:最坏的事情 可能出现的情况是 有人会写代码, 会自动去扫描 互联网和会影响 所有的这些计算机。 而一旦他们这样做了,好了, 他们可以做的最糟糕的事情 只是删除了一切, 或关闭的网站了。 所以我们可以看到损坏 从这个角度看, 在这里我们将有恶意的人 谁刚刚决定要兴风作浪 通过将系统关闭或删除 文件和类似的东西。 扬声器2:有人说这是 最难以测量 虫子多年了,它 可能需要数周甚至数 个月,以确定它的最终影响。 扬声器1:所以这一切是真实的, 但有趣的是,几乎所有的 意象你刚才看到的, 也许除了键盘, 无关与 臭虫任何责任。 服务器和电线等, 这有点切向有关, 但在核心实际上很 熟悉的东西是怎么回事。 其实,让我进入 我们CS50设备。 让我继续前进,最大限度地 在终端窗口中点击这里。 而你们一直在用这个, 或嵌入版物, 在以写程序gedit的, 输入命令,等等, 这实际上是,具有 已经好几个星期,猛砸,B-A-S-H。 这是伯恩再次壳, 这是说只是一种奇特的方式, 这是一个程序,有一个 闪烁提示,有效, ,坐在那里等待 输入你。 而且它是命令 通过该线路接口 你们已经运行的命令和 最终编译,然后运行 程序。 但击也是一种编程 在以下意义上的语言。 你知道,有喜欢的命令 CD和LS也铛等人, 但你可以定义自己的命令 通过实施这些猛砸。 现在我们不打算 详谈了 作为来砸的编程语言,但 知道,例如,在目前, 有没有所谓的命令,“你好。” 因此可以发现 其中的一个包。 它不是安装在我的电脑上。 请询问您的管理员。 但是,如果我想在那里是一个程序 Bash或在我的提示叫“你好”, 其实我可以用的语法是 很喜欢C.它是不太一样的, 但它看起来很相似, 功能,虽然缺少一些细节。 似乎什么都没有发生, 但现在如果我输入“你好”, 你其实可以写一 方案,而不是在C中,而不是在Java中, 不以其它程序 语言,但在击本身。 现在,这里的关键是,我写的 名字我想给这个新的命令, 而括号也 象征这是一个函数。 顺便说一句,你还可以做的乐趣 的事情,而事实上,即使是在Mac OS上, 这是一个叫做终端程序。 它配备内置到任何人的 电脑有一台Mac在这个房间里, 你可以做的Mac类似的事情 操作系统,但你可以去更不止于此。 这是一个小切, 但它是一种乐趣。 今天早上我被提醒, 想通过这种时候, 一个小游戏我经常玩 与CS50的前转录因子1 因此任何时候,他会走出来 他的键盘和他的屏幕解锁, 我想执行命令 像this--“打招呼”。 现在,任何时候他回来了 键盘后,我清屏 他会坐下来, 试着做了一些工作, 列出他directory--的内容 [音频播放] - 你好。 你好。 扬声器1:那么,在公平, 这本来就不是“你好。” 这是一般的东西 更类似于that-- [音频播放] -Beep。 扬声器1:--thatìwould-- 所以他的电脑会 任何时候乱骂他,他居然 在他的键盘上坐下。 而很快,他想通了 不要离开他的屏幕解锁。 但这个建议的那种 愚蠢的乐趣,你 可以有类似猛砸。 但它是一个多一点 严重的,可以肯定的,不止于此。 而事实上,这是一 最危险和最持久的bug 这确实击中了世界全球。 这个bug已经存在了 大约20年, 你会在短短的被击中 此刻,通过相对简单。 所以这是一个代表 命令,如果你 拥有一台Mac,从字面上现在 当你有你的盖子打开, 你可以尝试输入成 程序调用终端。 终端下 应用Utilities-- 这一次,Windows用户不必 担心这个特殊threat-- 但那些你用Mac电脑可以输入 这成为一个窗口,像我在这里做的, 如果你键入 在这个程序 所谓的终端,像我现在这样, 如果您看到这个词“弱势” 你的电脑 容易受到剥削。 现在是什么的意思? 这是无可否认的 一些很疯狂的语法, 但我们至少抽出 一些有趣的方面。 因此,有一些语法看起来 有点眼熟,至少在C 和编程更普遍。 我看到一些括号, 分号,大括号,而这样, 但事实证明,这 愚蠢的事情在这里黄 本质上是一种功能 什么也不做。 结肠手段做任何事情, 分号表示停止做什么。 因此,这些内 大括号,事实 我有一个平等 登录到左边,这 本质上是创造 一个命令或一个变量, 所谓的X,然后分配 代码,黄位在那里。 这可能是像“回声 你好“或”说嘟“什么的 类似的。 但是,如果你的眼睛发现 再漫步到右侧, 有更多的这条线比 该分号刚刚结束。 “回声脆弱”,然后 除此之外,还有更多的。 另外分号时,bash - C:。 所以长话短说, 这行代码是 足以令人信服 一台电脑,是 容易被做的事情 你想要它做的事, 因为有在击即中的错误 即使猛砸应该停止 命令正确读线 后有黄色的文字, 一个20多岁的bug, 巴什实际上已读 除此之外,分号和漂亮 很多做的是什么告诉我。 那么,有什么寓意 的最终? 我刚才说的“回声你好” 或“回声脆弱,” 但如果你做了什么 实际恶意,如室射频* 你可能不 曾经输入之前, 坦率地说,你可能 不宜太快, 因为你可以做一个 很多与它的伤害。 为什么呢? RM做什么,当然? 删除。 *意味着什么? 所有。 所以这是一个所谓的 百搭卡,所以这意味着 在删除一切 当前目录。 -r恰好意味着递归, 这意味着,如果你删除了 是一个目录,并有内 是其他的文件和其他目录, 递归潜入有 并删除了这一切。 和-f是最糟糕的这一切。 任何人都知道是什么意思-f在这里? 力。 所以强制手段,甚至 如果这是一个坏主意, 做到这一点,而不会提示我 为进一步确认。 所以,你知道,我们笑 这一点,但坦率地说,我大概 键入此多次 一天,因为现实 是它的最快的方法 删除一大堆东西。 但是,即使我做了一些损害。 但是,如果你是欺骗电脑 为确定一些愚蠢的变量 或函数调用X,但随后 欺骗电脑进入执行 超出该界限 功能,超越了分号, 你确实可以欺骗计算机 进入执行类似室射频 或电邮命令 或复制命令。 凡是从字面上就可以用做 计算机,无论是删除文件, 创建文件,发送垃圾邮件的人, 远程攻击某些服务器, 如果你能表达出来 用命令 可以欺骗计算机变成这样做。 现在有什么的一个例子 你怎么可以这样做? 嗯,有很多计算机 在互联网上运行bash。 我们所有的Mac用户都在其中。 许多Linux服务器中 他们以及和Unix服务器。 Windows再次得到 相对打爆 除非你已经安装了 特殊的软件。 现在很多的服务器,为 例如,运行Web服务器, 事实上Linux的也许是 最流行的操作系统 到因特网上的计算机上运行 这是煮好的网页。 现在,我们将在后面看到 在学期中,当 您发送的请求 您browser--铬, Internet Explorer中,whatever-- 到远程服务器, 事实证明,即使 你刚才输入www.example.com, 您的浏览器发送消息 这是一个有点神秘的,是这样的。 但是请注意一点东西奇怪。 前两行 我从来没有见过的, 但他们不看 特别危险。 但是请注意,我已经偷 对于这里的第三行。 如果一个坏家伙要发送消息 像这样从他或她的计算机 一个脆弱的Mac或 脆弱的Linux服务器, 有趣的是,猛砸, 这么简单的小命令提示符下, 是无所不在的,往往是 使用基本上执行 的内容 它接收消息。 并通过这种逻辑,你可以 欺骗Web服务器,因此, 通过发送类似 用户代理,通常 应该说 您的浏览器的名称。 用户代理浏览器,用户代理上网 资源管理器的User-Agent的Firefox,这 只是你的浏览器 确定自己的方式。 但是,如果一个坏家伙很 巧妙地说,毫米毫米,我 不告诉你 什么我的浏览器, 我不是要你送这个 神秘的前瞻性的东西与室射频 *在里面,你可以从字面上欺骗 在互联网上易受攻击的Web服务器 为正是在执行 有删除的所有文件。 坦率地说,这不是 即使是最糟糕的。 你可以做任何事情。 你可以启动一个分布式 拒绝服务攻击 如果您收到此消息 Web服务器的整个串 然后让他们全部下降,为 举例来说,在Harvard.edu服务器 您可以排序爆炸 赫克了出来 通过这是一个网络流量 这个坏家伙,否则触发。 所以,长话短说,几乎 每个人都在这个房间里谁拥有一台Mac 是受到此。 的一线希望是,除非你 在笔记本电脑上运行一个Web服务器, 除非你实际配置 它允许像SSH进去, 你是真正安全的。 它是脆弱的,但没有 1试图进入你的笔记本电脑, 这样你就可以排序的放心。 不过,苹果将很快 要更新此修复程序。 Linux的世界已经发布 一些修复Fedora和Ubuntu的 和其他版本的Linux,甚至 如果您在设备上运行更新50, 即使是过会 更新和修正。 但也有不 真的是脆弱的, 因为除非你 修补了家电 并公开了你的笔记本电脑 的网络技术,这是不上访问 默认情况下,你 其实一直很好,因为 对防火墙和其他技术。 但这是一个错误的极端例子 我们已经住在字面上20 多年来,谁知道是否有人 这一切的时候已经知道这件事? 而事实上,这是一 根本的挑战 我们将在后面看到 学期有关安全, 是,就像在真实世界中, 好人都处于劣势。 为了使坏人,我们必须 确保每个门是锁着的, 每个窗口是安全的,那 每一个入口点进入家庭 是安全的,以保持坏人。 但到底是什么坏人要 这样做实际上损害你的家 从你偷的? 他或她只是要找到一个解锁 门一破窗户,还是 沿着这些线路,并且它的 同样的事情在计算机安全。 我们可以写几百万 的编程代码行 并花费数百或数千 小时好一会才正确, 但如果你做只有一个 错误的正确性, 你可以把整个系统, 实际上在这种情况下,整个互联网 与世界处于危险之中。 所以,如果你想了解更多 关于这一点,去这个网址在这里。 有没有必要采取行动 今晚,除非你 在那些比较舒服的 一直在运行自己的网站 服务器,在这种情况下,你应该, 实际上,更新您的软件。 而这也是标题 的演讲,现在的文件, 我们对所链接 当然网站今天。 它是由一个老乡 名为肯·汤普森,谁 接受了一个非常有名的 奖励在计算机科学中, 他给了这一番话有些年头 以前,基本上是在这同一主题。 问人的问题, 如果你真的 信任,最终, 软件,你已经给? 举例来说,我们都有 在写程序, 我们已经编制 他们锵。 和你的知识,你写过 任何方案CS50那里的 各种各样的后门,有一种方法 一个坏人,如果你运行的程序, 可以接管你的电脑? 或许不会,对吧? 马里奥和贪婪,以及信用。 这些都是非常小的程序。 你必须非常 如果你真的不好 使你的整个电脑易受攻击 写10个或20行代码后, 或至少​​不知道的一些 对安全的影响。 我说,开玩笑, 但我们要看到今天 而本周它的实际 真的,真的很方便 是坏的,让即使是 短节目脆弱。 但现在,至少,实现 那在这里被问的问题 即将锵的编译器。 为什么我们一直相信锵 在过去两,三个星期? 谁在说,谁写锵 没有一个“if”条件在那里 这本质上注入了一些零 和那些到每一个程序在编译 这将让他或她访问 您的电脑,当你睡着了 和你的笔记本电脑的盖子是打开的 和您的计算机运行的是? 对不对? 我们有这样的荣誉制度的权利 现在,我们相信锵是合法的。 你相信这些设备是合法的。 你相信字面上每一个程序 在您的Mac或PC上是值得信赖的。 而作为这个简单的错误提示, 即使它没有恶意, 这绝对不是 可能是这种情况。 所以,你应该害怕得要命。 坦率地说,有没有简单的 解决这个其他 不是某种社会意识 日益增加的复杂性 我们正在构建顶部 我们的电脑系统, 怎么越来越脆弱 我们很可能是。 现在,随着中说,突围。 因此,突围是设置的问题三, 突围是从昔日的游戏 你可能还记得,但 对我们的问题集3, 它使我们能够 东西回来了一个档次 所以,当我们在写程序, 即使是在这样一个终端窗口, 我们实际上可以运行,最终, 图形化程序不 不像我们有 访问的划痕。 因此,这是员工的 实现突围, 这仅仅是这种砖破 游戏中,您将您的桨回 来回,你击出的球 对这些颜色的砖块往上顶。 因此,这也给我们带来 排序回哪里 我们能够非常迅速地 有划痕的,现在用C, 实现我们自己的 图形用户界面。 但更重要的是,这 问题集代表第一 在我们给 你一串代码。 而事实上,我带来了明确的 注意这一点,因为特别是 对于那些不太舒服,这 问题集,至少第一眼看上去, 会感觉像 我们已经采取了一个档次。 因为我们已经给你, 对于一些搜索的 而在PSET排序问题, 一帮我们写的代码, 和一对夫妇的意见 该说“做” 你必须填补空白。 所以不要太吓人,但 这是第一次 我们交给你的代码,你需要 先阅读,理解,然后添加到 并完成它。 再与突破, 我们要做的是相同的, 给你几十多行 的代码,坦率地说,给你 很多框架的 本场比赛,但站短 在实施砖块 和球和挡板, 但我们实现一些其他功能。 甚至,在乍看之下,再一次, 尤其是如果不舒服, 似乎特别艰巨, 你认为有这么多的新功能 你需要用你的头脑 四周,这是真的。 但请记住,这是 很喜欢划痕。 奇怪的是,你并没有使用所有的 在拼图的划痕。 奇怪的是,你并不在乎包 周围所有的人你的心 因为所有的花是 看一眼就明白了,呵呵, 这就是我能做的 与拼图。 事实上,在问题设置 3规格,我们将向您 在文档会 给你介绍一些新的功能, 最终编程 构建你使用。 条件,循环, 变量和函数 将是相同的,以 我们已经看到迄今。 所以事实上,我们会给 你的是一些示例代码 让您创建一个窗口 看起来没有什么不同这一点, 并最终把它变成 东西很喜欢这个。 所以要CS50的优势, 讨论上班时间多, 和安慰的事实, 代码你写的金额 其实并没有那么多。 第一个挑战是只是为了适应 自己的一些代码,我们已经写了。 在pset3任何问题, Shellshock,或以其它方式? 听众:这似乎是 与突围经历 该代码是几乎 一种面向对象的风格, 但我认为C组的 面向对象的程序。 扬声器1:一个很好的问题。 因此,在翻翻 分配代码,代码 我们写了pset3, 对于那些熟悉的,它 看起来就像是一个 有点面向对象的。 简短的回答是,这是。 这是如何的近似值 使用可能做的面向对象的代码 如C语言,但它是 还是最终的程序。 有内部没有方法 变量,你会看到的。 但是,让人联想到这一点。 我们将再次看到那个功能 当我们到PHP和JavaScript 朝结束学期。 但是现在,把它想成 一个什么样的暗示来。 这个问题问得好。 好吧。 所以,归并排序是我们如何 左的东西最后一次。 和归并排序是凉 某种意义上说,它是如此之快, 至少基于所述粗略测试 我们上周所做的,比说,泡 排序,选择排序,插入排序。 什么是整洁也是刚 如何简洁和干净 你可以表达出来。 并没有说什么,这是一个上 势必对合并的运行时间 排序? 是吗? 听众:N日志N? 扬声器1:N日志N吧。 Ñ​​日志N。 我们会回来的是什么 真正的意思或者是从何而来, 但是,这是更好的 比运行时间 我们看到了泡沫 选择和插入排序? 因此n的平方。 Ñ​​平方 大于这个, 即使它不是很明显, 知道日志n是小于n, 因此,如果你做了N次 东西小于n, 这将是小于n的平方。 这是一个有点直觉的存在。 但是,我们为此付出了代价。 那是快,但一个主题,开始 上周出现了这种折衷。 我有更好的性能 一次明智的,但 我才不得不花费在其他 另一方面,为了实现呢? 听众:内存。 扬声器1:再说一遍吗? 听众:内存。 扬声器1:记忆,或 空间比较一般。 而这是不是超 很明显我们的人, 但记得,我们的志愿者 是挺身而出,并加强 回来好像有一个数组 在这里,与作为虽然有 在这里,第二个阵列 他们可以使用的,因为我们 需要的地方可合并那些人。 我们不能只是交换他们的地方。 所以,归并排序杠杆 是更多的空间,这 我们并不需要用 其它算法, 但好处是,它的速度更快。 坦率地说,在现实世界中的空间 这些days-- RAM,硬盘space-- 是价格相对便宜,所以这 并不一定是坏事。 因此,让我们快速浏览一下,有点 更有条不紊,在我们所做的事情 为什么我们说,这是N日志ñ。 因此,这里的8号和 8名志愿者,我们有最后一次。 和合并的第一件事 排序叫我们做的是什么? 听众:分两种。 扬声器1:再说一遍吗? 听众:分两种。 扬声器1:分两种,对吧。 这很容易让人想起的 电话簿鸿沟, 征服更普遍。 因此,我们看了看左半边。 再一次,我们说,排序 元件的左半 没有什么我们接下来说什么? 排序左侧的左半边 一半,这使我们能够, 两分后, 专注于四个和两个。 你如何排序的列表现在,在 大小二,使用合并排序的黄色,? 以及分成两半, 和排序的左半部分。 这是哪里的东西 有点愚蠢的简要介绍。 你如何排序的列表是的 大小为一,像这样的数字4在这里? 它的排序。 你就大功告成了。 但是你怎么排序的列表 尺寸之一,当它的两个数? 那么,同样的事情,但现在究竟是什么 第三和归并排序的关键步骤? 你必须合并左 半部和右半部。 一旦我们这样做,我们看 下午四,我们看着二人。 我们决定所有的权利, 明明2至上, 所以我们把两个在其 的地方,后面跟着四个。 现在你有一种倒带, 这就是那种特性 像合并的算法的 排序,快退在内存中。 什么是故事的下一行? 我应该把重点放在下一个? 左的右半边 一半,这是六,八。 所以,我只想通过这个步骤 无需操劳点太多。 六,八,然后六是 整理,八排序。 把它们合并起来那样, 现在下一大步 是,当然,排序由右半 该算法的第一个步骤。 因此,我们专注于一,三,七,五。 然后,我们专注于左半部。 的该左半侧,右半 即,然后合并在一个和三个。 然后右半边,则左一半 的话,那么它的右半边。 合并它,现在哪一步依然? 合并大的左半边和大 右半边,所以一去那里, 然后二,然后三天,4,然后 5,然后6,那么7,然后8。 所以,现在这是为什么最终揭示, 特别是如果n和对数多 一般而逃避你, 至少在最近的记忆? 好了,看到这个东西的高度。 我们有八个元素,而我们 除以它由两个,用两个,用两个。 所以日志基地二期八给了我们三种。 而且相信我,如果 一点点朦胧的说。 但是日志基地二期八为三, 所以我们做了合并的三层。 而当我们合并 元素,有多少个元素 没有我们看一下每个这些行吗? 一共有n个,对不对? 因为合并的顶行 即使我们这样做,是零碎的, 我们最终感动了每一个数字一次。 和第二行中,以 合并大小两个的名单, 我们不得不接触的每个元素一次。 然后在这里真的 清楚的最后一行中, 我们必须相互接触那些 元素一次,但只有一次, 所以就在这里,那么,我们的n logñ。 而现在只是为了让事情变得 更正式的就一下,如果你 是目前分析这 在一种更高层次 并尝试决定,以及如何 也许你去表达 该算法的运行时间 只是看着它,而不是 通过使用一个人为的例子吗? 那么,多少时间,你会说 步骤是这样的黄色会采取, 如果n <2的回报? 这是一个什么样的大O? 所以,我看到一个,所以一步到位, 也许两个步骤,因为它是,如果 然后返回,但它的 固定的时间,对不对? 所以我们说的O(1),这是 我以后怎么表达这一点。 T,只是运行时间。 n是输入的大小, 因此T(n)的,只是一种奇特的方式 的说法运行 大小为n的时间给定的输入 将是在顺序上 的恒定时间,在O(1)。 但除此之外,这个怎么样? 你会如何​​表达 运行这个黄线的时间呢? 什么T' 有种你可以欺骗这里 周期性地回答我的问题。 因此,如果在运行时间 一般我们只说是T(N)。 现在你种撑船这里 他说,好了,只是排序的左半部分, 然后排序的右半​​部分。 怎么可能,我们象征性地代表 此黄色线的运行时间? 什么T' 什么是输入的大小? Ñ​​了两个。 为什么不让我说? 然后,这是另一个T(N / 2),然后 再次,如果我合并两个排序的一半, 有多少个元素我要去 有触摸总? ñ。 所以,我可以表达这一点, 仅仅是种幻想, 如在一般的运行时间。 T(n)为T(N / 2)的仅有的运行时间, 加T(N / 2),左半部和右半部, 加为O(n),这可能是n步, 但也许,如果我用两个手指, 它的两倍多 步,但它是线性的。 这步一定数目 这是n倍, 因此,我们可以表达这是这一点。 而这正是现在我们要踢的 回到我们的高中数学教科书 我们认为最终的复发 最终这等于n次日志N, 如果你真的这样做了 数学更正式。 所以,这只是两种观点。 一个数字用 硬编码的有代表性的例子 用八个数字,更 总体来看,我们是如何到达那里。 但是,什么是真正有趣的在这里 是再次循环这个概念。 我不使用for循环。 我有点确定 事情的本身而言, 不仅与此 数学函数, 而且在此伪代码方面。 这个伪代码是递归 在其两个线 基本上是告诉它去 用自身来解决小 较小尺寸的问题, 然后连连 又一次,直到我们消减它 下降到这个所谓的基本情况。 因此,让我们实际绘制一个更引人注目 外卖从这个如下。 让我进入gedit的,并采取 看看今天的一些源代码, 尤其是这个例子在这里。 西格玛0,这显然增加了 数字1到n。 因此,让我们看看有什么熟悉的 和不熟悉的位置。 首先,我们有几个 包括,所以没有什么新的存在。 原型。 我在一点点朦胧 这之后的几天里, 但没有我们说什么 样机的功能是? 听众:[听不清]。 扬声器1:那是什么? 听众:我们公布。 扬声器1:我们公布。 那么,你是教锵,嘿嘿, 没有真正落实这事, 但地方在这个文件中,据推测, 将要被调用什么函数? 西格玛。 而这仅仅是一个承诺, 它会是这样的。 这将需要一个整数作为 input--,我可以更明确 说INTÑ - 并且它的 会返回一个int, 但分号手段,毫米,我会避开 要实现这一稍晚。 再次,锵是哑巴。 它一定会知道 顶你告诉它底部, 所以我们需要至少给 是一个什么样的暗示来。 现在,让我们来看看主这里 让我们在这里向下滚动并 看到主在做什么。 这并不是说很长的函数,而 其实这里的结构很熟悉。 我宣布变量n,然后 我一再纠缠用户 使用调用getInt正整数, 和唯一的出口退出此循环 一旦用户已遵从。 这样做虽然,我们已经用 纠缠以这种方式给用户。 现在,这是有趣的。 我宣布所谓的int“的答案。” 我给它的返回值 一个所谓的功能“西格玛”。 我不知道做什么呢,但 我记得刚才宣布的。 然后我通过在 值,用户在键入N, 然后我就报了答案。 那么让我们来回滚 只是一瞬间。 让我们继续在这个目录中,使 适马0,实际上运行该程序 看看会发生什么。 所以,如果我继续运行 这个程序,./sigma-0, 我输入一个正 就像两个整数,适马, 作为希腊象征意味,只是 要由添加了所有的数 零上最多两个。 所以,0加1加2。 所以这应该有希望给我3。 这一切都在做。 同样,如果我跑这又 我给这三个数, 这是3加2,所以这 5,加1应该给我6。 然后,如果我真的疯了, 开始输入更大的数字, 它应该给我 越来越大的款项。 因此,仅此而已。 那么什么是六西格玛是什么样子? 嗯,这是非常简单的。 这是我们如何可能实现 这在过去的几个星期。 “INT”将是返回类型。 西格玛是名字,它以 可变米替代N。 我顶改变了。 然后,这仅仅是一个全面的检查。 我们会在某一时刻明白。 现在,我宣布另一个变量, 总之,初始化为零。 然后,我有这样的For循环 迭代,显然是为了清楚起见, 从i = 1上长达一个= M,这是 不管用户输入的,然后我 增加这样的总和。 然后返回的总和。 于是几个问题。 一,我要求我的意见,这 避免了一个无限循环的风险。 为什么会传递一个负数 诱发潜在的,无限循环? 听众:你永远也做不到米。 扬声器1:永远达不到米。 但米传入,让我们 考虑一个简单的例子。 如果m是由通过在 用户为负一。 无论主。 主要保护我们免受 这个也一样,所以我只是 是真的有肛 适马也确保 该输入不能为负值。 因此,如果m是否定的, 像负一。 有什么事情发生? 好吧,我是要 得到初始化为1, 然后我将是 小于或等于m? 支持。 这was--我们不要, 让尼克斯这个故事。 我没有问这个问题,因为 ,我影射的风险 是不会发生的,因为我是 总是会更大than--确定, 我收起了这个问题。 行。 让我们只专注于这部分在这里。 为什么我的一些声明 循环之外? 上线49我已经通知 í宣布在循环里面, 但网上48我已经 宣布一些外部。 是啊。 听众:[听不清]。 扬声器1:当然。 所以,首先我当然不 要声明和初始化总和 到的零内 环上的每个迭代中, 因为这显然打败 总结数的目的。 我会不断变化 值回零。 还有,什么是另一个更神秘的 原因是同样的设计决定? 是啊。 听众:[听不清]。 扬声器1:没错。 我想外面访问 中环过上什么线? 53。 而根据我们的经验法则 从一对夫妇的讲座前, 变量的作用域,说真的,到 大括号,涵盖他们。 所以,如果我不内声明的总和 这些外花括号, 在第53行,我不能使用它。 换句话说,如果我宣布 在这里,或者甚至在总和 For循环,我不能访问它的53。 该变量将有效地去了。 所以有几个原因在那里。 但现在,让我们回到 看看会发生什么。 因此适马被调用。 它增加了1加2或1加2 加3,然后将返回值, 它存储在回答,这里的printf 所以我看到在屏幕上。 所以,这就是我们称之为迭代 方法,即迭代只 意味着使用一个循环。 for循环中,While循环中,DO WHILE 环路,只需再次做某事 一次又一次。 不过,西格玛是一种整齐的功能 我可以有不同的实现它。 那么这一点,这 仅仅是种很酷, 让我真正摆脱 很多分心的 因为这个功能 是很简单的。 让我们来消减下来只 其四芯线 和摆脱所有的 意见及大括号。 这是怎样的一个令人兴奋的 另一种实现。 好吧,也许不是令人兴奋的, 但它是一种性感,没事的, 看看这如此多的更简洁。 只有四行代码, 我第一次有这种全面的检查。 如果m小于或等于 为零,标准差是没有意义的。 它不仅应该在 这种情况下为正数, 所以我只是要 返回零随意 所以,我们至少有 某些所谓的基本情况。 但这里的美景。 这种思想的全部,加上 从1数到n,m或在这种情况下, 可以通过一种推卸责任的完成。 那么,什么是1到m的总和? 那么,你知道吗? 这是相同的m的总和 加1〜m减1的总和。 嗯,你知道吗? 什么是m减1西格马? 好吧,如果你种按照此 在逻辑上,这是一样的m减1 加上m减2倍标准差。 所以,你可以种只是 - 这就好比,如果你只是 试图惹恼朋友 他们问你一个问题, 你种一个问题作出回应, 种你可以保持互相推诿。 但是,什么是关键的是,如果你继续 使问题越来越小 小,你 不是问什么是六西格玛 n的什么的西格玛 N,什么是n个西格玛? 你问什么 n个西格玛,什么是六西格玛 正减1,什么是正减去2倍标准差? 最终,你的问题 将会变成什么样? 什么是一个或西格马 零,一些非常小的值, 而只要你 得到,你的朋友, 你是不是要问 再次同样的问题, 你只是会说,哦,这是零。 我们就大功告成了玩这种 愚蠢的循环游戏。 因此,递归是编程的行为 函数调用自身。 这个程序,编译和运行的时候,是 要表现完全相同的方式, 但什么是关键的是,内 一个名为西格玛功能, 有一行代码,其中 我们调用我们自己, 一般来说,这是不好的。 举例来说,如果我有什么第一 编撰了这本,所以请sigma-- 使西格玛1 ./sigma-1。 正整数,请50 1275。 那么,什么功能似乎 是基于一个试验中,正确的。 但如果我得到一点点危险 和删除所谓碱的情况下, 而只是说,好吧,我只是做 这比它更复杂的。 让我们只计算西格玛 通过取米,然后加 在米减一西格玛? 那么,什么会发生在这里? 让我们缩小。 让我们重新编译程序, 保存,重新编译程序, 然后准备./sigma-1放大, 进入正整数,请50。 你们有多少人愿意 以明说看到吗? 行。 因此,这可能发生在 由于多种原因, 坦白地说,本周我们 约给你更多的人。 但在这种情况下,尝试 向后推理 什么可能在这里发生了什么? 分段错误,我们所说的最后 时间,是指内存的段。 坏事发生。 但究竟是什么 机械的偏差去 在这里,因为我的去除 的即所谓的碱的情况下, 在我返回一个硬编码的值? 你觉得哪里出了问题? 是啊。 听众:[听不清]。 扬声器1:嗯。 这个问题问得好。 如此数量的大小 我是总结 有这么大,它超过了 的存储器空间的大小。 想法很好,但没有从根本上 会导致崩溃。 这可能会导致整数溢出, 其中位刚刚空翻多 然后我们误以为一个真正的大 像负数数, 但本身并不会导致崩溃。 因为底了 一天一个int仍然是32位。 你不会 不小心偷了第33位。 但一个好的想法。 是啊。 听众:[听不清]。 扬声器1:本方法 从来没有停止运行, 而事实上它再次调用自身 一次又一次又一次 并且再次,与没有 这些功能不断 完成,因为他们唯一的行 码一再呼吁自理 又一遍。 什么是真正 这里发生的,现在我们 种可以得出这样的图示方式。 让我去了一个 图片只是一瞬间。 这是一个图片,那 最终将充实 在更多的细节,这是怎么回事 在你的计算机内存。 而事实证明,在 这幅画的底部 一种叫做堆栈。 这是一大块 内存的RAM块, 这只是用于任何时间 一个函数被调用。 任何时候你,程序员, 调用一个函数, 操作系统,如 的Mac OS,Windows或Linux中, 抓起一串字节,也许是 几KB,也许几兆 内存,递上 给你,然后让 您使用的是运行你的函数 任何变量,你需要的。 如果你再调用另一个 功能与其它功能, 你的内存另一片 和记忆另一片。 事实上,如果这些绿色托盘 从安嫩伯格代表内存, 这里就是发生在第一 一次调用函数标准差。 这就像把一盘这样的 什么是最初一个空栈。 不过,如果该纸盘 自称,可以这么说, 调用另一个实例 适马的,这是 像询问操作系统, 哦,需要多一点的内存, 给我。 然后它就会在上面堆。 但是,什么是这里的关键是, 第一盘仍然存在, 因为他援引这第二盘。 现在同时,SIGMA适马打电话, 这就像要求更多的内存。 被堆在了这里。 适马适马称,这是另一个 托盘被堆在这里。 如果你继续这样做, 最终,种地图这种视觉 该排行榜,什么事情 发生与该堆托盘? 它是将超过的量 内存您的计算机。 而一旦这个绿色托盘 超过水平线 上面的堆栈和上面那个字堆, 我们会回来的,在未来, 这是一件坏事。 堆是不同的 内存部分, 如果你让这些 盘桩与桩, 你要超越 你自己的部分记忆, 和程序确实要崩溃。 现在,顺便说一句,这个想法 递归的,因此 可以清楚地导致的问题,但 它不一定是坏事。 由于考虑后, 总之,how--,也许 这需要一些时间来 - 如何以优雅的或者多​​么简单 在实施六西格玛的了。 而且我们不打算使用 递归的CS50所有的东西, 但在CS51,真是任何类 在那里你操作的数据结构 如树或家谱, 有一些层级 这是超级,超级有用。 现在,作为一个一旁,让你 作为有抱负的计算机科学家 熟悉一些谷歌的了 里面的笑话,如果你去谷歌 你查查是什么 中,定义说,递归,进入。 嗯。 顺便说一句,我拉了几下。 这是像10分钟 拖沓今天早上。 如果你也是谷歌“歪”的通知 通过倾斜你的头slightly-- 然后这个人是可能 最残暴的是 既然有人喜欢花 他们一天执行本 几年ago--来吧。 哦,wait--这是一个错误。 因此,对一个运行 世界上最大的网站 这些愚蠢的小彩蛋。 他们可能消耗 代码的行数平凡 只是让我们可以有 小乐这样的事情。 但至少现在你 其中的一些内部笑话。 现在,让我们来看看一些 善意的谎言,我们一直叫晚, 并开始剥离回 一些技术上层 让你真正了解 什么是怎么回事 你能理解 一些威胁, 像Shellshock,那 现在已经开始成为 在每个人的前列 注意,至少在媒体。 因此,这里是一个非常简单的功能 不返回任何内容无效。 它的名字是交换。 它需要在两个变量 它没有返回值。 把A和B。 因此,一个快速演示。 我们把这些了。 我们不妨取一点 打破这里只是一瞬间 并有一个小东西喝。 如果有人不介意加盟 我在这里只是一瞬间。 你怎么样了枣红色的衬衫? 上来吧。 只是一个今天。 谢谢你,虽然。 好吧,我们有 来了谁在这里? 你叫什么名字? 扬声器4:劳拉。 扬声器1:劳拉。 上来吧。 所以劳拉,今天很简单的挑战。 很高兴见到哟。 好吧。 因此,我们有一些牛奶在这里 我们有一些橙汁在这里 有的杯子,我们 从安嫩伯格今天借来的。 扬声器4:借来的。 扬声器1:而且要继续前进 给你的这半杯。 好吧。 我们会给你一半 一杯牛奶。 呵呵,只是这样就可以 还记得这是什么样子, 我还记得带 这和今天。 好。 如果你不介意的话,让我们来看看,我们 可以把他们交给自己的眼镜 如果你想。 这将是从劳拉眼中的世界。 好吧。 所以你的目标,考虑到两杯 液体此处,牛奶和橙汁, 被交换两个内容,这样 橙汁进入牛奶杯 和牛奶进入 橙汁一杯。 扬声器4:我得再来一杯? 扬声器1:我很高兴你问,但 这本来是更好的素材 如果你没有问。 但是,是的,我们可以为您提供三分之一 杯那是当然的空白。 好吧。 因此,交换的内容在那里。 很不错。 挺好。 你这样做非常仔细。 和第三步。 好吧。 优秀的。 热烈的掌声中 将是很好的劳拉。 好吧。 我们有一点点临别礼物 你,但让我把这些。 太谢谢你了。 因此,一个简单的例子,不过, 证明,如果你做 想交换的内容 两个容器中, 还是让我们称他们为变量, 你需要一些临时存储 在这样阶段的内容之一。 你实际上可以做交换。 所以事实上,这个源代码在这里在 C是代表正是中。 如果橙汁是和牛奶 是B,我们想交换两个, 你可以尝试一些创造性的工作 通过倾一方转换成另一方, 但是这可能不会 结束特别好。 因此,我们采用了第三杯,通话 它TMP,T-M-P按照惯例, 放的内容 辛普森在那,然后换一个杯子, 然后把辛普森进入 原盅,从而 实现,正是因为 劳拉那样,交换。 因此,让我们这样做。 让我继续前进,开 了一个例子,是 其实所谓的“无 交换,“因为这不是 因为只是照你的想象。 所以这个计划,请注意 我使用的是stdio.h中,我们的老朋友。 我有原型 用于交换在那里,这 指其实施的 可能向下跌破, 让我们看看这个主 程序会为我做。 我第一次申报诠释x变 之一,诠释y得到两张。 因此,认为那些是辛普森的 和牛奶分别。 然后,我只是有一个 printf的话说,x是该 和y是这样的,只是让我可以 直观地看到发生了什么事情。 然后,我的printf自称 那我换了两下, 然后我打印出 声称他们交换, 我再次打印出x和y。 这样下来在这里互换是 正是劳拉做了, 我们看到了什么 刚才的画面。 因此,让我们继续前进, 大失所望。 毫无互换,并运行没有掉, 在输出放大在这里。 输入x为1,y为2,交换交换。 x是静止1,且y是静止2。 因此,即使坦白地说,这看起来 一模一样,虽然技术上更, 什么劳拉一样,似乎并没有工作。 那么,为什么会这样呢? 嗯,事实证明,当 我们写这样的程序 同时具有主,在这里强调, 然后另外一个功能,如交换, 在这里强调,这 它调用的世界 看起来有点像 这些托盘刚才。 当主第一次被调用, 这就像问操作系统 在任何地方一点点记忆 如x和y的主要有变量, 他们最终在那里。 但是,如果主电话交换和主 通过交换两个参数a和b, 橙汁和牛奶,不喜欢 递给了橙汁和牛奶 劳拉。 什么是电脑呢,就是它 经过橙汁的副本 牛奶劳拉和副本,从而使 什么是最终这盘内 为值1和2,或OJ 以及它们的牛奶,但副本, 所以,在这一点 在故事中,有 是辛普森和牛奶中的每一个托盘。 有一个和两 在每个这些托盘, 和交换功能确实工作。 它的内部交换他们 第二最上面的托盘的, 但该交换没有任何影响。 并根据只是一些 我们已经基本原理 谈到前,确实 短短的几个小时前,有什么 或许可以解释为什么改变 A和B交换内 对x和y的任何影响,即使 我通过x和y的调剂功能。 什么是这里的关键词 可以简单地解释一下吗? 我想我在这里听到了吗? 听众:返回。 扬声器1:回报? 不归。 让我们一起去另一个。 那是什么? 听众:[听不清]。 扬声器1:好了,return--我们可以 做复出之作中的故事, 但还有一个更简单的解释。 听众:适用范围。 扬声器1:适用范围。 我带的范围。 所以范围,记得在哪里 我们的x和y的声明。 他们中声明 的主力右在这里。 a和b,同时,有 有效申报 掉在里面,不是很 大括号,但仍 在交换的一般地区。 所以实际上,A和B 仅此托盘中存在 从安嫩伯格,这个 代码的第二块。 因此,我们确实改变了副本,但 这不是真的那么有用。 因此,让我们一起来看看 这个低一点的水平。 我要回去到 在源目录, 而我要第一 放大这里,只是 确认我在这 更大的终端窗口, 该程序的行为仍然这样。 现在假设这 是不是故意的。 很明显,我想互换 工作,所以感觉就像一个错误。 现在我可以开始添加 很多的printf的我的代码, 这里打印出倍过,Y在 在这里,在这里,B在这里。 但坦率地说,这可能是什么 你已经做了几个星期的 现在,在办公时间 而在家里工作时, 在pset时试图找到一些错误。 但是你会看到,如果你还没有, 这个问题设置3为您介绍 一个叫做GDB命令, 其中GDB,GNU调试器, 有自己一大堆 的功能,实际上可以 让我们了解的情况 像这样的,但更令人信服, 解决问题和发现的bug。 所以,我要做到这一点。 相反./noswap的,我不是 要运行GDB ./noswap。 换句话说,我要执行我的 程序不是在Bash中,我们的新朋友 今天。 我要我跑 节目noswap内 这个所谓的其他程序 广发行,这是一个调试器,它 是的,旨在帮助计划 你们人类找到并删除错误。 所以,如果我打在这里运行,有 文字的残暴量 你真的从来没有阅读。 它本质上是一种干扰 从提示, 我会打控制-L 起床,在那里的顶部。 这是GDB的提示。 如果我想现在运行这个程序, 作为今天的这个小小抄 幻灯片显示,润是第一 命令,我们打算引进。 我只是要输入 跑起来这里的GDB内, 而事实上它跑了我的计划。 现在有一些额外的 像这样的屏幕的输出 但是这GDB只是被肛 并告诉我们发生了什么事情。 你真的不担心 这些细节现在。 但是,什么是真正酷的 GDB的,如果我这样做again-- 控制-L清除screen--让我走 进取,键入“破为主,”因此, 当我按下Enter键,设置什么 所谓的noswap.c一个破发点, 线16,这是其中GDB 想通了,我的计划实际上 是,我的功能实际上是。 为此,我们将忽略现在 但是这是地址 在存储器具体的该功能。 所以,现在当我键入run, 发现什么是酷在这里。 我的程序违反的线I 对广发行在暂停执行。 所以,我不必改变现在我的代码, 加一些printf的年代,重新编译,重新运行 它,改变,添加一些的printf的, 保存,重新编译,运行它。 我可以走过我的程序 在人类的速度一步一步一个脚印, 不是在英特尔内部的那种速度。 所以,现在看到这条线 出现在这里了,如果我回去 我在gedit中的程序, 请注意,这实际上是 的第一行代码。 有gedit中第16行。 有16行GDB中,甚至 虽然这黑白界面 是不是几乎一样的用户 友好的,这意味着 该线路16还没有被执行 然而,但它即将被。 所以,如果我输入打印的确 X,不是printf的,只是打印的x, 我得到了一些零假值出现, 因为X有没有被初始化。 所以我打算接下来的输入,或者,如果你 想成为幻想,只是n转到下一个。 但是当我输入下一个进入,现在 注意到它移动到第17行。 所以,从逻辑上讲,如果我执行 第16行,我现在输入打印X, 我应该怎么看? 之一。 而现在,这是无可否认的混乱。 2美元是只是一种奇特的方式,如果你 希望以后参考该数值, 你可以说“美元签两个。” 这就像一个向后引用。 但是现在,就忽视它。 有趣的是什么 等号右边。 而现在,如果我明年再次键入 和打印Y,我看到2。 我也可以开始打印 点¯x再次,​​坦白说, 如果我开始有点困惑, 我在哪里,我可以输入清单列表 ,只是看到周围的一些环境 点我其实在。 现在我可以键入 接下来,有x是1。 现在我输入下一个。 哦,y为2。 再次,它是混乱的, 因为GDB的输出 被混合用我自己的输出。 但是,如果你要记住,通过 一眼来回你的代码 或者铺设了一面 并排也许,你会 看到真的我只是 步进通过我的节目。 但是请注意,接下来会发生什么,从字面上。 这里是第22行。 让我过目一下,从而使上 23,如果我打印点¯x现在,依然之一。 如果我现在打印Y,依然之一。 所以,这不是一个有用的练习。 因此,让我们重做了。 让我回去到 顶部和类型来看一次。 和它说程序 这是正在调试 开始已经, 从头开始。 是的,让我们再次做到这一点。 而这一次,让我们做下一个, 下一步,下一步,下一步,下一步, 但现在事情变得有趣。 现在我想踏入 掉,所以我不键入下一个。 我输入的步骤,现在发现它 已经跃升我noswap.c线33。 如果我回去gedit的,什么是33行? 这是第一个实际 代码行互换的内部。 这是很好的,因为现在我可以 种闲逛,让好奇的 至于什么是真正打算在那里。 让我打印TMP。 哇。 为什么TMP有一些 疯了,假的垃圾的价值? 听众:它没有被初始化。 扬声器1:它没有被初始化。 事实上,当你运行一个程序, 你给出一大堆的记忆 由操作系统,但你 未初始化的任何值, 所以你什么位 看到这里,即使它 这个疯狂的大利空 数,只是表示 这些都是从残存 一些以前使用的内存, 即使我有没有 我需要它。 所以,现在我要继续和类型 接下来,如果我现在输入打印TMP, 我应该怎么看? 无论a的值, a是第一个参数,只是 如x是第一 东西被传递, 所以A和X应该是相同的, 所以打印TMP应打印我一个。 所以,你会在问题集中看 三是各种各样的GDB教程, 但要意识到,这是开始 看一个工具,它将真正 帮你解决问题 这样更有效。 我们最终是什么 要做到周三 在开始剥开几层 并删除了一些辅助轮。 这东西叫字符串 我们已经使用了一段时间, 我们要慢慢的把这种美丽 从你开始谈论 更多的东西esoterically 被称为字符*, 但我们要做到这一点不错, 轻轻地在第一,即使指针 因为他们是所谓的,可以做一些 如果滥用非常糟糕的事情, 通过观察从一个小粘土动画 我们的朋友尼克Parlante斯坦福 大学计算机教授 学谁放在一起这个预览 对什么样的来本周三。 [视频回放] 嘿,宾基。 醒来。 现在是时候为指针乐趣。 - 什么是什么? 了解指针? 噢,好极了! [完视频回放] 扬声器1:那等着你在星期三。 我们会看到你呢。 [视频回放] - 和现在,深层的思考, 通过Daven法纳姆。 - 为什么我们要学C? 为什么不是A +? [笑] [完视频回放]