[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]