DAVID J.马兰:这是CS50和 这是4周的开始。 而且,男孩,是大众汽车 都是因为软件的麻烦。 让我们一起来看看。 [视频回放] -Cars,最聪明的人物 在速度与激情的电影。 本周,德国汽车制造商 大众发现自己 在丑闻的中间 潜在犯罪的比例。 -Volkswagen是支撑数十亿 罚款,可能的刑事指控 它的高管,如 该公司道歉 为索具1100多万辆汽车,以 帮助它战胜排放测试。 - 某些柴油车型分别为 设计与先进的软件 即使用信息,包括 转向和车辆的位置 速度来确定赛车 进行排放检测。 该种情况下,发动机 会减少有毒物质的排放。 但车被人做了手脚旁路 当它被驱动。 排放量增加10至40 次以上可以接受的EPA水平。 [结束播放] DAVID J.马兰:所以,让我们 看看这个 看看这是怎样 可能实施 以及如何这可能会影响 这么多车这样。 所以在我的手里这里的新闻 释放由EPA--发行 环境 保护机构这 是美国的监管机构, 处理环境问题, 然后将实际 这是法律声明 短短数天前发送给大众。 因此,EPA写道,现在公开 公开,一个成熟的软件 算法的某些 大众汽车检测 当汽车发生 官方的排放测试 和原来完全排放 只在测试过程中控制上。 的有效性 这些车辆污染 排放控制设备是很大的 在所有正常行驶减少 的情况。 这导致符合汽车 在实验室或测试标准 站,但在正常操作期间 排出的氮oxides--或NOx-- 在高达40倍的标准。 由大众汽车公司生产的软件 是报价引文结束,落败的设备, 由清洁的定义 美国空气法案。 他们接着说, EPA和其他机构 发现的失利装置 后独立分析软件 研究人员在西 弗吉尼亚大学。 氮氧化物污染有利于 二氧化氮,地面臭氧, 和细小颗粒物质。 暴露于这些 污染物已被链接 具有广泛的 严重的健康影响, 包括增加哮喘 攻击等呼吸道 疾病,可以足够严重 派人到医院就诊。 暴露于臭氧和 颗粒物质还具有 过早被相关 死亡是由于呼吸相关 或心血管相关的影响。 儿童,老人,残疾人 预先存在的呼吸系统疾病 尤其在风险 这些污染物对健康的影响。 我只想是说,这是相当严重的。 让我们继续阅读 只是多一个节选 然后我们将看看 潜在影响 这在汽车的情况下。 具体而言,大众汽车 制造和安装 软件在所谓的 电子控制 module--或ECM-- 这些车辆感测 当车辆正在测试为 符合EPA排放标准。 基于各种输入,包括 方向盘的位置时,车辆 速,发动机的持续时间 操作,并且大气压力, 这些输入准确 跟踪参数 用于联邦测试程序的 对于EPA认证排放测试 的目的。 在美国环保局的排放测试, 车辆ECM软件 然其生产的软件 标准的排放结果。 在其他时候, 车辆ECM软件 跑了独立的道路 校准从而减少 的有效性 整体排放控制系统, 具体地,选择性催化 降低贫NO x的trap-- 我们将看到在某一时刻。 NO x的结果,排放 增加10至40倍的因子 上面的EPA标准的水平 根据驱动周期的类型。 那么这到底是什么意思,和 源代码的软件的运行 在大众汽车的还没有 尚未公开披露, 是,有效地,这 相当于是冥冥之中有内 大众的代码。 如果正在测试,和如果车 检测某些环境因素 像方向盘 位置或运动 或缺乏的车或 任何数量的其它因素 当前假设 是这个配方的一部分, 他们只需打开 全排放控制。 换言之,便开始 排放减少污染物。 否则,在每一个其它情况 当它不被检测为 在实验室里,他们只是不。 所以你可以简化成多 具体的伪代码的东西 像这样。 如果车轮转动,但 方向盘不是,暗示 这辆车是一些 一种转筒 但在某种 仓库正在测试中, 然后表现为 EPA想你。 否则不。 因此,让我们一起来看看 在短视频的 考虑看看哪些影响 是这实际上机械。 [视频回放] -Last周五美国环保署宣布部分 2009年之间进行大众奥迪汽车 而今年用 所谓败设备 要解决排放法规 旨在保持空气清洁。 但是,这是什么意思是什么呢? 那么,现代汽车有几十个 里面他们的计算机。 而其中的一些计算机 帮助协调功能 发动机为最佳的 同时确保性能 有没有太垃圾了 走出排气管。 他们实际上已经工作 这种方式对于现在几十年。 基本上,每一个部分 现代汽车的发动机 具有传感器或控制器 就可以了,而这些计算机 正在阅读数据数千 每秒进行调整时间 像燃料与空气的比率 那将会进入汽缸。 这些欺骗大众 和奥迪车型都是柴油车, 和柴油多了一个 真正重要的计算机 控制参数,这是 未燃燃料的去量 到排气。 现在,听起来很糟糕。 听起来并不像你想 未燃烧的燃料在进入排气。 但在一个的情况下 柴油,你有什么 所谓的NOx捕集器是一种装置,其 吸收和陷阱的氮氧化物 这是污染物会 否则进入大气中。 这NOx捕集效果 是加强与未燃烧的燃料。 所以一场失利设备是一个特殊的程序 里面的这些计算机,可以使 看起来像汽车达到排放 标准,即使它没有。 大众汽车有一个问题就烦。 它的柴油发动机被称为 获取巨大的燃油经济性, 但NOx捕集仅工作良好 当更多的燃料正被使用。 所以车子就发现, 使用这种设备的失利, 当它得到了一个排放 测试中,它会使用更多的燃料, 使NOx捕集工作做好, 排放量将被罚款。 但你得到的道路上,该装置 关闭时,你燃烧更少的燃料 但是你把高达40倍 更多的污染物进入大气。 但到底如何做 轿厢知道是 被测试的排放标准? 环保局说,这是一个复杂的 系统检查的事 像方向盘的位置, 速度快,发动机有多长时, 甚至大气压。 换句话说,有 没办法,这是意外 因为软件是 设计得非常仔细地检测 正式排放测试。 这是一些相当严重 欺骗,这就是 为什么大众在 如此严重的麻烦。 事实上,他们的CEO,马丁 文德恩,刚刚卸任。 那么接下来会发生什么? 好吧,如果你的一半万分之一 柴油捷达,甲壳虫,的高尔夫,帕萨特, 或者奥迪A3S影响, 好在是 你的车仍然是安全驾驶。 你不必把它扔掉 直到大众汽车发布召回。 但在某些时候,他们是 可能将不得不 更新你的车里面的软件。 当发生这种情况你可能 得到每罐少英里。 律师们早已摩拳擦掌 弥补集体诉讼 因此,业主可以得到补偿 在未来的某个时候。 但是,这不会 发生任何时间很快。 [结束播放] DAVID J.马兰:所以这实际上提高了 一个有趣的大局观问题 作为信任。 对? 我们每个人都有的iPhone或机器人或 东西在我们的口袋里最有可能 这些天来,或笔记本电脑 在我们圈是 发运行的软件 苹果和微软 其他公司和束。 但是我们怎么知道什么 这些软件产品都在做 实际上是什么,这些 公司表示,他们正在做什么? 举例来说,谁的 说,你每次 打个电话在您的iPhone 或Android手机或类似, ,这一电话号码也不是 被上传到一些公司的服务器 因为有些节目你已经 写的,无论是操作 系统本身喜欢的iOS或Android, 还是因为你已经下载 一些第三方应用程序 不知怎的被监听 一切你打字或 一切你实际上说。 你怎么知道的是,当 你们正在运行锵 或者让编译您 在CS50,怎么自己的软件 你认为CS50自己的员工, 由CS50库的方式, 一直没有记录每 你收到的字符串 还是地地道道你收到? 那么,你当然可以看 在东西的源代码 像CS50库, 可以看看源代码 对于Linux操作系统 在CS50 IDE中运行。 但是,一个惊人的表现 给予早在1984年 在收到的图灵奖由 已知的非常著名的计算机科学家 as--叫肯·汤普森谁 获得了图灵奖哪些 是有点计算机科学的 诺贝尔文学奖,如果你愿意, 他在一个工作 操作系统被称为 Unix的,这是在非常相似 精神,我们使用的是Linux操作系统。 他问的问题,他的 获奖感言,基本上 放下了框架 年复一年的讨论 关于信任和安全,是这样的。 应在多大程度上一个信任一个 声明一program--一块 的software--是免费的木马? 也许是信任更重要 谁写的软件的人。 而事实上,我们已经链接 该传言称,他 在接受这一奖项时,给了 在CS50网站上的80年代 在今天的讲座页。 因为你会看到什么 是,他居然给 怎么连一个相当简单的例子 编译器像锵或什么 编译器他人已经使用在过去, 如果嵌入了编译器,我们什么 自己使用是一个几乎没有 条件,基本上说, 如果您发现该代码使用 在GetString函数或调用getInt 功能,继续前进,插入 后门或木马 这样该程序 现在有一些零 和那些做一些恶意的。 记录你的所有 按键,上传数据 一些服务器,还是真的什么。 什么肯·汤普森 继续做他的谈话 是要证明,即使 您可以访问源 编译器的代码 恶意可能会做这个, 这并不重要,因为 有这种鸡与蛋 过去的许多现实 年即编译器 用于编译自己。 换句话说,一个人回来的路上时, 只好写了第一个编译器。 此后,任何时候他们已经更新 一个编译器,通过改变它的源代码, 增加功能并重新编译 对于我们这样的人使用,那么, 他们使用旧的 版本的编译器 编译新 版本的编译器。 如果你看看 在他给了谈话, 你会看到,由于 那个圆的, 你其实可以有错误或 木马嵌入软件 我们使用。 而且,即使你看 源代码的程序, 它甚至可能不是显而易见 因为挂羊头卖狗肉实际上是 在一个有些旧版本 编译器,从此便 注入威胁到我们的软件。 这仅仅是说,我们 真的不能也不应该 在我们的笔记本电脑信任的软件运行 或电话或任何数量的位。 而事实上,后来在这个学期的时候 我们开始谈论网络编程 而真正开始建设 Web应用程序自己, 我们将谈论这些 威胁和其他。 现在,你可能想知道,发现 ,有一个小小的达斯 维达的剪辑 边缘是显示有 关于大众。是否 你从来没有见过,我 认为我们应该减轻 心情,因为这是所有 很郁闷的和可怕的。 我要回头看 在超级杯2011 当一个商业用 Volkswagen--这 几乎让他们可爱的again-- 播出,第一次在电视上。 这是60秒的剪辑 我想你会喜欢。 [视频回放] [MUSIC - 题材从“星球大战”] [狗叫] [汽车启动] [结束播放] DAVID J.马兰:是的。 我只是检查。 这车是违规的名单上。 好吧。 所以我们看一些 前伪片刻。 这里是一个更大的 的伪代码段 我们已经见过几次迄今。 而让我们使用这是一个机会 现在来介绍一种新的编程 我们做技术 见算法 上周,当我们看着归并排序。 但是,让我们正式确定一下,看看如何 我们可以使用它在实际的代码, 然后我们将使用这个 技术的道路最 可能解决某些其他问题。 所以这是第一个项目之一,我们 曾经写道,尽管在伪代码。 而这是什么程序 让我们做课程 是要找到麦克·史密斯在电话簿。 同时注意在特定行8 和11有这样转到声明。 而事实上,某些 语言,C其中, 实际上确实有 声明字面上 去,让你 跳转到指定的行。 一旦因为它是一般不赞成 它可以很容易被滥用 你就可以开始你的跳跃 项目所有的地方,而不是 使用的那种 逻辑和控制流 我们已经使用迄今只 循环和条件等。 但是,我们可以简化这个算法 在伪代码如下。 相反,这种反复的 或循环的方法 我们一直走去, 回来,回到线三条, 正中下怀我们为什么不踢多 一般说,在七号线和10, 只需更换这两个 对用线, 否则,如果史密斯早 在本书中,我们将 搜索麦克在 书的左半边。 否则,如果史密斯后来在 书,在右边的搜索麦克 一半的书。 同时注意已圆。 对? 我在寻找迈克 电话簿,然后 我最终也许打 七号线或者10号线 和我的指令对自己的搜索 麦克一半的电话簿。 好了,我怎么寻找迈克? 我在中间 搜索麦克,为什么 样的,你给我转了一圈? 但是,这是因为什么是确定 情况发生的问题的大小, 写在管线7和10? 我们不只是说搜索 麦克,搜索麦克。 我们具体说了什么? 在左半边寻找他 右半边是有效 该问题的一半大小。 所以没关系,我们是那种 搞这个循环, 这种循环论证, 因为至少我们 使问题越来越小。 而最终我们将到达 即所谓的基的情况下 我们只有一个页面left-- 上周我们的志愿者 did--我们有一个页面 离开,然后我们不 要不断寻找麦克·史密斯 因为他无论是在该网页上 或者他是不是。 那么我们怎样才能实现这个想法,这个 排序圆在实际的代码吗? 好了,我们可以利用技术 该真实一般被称为递归。 我们已经看到了这个在 伪代码归并排序最后一周。 回想一下,这是 伪代码归并排序。 这可以说是比更简单 泡沫或选择或插入排序 只是在简单计 使用它可以表达出来。 但是,这是因为 我们是那种圆 他说,搜索的东西 通过再次寻找它。 但是,我们正在寻找无论是在 左半或右半 然后最终我们 合并在此情况下。 但在这里,也与 这两种类型的线条, 没有我们再次有这样的 想法递归。 而具体是什么意思, 在一个算法的上下文中, 是一个算法是递归 如果使用或调用本身。 或用C方面,一个功能是 recursive--一个调用的函数 foo是递归的,如果FOO, 某处它的源代码, 调用函数foo本身。 而这一切的话永远富不坏 是一次次给自己。 这是确定的,如果FOO最终停止,一样 归并排序,说,等一下, 如果这个问题是超 小,例如, 或者我发现他的人,我 寻找,只是返回。 不要递归,不 周期性再次调用自己。 因此,让我们一起来看看 这是如何实际工作。 所以,我要继续前进,开 在这里两个源代码示例。 其中之一称为西格玛0。 这是不是在所有 递归,但让我们 一起来看看这是什么程序做。 我已经去除了所有 从中但所有评论 对CS50的源代码 网站上有,如果你的意见 希望通过它来读取一次。 而让我们做一对夫妇 神智检查这里。 因此,在这段代码的顶部, 我们有包括CS50.h. 这是什么呢? 这里为什么是它? 在合理通俗地说。 它做什么? 是啊。 听众:所以调用getInt功能工作。 DAVID J.马兰:所以这 调用getInt功能工作。 因为这里面 文件CS50.h,这 不久的我们会看到 它的源代码方面, 有一堆的功能 declared--调用getInt,GetString的, 和一帮others--的除非 我们实际上有包括线路, 编译锵不 要知道它的存在。 而且同样适用于线 2其中int定义 printf的,这是一个功能 我们继续使用相当多。 现在,四线似乎有点时髦 因为它只是一个单行。 它有一个分号,没有卷曲 牙套,它里面没有任何代码。 但是,我们才称之为 这件事情在过去的几个星期? 是啊。 因此,一个原型。 为什么我们有一个 原型,这似乎 是有点多余 通常是因为我们平时 再次查看功能 后来在该文件中,对不对? 那么,为什么我们have--你只是 抓你的头,但我会接受它。 是啊。 听众:[听不清] 主后功能。 DAVID J.马兰:没错。 这样编译器知道你 最终确定或实施 之后,主要的功能,大概是。 所以锵最 编译器是一种​​愚蠢的 他们会只知道 你告诉他们。 如果你想使用 一个名为西格玛功能, 你最好教的编译器 它存在于提前。 现在,主本身,甚至 虽然这是一帮行, 是现在非常熟悉的希望。 它有一个do while循环 在生活中,其目的 这里显然是获得一个 从用户正整数。 而只是一味地缠着他 或她,直到他们合作。 随后在第16行我有 一个有趣的电话。 IntAnswer。 这在左手 边给了我一个Int 它可以store--称为Answer-- 这是要以存储,显然, 西格玛的返回值。 所以适马只是一个 任意但有意义的名称 我已经给一个函数 在生活中,其目的 是需要一个argument-- 我们把它叫做N的这个case-- 和刚采取这一数目的总和 再加上每一个正数的 比它小。 所以,如果我通过了2号线到 西格玛,我要加2加1 加上0--不0--这样给我3。 如果我通过在3个西格玛,我想 有3加2加1,这给了我6。 等等。 因此,它只是增加了所有的 数小于或等于它。 现在,到这里我只是去 打印出来的答案。 因此,作为一个快速的完整性检查,让我们 使六西格玛0--点斜线西格玛0-- 并让我在2型。 而我确实拿到3。 让我输入3。 我确实得到6。 如果任何人都可以快速地做数学题, 如果我做50我该怎么弄? 听众:[听不清]。 DAVID J.马兰:哦,不。 但是1275这是非常密切的。 因此,这是在做50的结果 加49加48加47加46 一路下跌至1。 所以这是所有六西格玛一样。 但是,让我们看看怎么样了 现在已经实现了。 所以到这里是函数本身。 而这似乎并不有 任何与递归呢。 事实上,我们正在使用 老派技术。 我初始化的变量称为总和 到零,然后我有一个foreloop在这里, 而我所谓的声明一个Int 我,将其设置等于1-- 虽然我可以将其设置为 零,但由于我在做加法, 谁在乎,如果是0或1。 这将没有任何效果。 所以我迭代,​​只要我是 小于或等于m,其中 是传入的参数。 然后,我只是不停 一,增量和Insight 循环的所有我做的是做总和 加等于一,这就是故意的。 我并不想这样做,在这 情况下,像总和加上加。 我想实际添加 I的电流值 这使越来越大 做大到正在运行的理货。 然后我返回总和。 所以回答得的价值总和。 然后,我把它打印出来。 因此,有一个机会,在这里, 虽然,那种简化 这段代码概念 而那种打击一个人的 介意条款 简单,即使它 需要一段时间来排序 中明白为什么这 就是在这些小例子强大。 这里是西格玛埃德蒙顿所以 第二个版本的代码。 一切都往上顶是相同的,从而 同样的故事,适用于前。 但是,现在让我们来看看 实施六西格玛的哪些 我已经削减到只有这 lines--四行代码,真的, 再加上一些大括号和空白。 但是我在做什么? 如果m小于或等于 零,我需要那种处理 该超级简单的情况。 如果你把我零或任何东西 负这只是奇怪, 我只是随意 但始终返回零。 我不希望这件事 进入一些奇怪的无限 因为负值循环。 所以,我只是说,如果你给我 小于或等于0,我回零。 但是,这是好事,因为这是 电话簿中的单页 剩下的。 我咬过一个很具体的问题, 并没有要求什么递归。 但在第31行,什么 我似乎是在做什么? 括号只是保持 事情,希望更清晰一点。 但是,所有我做的是我 返回M--什么 你的手我 - 加 M--遗憾的价值, 加为m减1西格玛的价值。 所以,这是什么意思? 如果你给我3号作为输入, 答案我想获得最终 6,因为3加2加1给了我6。 但我怎么想 如何代码运行? 我第一次打电话西格玛 我传递值3, 这等于是说了一块 纸,这里的值3 我一直在传递这是西格玛。 显然3不小于0,所以 IF条件不适用。 的人这样做。 所以,我该怎么办? 我想回到米,这是 3,加西格玛为m减1。 因此,让我跟踪了这​​一点。 我打算把这个 一张纸了。 而什么样的价值,是 清晰的,我是要通过 进入适马在这一点上的故事? 什么号码? 2,对不对? 3减1,2。 所以,我只是需要一点点 纸片在这里。 所以,现在西格玛是越来越再次调用。 我也故意放 下来,因为它是 有点像暂停 该版本的故事 因为现在我专注 对m的减1的信号。 因此,M的3,M减1,2。 因此,这里是2,我已经通过了。 2显然是不小于 0,这样的情况下不适用。 否则我回到米,这是这个 的事情,再加上西格玛还有什么价值呢? 因此,如果1--的西格玛因为m是 现在2 SO 2减1为1。 所以,现在我只值1。 我只是路过的数量 1到函数sigma-- 还是我自己这里 - 所以1显然是不 小于零,仍然不适用。 否则返回1加什么西格玛? 0。 因此,让我只记得。 我会回来以后。 现在我要继续前进,并记 向下数0,因为这是 我的论点或参数。 我顺利通过了数0 最后这个过程 只是重复自己的广告 nauseum不会停止,因为什么 我马上做一次,我看到这个0? 我回零。 所以,现在你必须倒回的故事。 如果我现在往回走的时候, 什么是最近的事 我做了,如果你是从字面上 倒带视频? 我要拿起最新的 1这给了我1加0就是1。 如果我继续倒带 故事,那将会给我 2加上该运行值,这是1。 所以这是3。 然后,我会继续后退。 当我第一次放下数量 3--所以3 + 3给了我6。 而现在,如果你倒带 视频,直到这一点, 这是很 第一个问题我问。 当传递3,什么是3西格玛? 它们也确实6的总和 所有这些纸片。 因此,如果这需要一点时间来 包装你的头脑围绕,这很好。 但认为这是一个little--它 是非常谨慎的,我叠 在彼此的顶部,这些数字。 这有点像有一个 memory--创纪录的时间, 像在视频洗涤器, 我的确可以倒带研究。 而且我们要回来 隐喻的只是一点点。 但首先,事实证明,有 很多爱好者和有趣的人, 我想,在谷歌。 会有人谁是非常 擅长谷歌搜索的头脑 上来就一会儿和 帮我寻找的东西? 非常,非常低调。 有人谁是从来没有 来之前,也许吧。 行。 是吗? 来吧。 下来吧。 你叫什么名字? SAM:山姆。 DAVID J.马兰:萨姆,下来吧。 这是相同的。 很高兴认识你。 嘿。 你过来吧。 所以,我需要你做,如果 你可以,山姆,这里是谷歌。 您可以搜索术语递归? 不要糟蹋。 现在let's--是的。 单击OK了。 更好单击。 啊,明白这一点。 没有? 行。 因此,让我们做一对夫妇的人。 与其说相关 学术在这里,但你 曾经搜查谷歌的字谜? SAM:第 DAVID J.马兰:OK。 搜索字谜,而不是递归。 怎么样歪斜。 你有没有搜索歪? 现在,这个有点困难 见但希望everything's--确定。 这只是你和我享受这个。 行。 那么最后,这个one's-- 这是一个有点歪。 现在做一个桶滚。 太好了。 好吧。 非常感谢萨姆。 干得好。 谢谢。 那么是什么在所有事情 这些愚蠢的例子吗? 因此,其实,引擎盖下 谷歌的数百万行代码 显然是一些愚蠢的IF 这本质上是条件 检查用户是否具有 键入这句话, 做一些事情,大概花了 时间的非平凡量 实施只是为了 有趣的是这种方式。 但是,这一切都沸腾 向下至罩下方。 但是,当然,递归 更的更老派 例如在那些特殊的技巧。 而且肯定有其他人在那里 同时,我们也许甚至还没有 发现只是还没有。 因此,采取一看,还是考虑 现在下面的程序, 当然抓住任何 这些对你的出路。 我要继续前进, 打开一个程序,是 要尝试交换两个值。 但在此之前,我们去那里,让我们做到这一点。 我们可以多一个获得 志愿者,我觉得呢? 你愿意做志愿者? 没有? 上来吧。 上来吧。 好吧。 所以,你的名字是什么? LAUREN:劳伦。 DAVID J.马兰:劳伦。 上来吧,劳伦。 所以劳伦正在 这里的挑战如下。 很高兴认识你。 因此,劳伦在这里有在前面 她的两个空杯子。 而且我们有一些橙色 果汁和一些牛奶 我们打​​算去 进取,做到以下几点。 我们只是要填补这个。 在这里几盎司的牛奶,让我们 补一点橙汁在这里。 而在所有的前 这些观众, 交换这些杯的两个值。 把橙汁中的奶杯 而牛奶中的橙汁杯。 你会怎样做,如果你在 家庭和能够获得其他用品? LAUREN:把它放在另一个杯中。 DAVID J.马兰:OK。 因此,让我们有一个临时的 可变的,如果我们的意愿。 现在继续前进,实现 同样的交换过程。 超好的。 我们已经把OJ到临时 变量,牛奶倒入OJ变量, 现在的临时变量 到牛奶变量。 行。 所以非常好,到目前为止完成的。 因此,原来out--认为, 想了一会儿就好了。 在这里,只是怪胎它了一下,这 将相应的C代码 我们只是执行。 我们有两个输入,a和b,这两个 我们只想说的简单是 廉政局。 并注意在这里,如果我想交换 两个变量,a和b的值, 我们的确需要一个中间人,一 临时变量,暂时杯, 到其中的倾的一个值 因此,我们有一个占位符吧。 但随后的代码正好是 作为劳伦这里实现。 现在,只是为了获得一个 有点疯狂,原来 你可以做到这一点没有 一个临时变量。 要做到这一点正确的,但是,我们要 有骗一些化学反应。 我们这里有一些额外的杯子。 所以最接近看起来 像牛奶和水perhaps-- 或牛奶和OJ--是我们有一些 水,所以我们要填补这一个 有几盎司的清水。 这可能是太多了。 是啊。 这是肯定吃不消。 保持在一秒钟。 而现在我们有油,我记得 初中化学课, 但愿它不会与水混合。 但是,它像是一种 看起来像牛奶和OJ。 所以,现在,无需使用 一个临时变量, 你可以交换这两个值? 因此,油进入水杯, 水进入油杯。 LAUREN:没有其他的杯子? DAVID J.马兰:没有其他的杯子。 而且我已经不实际 今年前测试这 所以我不知道这是否会 实际工作化学。 这是不应该发生的。 难道它的工作? 好吧。 因此,分离? 好。 现在,我们得到得到 水倒入另一个杯子。 智慧的化学浓缩可能 可能做到这一点比我强。 LAUREN:水的底部。 DAVID J.马兰:这是该water-- 什么是关键的最后一次,我们这样做。 你必须做正确的顺序。 是啊。 没关系。 所以,现在我们有油两杯。 行。 没关系。 但是,化学,如果这工作不是我 - LAUREN:这是水。 DAVID J.马兰:这主要是水。 好吧。 但是,这仍然是相同的杯子和以前一样。 所以倒它 - 尝试在那边。 行。 这是一个很好用的上课时间今天。 行。 所以,现在we--不错。 有点。 好吧。 所以非常好。 谢谢劳伦。 非常出色地完成。 所以为了使你的头脑, 这也许是东西 有,如果你喜欢CS50 ID玩, 你可以,事实上,交换两个变量 不使用临时整数。 这是相应的C代码。 如果你从过去的回忆 周三我们介绍了,如果简单地说, 一些新的运营商℃,不 有人回忆一下那个小胡萝卜 符号是,那个小三角 从键盘符号表示? 什么位运算符? 听众:EXOR。 DAVID J.马兰:EXOR。 异或。 所以,如果你想,只是为了好玩。 回家,给a和b两个任意 像任何eight--和I值 会选择八位值。 如果你有32位做到这一点, 你会很快感到厌倦。 但是,只要给一个八位 值是什么,一,二, 并给B A类似的价值。 然后使用定义 XOR从上周三, 应用该的点点滴滴,每 那些八位在每个a和b, 然后根据此代码,这样做完全。 而且这不是什么不正确 你在这里看到的屏幕上。 它确实可以归结 三XOR运算 不知何故神奇地一和 b目录都会交换职位 而不丢失任何信息。 因此,油和水的技巧是 最接近真实世界的化身 我能想到的模仿。 但它肯定更容易 使用一个临时变量, 在这里这种情况下。 而这也是一个机会说, 太,这种微优化, 作为一名计算机科学家 可以说,虽然一种乐趣 吹嘘你如何做到这一点没有 像一个额外的变量交换, 这还不是所有的说服力。 由于保存32位,如 在实际的整型的情况下, 是不是所有的吸引力 一个系统,其中上 你可能会使用几十兆 甚至更多的内存等这几天。 而事实上,当我们得到 到后来问题集 而要实现咒语 检查你会 被质疑这样做有 这是小的RAM和尽可能少 时间尽可能的 还是computer--您 有一个星期来实现 它 - 你会have--你会 面临的挑战是减少这些资源。 而这真的是唯一的 时报到本学期 在那里你会被鼓励刮胡子 关闭即使是最优秀的性能 成本并非如此。 那么what--怎样才能 看到这样的实际代码? 现在让我继续前进 并开辟一个例子 故意叫 没有交换,因为它不 其实交换变量 因为你实际上可能期望。 因此,让我们一起来看看。 这里有一个程序,没有CS50 库回事,只是标准的I / O。 现在我们有一个原型 用于交换往上顶刚刚 意味着它一定是在后面定义。 而这里的主力。 我任意分配x和y, 分别值之一和两个 只是因为他们是小 易去想。 然后,我只是有一堆用printfs的 在那里我有一个全面的检查。 x是1 y是2大概是 什么样的printfs输出会说。 因此,没有魔法迄今。 然后,我要索赔 打印清晰度,交换点点点。 我会打电话给交换 功能,通过在x和y。 而且,我们现在假设 掉期完全实现 因为这是一个时刻前 用临时变量。 所以我要求大胆,调换。 x是现在这个y是现在。 但该文件,当然, 被称为没有交换。 因此,让我们其实看看会发生什么。 如果我编译没有交换,然后 做./noswap,x是1,y是2。 交换交换。 x是1,y是2。 因此,它实际上似乎是,即使有缺陷 虽然swap--让我们向下滚动now-- 是按照完全实现 代码我刚才提出的。 所以我们不会获得幻想 与XOR的东西现在。 这也正常吧 像牛奶和OJ, 但它似乎并不奏效。 因此,让我们再次做到这一点。 也许我只是不运行它的权利。 因此,让我们再次运行没有交换。 或许我 - 没有。 所以它只是不工作。 因此,让我们做一个小的完整性检查。 让我在这里交换继续 并且只需添加,等待一分钟, 一个是%I / N,让我们 插件的一个的值。 因为我真的想 看看发生了什么事情。 事实上,这是 调试技术 你可能会使用 办公时间或在家已经, 类似于第一丹的一半 Armendariz环的视频在PSET3 其中,我们介绍了打印清晰度为 推荐的技术中,至少 对于简单的情况。 让我继续前进,运行make 再没有交换,./noswap。 有趣的。 所以,注意什么似乎是正确的。 x 为1,y是2,但a为2时b为1。 因此,这两个不知何故交换 但x和y是没有得到交​​换。 所以要清楚,发生了什么 是,在这里我有X和Y 而这些都是局部变量,在 主要适用范围,我传递的x和y 互换。 现在,掉期,作为一个单独的功能, 可以自由地调用它的参数 或者它的参数什么就是了。 富或酒吧或x或y或a或b。 只是为了清楚,他们是 不相同的x和y本身 我已经说过了a和b。 但是,我们可以打电话给他们任何我们想要的。 所以它看起来像 交换被传递 x-- AKA A--和它的 传递y-- AKA湾 不知怎的,这三条线都 正是这些交换价值 作为劳伦就与牛奶和OJ。 但是,当我们打印出 的值,a和b 的确交换,但X和 y的不改变它们。 回想一下,x和y是在这里。 因此,我们可以通过看这 另一种技术为好。 而这也是一个技术 嵌入在问题设定了三个。 让我们继续前进,并为此在 CS50 ID,如果你还没有。 在右侧我们 有这样的调试器选项卡。 如果你打开​​这个了, 有一些神秘的信息 多数民众赞成在投掷您最初。 但是,让我们取笑这除了真正的快。 所以一个,你看到的局部变量。 原来,打造成为CS50 IDE和 很多编程环境的更多 一般是一个调试器。 一种工具,可以让你直观地看到 什么是你的节目里面发生 而不必诉诸于添加 printfs输出和编译并运行 和添加的printf的,编制和 运行时,它已经在办公时间 或家庭,大概是 越来越漂亮乏味。 所以在这里,在短短的时刻,我们 要看到的实时 我们的局部变量的值。 我们也将能够设置 所谓的断点这 有机会在我的计划暂停 执行在特定的代码行 我很好奇。 对? 这些方案在瞬间运行。 它是一种很好的为我们人类更慢 要能够暂停,花一点时间,看看 什么是围绕回事 一定行的代码 没有程序耕翻 通过它,完成全部。 因此,一个断点将允许我们 打破和暂停在某一点。 调用堆栈是一个奇特的方式 说功能是什么目前 被调用的时刻。 主总是首先调用。 但是,如果主调用 函数称为交换, 我们真的要看到这 塔的功能,已 所谓逆时间顺序。 因此,让我们看到这一点。 我要缩小。 我要回到我的代码。 而只是因为我想 这里是迂腐, 我要继续前进,然后点击 只是五号线的左侧。 这创建了一个红点。 并注意在右手侧 调试器知道,哎, 我刚才说了一个断点 noswap.c五号线,特别是 在这行代码。 因此,调试器知道我 有请下一次 我跑我的程序就暂停 在此执行,而不是仅仅 运行整个事情的超级快。 所以,现在我要点击调试 在IDE的顶部按钮 而这要做到以下几点。 这将打开一个最初有点 可怕看第二终端window-- 从远程调试 举办​​这样和such-- 我们会回来的是什么 所有这意味着不久。 但是,什么是重要的,现在 是那个红点被击中, 调试器具有故意 暂停execution-- 不是本身该行,但是,从第一 线的在该函数中的实际代码。 这就是为什么七号线是 现在,以黄色突出显示。 现在,让我们来看看 在右手侧。 它看起来像,在默认情况下, 好听的是,x具有什么价值? 0。 和Y有什么价值? 零。 这是可以预料的意义 x和y--的黄色line--有 还没有执行。 的SO x不应该具有值1。 它可能具有任何其他值, 所谓的垃圾值。 我们很幸运,因为它是 在这一点上为零,基本上是。 所以,现在这里只有少数 按钮,我们需要照顾 关于这种方式调试时。 请注意,在这里,我们有一个播放按钮。 如果我们发挥,或打 恢复,这只是 经过运行 该程序的其余部分 或者直到遇到另一个断点。 但我没有设置任何其他 断点所以它只是 经过运行结束。 那种连败的 闲逛的目的。 所以,相反,我很在乎 这些图标右侧。 如果我将鼠标悬停在 他们,你也应该这么做, 你会看到小tips--工具提示。 这一个是步过。 现在,这并不意味着跳跃 下面的一行代码。 这只是意味着执行它, 移动到下一个,移动到下一个, 移动到下一个。 换句话说,通过 那个按钮,我可以走 通过我的代码,一步一个脚印的时间。 逐行逐字地。 现在,到右侧 这,还有另外一个 我们会看到在短短的时刻。 这就是所谓的 步入图标的 要允许我潜水 成另一种功能。 但是,让我们来看看在短短的时刻。 所以,我要点击跳过。 而现在发现,我点击 这个按钮在右上角, 保持你的眼睛大致在本地 变量和看看会发生到x什么。 x是现在的1,因为 黄线目前已执行 我们已经转移到8号线。 而在短短的一瞬间ÿ 应该有希望成为2。 现在,没有什么有趣 发生了一点。 这一切是printf的。 同时注意,在我的副终端 窗口,我看到打印高清输出。 而现在我必须做出一个 决定程序员。 我能跨过这条线的 代码执行,但不 越来越好奇里面有什么。 或者,我可以真正踏进去 去交换本身的内部。 因此,让我们做后者。 让我继续前进,点击 不踩过去,但步入。 请注意,突然 窗口变化 以突出所述第一 线的交换代码。 这是第21行。 而现在,有什么样的时髦的是, 如果你看过来,符合市场预期, 逗号b为1和2。 为什么是临时32,767? 回顾温度,很像 空杯刚才, 这里宣布第21行。 为什么32,000-我的意思是,这是为什么 它只是一些奇怪的值? 是吗? 听众:这不是初始化。 DAVID J.马兰:这是 未被初始化。 因此,我们的电脑总是 有物理内存。 它总是有物理RAM。 而总有为零的 和一个人在那里,对不对? 因为我们使用我们的 计算机整天, 您使用的是CS50 IDE 或服务器整天。 这样RAM或者有一些零或 有些人的或者一些零和一。 不管是否 不是你使用它们。 你不能只是有空白 空间,您要位。 他们要么零和一。 所以,事实证明,临时的,因为 我们没有初始化它, 我们这些32位,但他们还没有 被初始化到任何已知的值。 所以,无论他们是最 最近使用for--的32 bits-- 我们只是看到一些文物 以前使用这些特定的32 位。 当我点击步过,虽然, 唷,温度将会获得价值1。 如果我再这样做,一个是 将要给出的值2 然后b为要 被赋予值1。 还等什么高兴现在 这点在故事 是调试器是 给我看,超级慢 在我自己的节奏,有什么 交换的状态。 但是请注意,在这里的顶部,通知 该调用堆栈实际上 有两层到它。 现在,这突出显示为一 交换,如果我在主营点击相反, 注意局部变量如何变化 因为开发人员可以只跳 各地去到任何不同的范围。 因此,即使我们正在做这一切 工作,并正确地交换a和b, 如果我去来回交换之间 其中a是2,b是1和主, 一直主要受到影响呢? 第 那么,有什么外卖吗? 嗯,事实证明,任何时候 你调用一个函数像交换, 你通过它的参数,是什么 你传递的交换功能 在这种情况下是一个拷贝 这些论点。 因此,如果x和y分别是每个 32位,什么交换也越来越 是两个新的地方 变量或参数, 称为一个和b--但这些都是任意的 names--但是零点的图案 和1的内部a和b是 排队是相同的x和y 但它们不是 同样的事情,x和y。 就好像主在其片 纸张的数量1和2为x和y, 然后当它手中那 一张纸来交换, 交换非常快变 自己的笔,记 图1和2自身的纸片 手回原来的XY主 然后做自己的 与a和b的事情。 这是因为现在的超级重要 这有平凡的意义 对于实际编写正确的代码 因为它似乎我们不能互换 两个变量。 我写了一个正确的交换功能。 我们与劳伦实现了它作为 正确的交换功能,在现实中, 但显然没有了 如果事情你不能真正 交换两个值永久。 因此,我们需要另一种方式 真正得到这个, 我们需要能够 实际上解决这个问题。 而事实证明out--,我们会来 回到这个特定图片 long--之前,这是一种方式 你可以画出你的计算机的内存。 这只是一个矩形。 你可以任意绘制 的方式,但它的数量 先画出它作为 矩形的理由如下。 我们要开始今天及以后 谈到所谓的栈。 且堆栈只是一大块 的RAM-- memory--的一大块 该功能可访问 当他们是所谓的。 所以,事实证明,在 这个堆栈的底部 是所有主要的局部变量 和org C和有机V和所有的东西 是要去默认。如果主 调用其他一些功能像掉期, 同时,交换是会得到另一个 层的上面记忆起来。 所以只给你一个快速粗略 这个画面,如果我去了这里 - 让我这反映在 开销well--真正让我有, 如果我们只关心 这幅画的底部,现在, 是,当我运行一个程序 而主要被调用, 主要被给予一个组块 内存在我的电脑是 在此所谓的堆叠的底部。 而且我要画它 特意为正方形。 因此,这就像32位或4个字节。 如果这主要功能有一个 变量名为x为1的值 并且它有一个称为可变 y随的2的值,这是 喜欢采取这种条子的内存 主已经通过操作定 系统并瓜分,使 第一本地变量超出这里, 第二个放在这里,这就是它。 当主呼叫交换,交换 都有自己的内存片 我们将得出这样的 从操作系统, 而这将有其 根据自己的局部变量 我们实施早期 与局部变量 和b,最初 得到的值1和2。 不过,只要 在交换代码执行, 和劳伦实际交换的 辛普森和牛奶,发生了什么? 那么,这2成为1,本 1正在成为2,和,顺便说一下, 有一个临时变量,正在被 使用的整个过程中,最终 消失了。 但它并不重要 多少工作你做 在这条线在此内存空间of--, x和y是完全不变。 因此,我们需要给予一些方法 交换和功能,例如它 秘密访问,如果你愿意,给 功能li​​ke--到存储器像x和y。 因此,让我们一起来看看 一个例子,可为 我们来看看到底是什么一直 怎么回事这整个时间。 我要继续前进 开拓比较为零。 而且我要关闭 我们的调试器,我要去 关闭这个面目可憎消息 刚说,等一下, 你在中间的调试。 我要在这里隐藏此选项卡 刚回到简单。 如果GDB被杀害所以不要担心。 这只是意味着,该方案具有 已经辞职,故意在这种情况下, 由我。 而现在比较零做到这一点。 我使用的是CS50 库中的标准I / O。 我有一个主要功能第一 说,说些什么,并得到一个字符串。 然后再和说 得到另一个字符串。 并注意这两个字符串 被称为s和t分别。 而现在这个方案,比较 零,它在生命的目的, 它应该告诉我, 我才键入同样的事情? 所以我要回一个星期。 我用我等于等于运算符 这是质量运算符。 不是赋值运算符, 等号运算符。 我只是比较s和t。 因此,让我们真正去前进,做到这一点。 而且我要继续前进 并进行比较为零。 我该怎么办./comparezero。 我要去 前进,说些什么 喜欢,让我们做妈妈的小写 怎么样的妈妈大写。 当然我型不同的东西。 好吧。 这是可以预料的。 让我们再次运行它。 这两次做小写字母,小写字母。 这看起来超一样对我。 输入。 行。 也许这只是奇怪,因为 它不喜欢我的语法。 因此,让我们做一个大写妈妈, 资本妈妈,是相同的。 不同的东西。 那么,为什么会这样? 那么,什么是实际去 在这里引擎盖下? 因此,让我们回去了 这里只是一个时刻 并且考虑什么的GetString 其实这样做。 当你打电话的GetString, 这是一个函数,我们 自己写的,它以某种方式得到了 序列来自用户的字符。 而且,我们认为第一 一次我打电话的GetString,这给了我 一个内存块,看起来像这样。 如果我输入全部小写 M-O-M--和之后发生的事情? 只是一个快速的完整性检查。 反斜杠零。 我们知道。 而记得我们打了 与Zamila名左右 和一堆其他的名字 当罗布在这里寻找 在什么内存里面发生。 所以,这个故事是完全一样的。 这是什么的GetString 将返回给我。 现在,我的代码刚才存储 GetString的返回值 在一个变量被称为第 然后我第二次把它称为, 它存储在一个变量称为T。 所以,如果我在这里走了过来,我需要 作出这样的本地变量 - 而我一般会 画一个字符串作为just--我们 称之为S--这里作为一个小广场。 而现在,somehow--怎么做妈妈 去这个变量s里面? 好了,我们要回去 这里首要原则。 什么是的GetString实际上返回? 所以,事实证明,M-O-M 反斜杠零,和任何数目的 在内存像其他字符串 Zamila和Rob或安迪或任何其他人, 当然在我们的 计算机的RAM或存储器。 而你的内存有like--你有 RAM的演出,内存2演出, 或十亿或两个十亿字节, 或者甚至更多,这些天。 因此,让我们假设,对于今天的目的, 这不要紧,我们如何编号 他们,但我们可以号每 这十亿两十亿的 三四十亿字节。 而我们只是武断地说, 这是第一个咬,咬第二口, 第三,第四。 我故意不使用零 今天,但我们会回来的。 因此,换句话说,如果是这样的 第一次我正在使用的程序, 我刚开始运气和第一 咬是位置的一个那么双 那三四十。 如果我不停地画,箱号 的两个十亿会的方式在这里。 所以,你怎么想的话, 的GetString实际上返回? 它没有返回M-O-M反斜杠 零本身,因为这明显 我已经开箱子不会格格不入。 那么还有什么可以真正的GetString 将返回所有这几个星期? 答案是上 董事会这里的某个地方。 你可以不适合M-O-M反斜杠零, 那么,什么可能是有意义的呢? 如果你必须是超级聪明,把 上的所谓的工程帽, 什么你能回来吗? 什么是最少量的信息 你仍然可以返回会 让你找到M-O-M的内存? 是吗? 听众:一。 DAVID J.马兰:一。 为什么呢? 听众:因为它会告诉 你去哪里[听不清]。 DAVID J.马兰:没错。 我只是要返回地址 我所得到的字符串。 在这个地址 此案的位置之一。 所以,真正被存储在S-- 和每一个字符串变量从而far-- 刚刚被 该字符串的地址。 同时,如果我叫 GetString的第二次,我 请在字面上相同件事 - M-O-M与lowercase-- M-O-M 而另一个反斜杠零, 现在也许我的程序 已经运行了一段时间,所以也许这 是10,这是位置11,这是12, 这是13。 使用一些其他的计算机 内存无论出于何种原因。 怎么现在去我的第二个 在我的节目T变量? 10。 没错。 所以,当我们在看 这个程序源代码 在这里我只是想 比较这两个值, 是S等于等于T,什么是 明显的人的答案是什么? 只是没有因为1不等于10。 所以,这里存在一个 对我们的机会真的 刚回去,再一次,第一次 原则想想,算了, 这是怎么回事引擎盖下? 我们一直在谈论 位和字节和存储器, 但实际上它是有用的了解 因为当你打电话的GetString, 即使我们认为它是 返回M-O-M或字符串的妈妈 或者安迪或Zamila或 等,在技术上 它只是返回的地址 的内存块。 但是,这是确定的。 因为我怎么知道 其中字符串结束? 如果我只给的开始? 那么,反斜线零,对不对? 就在线性时间我可以 与印刷清晰度M-O-M打印出来。 而当我看到反斜线 零,我不在乎,我开始, 我已经知道含蓄 在这里我需要结束。 所以,今天标志着beginning--和 让我做这将大大因为我们 经历了很多的麻烦, 这些在这里训练wheels--得到 所以今天的训练轮开始 脱落,我们揭示了在least-- [掌声] 这是值得一游 瞄准这一早上,是吗? 所以now--有,原来 出,没有这样的事情串。 字符串不存在。 这是我们已经有代名词 里面的CS50库。 今后,我们将开始打电话 s和t不是字符串,但字符明星。 与焦炭星,我们将 梳理出前长。 但是这并不是说, 即使我们继续 使用的GetString现在, 技术上我应该 可以说,炭星和焦炭的明星。 而事实证明那是什么星 是要表示的东西 所谓的指针或地址。 而事实上,一个传情 面对未来 是这20秒的剪辑我们 朋友尼克Parlante在斯坦福 谁,前一段时间,花 一段荒谬的数额, 作为最好的,我可以告诉他 厨房或他的地下室, 制作粘土动画 引进世界 指定的字符 宾基与我们将 下一次被介绍给指针。 因此,这里是一个什么样的来预览。 [视频回放] - 嘿,宾基。 醒来。 现在是时候为指针乐趣。 -那是什么? 了解指针? 哦,好极了。 [结束播放] DAVID J.马兰:而关于这一点, 我们会看到你在周三。 好吧。 谁是跳舞? 来吧。 谁是跳舞? 你想让我得到它开始了吗? 我会得到它开始。 Woooo! LAUREN:甜花哨的摩西。