[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。
所以我要这个距离，而不是抽象的，并使用此常量，其
顾名思义，永远不会改变。
而现在，无论我们有不同的测验今年或明年，我
只需要改变它在一个地方，在这里顶部。
>> 所以这是所有不变的是。
同时，新概念的特点是一个数组。
因此，在方括号给我这么多的花车，让我集体
他们成绩在这里。
所以，现在让我们来看看我会做什么。
在这里，在第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）。
因此，将要出生的命令行参数。
而一旦你得到真正的成熟，你就可以写
很迷幻的程序，如这一个在这里，这超出
我们已经做了一些功能迄今为止，所有功能相当强大。
>> 因此，我们将离开这个在屏幕上。
我们星期一见。