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