[Powered by Google Translate] [第4条] [舒适]
内特 - 哈迪森] [哈佛大学]
这是CS50。[CS50.TV]
>> 好了，欢迎回款。
在本周的部分中，我们要做的几件事情。
我们将首先回顾一下习题集2，
这是在的凯撒和维琼内尔问题集。
然后，我们将潜入测验0个评论
并花一点点的时间，扼要我们所谈论的
的讲座中，到目前为止，我们还会做的几个问题
从上一年度的测验。
这样，你们有一个很好的方式准备。
>> 首先，我已经启动了一对夫妇的良好的解决方案，
对于前一个问题集，习题集2，进入这个空间。
如果你们打这个环节，
如果你点击我的名字，然后单击“我的第一次修订
，你会看到caesar.c的，而这正是我在寻找。
让我们来谈谈这真的很快。
这仅仅是一个样品溶液。
这不一定是最完美的解决方案。
有许多不同的方法来写这个，
但也有几件事情，我想强调
我看到了，因为我是分级的，常见的错误，我认为
这个解决方案做了很好的处理工作。
>> 第一的是，在顶部具有某种头注释。
在第1行至第7，你看到的细节，
究竟是什么程序在做什么。
当你写C代码的一个很好的标准做法
不管你的程序是包含在一个单一的文件或
无论是拆分到多个文件中是有某种
定向开头处的注释。
这也为走出去写代码，在现实世界中的人。
这是他们会把版权信息。
下面是＃包括。
第16行有这样的定义，我们会回来的，在短短位。
，然后再次启动的功能，一旦主开始，
因为这个程序已经都包含在一个单一的功能
第一件事发生这种情况，这是很惯用的，典型的C程序
，它的命令行参数的是，它会立即检查
>> 计数参数是argc。
在这里，我们看到，这个程序需要2个参数完全相同。
记得有，第一个参数的特殊
这是永远的正在运行的程序的名称，
的可执行文件的名称。
因此，这是什么做的是，它可以防止用户运行该程序
更多或更少的参数。
究其原因是因为我们要检查这项权利了
我们实际上无法访问此argv数组，这里可靠
直到我们检查，看它有多大。
>> 我看到了常见的错误之一是，人们马上会去
和抓斗的argv [1]。
他们会抓住关键参数的数组，并做一个我检查它，
然后，他们会做的测试为argc以及接下来的测试，
不是第一个参数是否确实是在相同的时间的整数，
不工作，因为的情况下，没有提供参数
你会被抓住的参数是不存在，或试图抓住一个不存在的。
>> 其他大的事情，你应该注意到的是，
你总是希望打印出某种有用的错误信息
定位他们的用户。
我敢肯定，你的所有运行程序，所有的突然崩溃，
你这是荒谬的小对话框弹出，并说
一些可怕的神秘，也许给你一个错误的代码，或类似的东西
那是没有意义的。
这是你真正想要提供一些有益
并针对用户，这样当他们运行它，他们“哦，”面对手掌。
“我知道该怎么做，我知道如何解决这个问题。”
>> 如果你不打印一条消息，那么你最终实际
让用户去检查你的源代码
出了什么错。
也有一些时候，你会使用不同的错误代码。
在这里，我们只是说有一个错误，
有一个错误，出现了错误。
更大的程序，通常被称为由其他程序的程序，
在不同的情况下，将返回某种特殊的错误代码
以编程方式沟通，否则你会
只使用一个好听的英文消息。
酷。
当我们的工作，你可以看到我们拉的关键了。
我们测试一下，看看如果钥匙和。
我们从用户得到一个消息。
我们之所以这样做，在这个do while循环，这是什么，我们将覆盖
一点点，但事实证明，如果你输入控制D
当你在终端上的提示，GetString的
实际上做的是，它发送一个特殊字符
到该程序。
这就是所谓的ELF文件结束符。
在这种情况下，我们的消息字符串，是空的，
所以这不是我们检查中的问题，为自己的东西。
>> 但是，当我们去，现在我们已经开始谈论指针
和动态内存分配在堆上，
检查是否为空，只要你有一个功能，可能
返回null值是在做的习惯，你会希望得到的东西。
这是在这里主要是为例证。
但是，当你看到的GetString在未来，
所以从习题集4上，你要记住这一点。
再次，这是不是一个问题，问题3，因为我们没有遮盖。
最后，我们得到的这部分，我们得到的主要加密循环，
有一对夫妇的事情在这里。
首先，我们遍历整个消息字符串本身。
在这里，我们已经把strlen的要求的条件，
一些你所指出的，是不是一个伟大的方式去。
事实证明，在这种情况下，它也没有很大的，
部分原因是因为我们要修改的消息本身的内容
在fo​​r循环中，所以，如果我们有10个字符长的消息，
我们第一次启动，strlen的循环，将返回什么呢？
10。
>> 但是，如果我们再修改的消息，说我们修改它的第5个字符，
我们扔在一个\ 0字符在第5位，
在随后的迭代中的strlen（消息）将不会返回它的所作所为
我们第一次迭代，
但是，它会直接返回5，因为我们扔在了空终止，
定义字符串的长度
由位置，\ 0。
在这种情况下，这是一个伟大的路要走，因为我们修改它。
但是你注意，这实际上是出奇的简单加密
如果你能得到正确的数学。
所有这一切需要的是检查是否或不信你看
是大写还是小写。
>> 究其原因，我们只需要检查，我们并不一定要检查
是α的情况下是因为
如果一个字符是大写的，或者如果它是小写
这绝对是一个字母，
因为我们没有大写和小写的数字。
我们做其他的事情，这是一个小技巧 -
我们已经修改了标准的恺撒密码式
我们给问题集规范。
这里有什么不同的是，我们减去
A，大写的情况下，资本，然后我们增加了大写字母A
备份结束时。
>> 我知道一些你在你的代码中已经这样做了。
有没有你这样做您提交的吗？
你这样做。你能解释一下这是什么做的，Sahb？
通过减去它，因为你做了一个mod后，
你必须把它拿出来，这样一来你[咳嗽]位置。
然后加入回来后移了过来，你想。
是的，没错。
什么Sahb说的是，当我们要添加
我们的信息和我们的键
然后国防部称，国防部，的NUM_LETTERS，
如果我们不扩大我们的信息到相应的0至25的范围内，第一，
那么，我们可能最终得到一个非常奇怪的数字
因为，我们正在寻找时，我们期待在消息[I]的值，
当我们看到我们的纯文本消息在第i个字符，
在这65至122的范围内，是一种价值的地方
通过小写字母z的大写字母A的ASCII值的基础上。
因此，当我们mod这26或由NUM_LETTERS的，
因为那是我们的＃define在这里的右上角，
这给我们一个值，在0至25的范围内，
我们需要一个方法，然后，备份扩展
并在适当的ASCII范围。
做到这一点最简单的方法是，只是规模都记录下来
到0至25的范围内，首先，
然后改变一切结束时。
>> 另一个常见的​​错误，我看到了人碰上的是，
实际上，如果你不这样做缩放马上
和你添加消息和关键，你将它们添加，也就是说，
到一个char变量，问题与
既然这个消息[i]是一个比较大的数量开始
记得至少65，如果它是一个大写字符
如果你有一个大的关键，说，像100，
和你添加那些连成一个符号的字符，你将得到一个溢出。
你会得到一个值，该值大于127，
这是一个char变量可以容纳的最大价值。
同样的，这就是为什么你会想要做那种事情开始。
有些人得到了解决这种情况下做的，如果其他测试
在这之前，看看它会溢出，
但这种方式得到解决的。
然后在此解决方案中，我们打印出整个字符串在最后。
其他人打印出一个字符的时间。真棒。
在这一点上，你们有任何问题，任何意见？
你喜欢的东西，你不喜欢的东西吗？
>> 我有一个问题。
也许我错过了在你的解释，但如何做这个节目
跳过空格连接的关键文本的长度吗？
这仅仅是恺撒密码。哦，对不起，是的。
是的，我们会看到这一点。
在恺撒密码，我们得到了解决，因为
我们只翻个字符。
我们只旋转他们，如果他们是大写或小写。
你们感觉还不错，对这个吗？
感觉自由复制这个家，把它，
给你们写了什么。
肯定会觉得免费发送关于它的问题。
再次，认识到这里的目标与您的问题集
不要让你们来编写完美的代码为您的问题集。
这是一个学习的经验。是啊。
>> 返回的do while循环，如果它等于空，
所以空只是意味着什么，他们只投中输入？
null是一个特殊的指针的值，
我们使用空当我们想要说
我们有一个指针变量，它指向没有。
因此，它通常意味着这个变量，这个消息变量
是空的，在这里，因为我们使用的是CS50特殊的字符串类型，
的CS50的字符串类型是什么？
你见过它是什么，当大卫拉了回来罩在演讲吗？
这是一个时髦的，它是一个指针，对不对？
好吧，是的。>>这是一个char *。
因此，我们真的可以取代
在这里用char *的消息，
等GetString函数，如果它没有成功地得到一个字符串的用户，
它不能解析的字符串，在一种情况下，它不能解析的字符串
是，如果用户键入文件结束字符，控制D，
这是不是你通常做的事情，但如果出现这种情况
然后该函数将返回为空值的一种说法
“嘿，我没有得到一个字符串。”
会发生什么，如果我们不把消息= 0，
这是一件好事，我们还没有做呢？
为什么会是这样一个问题在这里吗？
因为我知道，我们谈了一点点的内存泄漏演讲。
是啊，让我们做到这一点，让我们看看会发生什么。
>> 罗勒的问题是会发生什么，如果我们实际上并没有
此消息= NULL测试？
让我们来滚动到顶部。
你们可以评论了这一点。
其实，我将它保存在一个修订。
这将是第三次修订版。
你必须运行此程序是，你必须点击齿轮图标，在这里，
你就必须给它添加一个参数。
你必须给它的主要论点，因为我们要通过在命令行中的参数。
在这里，我要去给它的数量3。我喜欢3。
现在放大，运行该程序。
它的运行，编译，构建。
在这里，我们走了。它的等待提示。
如果我输入的东西，喜欢Hello哪里去了？
哦，我的程序运行时间太长。我jawing太长时间。
在这里不言而喻。
现在，我输入你好。
我们看到它加密适当。
现在会发生什么，如果我们这样做迅速的GetString返回null？
请记住，我说，我们这样做，同时按控制D。
在这里，我会向上滚动。我们将再次运行。
建设中。就这样吧。
现在，当我打控制D
我说opt/sandbox50/bin/run.sh，这条线分割故障。
你们有没有看到过吗？
>> [学生]：为什么没有“对不起？
[学生]：为什么在这种情况下，是没有核心转储？
核心转储的问题是，为什么没有核心转储这里吗？
问题是有可能，但核心转储的文件
被存储在硬盘驱动器。
在这种情况下，我们已禁用核心转储
运行服务器上，所以我们没有人段断层
建立核心转储吨。
但你可能会得到一个。
核心内存转储文件之类的事情，你经常可以禁用，
有时你做的。
分割故障，回答你的问题，罗勒，
是说，在我们试图访问一个指针
没有被设置为指向任何。
视频的时候Binky试图记住Binky
去访问的指针没有指向什么？
在这种情况下，我想技术上的指针指向的东西。
它指向空，这在技术上是0，
但是这被定义为在一个段是无法访问的
你的程序，你会得到一个分割故障
因为你不访问内存中一个有效的段
像堆段或堆栈段或数据段。
酷。
任何更多的问题，凯撒？
>> 让我们继续前进。让我们来看看在第二次修订真的很快。
这是维琼内尔。
在这里，维琼内尔
我们将步行通过这个很快，因为再次，
维琼内尔和凯撒是非常相似的。
头注释之前，
＃define的前避免使用这些神奇的数字。
这种做法的好处是说，我们希望迁移到
不同的字母或类似的东西。
而不是去手动更改所有的26个代码中的
我们可以改变这27或砸下来
如果我们使用不同的字母表，不同的语言。
同样，我们已经得到了这个检查计数参数，
真的是你几乎可以作为一个模板。
几乎每一个你写的程序应该有
如果需要命令行参数的一些序列的线
在开始的时候是这样的。
这是一个你想要做的第一次完整性测试。
>> 这里，我们所做的只是我们确信，
关键字是有效的，那就是，我们做了第二次检查。
再次注意，我们分开argc和2。
请注意，在这种情况下，我们需要做的是一件事，而不是
使用我，我们想验证的整个字符串，
在为了做到这一点，你确实有去逐个字符
在字符串。
有没有很好的方法来调用一下就可以了
因为即使，例如，一个我将返回0
如果它不能解析一个整数，所以，甚至不工作。
同样，不错的消息，告诉用户究竟发生了什么事。
那么在这里，再次，我们也处理的情况下，
用户控制三维随机字符类型。
>> 然后夏洛特有一个问题，我们如何管理跳过空格
在我们的字符串。
这是一种类似我们所做的Myspace程序
我们所做的部分，工作的方式，这
是我们跟踪的数量，我们看到的字母。
当我们走在消息字符串，因为我们逐个字符地走了过来，
我们跟踪的指数的一部分，我们的for循环，然后我们也跟踪
数量的字母，所以非特殊字符，非数字，非空白
我们看到在单独的变量。
然后，该解决方案修改的关键
得到一个实际的的关键整数，它确实是在飞行中，
右，然后到实际的消息字符进行加密。
有一些解决方案，是完全
将修改键时，关键的有效性进行测试。
除，以确保该字符和关键字
是按字母顺序排列的字符也变成为一个整数
在0至25的范围内，然后跳过做到这一点后来在for循环。
同样，你在这里看到的，这真的是完全一样的代码
在这一点上，我们在凯撒。
你这样做完全一样的东西，所以真正的关键是搞清楚
如何把关键字转换为整数。
>> 有一件事，我们在这里做的是有点晦涩难懂
是我们重复这句话，我想你可以称它，
3个独立的上线58，59和61倍。
有人可以解释这句话究竟是什么做的吗？
访问的是一个字符，像你说的。
是的，这是听不见的字符的关键字，
所以它的数量，因为你只沿着看到的字母
关键字，一旦你已经看到了这封信，
因此，要有效地跳过空格之类的东西。
是的，没错。
然后，一旦你已经看到了你刚模的关键字空白，所以你搬回左右。
没错。这是一个完美的解释。
凯文说的是，我们要索引关键字。
我们希望得到字符的num_letters_seen，如果你愿意，
，但如果num_letters_seen超过关键字的长度，
到适当的范围内，我们得到的是我们用mod运算符
有效地环绕。
例如，如在短期内，我们的关键词是腊肉，
和它的5个字母长。
但在这一点上，我们已经看到了6个字母在我们的纯文本
和加密。
我们最终将访问num_letters_seen，
这是模的长度的关键字，5，6，
，所以我们会得到1，而我们要做的是，我们将
在这一点上，我们的关键字内部访问的第一个字符。
>> 所有的权利，任何上维琼内尔的问题
在我们继续之前吗？
你们感觉还不错，对这个吗？
酷，太棒了。
我想，以确保你们有机会看到代码
我们认为看起来不错，有机会向它学习。
这将是最后一次，我们将使用空间的时间是，
我们要转变目前，，我去cs50.net/lectures的
所以我们可以做一点点的测验审查。
我认为最好的方式，开始做测验复习
是来此讲座页，cs50.net/lectures
下一周的标题，所以，如果我在这里看在第0周，
我看到我们有一个列表的主题，我们讨论了在0周。
>> 如果任何这些主题似乎你不熟悉的
你一定要回去和冲刷的讲义，并可能
即使撇去通过讲座，观看他们，如果你想要的
这是怎么回事每个主题的的感觉。
另外，我会说今年的一个很酷的资源，我们已经得到了
是，我们已经创建了这些短裤，如果你看一下在第0周，
我们并没有覆盖所有的主题，但我们已经有了相当多的，
一些棘手的，所以再次看着这些短裤
是一个很好的办法让你加快速度。
特别是，我要在一个插件为3的底部，因为我做了那些。
但是，如果你挣扎二进制位，十六进制，这样的东西，
二进制是一个伟大的地方开始。
ASCII是另外一个，这是很好的查看过。
你甚至可以看我在1.5倍的速度太慢了，如果我要去。
由于它的检讨，觉得要做到这一点。
>> 刚开始真的很快，我们要通过一对夫妇的这些测验的问题
只是通过这些流失。
例如，让我们来看看，我有问题16在黑板上。
我们有以下计算以二进制，
我们想要显示的任何工作。
好吧，我想给这一个镜头。
你们应该跟随纸，
我们会做到这一点真的很快。
我们要的二进制执行下列计算。
我有00110010。
我要添加它00110010。
对于数学天才，在家里，
这是有效地乘以2。
让我们开始。
我们要遵循相同的加法运算，我们做
当我们添加的十进制数。
真的是这里唯一的区别是，我们回圈周围
一旦我们拥有了1 + 1，而不是一旦我们得到10个。
>> 如果我们从右边开始，真的很快，第一个数字吗？
[学生]：0。>> [内特H.] 0。
大，第二个数字吗？
[学生]：1。
[内特H.]它是一个1？ 1 + 1是什么？
[学生]：10。
[内特H.]没错，那么什么是数字，我写的正下方加在一起呢？
[学生] 1，0，0，然后再进行1。
[内特H.] 0和1，携带完全。
接下来一起来，罗勒，该你了。
什么是第三个呢？>> [罗勒] 1。
内特H.] 1，完善。凯文？
[凯文] 0。>> [内特H.] 0，夏洛特？
[山猫] 0。>> [内特H.]是啊，我该怎么办？
[学生]：1。
[内特H.]我该怎么办？然后，我携带1。
完美，Sahb >> [Sahb]现在你有1个。
[内特H.]我在这里做什么？
[Sahb]，然后在你下一次有1个，因为你结转1。
内特H.大，所以在这里我们就可以完成了。
酷。
[学生]：0 + 0 = 0？
0 + 0 = 0。
1 + 1，像你说的，是10个或1，0，而。
10是用词不当，因为我的10是指10号，
这是我们如何代表它时，我们正在编写的怪癖。
我们代表数字2，1，0，和10号是略有不同的。
>> 是一种不错的关于二进制是什么，真的没有那么多的
情况下，你需要学习。
有0 + 0 = 0，0 + 1 = 1，
1 + 1为0，然后再进行1，
然后你可以在这里看到第三列从右边
我们有这个1，1，和1。
和1 + 1 + 1是1，则
携带其他1。
当你做二进制加法，很简单。
完整性检查自己，我做了这些夫妇更
在你走之前，因为这是
或许我们会看到的测验。
现在，让我们做下一个。
让我们做的问题17。
我们将以下二进制数转换为十进制。
我有10100111001。
请记住，在我做的二进制视频
我走过一对夫妇的例子，我展示了如何
一切正常，当你这样做是在十进制。
当你在工作中的十进制表示，我认为，我们
这一点在我们的生活中，流利的
这是很容易掩饰它是如何工作的机制。
>> 但是，要做到快速回顾一下，如果我有137
这实际上意味着再次，这是在十进制表示
十进制的137，我有1×100 + 3×10 + 7×1。
这一切都停留在屏幕上。
然后，如果你看看这些数字就在这里，
100，10，1，你看，它们实际上是一切权力的10。
我有10 2，10 1，和10到零。
我们有一个相类似的事情在二进制，
除了我们的基地，我们把它称为是2，而不是10。
这些10秒，我在这里写下的底部，
这10 2，10 1，10到零，10是我们的基地，
和指数，0，1，或2，
是隐含的数量，我们写的数字的位置。
1，如果我们看一下吧，这是在第二的位置。
图3是在第一位置，和图7是在第0个位置。
这就是我们得到的各种指数，以下为我们的基地。
>> 在此我们将实际，你知道吗？
我们会尽我撤消“按钮去了？
就这样吧。
我喜欢这撤消事情。
在此，我认为至少对我来说
最简单的方法开始将二进制数转换
或十六进制数，其中的碱是16
而不是10或2继续前进，写出来的
我在上面的二进制数中的数字的基准和指数。
如果我们开始从左至右再次，
这是一种违反直觉的，
我会重新变回黑色在这里，我们有2至第0个位置，
然后我们有2 1，2 2，
然后2 3，2 4，2 5，6，
7，8，9和10。
我已经写了这些数字是所有的指数。
我只写了基地在第3的空间。
>> 在这一点上，我要继续前进，我要删除
的东西，我们在小数，如果那也没关系。
你都明白了。
你看网上我敢肯定，将能够倒带我，如果你想。
切换回笔。
现在，我们可以做的，如果你们不完全取决于你的权力，以加快2，
这是很酷。
它发生。我明白了。
我曾经有一个面试时，有人告诉我，我应该知道的一切权力2
通过2的30。
这不是我的工作。
总之，你们可以继续在这里做数学题，
但与二进制文件，它不是真正意义的，
它也不有意义的十进制或十六进制，
做数学题，你在哪里有零。
你可以看到我有0在这里，这里的0，0在这里，在这里，在这里，在这里。
为什么它可能没有任何意义，做实际的数学
该位置计算出相应的功率为2？
没错，像夏洛特说，这将是0。
还不如节省自己的时间，如果计算2的幂是不是你的强项。
在这种情况下，我们只需要计算它的0-2？
[学生]：1。
[内特H.] 1，2到3是-？
[学生] >> [内特H.] 8。
2到4？
[学生]：2。对不起，1。
[内特H.] 2至4是16的，没错。
2到5，凯文？>> 32。
[内特H.] 32，2到8？
[学生]：32×8，256。
[内特H.]完美。
和2至10吗？
[学生] 1024。
[内特H.]是啊，1024。
>> 一旦我们得到这些数字，我们可以总结他们所有。
这是它做的几件事情是非常重要的。
一个缓慢，并检查您的工作。
在年底这个数字，你可以告诉大家有一个1，
我的结果，所以我一定要得到一个奇数，
因为所有其他的人都将是偶数
因为，这是一个二进制数。
其他的事情是，如果你得到这一点在测试
你写的这一步
和你的时间不多了
看的点的数量，此问题是值得的。
这个问题，你可以看到，如果我迅速翻转回我的笔记本电脑真的，
这个问题是值得2分，所以这不是那种此外
你应当经历的，如果你真的时间紧迫。
但我们会切换到iPad上，我们将通过它真的很快。
>> 我喜欢做的小数字第一
因为我发现，更容易。
我喜欢32和8，因为他们走在一起很容易，我们得到50。
16和1得到17。
在那里，我们得到57，
然后，我们可以做的其余部分，所以我们可以做的57，156。
来吧。
人，好了，让我们来看看。
我们有57，256和1024。
在这一点上，我宁愿去。
我不知道。我清楚地读了。
7，6，和4中，您可以在17。
1，5，5，2，13。
然后，我们得到了3，然后我们得到1。
1337年。
复活节彩蛋，任何人？
任何人都承认这个数字吗？
克里斯识别数字。是什么意思，克里斯？
[克里斯] LEET。
LEET，所以如果你看看这个，它看起来像利特。
黑客的东西。注意在期中考试或测验，而这样的东西。
如果你看到这样的东西，你想知道“咦”
这可能意味着什么。
我不知道。大卫喜欢它。
这是一个好办法，完整性检查。
像好吧，我可以看看会发生什么。
>> 这是周0/Week东西。
如果我们切换到我们的笔记本电脑，现在，
缩小，和一些其他的事情。
有ASCII，这是我们已经做了很多的问题集。
A.资本这个概念什么是真的吗？
知道它的十进制整数。
65是它被映射到ASCII表中，
因此，这是电脑如何写，
这就是我们已经越来越远，其实写
字符大写字母A和字符小写的a
在一些你一直在做的这些解决方案和习题集。
一对夫妇的其他东西。
我们有报表，布尔表达式，条件，循环，变量和线程。
>> 这些都似乎最有意义吗？
这个术语有时是有点时髦的。
我喜欢的一份声明中认为，大部分的东西，以一个分号结束。
报表如x = 7，设置一个变量，
想必称为x = 7。
据推测x是一个类型，可以存储数字7，
因此它可能是一个int或float或短或一个字符，
类似的东西。
布尔表达式是使用这些双等号
爆炸等于或不等于，小于，大于，
小于或等于，所有这样的东西。
条件是if else语句。
我会记住，你不能有别的没有相应的如果。
同样，你可以没有其他，如果没有相应的如果。
循环，召回的3种循环已经被锤打成
特别是最近几个部分和习题集。
使用，而当你获取用户输入，
使用whil​​e循环，直到特定的条件是真实的，
然后利用这些循环，如果你需要的
你知道循环迭代目前是我想想。
或者，如果你做了我想要做的事情在一个字符串中的每个字符，
我想要做的事，该元素在数组中的每个元素。
>> 线程和事件。
这些我们还没有涉及到明确在C中，
但是请记住这个从头开始。
这是概念具有不同的脚本。
广播事件，这也是这个概念。
有些人不使用广播最初在自己的项目，
这是很酷的，
但这些都被称为并发两种不同的方式处理这个更大的问题，
这是你如何让程序执行
或看似同时执行？
不同的任务运行，而其他任务同时运行。
这是你的操作系统是如何工作的。
这就是为什么，即使，例如，
我有我的浏览器中运行，我也可以将Spotify的，播放一首歌曲。
这是一个概念性的东西了解。
我想看一看线程的短
如果您想了解更多关于。
>> 让我们来看看，我认为有可能是
其中的一个一个问题，在这个问题上。
同样，我认为是不是线程和事件，我们将介绍在C
只是因为它的显着更多的困难比在Scratch。
你不应该担心它有，但绝对明白的概念，
明白发生了什么事情。
在我们继续之前，任何问题上0周材料？
每个人都感觉还不错呢？
了解变量，什么是变量？
>> 移动。每周1次。
一对夫妇的事情，在这里，没有覆盖
在测验审查必要的，也有更多的概念性的东西，去思考。
首先是这个概念的源代码，编译代码和目标代码是什么。
任何人？罗勒。
是对象的代码，我的意思是源代码是什么，你把铛，
代码和目标代码是什么铛放出来，让您的计算机可以读取的程序。
没错。
源代码是C代码，您输入。
目标代码是你得到了什么铛。
这是“0”和“1，二进制格式。
那会发生什么情况是，当你有一大堆的目标文件，
说你要编译一个项目或程序使用多个源代码文件，
按照惯例给定的文件扩展名。
那为什么我们caesar.c，vigenère.c。
如果你正在编写Java程序，你给他们的。java扩展名。
Python程序。py扩展名通常。
>> 一旦你有多个c文件，编译它们。
铛吐出了这一切二进制垃圾。
然后，因为你只需要1个程序
你有链接器链接所有这些对象文件一起
为1可执行文件。
这也是发生了什么，当你使用的CS50库，例如。
CS50库既h头文件。
您阅读，＃includecs50.h。
那么它也是一个特殊的二进制库文件
被编译的，是“0”和“1，
和-L标志，因此，如果我们回到我们的空间，我们期待真的很快
在这里发生了什么事情，当我们看我们的铛命令，
我们得到的是在这里，这是我们的源代码文件。
这是一群编译器的标志。
然后在最后，这些在-l标志链接
实际的二进制文件，这2个库，的CS50库，然后数学库。
>> 了解每种类型的文件的目的
在编译过程中，你要的东西能够
至少给一个高层次的概述。
源代码的原因。目标代码出来。
目标代码文件链接在一起，你会得到一个美丽的，可执行文件。
酷。
这也是在那里你可以得到的错误在多点
在编译过程中。
这是在哪里，例如，如果你把这个连接的标志，
CS50标志，你忽略它在空间，或当你运行你的代码，
这是在那里你会得到一个错误的链接阶段，
和链接器会说：“嘿，你调用一个函数的GetString
这是在的CS50库。“
“你告诉我是在CS50库，我无法找到它的代码。”
这就是你有链接，这就是独立的
从一个编译错误，因为编译器的语法和诸如此类的东西。
知道发生了什么事情的时候，这是很好的。
>> 其他的事情了解。
我会说，你一定要来看看短的类型转换通过约旦
了解整数是什么引擎盖下，
引擎盖下的是什么字符。
当我们谈论的ASCII和我们其实看的ASCII表，
什么做的是给了我们一个引擎盖下的样子
如何在计算机实际上代表了资本和数字7
一个逗号和问号。
电脑还具有特殊的方式来表示
为一个整数的数目7。
它有一个特殊的方式来表示一个浮点数7号，
有很大的不同。
类型转换是如何告诉计算机“嘿，我想你转换
从一个表示的另一种表示。“
我们为什么不来看看在那。
>> 我也来看看在短库和短期的编译器上。
那些谈论编译的过程中，
图书馆是什么，并去了其中的一些问题，你可能会问。
上一周1材料？
在这里，令人望而生畏你想覆盖的任何话题？
我企图炸毁通过这些早期的主题，因此，我们可以得到
指针和做一点点的递归。
思考？
凡是有哪些？
一些巧克力可能的时间？
你们正在通过它。
我要在我的咖啡喝着。
第2周。
良好的通话，良好的通话。
在第2周，我们谈了一点点更多的功能。
>> 在最初的几个问题集，我们并没有真正写在所有的任何功能
以外的功能吗？
[学生]主。>>主，准确。
所以，我们看到了不同的服饰，主要穿。
它不带任何参数，
我们只说在括号之间的空白，
然后有另外一个我们要采取命令行参数，
正如我们所看到的，这就是你有int argc和字符串argv数组
现在我们实际上已经暴露字符串的char *，它是
我们要开始写为char * argv和括号。
习题集3，你们看到了一堆的功能，
实施了一堆的功能，画画，看后，争夺战。
的原型都写在你身边。
>> 我想在这里谈论与功能真的很快
有3个部分，只要你写一个函数。
你必须指定返回类型的函数。
你必须指定一个函数名称，然后你必须指定
参数列表参数列表。
例如，如果我写一个函数来汇总了一堆的整数
然后回到我这里来的总和，这将是我的返回类型
如果我想总结的整数，然后返回的总和吗？
然后的函数名。
如果我继续写在绿色，这部分是返回类型。
这部分的名称。
然后在括号之间的
是我给的参数，
通常缩写为args，有时也被称为参数的参数的。
如果你有一个，您只需指定一个。
如果您有多个，用逗号分开，每一个。
为每一个参数，你给它两件事情是凯文？
[凯文]你有给类型及名称。
然后的名称的名称是您要使用的名称
的金额范围内功能是指这样的说法，
在函数内，您目前正在编写的。
>> 您不必例如，如果我要总结，
也就是说，一个数组的整数 - 我们将做的int数组，
我给自己一些花括号
然后，当我传递一个数组的总和功能
我把它的参数列表中的第一个位置。
但传递的数组，我不必有名字改编。
到达将是我指的是身体内的功能，参数。
其他的事情，我们需要考虑到，
，这是从功能略有不同，但我认为这是一个很重要的一点，
是，在C，当我在写一个这样的函数
我怎么知道这个数组有多少元素？
这是有点一个棘手的问题。
我们谈到这一点在上周的部分。
我怎么知道在C数组里面的元素的数量？
有没有办法呢？
>> 事实证明，有没有办法知道。
你必须通过它分别。
有一个技巧，你可以做
如果你在相同的阵列功能，其中已申报，
你正在使用的堆栈阵列。
但是，这只是工作，如果你在相同的功能。
一旦你将数组传递给另一个函数，或者，如果你已经声明数组
你把该数组在堆上，你使用的malloc
和这样的东西，那么所有的赌注都关闭。
然后，你必须通过左右
一个特殊的参数或其他参数
告诉你有多大的数组。
在这种情况下，对不起，这是怎么回事了屏幕在这里，我想使用一个逗号，我
我会通过另一种说法
，诠释莱恩的长度。
>> 有一件事可能遇到的测验
要求你写或执行特定的功能叫什么。
如果我们不给你的原型，所以这整个事情在这里，
这全乱了调用该函数的声明或函数原型，
这是一个的第一件事情，你会想要确定下来，如果它不给
你马上测验。
我已经学会的技巧是：
说，我们给你一个函数的原型，和我们说，“嘿，你得把它写。”
在大括号中，你必须在测验
如果您发现有一个返回类型，你注意到的返回类型
是无效，这意味着该函数不返回任何东西以外的东西，
然后一件事，你一定要做到的是写
某种类型的return语句在最后的功能。
返回，在这种情况下，我们会把一个空白，因为我们要填补的空白。
但是，这可以让你想以正确的方式，我要如何解决这个问题呢？
它提醒你，你要返回一个值
该函数的调用者。
>> 是啊。>> [学生]：风格当我们编写代码的测验？
如缩进和这样的东西吗？>> [学生]：是的。
不，没有那么多。
我想了很多，这是我们的日子会澄清的测验，
但通常担心的＃include，这样的东西，它是一种外。
[学生]：你需要回应你的手写代码？
你需要回应你的手写代码吗？
谈到始终是一件好事，如果你担心部分信贷
或者你想传达你的意图，平地机。
但是，我再次将澄清的测验和测验的一天，
但我不相信你会被要求写评论，没有。
通常不会，但它绝对是诸如此类的事情，
你可以传达你的意图，想：“嘿，这是我要去的地方用它。”
有时，可以帮助部分信贷。
酷。
>> 罗勒。
[罗勒]声明说，INT郎之间的区别是什么
在与声明一个变量，在函数中的参数或参数？
哇，咖啡去了气管。
[罗勒]喜欢的事情，我们希望把在参数。
是啊，这是一个很大的问题。
你会选择什么样的事情，你要投入的参数
对你应该做的事里面的功能是什么？
在这种情况下，我们这两个参数
因为他们的东西，不管是谁去使用SUM函数
需要指定这些事情。
>> 和功能，像我们谈到了，有没有办法知道
有多大的数组是得到它的调用者或任何人使用SUM函数。
它没有办法知道这个数组有多大。
我们之所以在这里通过这个长度作为参数
是因为在这个时候，我们基本上是告诉来电者的功能，
谁是将要使用SUM函数，“嘿，不仅你得给我们一个数组
整数，你也必须告诉我们有多大的数组，你已经给了我们。“
[罗勒这些都将是命令行参数？
没有，这些都是实实在在的，你会传递给函数的参数。
>> 让我在这里做了新的一页。
[罗勒]喜欢的名字将传递
[内特H.]如果我有诠释的主要（无效），
我要把我返回0，在这里的底部，
并说我要打电话功能的总和。
我想说的诠释x = SUM（）;
使用SUM函数，我想总结的，我必须要通过在阵列
和阵列的长度，所以这是
假设我有一个整型数组，
说我有numbaz [] = 1，2，3，
种使用砍死语法正确，
然后我会做什么，总之，我希望通过
两个numbaz和3号
告诉SUM函数“好了，在这里我要你总结的阵列。”
“这是它的大小。”
这是否有意义吗？回答你的问题吗？
>> 在许多方面，它平行的就是我们正在做的主要
当我们有命令行参数。
像恺撒密码的程序，例如，需要
命令行参数将无法做任何事情。
不知道如何进行加密，如果你没有告诉它使用什​​么键
或者，如果你没有告诉它你想加密的字符串。
提示输入，这是我们已经有2个不同的机制
用于输入来自用户的，在来自用户的信息采取。
对于问题1，我们看到这个调用getInt，GetString的，GetFloat的方式
提示输入，这就是所谓的使用标准输入流。
这是稍有不同。
这件事情，你可以做一次，而不是
当你调用程序，当您启动程序的运行。
所有的命令行参数指定当您启动程序运行。
我们已经将两个。
当我们使用参数的函数，这是非常类似的命令行参数主要。
这是当你调用这个函数，你需要告诉它
它究竟是什么的需要，以执行其任务。
另一个好处看，我就让你看看它在你的空余时间，
它覆盖在测验是这个概念的范围
与全局变量和局部变量。
千万要注意。
>> 现在，我们要对这个其他的东西，
第3周，我们开始谈到的搜索和排序。
检索和排序，CS50，至少在
非常多介绍一些计算机科学的理论部分。
的问题的搜索，排序的问题
是大的，规范的问题。
你怎么找到的数十亿美元的整数数组中的一个特定的数字吗？
你如何找到一个特别的名字里面的电话簿
是存储在您的笔记本电脑吗？
因此，我们提出这个概念的渐近运行时间
要真正量化多久，这些问题是如何努力，
他们需要多长时间来解决。
我相信，在2011年的测验有一个问题，我认为这是值得的
覆盖速度非常快，这是一个问题12。
哦，不，这是欧米茄。
>> 在这里，我们谈论以最快的速度运行时
对于一个特定的算法，然后最慢的可能的运行时间。
欧米茄（Omega）和O这是真的只是快捷方式。
他们的符号的快捷键说
如何快速在最好的情况下，我们的算法来看，
如何在最坏的情况下缓慢将我们的算法运行？
让我们做一对夫妇这些，而这些，也包括了
在短期渐近符号，这是我极力推荐的。
杰克逊做了很好的工作。
二进制搜索，我们谈论二进制搜索算法，
我们通常谈论它，其大澳
大O是什么？
什么是运行时的二进制搜索速度最慢的可能吗？
[学生] N²？
关闭，我想类似的。
这是快了很多。
[学生]：二进制吗？是的，二进制搜索。
[学生]：这是日志n。
登录n，所以日志N意味着什么？
它一半在每次迭代。
没错，所以在最慢的情况下，
说，如果你有一个排序的数组
你正在寻找一百万整数，
是第一个元素的数组或数组中的最后一个元素。
请记住，二进制搜索算法的工作原理是在中间的元素，
如果是这样的比赛，你要寻找的。
如果是，那么伟大，你发现了它。
>> 在最好的情况下，二进制搜索运行的速度有多快？
[学生] 1。
1，这是恒定的时间，大O 1。是啊。
[学生]：我有一个问题。当你说的n登录，您的意思是与基地2，对不对？
是的，所以其他的事情。
我们说为log N，我想，当我在高中
我一直认为日志基数为10。
是啊，这样的话，2为底通常我们使用的是什么。
再次，要回二进制搜索，如果你正在寻找无论是
在最后元素或元素在开始的时候，
因为你开始在中间，然后丢弃
取其一半不符合标准，你要寻找的，
你去下一半，下一半，下半。
如果我在寻找万整数数组中的最大元素
在100万次的日志，我要减半
之前，我终于测试，看看，我要找的元素
是在最大或指数最高的阵列中，
将日志的n，记录的100万次。
>> 冒泡排序。
你们是否还记得冒泡排序算法？
凯文，你能不能给我一个快速回顾中，冒泡排序算法发生了什么事吗？
[凯文]，基本上它通过在列表中的一切。
它着眼于前两个。
如果第一个比第二个它掉期将是更大的。
然后比较第二和第三，同样的事情，掉期，
第三和第四，一路下跌。
更大的数字会跟进的。
然而，许多循环后，你就大功告成了。
没错，凯文说的是，我们会看更大的数字
泡沫结束的数组。
例如，你不介意走我们通过这个例子，如果这是我们的数组？
[凯文]你会需要2个和3个。
3大于2，所以你换。
内特H.]右，所以我们交换这些，和这样我们就得到2，3，6，4，和9。
[凯文]那么你就比较3和6。
3小于6，所以你离开他们，
6和4，你会交换他们，因为4小于6。
[内特H.]对，所以我得到2，3，4，6，9。
[凯文]和9大于6，所以你离开它。
你通过它回去了。
>> [内特H.]在这一点上我做了吗？凯文号
我为什么要在这一点上没有这样做呢？
因为它看起来像我的数组进行排序。我看着它。
[凯文]再经历一遍，确保没有更多的掉期
才可以完全停止。
没错，所以你仍然需要继续通过并确保不存在交换
在这一点上，你可以使。
这真的只是幸运，就像你说的，我们结束了
只有1通过我们排序。
但要做到这在一般情况下，我们实际上要做到这一点，一遍又一遍。
而事实上，这是一个可能的情况下最好的例子，
像我们所看到的问题。
我们看到，最好的可能的情况下为N。
我们经历了阵列1次。
最坏的情况下，该算法是什么？
[凯文] N“。
而且，看起来像什么？数组的样子，取n²时间吗？
[凯文] [听不清]排序。
没错，所以如果我有数组9，7，6，5，2，
第9泡沫一路。
1次迭代后，我们就会有7，6，5，2，9。
7将泡涨，6，5，2，7，9，等等等等。
>> 我们不得不去整个数组n次，
实际上，你可以得到比这更精确的
因为一旦我们已经提出9一路到最后可能的位置
我们知道，我们永远都不会拥有再次反对该元素比较。
一旦我们开始冒泡7
我们知道，我们可以停止后，7是正确的前9
因为我们已经比较9。
如果你这样做一个聪明的方式，它并不是真正的，我想，那么多的时间。
你不是要比较所有可能的[听不清]组合
每一次你通过每一次迭代。
但尽管如此，当我们谈论这个上限，我们说，
您正在寻找在n²通过比较所有方式。
>> 让我们回去了，因为我们已经开始得到一点点的时间短
我会说，你一定要通过此表，其余的，
填补了这一切。
想想例子。想想具体的例子。
这是非常方便的和做的。
画出来。
这是排序的表，当你通过在计算机科学
你应该开始知道这些由心。
这是你在​​接受采访时的各种问题。
这些都是各种各样的东西，是很好的了解，
想想那些边缘的情况下，真正搞清楚如何思考
知道冒泡排序可能出现的最坏的阵列的
进行排序的，是一个以相反的顺序。
>> 指针。让我们来谈谈关于指针一点点。
在过去的几年时间里，我们这里有
我知道这是与文件I / O，是相当新的东西。
当我们谈论指针的原因，我们要谈论的指针
是因为，当我们工作在C
我们真的是在一个相当低的水平相比，大多数现代编程语言。
我们实际上能够操纵内存中的变量，
他们实际上是在我们的RAM。
一旦你到了操作系统类，你会看到
，，，种一个抽象的概念。
这是事实并非如此。
我们的隐藏这些细节，我们已经得到了虚拟内存。
>> 但现在，你可以假设你有一个程序时，
例如，当您开始您的恺撒密码程序
我会切换回我的iPad真的很快
在一开始你的程序，如果你有，说，
4 GB的RAM您的笔记本电脑，
你得到抛开这一块，我们把它称为RAM。
在一个地方，我们要调用0开始，
它结束的地方，我们会打电话给4千兆字节。
我真的可以不写。人，被黑客攻击。
当你的程序执行
操作系统瓜分RAM，
它规定了不同的细分为不同的部分，你的程序的居住环境。
到这里，这方面是怎么样的无人区。
当你去了稍远一点这里
你有实际的地方
你的程序的代码生活。
实际的二进制代码，可执行文件实际上被加载到内存中
当你运行一个程序，它住在代码段。
你的程序执行的处理器看起来在这个代码段
要弄清楚什么是下一个指令？
我需要执行的下一行代码是什么？
>> 还有一个数据段，这是这些字符串常量
获取存储，你一直在使用。
再远些了这个地方称为堆。
我们在那里存取记忆体使用malloc，
然后向你的程序的最顶端
有堆栈，
而这也正是我们一直在玩的最开始。
这是没有规模或任何东西。
这是很多非常依赖于机器，
依赖于操作系统，但是这是比较如何得到分块。
当你运行一个程序，你声明一个变量名为x-
我要画一个框下方，这将是RAM以及。
我去看看。
我们将绘制锯齿线来表示，这仅仅是一小部分的RAM
不是所有的为我们绘制在上面。
>> 如果我声明了一个整数变量x，
其实我得到的是一个映射
我的程序被存储在符号表中的
连接这个区域的记忆，我画的名字x
在这里之间的竖线。
如果我有一个在我的计划，说X = 7的代码行
处理器知道“哦，好吧，我知道在这个位置在内存中的x生活。”
“我要继续前进，并写了7。”
它是如何知道什么位置，这是在内存中吗？
那么，这一切都在编译时完成。
编译器负责分配中的每一个变量都去
创建一个特殊的映射，或者更确切地说，点与点之间
一个符号，到哪里去，一个变量的名称
到哪里去住在内存中。
但事实证明，我们实际上可以访问它在我们的程序中。
这得到重要的，当我们开始谈论一些数据结构，
这是一个概念，我们将在后面介绍。
>> 但是现在，你可以知道的是，我可以创造一个指针，指向这个位置，X。
例如，我可以创建一个指针变量。
当我们创建一个指针变量，我们使用星符号。
在这种情况下，说，我要创建一个指向整数的指针。
这是一个类型，就像任何其他。
我们给它一个变量，如Y，
然后，我们将它的地址，地址。
在这种情况下，我们可以设置y以指向到x
通过x的地址，这是我们做这个符号，
然后我们设置y来指向它。
这基本上是不是，如果我们看一下我们的RAM
这将创建一个独立的变量。
这将调用它的Ÿ，
而当这行代码执行
它实际上是要创建一个小的指针，我们通常画一个箭头，
点为x和y置。
是。
[学生]：如果x是一个指针，你会做
诠释* Y = X代替的符号？
是。
如果x是一个指针，然后就可以设置两个指针彼此相等，
在这种情况下，y的设置将不会为x，
但它会指向到任何x被指向。
不幸的是，我们没有时间了。
>> 我想说在这一点上，我们可以谈论这个脱机，
但我要说的开始工作，通过这个问题，＃14。
你可以看到已经有一点点充满在你这里。
您可以看到，当我们声明了两个指针，* X * Y，
注意，指向的变量*的东西，是去年。
原来，这是类似的，以我们正在做的这一年。
不要紧，你写的*当你声明的指针。
但是，我们已经写了旁边的类型*
因为这使得它很清楚，你声明一个指针变量。
你可以看到，申报2个三分球，为我们提供了2盒。
在这里，当我们设置x等于对malloc
这是什么说的预留内存在堆中。
这个小盒子在这里，这个圈子里，位于堆。
X是指向它。
需要注意的是Y还没有指向任何东西。
要获得内存来存储数字42到x
我们将使用什么样的符号？
[学生] * X = 42。
没错，* X = 42。
这意味着按照箭头，并在那里罚42。
在这里我们设置y和x有y指向为x。
同样，这就像凯文说什么，我们设y等于x。
Y不指向为x。
相反，它指向x是指向以及。
>> 然后终于在这最后一箱有2种可能，我们可以做的事情。
其中之一是，我们可以说X = 13。
另一件事是，我们可以说，亚历克斯，你知道，我们可以在这里做什么？
你可以说* X = 13
[学生]：你可以说诠释什么。
内特H.]如果这被称为一个int变量，我们能做到这一点。
我们还可以说* Y = 13，因为它们都指向同一个地方，
这样我们就可以使用任一变量到那里。
是啊。>> [学生]：会是什么样子，如果我们只说INT x是13吗？
这将宣告一个新的变量x，它是行不通的。
我们希望有一个碰撞，因为我们声明x是一个指针。
[学生]：如果我们只是有这样的声明本身会是什么样子的圆吗？
如果我们有X = 13，那么我们就会有一个盒子，而不是箭头
开箱即用的，我们得出它只是一个13。
[学生]：在“名称”框中。好吧。
>> 感谢您的收看，祝你好运测验0。
[CS50.TV]