[Powered by Google Translate] DAVID J.马兰所有权利。 这是CS50,这是结束2周。 如果您希望明天的这个时候周围是饿了,知道我们要去 召开会议,明天一小群,周四,1:15 PM。 这个URL,在这里,如果你想回覆。 空间是有限的,所以请原谅,如果表单的时候,填补了你 填写。 虽然可能感兴趣的另一个URL是这样的。 因此,在,只是大约一个月的时间,当然是要提供 所有通过EDX,通过更广泛的人在互联网上 能够跟着,从事的过程中,其实相当积极。 他们将使用CS50电器和CS50讨论的,大部分的 各种软件工具,我们已经一直在使用这个学期。 而其中一项措施,我们希望作为一个实验,今年 我们可以看到多少内容翻译成其他说 书面语言。 所以,如果你可能有兴趣参与该项目, 我们将提供英语课程的成绩单及字幕 讲座和短裤,研讨会及部分和 - 如果你会讲一口流利的或写流利一些其他的语言,我们会 爱,让你在这个项目,让你承担一个或更多的 视频,将其转化为一个语言,你知道得很好。 为了让你的界面感,还有这个基于Web的用户界面 我们将使用,将创建基本上是这样的一个UI。 这是我教一些万圣节前。 和右手侧有黑色旁边这些时间戳, 你会看到不同的东西,我的嘴里说出来的那一天。 然后在它下面,你会翻译成一些其他的语言。 究竟是什么之间的映射是,在这种情况下,英语 并说,西班牙。 因此,它实际上是一个非常用户友好的工具。 您可以倒带,快进,很容易与键盘快捷键。 所以,如果你想参加这个实验,你的话 有可能有成千上万的人看到和阅读的,请不要感到 免费参加。 现在,一个字约从周一小猫,免得我们已将过于 可怕的消息。 一定要明白,,办公时间建议和段的建议, 课程的设计是非常有学生的协作和 说一起工作,通过习题集和问题。 真正的行归结到了,你的工作,最终 应提交的应该是你自己。 所以,坦白地说 - 在办公时间,这是完全正常的 - 它完全可以预期的,甚至 - 有一些聊天 你旁边的朋友。 如果他或她挣扎着一些话题,和你一样,哦,好让 我给你看到,我写了一些代码行。 这很好。 出现这种情况。 这是非常有利的,我认为,学习的过程中。 在哪里就行了,再次被越过时,头是有点歪了 这里真的有太多秒或分钟,只 无障碍给你的朋友的机会。 当然,当事情变得交换通过电子邮件和Dropbox 等,也有是行。 因此,通过各种手段,手感舒适,感到鼓舞与朋友聊天 和同学约pset和更多。 而就认识到,真的是你最终提交 你的创造,而不是别人的产品的。 因此,在同样的可爱的动物,你可能会 知道这家伙在这里。 因此,从几年前的电影,这是惊人的俗气。 在这里的任何人都看到“太空炮弹”? 好的。 因此,一个好的号码。 因此,这是我们今天介绍的最后美妙的学术方式 密码学的概念。 因此,pset的,这将前来领域特定问题 明天晚上到很晚,是潜入密码学的世界, 信息的加密和扰码是一门艺术。 而这最终涉及到世界的安全。 立即安全对于大多数我们的形式相当平凡的机制。 我们所有的用户名和密码。 我们所有的人都非常糟糕的用户名​​和密码,最有可能的。 如果您在多个网站上的密码是相同的,这可能是不 最好的主意,我们将讨论对学期结束。 如果您的密码是写在一个便签 - 可不是闹着玩的 - 你的 显示器,这也并不一定是最好的设计,而是一个相当普遍的 的现象。 而且,如果你不使用加密技术来加密您的密码,它们是 特别脆弱。 所以,如果你认为你是超级聪明有一个隐藏的字 在您的硬盘驱动器上有你所有的密码,但记录的地方 它是在一个文件夹,没有人会看,这也不是一个很 安全机制。 还等什么的pset将介绍这是密码学艺术的, 扰码信息,如密码,这样的事情是 更安全。 所以这个非常现实世界中的问题,以激励与非现实世界的 的情况下,让我给你介绍我们最喜欢的片段之一,从这个 电影,“太空炮弹”。 [视频回放] 头盔,你的恶魔,什么是怎么回事? 你在做什么我的女儿吗? 请允许我介绍年轻的整形外科医生,菲利普博士 Schlotkin,最大的隆鼻的人在整个 宇宙和比佛利山庄。 殿下。 鼻的工作吗? 我听不懂。 她已经有鼻子工作。 这是一个甜蜜的16个目前。 不,这不是你的想法。 这是非常,非常糟糕。 如果你不给我组合的空气盾,博士Schlotkin会 给你女儿回到她的老鼻子了。 - 不! 你从哪儿弄来的? - 所有权利。 我会告诉。 我会告诉。 不,爸爸,没有。 你别这样。 - 你说得对,我亲爱的。 我会想念你的新鼻子。 但我不会告诉他们的组合不管是什么。 - 好极了。 Schlotkin博士,做最坏的。 是我的荣幸。 - 不! 等等,等等。 我会告诉。 我会告诉。 我知道它的工作。 好吧,把它给我。 该组合是其中之一。 一。 一。 二。 二。 二。 - 三 三。 三。 四。 四。 四。 五 五。 五。 所以组合是一个,两个,三个,四个,五个。 这是我所听到过的最愚蠢的组合在我的生活中。 那是白痴才会有这样的事情在他的行李。 谢谢你,你的高度。 你做了什么? 我关掉了墙上。 不,你没有。 您关闭了整部影片。 我一定按错了按钮。 好了,把它放回去。 把电影。 是的,先生。 是的,先生。 让我们去,爱尔纳。 来吧,格雷琴。 当然,你知道,我还是会向您。 好了,没有工作? 门在哪里? 它的工作,先生。 我们的组合。 - 太好了。 现在,我们可以从地球Druidia每一个呼吸新鲜的空气。 什么组合? 一,二,三,四,五。 一,二,三,四,五? 是的。 这是惊人的。 在我的行李,我已经得到了相同的组合。 准备空间球1立即离开。 是的,先生。 和变更的组合在我的行李。 - 噢! [END视频播放] DAVID J.马兰:你现在应该看到一个惊人的电影。 因此,这里的语境是不安全的数据来的机会 加密和争夺它。 等,例如,是一个加密的消息的一个例子。 这实际上是说英语的东西。 但它显然不是完全明显。 我们将兜了一圈,今天捉弄除了这是什么秘密 这里的信息是。 但在现实世界中的电脑,事情并不甚至看起来会 是的英语句子。 例如,这是你可能会发现在一个标准的Linux或Mac或 Unix计算机中的文件,是很久很久以前被称为密码文件。 如今,它被转移到其他地方。 但是,如果你的系统上,在正确的地方,你会看到不仅是你的 用户名或系统上的其他人,但你会看到一个 他们的密码的加密版本。 事实上,这个词地下室有以下的东西是加密的。 而这一系列看似随机的字母和字符和数字, 等等,都可以被解密仅由一般知道的一些秘密 - 一个秘密的话,一个秘密数字。 事实上,艺术的加密技术最终都归结到信任的一些 排序和别人不知道的东西。 我们将探讨这方面更详细一点今天在pset中来。 而现在通过/失败的一个词。 特别是一些潜入的pset,家电,和 一个很新的世界为自己,认识到挫折和 混乱和技术困难是可以预期的。 特别是随着第一的pset,那里有这么多新的,刚开 熟悉的ls和cd,所有这些神秘的命令在一个新的环境。 这是从实际材料和编程本身分开。 因此,实现,也有一定存在的办公时间 支承结构上。 节本星期日开始。 但是,最重要的是,如果你只是感觉这是不 你的世界,实现它确实只是需要时间。 ,它不给我这个机会,几年前对我来说,一类 通过/失败,说实话,我永远不会甚至踏上在教室里。 你可以改变这件事,直到说,第五次周一的课程。 所以,如果你对现在的边缘,而不是头,实现了一些其他 完全水域,肯定会考虑转变为通过/失败。 同样,有没有真的这种文化在哈佛考虑的事情 通过/失败,因为每个人都希望实现或超额完成。 但坦率地说,这是一个美妙的方式尝试了,可能不 很熟悉的。 你会做在大多数情况下,相当精致,也许 多给您惊喜。 更具体的,我觉得通过/失败一般不, 尤其是当你可能经历过的pset 0,如果你已经把 在10小时,15小时,25小时到一些pset中 - 和你只是撞 你的头靠在墙上, 它的超级深夜, 但你在pset的方式,如90%, 你知道你只是无法弄清楚一件事 - 通过/失败的真正的边缘,这样的一类,在这里你可以排序 高兴地说好了,我知道它并不是完美的。 但我的工作我的屁股上。 我很高兴就结束了。 将满足期望通过/失败。 所以千万记住这一点。 好的。 因此,那些你们谁一直在努力使用哈佛大学的Wi-Fi知道 该有一CS50 SSID的,通过Wi-Fi连接周围,漂浮 可能有更好的运气。 这是一个有点讽刺的密码 - 如果你想尝试一下 更好的速度和连接到该让我们知道,如果没有更好的 - 是一,二,三,四,五,一路攀升到8,因为8是 更安全比五。 所以,如果你需要的Wi-Fi密码,无线连接到CS50这里。 一,二,三,四,五,六,七,八。 CS50后上讨论,如果你仍然有间歇性的连接问题, 我们将让权力知道这个空间。 好的。 所以简单的玩笑话,尤其是对于那些你们谁是风扇的男孩或女孩 所有苹果。 我从几年前挖了这个文件,ilock.c,只是为了 种更具体,更复杂一些更基本的C 我们一直都在写程序。 于是,我打开了这个文件,ilock.c。 这是今天的讲座页。 在左侧,你会看到一个长长的清单功能。 因此,研究员,这是谁写的写了很多的功能, 以上只是主。 在这里,他用一大堆的库。 如果我们开始滚动,这实际上是非常 第一,我认为,原来的iPhone破解。 当你想原来的iPhone越狱,这意味着untether 从AT&T和实际安装特殊的软件就可以了,做的事情 苹果没有人做 - 好了,有人花时间来弄清楚他们是如何利用 软件缺陷,错误,错误,在苹果公司的软件。 从而诞生了ilock.c。 如果你的计算机上编译它和它的iPhone上安装 说,通过USB电缆连接到您的计算机,这将给你 行政或root用户权限在您的iPhone,让你做很多 任何你想要的。 所以这个迷人的猫捉老鼠的游戏和苹果之间的 特别是他们在世界各地的很多企业一样,试图锁定 他们的东西,所以,你只能用它做什么,他们打算。 但由于这样的人,他们的低层次的认识 的细节,并在这种情况下,C编程和熟悉的结构的特定 我们已经开始玩,你能够真正利用 硬件的方式,您认为合适的,而不一定是一些企业实体。 因此,举例来说,我不知道这是做。 但是,GetVersion听起来很简单。 看起来这是一个函数,这个人写的。 以某种整数作为参数,不返回任何东西,但 一个for循环和循环条件,如果条件下,如果 突破,并以某种方式涉及到的版本号。 如果我们向下滚动 - 尽管很多这些关键字将是新的,并有一个 一大堆的功能在这里,我们从来没有见过,可能不会看到超过 本学期的过程中 - 在一天结束的时候,它遵循相同的规则和逻辑,我们已经 玩迄今。 因此,这是破解你的iPhone 4S或3S或很快5S,这几天太旧, 但要知道,这一切都非常来源于这个世界,我们已经看到 潜入。 因此,让我们来看看一个更简单一点的例子。 这其中,只是为了获得回暖的一些语法,也有一些其他的数据 类型,我们已经谈到了,但还没有真正出现在C.因此,这是一个 文件名为​​positive1.c。 每在上面的评论,这只是要求用户提供一个 正数。 所以这是一个例子,一个do-whil​​e循环,这是很好的用户交互 程序,你需要告诉用户做一些事情。 ,如果他们不配合,你骂他们,或拒绝他们的意见。 典型的例子,我该怎么办第19行到24这么久的用户 没有给我一个正数。 现在,这个细节在这里的第18行,为什么我宣布这整个Ñ以上 循环结构,而不是右线22我 真正关心得到n? 是吗? [听不清] DAVID J.马兰:是啊,所以这个问题的范围。 在外行人的术语,什么范围是指什么? 是吗? [听不清] DAVID J.马兰:你能不能说大声一点好吗? 主讲人1:在这里你可以访问一个特定的变量。 DAVID J.马兰:完美的。 在这里你可以访问一个特定的变量。 而且一般的经验法则迄今为止一直认为,一些人的范围 变量的定义是,你已经看到最近的花括号。 因此,在这种情况下,如果我犯了个错误n在第22行声明, 该行会的工作。 我会得到一个int,我希望把它变成第22行中的变量n。 但是,这行代码将不知道我说的是什么呢? 所以,25,事实证明,24为好,因为在这种情况下,它不属于 大括号。 因此,只要一点点的滋扰,但很容易解决,只需声明 变量以外的函数本身。 现在,我们可以看到以后的今天,你可以走了一步。 你甚至可以得到一个有点懒惰 - ,这是不被推荐的,在一般情况 - 但你甚至可以偷懒,把一个全局变量,可以这么说,不 内的一个函数,而不是一个循环的内部,但在文件本身,外 所有的功能,你已经写了,因为我在这里的第15行。 但是,这一般是不可取的。 但是,认识到这一点是有时其他问题的解决方案,我们将 最终看到的。 因此,就目前而言,我们将保持这样的。 但是,让我们看看我们是否能改写这只是开始表达自己在一所房子里 略有不同。 因此这个方案,仅仅是明确的,是阳性。 让我继续在这里,在我的终端窗口阳性,回车。 编译,没问题。 我要去,运行positive1,按下回车键。 我要求你给我一个正整数。 我会说:-1。 没有工作。 0,99,这似乎是工作。 也许不是最严格的测试。 但至少这是一个不错的完整性检查,我们正在正确的轨道上。 所以,现在让我继续前进,打开这两个版本。 有什么不同了吗? 它实现了同样的事情。 但是,什么是跳出为明显不同时间? 是啊,所以这个布尔绿色。 gedit有绿色高亮显示该关键字被称为布尔, 这是一个数据类型。 它不内置于所有版本的C.你需要包含一个 具体的库。 在我们的例子中,我的CS50库,使我们 有机会为bool。 但在第18行,我们似乎有一个布尔值,这里所谓的感谢。 所以,我可以把这种现象称之为什么。 但我把它叫做感激只是一种传达一些语义上的意义。 因此,最初的第18行,我显然不是感谢,因为 布尔值,感谢在第18行初始化为false。 然后,它似乎是我在这里做了21行〜23是我刚刚 种重写我的逻辑。 所以没有功能不同的。 但在第22行,我现在检查,如果int用户提供了大于 0,那么我只需更改感谢真正的价值。 我为什么这样做呢? 因为在第25行,很显然,我要检查的条件。 做这个循环,同时感谢是假的。 因此,我建议这是一个版本的替代品,因为它至少一个 更直观一点,也许吧。 这是一个有点植根于英语。 因此,请执行以下操作,而你不感谢,同时感谢是假的。 而这个时候,我显然不关心记住用户输入的是什么 因为通知中没有任何变量n。 因此,实际上,I - 一个善意的谎言。 在功能上,该方案是一个有点不同的,一旦我们得到的底部 它,因为我不记得n是什么。 但我想在这里展示我们已经看到过,即使调用getInt和 正在使用的右手侧的一个等号的GetString迄今,使得 我们记住它们的价值,从技术上讲,这不是绝对必要的。 如果由于某种原因,你只是不小心保存的价值,你只是想 检查该值,请注意,我们可以简单的写调用getInt开放 括号,关闭括号。 该函数会返回一个值,因为我们一直在说。 这将会给你一个int。 所以,如果你在精神上认为这种情况发生,当我输入99,调用getInt 返回数字99。 因此,从理论上讲,这是因为虽然我的代码,其实这。 因此,如果99的确是大于0,然后感谢变为真。 第25行实现哦,我们正在做的,因为我现在感谢。 而在第26行,我们简单地说,感谢为正整数,不管它 碰巧。 现在,让我们在这里做轻微的语法糖,可以这么说。 让我们来看看,如果我们可以清理这条线,这第三个和最后的25方差 在positive3。 因此,注意到现在唯一的区别是哪一行代码? 是啊,所以25。 我们还没有真正看到这一招只是还没有。 但是,我们也看到周一的感叹号,这表示什么? 因此,没有或否定。 因此,需要一个布尔值,,并翻转它的价值。 真亦假。 假变为真。 所以,我建议,即使是一点点的一种方式,更直观 编写的代码,因为我仍然会初始化为false感谢。 我还是做到以下几点。 我感谢设置为true,在时机成熟时。 但现在你可以真的只是翻译代码口头左到右, 同时感谢。 由于爆炸,或惊叹号,表示不的概念,因此,虽然 不心存感激。 所以,再一次,我们没有引入任何新的概念本身。 我们已经讨论了布尔值,当我们从头打了。 但现在认识到,我们就可以开始写我们的代码 许多不同的方式。 因此,特别是在pset1移动,如果你有几分努力找出的方式来 请编写一些程序,你很幸运,因为有将是任何 的解决方案,您可以发生在数。 举例来说,即使是最简单的程序,这仅仅是3。 好的。 现在记得上周一,我们留在这有返回值的注意。 因此,对于第一次,我们写了一个程序,不只是有主, 它也有它自己的自定义函数,我写在这里。 因此,在31〜34行,我已经实现了一个多维数据集函数。 这并不复杂。 这只是一个次次,在这种情况下。 但重要的是它是我输入的形式 我回输出的形式的时候,一个次。 所以,现在我有能力,就像我用printf单独使用,调用 多维数据集函数调用这个函数。 和多维数据集的功能需要一定的投入。 和多维数据集函数返回一些输出。 因此,相比之下,输出只是做了一些事情。 它没有返回任何东西,我们关心的 - 即使作为一个 一旁,它返回一个值。 您通常会忽略它。 的printf只是做了一些事情。 它有打印到屏幕上的副作用。 反差,在这里,我们有多维数据集的功能,这 实际上返回的东西。 因此,这是一般 - 对于那些熟悉,这是一个非常简单的想法。 但是,对于那些不太熟悉这个想法传递输入和 背面输出,让我们尝试只是超级简单的东西。 是任何人都舒服了舞台上简单吗? 你必须是舒适的与你的相机,以及。 是啊。 好了,你叫什么名字? KEN:肯。 DAVID J.马兰:肯。 所有权利,肯。 上来吧。 所以,肯将是各种各样的功能,在这里。 让我们继续做到这一点。 让我们一点点花哨。 认识你很高兴。 欢迎来到舞台中央。 好的。 让打这个按钮,在这里。 好的。 所以,在这里你有一个现代化的黑板上。 我的主要功能是,例如。 我没有一台iPad拿在手中。 我真的不记得怎么样 - 好了,其实,不能说。 我真的没有很好的笔迹。 所以,我希望你能在屏幕上打印的东西对我来说。 所以我的主要程序。 我要你说,这写在我的鸡从头开始, 然后将你的输入。 因此,尽管这项工作是愚蠢的,函数的概念,并调用 功能,并返回一个函数真的归结到这。 我主要的。 我刚才写在屏幕上输出(“东西”)。 我运行这个程序。 如printf被调用,它需要一个参数 - 或一个参数, 有时 - 双引号之间。 这里有这样的说法。 我把它传递给肯。 现在,他写了一些数年前,显然是一个黑盒子 只有知道如何打印在屏幕上的东西。 所以,执行。 这是不坏的。 所以,很不错。 所以,现在肯执行。 他递给我任何东西吗? 因此,到目前为止,我们已经看到的。 同样,printf并返回一个数字。 但是,我们要忽略的是现在,因为我们从来没有用过它。 所以这是它为肯。 因此,现在主要来执行 - 主要接管程序的控制,因为这行代码, printf中进行执行。 我们去了解我们的方式执行的任何其他线路有。 好的。 现在让我们尝试一个稍微不同的例子。 这一次,在这里,让我们先来清除屏幕。 而这个时候,我们会做的魔方功能。 但是这一次,我期望的输出值。 因此,让我们继续前进,并做到这一点。 所以,现在我有一个行代码,说X =立方体(X)。 因此,实际上let's - 行的代码,召回,看起来是这样的。 X =立方体(X)。 所以,这是怎么去上班? 因此,让我们继续前进,并给你一个白色的屏幕。 我要现在写下来的x的值,在这一刻 时间发生,让我们说,2,保持它的简单。 因此,我已写在一张纸的价值2, 这是我的x值。 我把它肯。 KEN:我只写答案是什么? DAVID J.马兰:是啊,让我们只写答案。 好吧。 现在他已经回到我的东西。 所以 - 完美的。 尼斯SEGUE。 所以,现在他递给我回值8,在这种情况下。 我该怎么办呢? 嗯,其实,让我们来看看。 得到这个权利。 我会用它做什么呢? 现在,我将这个值和实际存储在这些 在存储器中的相同比特。 但是,请注意,我是那种挣扎在这里。 我有点困惑,因为我在哪里写x的值吗? 因为我刚刚做的是需要亲自肯一张纸 的值是2,这为x。 事实上,这恰恰会发生什么。 因此,原来,当你调用一个函数,并传递参数 喜欢的“Hello World”,或者你传递一个参数,如2,一般,你 通过在副本这样的说法。 所以,正如我写下的2号这里,并把它交给肯; 意思是,我仍然有一份价值2的地方。 因为事实上,现在我已经得到了值8,我需要回去 RAM写下我曾经有过的数字2。 所以,直观地记住这个概念在字面上通过 值的副本。 肯做他的事,交给我的东西 - 在这种情况下, 这样的值8。 然后,我与价值的东西,如果我 要保持它的周围。 因此,所有这一切都将是所有太熟悉了不久。 非常感谢你在这里演示,肯。 好的。 非常好。 因此,让我们来看看如何,最终涉及到的一些功能 调用,我们一直在这里做什么。 因此,让我继续前进,把我们带回了魔方的例子在这里。 注意到,如果我们要真正开始采取进一步,我们将 必须注意的一个事实,即数x被传递 这里实际上被传递到函数是不同的。 所以,再一次,通过复制将变得相当 锗在短短的时刻。 所以,让我们来看看在一些不相当的工作。 我会继续前进,打开第三个马车例如, 是有缺陷的性质。 它被称为buggy3,和它实现了一个交换的功能。 所以,在这里,我们有一个主函数,x和y的任意初始化为 分别为1和2,。 我们可以使用调用getInt,但我们只需要一个简单的练习。 因此,它是硬编码为1和2。 在第21行和22行,我们似乎打印出x和y,每行一个。 然后,在第23行,我要求我交换这些值,点,点,点。 显然,我在第24行调用一个函数,称为交换 ,它有两个参数。 这是完全合法的,采取两个参数的函数。 我们已经看到输出已经做到这一点了。 所以交换显然x和y。 正如它的名字所暗示的,我希望这是怎么回事 交换这两个值。 因此,我要求在第25行,交换。 我转载的假设下,x和y 我的确被换。 但是,如果我运行这个程序 - 让我打开一个终端窗口。 让我做buggy3。 正如它的名字所暗示的,这是没有好下场的。 因为当我按下Enter键,注意x是1。 y为2。 但在程序结束时,他们仍,其实,是一样的。 因此,根据示范与肯,刚才到底发生了什么? 好吧,让我们深入到这个交换功能。 它的超级短。 这是只有几行代码长。 但是,什么是最根本的问题的基础上简单的故事告诉 在这里肯吗? 交换为什么坏了? [听不清] 没错。 因此,我们要存储的副本,而不是变量本身。 换句话说,交换显然有两个参数,一个int。 它的任意称为A和B。 这里,我已经通过在x和y,分别是1和2。 但我不是真的通过在x。 我不是真的在y传递。 我是通过x和y的副本的副本。 这就像几乎就像交换的值复制和粘贴 你希望它是实际操作。 所以,如果是这样的话,当我的程序,开始执行 线35,然后36 - 当我到37行,在这一点上的故事,是什么值呢? 在这一点上的故事,37号线,在这一点上的价值是什么? 因此,它应该是1。 对吗? 因为x的第一个参数中传递。 而这个函数只是任意调用它的第一个参数,一个。 同样,第二个参数为y。 它只是随意调用的第二个参数b。 现在这种两分法其实是相当简单的解释。 想想吧。 我们没有见过的人谁写输出。 因此,毫无疑问,他或她不知道30年后,我们的变量将 被调用。 所以,必须有区分你调用中的变量 功能,你写的,你在你的函数调用变量 打电话或使用。 所以,换句话说,我写了我的变量x和y。 但是,如果别人已经写了交换功能,他或她肯定 不知道我的变量来调用。 所以认识到,这就是为什么你有这种二元性的名称。 从技术上讲,我可以做到这一点巧合。 但他们仍然会通过为副本。 这仅仅是一个纯粹的巧合美观,如果那个人是谁写的 交换使用相同的名称。 好的。 所以在这一点上故事中的第37行,一个是1。 b是2。 现在我进行交换。 首先,让我真正做到这一点简单得多。 我不知道这三行代码做什么。 让我做到这一点。 b得到。 一个得到b。 完成。 为什么是这个破碎的,逻辑上吗? 这是一种直观的东西,对不对? 因此,一个变成了​​B。 B变成A。 但问题是,尽快执行第37行,有什么 a和b的值? 相同的是,1。 因为你打一顿,可以这么说,你已经改变了b为一个。 所以,第37行执行,这是伟大的。 你现在有此功能的号码1内部的两个副本。 那么,当你说在第38行,得到b,好了,你种拧紧。 因为你只是分配1比1。 你失去了你关心的价值。 因此,在原始版本,请注意,我就是这样做的。 我不是有三分之一的代码看起来是这样的。 我声明了一个临时变量 - tmp是一个很常见的名字 一个临时变量。 它是一个int,因为它符合我要的副本。 存储副本的tmp目录内的。因此,一旦线路37条的执行, a的值是 - 快速完整性检查 - 1。 b的值是2。 TMP的价值也是1。 所以,现在我执行第38行。 因此,一旦执行第38行,一个需要的b的值。 和B是2。 因此,一个现在是2。 所以在这一点上的故事,一个是2,b为2, tmp是1。 所以,现在从逻辑上讲,我们只是扑通TMP到b的值。 我们就大功告成了。 因此,我们已经解决了这个问题。 不幸的是,当我运行这个程序,在这种形式,它并不实际交换 任何值。 但要清楚,为什么呢? 我刚才固定的逻辑问题。 但同样,如果我运行这个程序,X和Y保持不变,年底 该计划的执行。 [听不清] DAVID J.马兰,因此,我们不返回任何东西。 所以,这是事实。 但事实证明,这里有一个有点问题,因为到目前为止, ,我们已经能够返回的唯一的一件事。 这是一个限制,您可以只返回一个真正的价值, 在这种情况下,我被堵到了这里 因为我可以返回新的x值,否则我可能会返回 新y的值。 不过,我既要回来了。 于是久违这里没有简单的解决方案。 但问题的根本是为什么呢? 我们有什么实际交换? a和b。 但是,a和b的副本的x和y,这意味着我们只是做了这一切 - 我们只花了像三分钟谈交换 功能和所有这三个变量。 这是伟大的,完全正确的,孤立的。 但是,A和B的范围不仅是在这些行。 因此,就像一个for循环,如果你声明一个整数i在for 环 - 同样,如果你声明a和b里面的功能, 你写的,他们是该函数的唯一有效的内部。 这意味着只要交换是执行,我们从线24条, 线25,x和y没有被改变。 你只是浪费了大量的时间交换的变量的副本。 所以,事实证明,要解决这个实际上是不很明显。 这不是很充足的返回值,因为我们可以 只返回一个值。 我真的想交换x和y都在相同的时间。 因此,我们要回到这个。 不过,现在认识到这个问题从根本上源于一个事实 a和b的副本。 他们是在自己的范围内。 好吧,让我们以某种方式设法解决这个。 让我真正滚动回到这里,开拓,让我们说,第四个变种 此,buggy4。 又是怎么回事吗? 这是一个类似,但更简单的看问题之前,我们采取一捅 解决它。 这项计划被称为增量。 它显然初始化的x为1的整数,在第18行中。 然后,我x是1。 然后,我声称递增,点,点,点。 然后我打电话增量。 但随后在22日和23线,我要求它已经增加。 我要求x是现在不管它是什么,大概是2。 但这种方案是不稳定的。 有什么问题吗? 是吗? [听不清] DAVID J.马兰:没错。 所以X显然已宣布的第18行。 这是内主要的大括号中。 所以,简单的答案是,在这里,x存在。 它不存在于线32。 因此,这个程序实际上不会编译。 编译器,当我尝试编译这段代码时,会骂我 一些未声明的标识符或东西的效果。 事实上,让我们尝试。 这是使buggy4。 在那里,它是。 使用未声明的标识符x线32。 而实际上,让我们更加明确,今天在这里,这是非常有用的 办公时间和在家里。 请注意,这是一个有点神秘的书面。 但事实上,铿锵有对我们大吼大叫,说 buggy4.c:32:5,实际上是有用的。 这意味着,该错误是在字符位置5的线32上。 因此,一,二,三,四,五。 这是,事实上,问题出在哪里。 同时要记住,在办公时间,在家里,我很幸运在这里。 我有一个错误。 这将是比较容易解决的。 但是,如果你获得压倒性的错误消息,再次充满整个​​画面, 实现最底层的人可能只是对症 最顶层的。 因此,总是追逐你的错误,从上而下。 因为有可能只是一个菊花链的效果,建议你 有比你实际做的方式更多的问题。 那么,我们怎么能解决这个问题,如果我的目标是增加x? 那是什么? 好吧。 因此,我们可以使X全球。 让我们走捷径,我警告早期。 不过,赫克说,我们只需要一个快速解决。 因此,让我们在这里说诠释x。 这使得X全球。 所以,现在主要有访问它。 而增加的访问。 因此,让我继续前进,现在编译这个。 ,输入使buggy4。 似乎现在编译。 让我们来运行buggy4,它似乎实际工作。 现在,这是这些东西之一 - 听我的话,还不如我呢,我刚刚在这里完成。 因为整体来说,我们的计划将变得更加有趣, 比这更长的时间。 如果您解决生活中的问题是啊,把所有的 在文件的开头的变量,很快就做节目得到 惊人,难以管理。 它变得很难想出新的变量名。 它会更难理解变量是做什么的。 ,因此,在一般的,这是不是一个好的解决方案。 因此,让我们做到这一点。 我们不想在这里使用一个全局变量。 我想增加x。 所以,我可以很明显 - 在一天结束的时候,这是一个愚蠢的故事,因为我们只要做到这一点。 但是,如果我不知道,运营商,或我没有被允许到 改变它在主本身,怎么可能我实现了肯在这里,这 时间到多维数据集,但增加? 我该如何改变这件事情吗? 是啊。 [听不清] DAVID J.马兰:好,好。 那么,为什么不让我通过在x? 然后,而不是返回它,为什么不,我只是做回X + 1? 现在,一对夫妇更多的东西必须改变。 我在正确的轨道上。 还有什么我需要调整吗? 别人。 是吗? [听不清] DAVID J.马兰:我需要改变的返回类型增加 因为它并非无效。 虚空意味着什么也没有返回。 但显然,现在是。 因此,这需要改变int以符合任何 实际上,我回来了。 现在别的东西,是大声喧哗。 是吗? [听不清] DAVID J.马兰:所以我需要增加x? [听不清] DAVID J.马兰:啊,所以我需要传递X。 所以我需要在这里做到这一点。 因此,原型,我必须要改变这个在这里。 因此,这成为一个int。 这成为 - 嗯。 其实,我这里有一个错误。 让我们来解决这个问题第一次。 应该是什么内容究竟是什么? 因此,它必须是一个int的东西。 它可以是x。 但是坦率地说,如果你开始调用所有的变量x,它会得到 越来越不清晰哪个是哪个。 因此,让我们任意选择一个不同的命名约定为我的 辅助函数,我写的功能。 我们将调用它。 或者,我们可以把它称为 - 我们姑且称之为,它even_number更明确。 于是我返回任何数加1。 现在,我必须要改变一个其他的东西在这里,一个 其他的东西在这里。 我有什么改变第21行第一次吗? 我有把它分配给x。 这样我就可以不叫增量x。 通过改变x的值,我需要记住的答案 左手侧。 即使x是现在的左,右,这是完全正常的,因为 首先被执行的右手侧,然后被扑通进入左 手的事情,x在这种情况下。 最后,这是一个简单的办法。 这应该匹配什么是向下。 诠释号。 好的。 那么一大堆的一个非常愚蠢的功能的变化。 但代表,我们将越来越多地想要做的事情。 因此,请buggy4。 我搞砸了的地方。 哦,我的上帝。 五个错误一样,一个六行的计划。 那么,什么是错的第18行,字符? 好的。 所以,我要声明这个中断。 好的。 所以,让我们来看看,一大堆其他错误。 噢,我的上帝。 19,18,21。 再次,让我们清除屏幕 - 控制L - 并重新运行铛。 因此,五个方面的问题是实际上只是一个。 所以,现在让我们来运行buggy4,回车。 哇! x已经被正确地递增。 好的。 如何增加数字的任何问题? 是吗? 主讲人2:为什么是它,你可以只改变x的变量数 命名,它会知道你是什么意思? DAVID J.马兰:好问题。 它是如何,我可以只改变x的数量,程序将知道 立即吗? 所以,再一次,把它作为这个抽象。 所以,如果我主要和Ken是渐进式的,坦率地说,我不关心 什么肯称,他的iPad。 我不在乎他所说的什么,做他的执行 这个功能。 所以这是一个实现细节,我,主,不 有关心。 因此,简单地改变它一贯里面的功能,号 和数量,是需要很长时间,我重新编译。 这是有点像,如果你认为的 - 很多人来说,你的驱动程序的 许可所驱动,或者如果你即使在汽车驱动 - 我们大多数人不知道如何汽车引擎盖下的。 从字面上看,如果你打开​​引擎盖,我们大多数人 - 包括我自己 - 不会真正了解我们正在寻找。 有点像你可能会觉得现在的东西,如这项权利。 但是,我们真的不关心汽车是如何工作的。 我们不必关心所有内部的杆和活塞和电缆 汽车实际上是在做什么。 所以像你所说的活塞无所谓 这里在这种情况下。 同样的想法。 是吗? [听不清] DAVID J.马兰:如果有更多的用途的变量XA时刻前, 作为程序员,你将不得不改变他们无处不在。 或者你可以从字面上文件,菜单,然后查找/替换, 类似的东西。 但是你将不得不让自己的这些变化。 你必须是一致的。 [听不清] DAVID J.马兰特定的顺序:A喜欢这里吗? 如果这是int的另一个电话号码吗? 是啊。 因此,为了重要的,当你调用该函数。 所以,如果我在这里呼吁增加的东西逗号东西, 有一个直接的映射。 第一可变,无论它的名字,作出了第一个副本 在这里的论点。 对不起,这不应该是一个括号。 第二个参数与第二个。 ,是的,所以,为了事宜。 好的。 对不起,我花了很长的路到那里。 其他问题吗? 好的。 因此,让我们来看看,如果我们不能画一幅画,实际上 引擎盖下的,可以这么说。 因此,这是一个矩形,可能代表你的计算机的内存。 所以,即使你不知道如何记忆或RAM作品如何,至少 假设你有束的这些天。 你得到了它的兆字节。 你有GB的。 我们知道,从周零一个字节是什么? 8位。 对,所以8 0和1。 所以,如果你的计算机有一个演出的RAM,2个演出的RAM这些日子里,你有一个 亿或2亿字节的内存,或大约8亿美元或16亿美元 位,您的计算机内。 现在不像的小绵威利例如,它没有磁性粒子 典型的了。 越来越多的,至少在笔记本电脑,它的固态硬盘,固态硬盘, 只是没有移动部件。 这是所有的电子。 这是所有的电力基础。 因此认为,虽然,这个矩形代表一个或两个 GB的记忆体,你有。 因此,它是一个内存块。 现在世界上的计算机科学类的分区块 内存做不同的事情。 因此,举例来说,如果这是您的计算机的内存 - 所建议的 矩形 - 原来,按照惯例,在您的RAM的顶部,所以 说,一般是什么所谓的文本段。 这些都是零和的,你已经编译。 因此,当我们已经看到引擎盖下的a.out是什么,所有 0和1 - 当你运行一个程序时,这些0和1,从您的硬盘装入 到一些所谓的RAM驱动器。 在RAM中,他们把在顶部。 同时,你还有其他的事情。 初始化数据,未初始化的数据。 这两个大片的内存是指为全局变量, 你不经常使用。 但有时如果你这样做,他们结束了在那里为好。 此外,还有一些其他的东西。 环境变量,我们不会花太多的时间。 但随后的两件重要的事情会回来整个 学期,堆栈和堆。 因此,大多数您的计算机的内存中运行的程序时保留 一些所谓的堆栈,称为堆的东西。 我们不会谈论堆,但我们会 谈论的堆栈。 和堆栈是为了唤起了视觉像食堂 餐托盘Mather中楼,或任何你碰巧是,这里的 食堂的工作人员清理他们的每一天。 它们堆叠起来,从地板上起来。 同样在内存中,有这种想法,把一些在 叠加,将在栈上的东西,把东西在栈上。 是什么意思呢? 好吧,让我们放大只是这张照片的下半部分,您的电脑 RAM,提出以下建议。 原来,当你运行一个程序,如a.out格式“或”你好,什么 该程序是你写的, 再次,从您的硬盘驱动器加载这些0和1 - 长期储存,在那里停留,即使你拔掉插头 - 加载到RAM中。 RAM的速度比硬盘驱动器。 这是小于硬盘驱动器。 但它的节目直播,当你运行它们。 所以,你双击一个Mac或PC上的程序 - 它装载 到RAM中的硬盘驱动器。 只要它加载到内存中,0和1的方式上, 所谓的文本段。 但是,当你的程序启动运行,主要 函数被调用。 为主,正如我们已经看到的那样,经常有局部变量。 它有整型和字符串和字符之类的。 所以,如果你的程序,你写的程序,你有 双击内主要使用的一些变量,他们最终在 你的内存堆栈的底部,可以这么说。 现在更具体地说,这是什么究竟是什么意思? 这也就意味着,如果我们要怎样数算自己的事情 - 如果我们要在您的计算机数量的字节RAM,请注意, 这可能是字节数为0。 这可能是字节数一,二,三,四,五,六,所有 喜欢 - 2亿美元将一路攀升,在顶部。 所以,换句话说,当我们谈论RAM或内存中的字节, 只是意味着有人已经决定号每 这些内存块。 所以,当你需要32位的int,或者你需要一个字符的8位,其中 他们结束了在内存里? 那么从​​理论上讲,他们刚刚结束了在底部的 东西叫堆栈。 但现在有什么有趣的是,当主调用一个函数。 假设一个函数调用foo的,只是一个任意的名称。 会发生什么更主要的是在这个堆栈的底部的内存。 美孚现在被放置在顶部的主内存中。 因此,任何局部变量foo的最终排序的概念上以上 在主。 如果foo调用另一个函数调用酒吧,这些变量在这里结束。 如果酒吧调用别的东西,在这里,这里,这里。 那么,在运行了一个程序很有意思的是,当你调用函数, 那些函数调用的函数,这些函数调用功能, 你建立了这个堆栈在内存中的功能。 而只有一个函数返回后,你开始,内存。 因此耗尽内存在计算机程序中最简单的方法之一是 写函数从不返回。 因此,举例来说,让尽可能多的展示与 故意错误的程序。 让我继续前进,不要#包括的,诠释的主要(无效)。 我该怎么办(2> 1),这可能将永远不会 改变我们。 让我继续做输出。 事实上,这将是在视觉有趣的。 让我们这样做。 为Int(i = 0; I> 0)。 让我们犯这样的错误,我+ +。 让我们在这里不是printf。 我们的做法是我的说教。 让我们在这里有一个方法。 虚空的合唱,我们会说INT I。 然后我会说,输出 - 哦,让我们使这更有趣的。 让实际不打印任何东西,在所有。 我们只要做到这一点。 合唱团(I)。 好的。 因此,这是越野车,因为为什么呢? 我正在做这件事,因为我去的,因为该计划实际上并没有做什么 的兴趣。 但是,这不是目标。 我们的目标是编写一个程序,做什么,显然,其主要功能? 调用自身。 实际上,我们并不需要循环。 让我们甚至简化这只是因此,不要忽视真正的 根本的问题。 主要调用合唱团唱一些合唱。 然后我做了一些愚蠢的事情,和我有合唱的呼叫合唱团,因为我假定 别人可能实现它。 现在,这是不会还来编译。 我需要做什么? 我需要的原型,记住了。 所以我需要在这里有无效合唱团(int i)的。 所以,现在,如果我去这里 - 其实,让我们用更大的窗口。 让我们继续前进,并合唱。 让我们继续前进,并合唱。 使用身份不明申报我。 哦,那是愚蠢的。 我们并不需要的参数。 我们只要做到这一点。 希望我们能有这样开始。 这本来是一个更简单的程序编写。 这样出现了。 现在,让我们去到我的终端窗口,再次运行铛。 在这里,我们走了。 这是真快。 究竟刚发生时,有关系吗? 好了,现在我将添加打印线,这样我们就可以看到。 因此,让我输出,比方说,我在这里。 好了,没有变量,我们会留下这样的。 让我重新运行。 让我重新运行合唱团。 。 继续下去。 顺便说一句,为什么它没有崩溃吗? 分割故障发生前超级快。 [听不清] DAVID J.马兰:没错。 因此,它需要一定的时间来打印。 它只是需要更多的工作在计算机的一部分。 有。 分割故障。 因此,发现是多么快的程序运行。 如果你没有打印任何东西,超级快。 但是,我们仍然得到了该段故障,因为发生了什么事? 好吧,如果你认为您的计算机的内存,这 恰好是主要的。 但在这里 - 我们只需要调用这个合唱之中,让我们这个合唱团。 现在,如果我做我的美学,这只是说合唱, 合唱团,合唱团,合唱团,合唱团,合唱团,合唱团,广告nauseum。 最终,会发生什么呢? 如果大的画面字面意思是这样的,这是发生在概念上吗? 该协议栈溢出堆。 更糟糕的是,你只是溢出的一切,包括文本段,这是 0和1代表你的程序。 总之,这仅仅是超级,超级坏。 对吗? 你的程序已失去控制。 您使用的是比你打算一切都是因为一个愚蠢的方式更多的内存 错误,在这种情况下。 或者,在这种情况下,故意做的函数调用自己。 现在,这并不全是坏事。 调用自己的函数实际上拥有极大的权力 当你正确地使用它。 我还没有正确地使用它在这里。 因此,这并不全是坏事。 但事实上,我从来没有真正停止称自己是一个基本的 这一方案的弱点在这里。 那么,我们要与所有这一切吗? 那么,到底发生了什么? 当我打电话的增量功能,像我们所做的是在那些例子, 我有一个值,如1,我传进去 我通过在副本的头号。 因此,发生以下情况。 因此,让进入的增量例子。 而且这家伙就在这里。 因此,这里实际上发生了什么。 当我打电话的增量,和我通过在X,形象地什么 在这里是这样的 - 如果我有1的值保存在这里,和其实我打电话增量,这 现在被称为合唱团 - 是啊,把我关在这里。 所以,让我们把这个增量。 我们不知道这是什么下一个功能将是。 那么,什么是实际发生的事情是这里的某个地方,我有一个在主块的 存储器,存储数字1。 当我打电话给增量,我使用其他的内存块,但现在我 有副本1。 当我增加值,这将成为2 - 可怕的写在 屏幕在这里。 但后来,发生了什么,尽快增加回报吗? 内存只是被交还给操作系统,这意味着所有 你这样做是没有什么用处。 实际上仍然是存在的,最初是包含在主。 所以,我们要这个吗? 好了,事实证明,在内存中,你有这个背靠背序列 字节,你可以把东西英寸 而事实证明,我们已经看到的东西,包括把 事情背靠背背靠背。 什么是一个字符串,第一个星期,现在在本周二的基础上吗? 所以它只是一个字符集合。 因此,原来,就像你可以把数字在内存中,同样你也可以 把字符在内存中。 一旦我们开始把字符在内存中背靠背 回来,事实证明,使用最简单的事情,比如一个for循环 while循环中,我们可以遍历 - 从左至右在字符串中的字符 - 开始按摩到完全不同的字符。 A可能变为B。有可能成为C.所以,最终,我们可以采取一个 英语句子,其实是有道理的,每个人转换 一次一个步行通过我们的计算机的内存离开 实际上加密的权利。 因此,让我们在这里,我们五分钟的休息时间,当我们回来时,我们会 启动这一进程的扰码信息。 好的。 所以,在我们深入到一些加密,这些东西称为“阵列”,让我 暂停任何问题,因为我觉得我是那种混乱的一些 这些议题。 所以现在,如果我们可以让我们来解决。 所以,我们刚才讲的返回值。 我们谈论的论点。 我们谈论这个概念,我们回来在周 来,这些堆积一大堆的查看内存 托盘,可以这么说。 从底部上起来,使得每个托盘会在栈上代表 的功能,这是目前被调用。 有什么问题吗? 因此,如何对 - 让我试着问了一个问题。 我一直在破坏,但现在it's - 地一下男孩的脸。 因此,我们将回来。 因此,让我在这里问一个问题。 让我简化这回它是什么之前,我们早期的Q&A. 而事实上,增量左括号,INT数,关闭 括号内。 整数数字代表什么? [听不清] DAVID J.马兰的说法。 好了,但什么是参数? [听不清] DAVID J.马兰:对不起,那是什么? 主讲人3:你传进去的东西 DAVID J.马兰:好吧。 所以,你传进去的东西 更一般地,它仅仅是输入。 如果你在生活中写一个函数,该函数的目的是做 有点不同的东西,每次你使用它,那么唯一的办法 要做到这一点真的会似乎是为它提供输入,所以它 可以做不同的事情,每次输入。 所以,你需要指定两件事情,当一个函数需要输入。 你需要指定你想给,输入的名称,纯粹是为了 自己的方便,所以,你可以参考它的功能 自己写作,我在这里的第32行。 但是,你还需要指定它的类型,因为C是一种编程语言 只需要 如果你想要一个变量,你必须告诉计算机 数据类型是, 在很大程度上,以便它知道多少位 分配给该变量。 因为它可能是6 - 对不起,它不会是6。 它也可以是16。 它可以是8位。 它可以是32个,甚至64。 但是,计算机需要知道。 现在,在左边的int代表着什么,与此相反呢? [听不清] DAVID J.马兰:那是什么? [听不清] DAVID J. MALAN:类型的函数,并更具体地,在 其输出的类型。 右。 因此,而括号中的东西代表的输入,如果有的话, 事情左边表示其输出端。 在这种情况下,增量显然是返回一个int。 所以int是这个函数的返回类型。 要返回的是什么意思? 从字面上看,,使用关键字回报。 然后,如果你返回到正确的关键字是 整数,那么这确实是符合我们所承诺的。 你不能做这样的事情 - 你好,世界 - 因为这是一个字符串。 很明显,这不是一个整数。 因此,在短,真的是对我们的负担,程序员,具体为 我们回国,然后返回。 一点点,然后作出更明确的背景下 - 他又出来了。 背景 - 大惊喜,在短短的时刻。 这里的背景是,现在是您的计算机的内存中,再次, 技嘉,2千兆字节,什么都好。 也许是更重要的。 也许它的不足。 但电脑的看法有不同的部分。 出现下降。 别的东西。 不同的东西在中间。 今天,我们就开始讲这个故事。 但我们会回来到这个随着时间的推移。 现在,唯一的一块内存中,我们真正关心的是文本段 因为这只是代表了0和1 ,铛输出。 所以,当你在键盘上像a.out的运行命令,或者双击 在Mac OS或Windows点击一个图标,你的程序从硬盘装入 开车到RAM中。 它的屁股在您的计算机的RAM的顶部,可以这么说。 同时,为您的程序开始运行,并在被称为主 程序,你写的程序微软和苹果写道,任何其 局部变量结束了在那里降落的底部,您的计算机的内存中。 但是,如果主本身调用另一个函数,变量或 参数,它们最终会在它的上面。 如果该函数调用的东西,他们最终在它上面, 在它上面,在它之上。 只有一次是执行不托盘堆叠,所以 说话,开始越来越低。 这是什么话,概括地说,解释了为什么当你调用立方体 - 还是你打的增量 - 你在副本的价值传递。 是什么意思形象地是,你从字面上写 号1中的存储器的另一部分,改变一个1至2,在箱子的 增量 - 或8,在多维数据集的情况下 - 然后投掷,内存只要增加或多维数据集 函数返回。 问题。 [听不清] DAVID J.马兰:凡 - 全局变量中存储的是什么 目前被称为初始化的数据和未初始化的数据。 区别在于,如果你有一个全局变量,并赋予它 立即等号的值,它结束了在顶部。 如果你只是说没有价值的诠释x分号,它最终小幅上涨 简单地按照惯例,在RAM。 其他的问题。 好的。 因此,这幅画会回来的,因为我们变得更强大,我们能做些什么 与计算机。 但现在,让我们有一个简短的介绍,特定类型的加密技术, 密码学不解决世界上所有的问题,但没有解决 其中的一些。 在这种情况下,在这里,我们有一些所谓的密钥加密。 密钥加密,顾名思义,源于它的安全性 从一个秘密。 因此,举例来说,如果你是在小学和你通过一个 小秘密情书的男孩或女孩,你破碎 - 如果你 想通过贯穿全场的,你可能不会写 英语中的注释,或任何你的母语,而是你 可以对它进行加密。 或者你可能只是给他们一个文本消息,这些天。 但你实际上可能会通过他们在教室。 而要做到这安全地,以这样一种方式,您的朋友和教师 不知道你写的东西,你可能会想出一个相当简单的 算法 - 年轻人虽然你可能是 - 只是争夺的话。 因此,而不是写一个,你可能会写B.而不是B,你可以写 C.而不是C,你可能会写D,等等。 或者,你能想出一个更复杂的字母翻译 以不同的字母。 但美中不足的是男孩还是女孩,你发送此说明需要 知道的东西。 这是什么,很明显吗? 一样,你的秘密是什么。 喜欢什么,是AS和BS和CS和DS之间的映射? 难道仅仅是增加一个,可以这么说,每一个字母去从 A到B,从B到C? 它是比这更复杂吗? 所以,你和你的美眉需要有这个秘密的信息。 但有一个catch-22在这里种。 如果这是第一次通过你这封情书 类的是男孩还是女孩,怎么会知道这个秘密,甚至是吗? 因此秘密密钥加密并不能解决世界上所有的问题。 其实有关系,我们再回过头来朝 学期结束。 同样,我们有没有可能发送过 - 同样,我们大多数人不知道的人的作品,例如,在 Amazon.com。 然而,我们很多人可能买的东西在Amazon.com。 我们一直被教导要承担这些电子商务 交易是安全的。 对吗? HTTPS URL可能说。 有可能一个愚蠢的小挂锁图标的地方。 有某种形式的加密技术保护您的信用卡信息 你和亚马逊(Amazon.com)之间。 然而,如果密码学需要知道一些秘密,但我不 知道在亚马逊的人,而且我肯定不会安排任何形式的 有人在亚马逊的秘密,我的电脑或浏览器这样做呢? 好了,原来有其他类型的加密技术完全解决 那样的问题。 但是今天,我们将重点放在简单的一个,在那里你可以安排在 提前知道一些秘密,如加1或一些AS和BS之间的映射。 和加密过程一般涉及这一点。 你有一些简单的文字,描绘在左。 您可以运行它通过某种算法或过程 加密。 也许这只是一个变成了​​B,B变成C。然后你就结束了 密文。 同时,一旦你的美眉接收到的秘密纸条,他或她有那么 一般扭转这种算法,从而获得进行解密 备份纯文本。 现在有物理的化身。 举例来说,这是一个小秘密的解码器环。 这是在这个意义上,在这里两个表盘的环。 在这件事情的外周,有字母A到Z, 虽然他们以随机顺序。 在里面,有一些数字,例如, 戒指,你可以种翻在外面,但不是内部以排队 数字与字母。 而在剪辑你将要看到的 - 其中有些你可能已经看到24/7 从一部电影叫圣诞故事在圣诞节前后。 你会看到那个小拉尔夫是如此渴望要弄清楚什么的小孤儿 安妮的秘密是他的消息了沟通,我认为,在 数字信息串行中形成的。 你有积累的小卡片,来到 在麦片盒。 你必须邮寄他们。 你有秘密的解码器环,所以,你终于可以图 字母和数字之间的映射是什么, 或字母和字母。 所以,我给你这个短片从一个圣诞节的故事,以激励的pset 2 我们的讨论,在某一时刻的数组。 所以在这里我们拉尔夫。 [视频回放] 无论是向所有人拉尔夫·帕克委任一个 的小孤儿安妮秘密圈的成员,并有权 荣誉和利益发生于此。 签名,小孤儿安妮。 会签,皮埃尔·安德烈! 在油墨中! 荣誉和利益,已经9岁。 来吧,让我们用它。 我并不需要所有的爵士乐关于走私和海盗。 - 听着明天晚上的结论冒险的黑色 海盗船。 现在,是时候为你的成员安妮的秘密消息 秘密圈。 请记住,孩子,只有安妮的秘密圈的成员可以解码 安妮的秘密消息。 请记住,安妮得靠你了。 将你的脚B2。 这里的消息。 12,11 - 我在我的第一个秘密的会议。 -14,11,18,16 - 皮埃尔是在今晚很大的发言权。 我可以告诉大家,今晚的消息是很重要的。 -3,25。 这是一个消息,安妮自己。 记住,千万不要告诉任何人。 -90秒后,我在一个房间里唯一的一个九岁的孩子 可以坐在隐私和解码。 啊哈,B.我去到下一个。 E.第一个字是。 S.它现在更容易。 U. 哦,来吧,拉尔夫。 我得走了。 - 我是正确的,妈妈。 - 啧啧奇才。 -T,O.一定要。 要确保的是什么? 小孤儿安妮想说的是什么呢? 要确保的是什么? - 拉尔夫! 兰迪得走了。 请你出来吗? 好吧,马。 我马上就出来。 我越来越近了。 张力是可怕的。 它是什么? 这个星球的命运悬而未决。 - 拉尔夫! 兰迪得走了。 - 我就出来,哭出声来。 哎呀,几乎没有。 我的手指飞了起来。 我的心是钢的陷阱。 每一个毛孔振动。 这几乎是清楚的。 是的,是的,是的,是的。 要确保喝阿华田。 阿华田? 照出的商业? 狗娘养的。 [END视频播放] DAVID J.马兰:因此,我们有加密技术。 因此,如何在一台计算机,我们可以去实现,或者 代表这样的事情吗? 好了,我们需要一种方式表达自己一点更灵活 因此,我们的变量不允许的。 我们已经有整数。 我们已经有个字符。 我们的花车和双打和其他几个人。 但是,这些都是个人的内存不真的让我们 表达的东西,如单词和句子和短语。 事实上,我们叫这样的事情串。 但我们所承诺的,这是真的只是一个简化的CS50 库,我们打算剥离回来。 让我们开始做,在这里。 让我继续前进,打开一个文件 - 所有这些文件都可以像往常一样在网上 - 称为array.c解决的问题无关字符串,但描绘一个 的图片在这里,我们怎么可能使用的东西称为数组。 数组是一种数据类型。 这是一个类型的变量,各种各样的,有多个较小的数据类型 它里面的背靠背背靠背。 因此,举例来说,如果我们要编写一个小程序,让您的 测验平均为一疗程,有两个小测验,你可以很容易像50 编写这个程序 - 甚至在一些上周的材料 - 通过调用getInt和一对夫妇的变量。 诠释quiz1,诠释quiz2,这是很简单的。 这也许是10,20行的代码,最大,实施程序,要求 两个测验的分数,然后计算它们的平均用户通过将它们添加 在一起,除以二,然后打印结果。 我们或许可以做到这一点很容易现在, 有些分钟数。 但问题是,假设有50有三个测验或4。 假设你想使用相同的程序,有一类 每周测验。 想想一个类时,每周测验。 如果有像在一个学期16周,现在你有16个变量 - quiz1,诠释quiz2,诠释第quiz3,诠释quiz4。 只要你开始看到这种冗余,复制和粘贴 的代码,它应该让你希望有一个更好的办法。 幸运的是,因为数组。 因此,让我们做到这一点。 首先,让我介绍一个非常简单的事情,我们到目前为止还没有使用, 但偶尔你会看到它的代码。 这就是通常被称为一个常数。 所以在这个意义上,这个值不会改变,它是一个常数。 创建一个常量时,是使用全部大写的人的约定 字母,只是,使其真正站出来,在你的代码。 特殊的关键字,您使用的C#定义。 所以,如果你说的,然后是一个空格,然后你想使用这个词, 常量的名称,然后该常数的值。 因此,通知,这从一个变量分配的东西是不同的。 有没有等号。 有没有分号。 这是通常被称为预处理器指令,但更多的 另一个时间。 就目前而言,这将创建一个不变的值,称为测验的实际 的数值是2。 因此,任何地方,你看到测验,测验,测验,这是整个文件 只是数字2。 现在,如果我看主要现在,让我们来看看它是如何工作的。 起初,这看起来有点神秘。 但它是从第一个星期,所有的东西。 询问用户的等级。 如何才能做到这一点呢? 那么,在第22行 - 这是真的的多汁的一部分 - 我声明了一个浮动,但是不只是一个单一的浮动。 我声明,而是一个浮点值数组。 这个变量将被称为档次,这里暗示。 但唯一的一块新的语法,那么这些方括号中,其实 我已经说过了浮动等级,然后打开支架,然后一个数字。 请注意,如果这是一个常数,这是像我们这样做。 这意味着哎电脑,给我两个花车,让我们共同呼吁 他们的成绩。 这是更繁琐的过程,这样的对比。 浮法级1,浮动grade2“,等等。 因此,一个阵列,使我们能够实现这个想法,但要少得多乱七八糟,在 这样的方式,我们可以写一行代码,而不是,比方说,一个16 16 周的学期。 所以我不想硬编码,因为,如果你认为现在 假设明年逻辑 - CS50更改为3,而不是测验。 我有2号。 在这里,我有2号。 在这里,我有2号。 在这里,我有2号。 它变得非常乏味,很容易搞砸了,不小心改变 一个值,错过了一些其他值2。 所以我要这个距离,而不是抽象的,并使用此常量,其 顾名思义,永远不会改变。 而现在,无论我们有不同的测验今年或明年,我 只需要改变它在一个地方,在这里顶部。 所以这是所有不变的是。 同时,新概念的特点是一个数组。 因此,在方括号给我这么多的花车,让我集体 他们成绩在这里。 所以,现在让我们来看看我会做什么。 在这里,在第24行是一个for循环的开始。 这实在是没有任何幻想。 这只是使用测验,而不是硬编码的数字。 但也有是没有从上周智力有不同的。 这仅仅是printf的。 因此我们知道printf(“小考数的%d%d”的),因为我只是想打印出来给我测验 数之一,两个,然后两个两个。 因此,这纯粹是一种审美的东西。 但是,现在最有趣的部分是在第27行。 为了填补的两个占位符的浮点 值,你再使用方括号。 在这种情况下,我使用的是我,因为for循环已开始与我等于 什么样的价值,显然是吗? 0。 因此,在这个循环的第一次迭代,这是因为虽然我 写在代码中。 但在这个循环中的第二次迭代,这是因为虽然我 写在我的代码。 但事实上,我使用一个变量是完美的,因为,正如其名 表明,它改变它的值在每次迭代。 所以我填充这个数组一个地方的时间。 阵列看看这是什么样的呢? 好了,我之所以得出这个超级简单的屏幕上的矩形 之前是因为这个原因。 数组是另一块内存的内存块, 其次由另一个的内存块,等等。 所以,如果我的数组大小为2,在这种情况下,在这里,所有我会做的 打字在我测验成绩,喜欢上了这里。 我就这一个。 然后,我得到了99就这一个。 该内存可能甚至没有使用,因为我只问 电脑的数组大小为2。 这些广场仍然存在。 对吗? 你还有2 GB的RAM,即使你只 两个浮点的要求。 因此,阵列背后的想法是,计算机只需要一个内存块的 然后分给更小的碎片背靠背背靠背。 因此,这是所有的数组。 这是一个连续的内存块,这里面你可以把东西。 现在发生这种情况,然后做一些无聊的算术。 如果我向下滚动在这里,这是我然后遍历数组中。 我拿出所有的数组中的值的总和。 然后,我在这里使用ROUND函数实际做的 总结除以测验。 但是,让我挥挥手,作为足够的算术现在的排序。 但是,所有为我做的最终计算平均值。 所以第一次测验加第二个测验,再除以2,然后打印 它作为一个int。 但现在,让我们叫字符串转换到一个不同的例子, 它描绘了一个类似的画面,但使用​​字符串。 让我继续前进,简化这只是一个瞬间。 现在原谅缩进。 请注意,在这个例子中的第19行,我收到了来自用户的字符串。 但是请注意,我在22日线下做。 实际上,我遍历从我 - 这是一个新的伎俩 - strlen的字符串的长度。 这是一个与C的功能,如果你传递一个字符串,它告诉 你有多少个字符在该字符串中。 这就是全部。 事实上,它是strlen的字符串的长度,而不是仅仅是因为它的 更加简洁。 30年前,人们喜欢写东西尽量简洁。 因此,我们已经把该公约。 我+ +只是意味着我在每次迭代中增加。 而现在注意到这一点,这是非常有趣的。 因此,在第24行,我说电脑,给我一个字符,8 位,并称之为C。 不过这到底是上右手边说? 在英语中,什么代表什么呢? [听不清] DAVID J.马兰:没错。 给我的第一个字符数组中的。 或更一般地,给我的阵列中的第i个字符。 意识到这是重要的,现在,计算机科学家,我们实际上 从0开始计数。 你不拥有自由裁量权,现在开始这样做。 现在,你必须按照电脑的期望和行为 从0开始计算,因为[0]将是第一 字符串中的字符。 [1]将是第二个。 [2]将是第三个,等等。 所以,如果我编译这个程序 - 这是,再次字符串。 所以字符串。 现在,我在我的终端窗口中执行字符串。 它在等待输入,所以我要输入,就说,大卫。 输入。 而现在它打印DAVID在不同线路上,因为 请注意我在做什么。 我一次打印一个字符。 现在,我们将进入今天。 但我删除了刚才在这里检查。 事实证明,如果用户出现异常,对抗性的,或只是 混淆,实际上,你可以不给一些长度字符串。 如果你按错键盘上的键,你可以给 没有在所有的字符串。 或者,如果你是恶意的,你可以尝试将其粘贴在一千兆字节的价值的 的文章,以填补这个字符串。 如果计算机运行内存,事实证明,我们将 这个特殊的值称为空。 因此,就目前而言,只是知道有这个特殊的值称为空 让我们来检查时,我们的记忆,在其他的事情。 但是,如果我现在打开字符串,请注意区别就在这里。 看到一个与字​​符串的区别就在这里。 对于字符串,这个for循环是一个有点不同。 让我删除空值,这样我们就可以谈论其他时间的。 但是,什么是不同的for循环? 我可以回到前面的例子。 所以这是第二版。 这是一个版本。 一,二,一两个。 因此,strlen的电话是在哪里呢? 这是在for循环的第一部分。 任何想法,为什么我这样做? 是啊。 [听不清] DAVID J.马兰:所以我们不会每一次调用该函数。 没错。 回想一下,他们是超级简单的for循环,一旦你 明白,这是初始化, 条件,和更新。 的问题是,对每个条件发生 循环的迭代。 因此,在这个例子中,什么是坏的事实 这是我的条件吗? 你调用strlen再,再而三。 但是,一旦我输入的国宝,该字符串的长度是5个。 它不会改变,因为在每次迭代循环 字符串仍然是D-A-V-I-D。所以这是一个暗示了这是怎么回事成为 越来越重要思想的设计决策, - 只是不 使计算机做不必要的工作。 现在,正如pset的,PSET 2标准版先睹为快 要挑战你真正落实一定数量的密码,一些 数的加密算法,这样就可以加密和解密 秘密消息,就像一个拉尔夫解码。 在黑客版的pset 2,我们要去远一点。 我们将交给您的文件,其中包含一个实际的计算机系统 一大堆的用户名和加密的密码,和面临的挑战 为黑客版将是破解这些密码和数字 出了什么加密或什么秘密被用于实际 产生这些密码。 我们要做到这一点,使用一个新的功能,在这里我给的C 你只是一个演示,被称为命令行参数。 因此,原来,你们有些人可能已经看到在部分或教科书中, 主并不总是括号中是无效的。 事实证明,主也可以这样写,有两个参数, argc和argv,argc是的话,你输入后数 在命令行程序的名称。 而argv是实际的话。 的方括号,显然,argv是一个数组。 这将是一个字符串后的字符串后,内存中的字符串。 所以,我们要能够做到的,开始的pset 2, 这样的事情。 如果我argv1,这是一个例子,我们会回来(星期一)运行 ,请注意,它似乎并没有做任何事情。 它只是打印出自己的名字。 但是,如果我说再见类,请注意,这个方案显然迭代 在每一个的话,在提示符下输入。 和手段,我们将获得用户的话, 在提示符下输入是通过改变为主,本周末开始,从int 主要(无效),INT主(ARGC ARGV)。 因此,将要出生的命令行参数。 而一旦你得到真正的成熟,你就可以写 很迷幻的程序,如这一个在这里,这超出 我们已经做了一些功能迄今为止,所有功能相当强大。 因此,我们将离开这个在屏幕上。 我们星期一见。