[Powered by Google Translate] [演练 - 习题集2] [Zamyla陈 - 哈佛大学] [这是CS50。 CS50.TV] 好的。你好,大家好,欢迎来到演练2。 首先,我要祝贺你完成的pset 1。 我知道,它可能是一个有点艰难一些, 本来是你的,你写的第一个计算机程序, 但是要记得,在本月底,当你回首在学期结束的时候, 你将看到的pset 1,你会说:“嘿,我可以做了,在5分钟。” 因此,了解和信任,在本月底,你一定会找到的pset 1很简单的。 但现在,这是一个巨大的成就,得到完成表示祝贺。 现在,也是一个快速的注意之前,我们得到到肉的演练。 我只想做一个快速的注意,我有时会没有足够的时间 在演练通过每一个方式做问题集 ,而只是可能集中在1或2种实现, 的方式,你可以做到这一点。 但是,这并不是说,你这样做的另一种方式是被禁止的。 经常有,作为与计算机科学,无数的做事方式, 所以肯定会觉得自由地使用不同类型的比我可能已经提出的解决方案。 [pset中2:加密 - Zamyla陈 - zamyla@cs50.net] [pset2 - 0。 A组的问题 - 1。凯撒 - 2。维琼内尔] 好的。所以,问题设置2:加密是一个有趣的。 再有,每pset中,你会开始部分问题 要在你的小节进行分配的教学研究员。 我们不打算在演练中去,通过这些, 但他们肯定会帮你完成的pset。 因此,问题集的第一部分是凯撒。 因此,在凯撒会有人与你擦肩而过的关键整数, 你将加密的文本字符串,他们为您提供 并给他们一个加密的东西。 如果有人观看圣诞故事,有一个例子,有。 问题集的第二部分是维琼内尔, 这是一个更先进的加密技术。 所以我们要来加密的一段文字, 除,而不是只是一个单一的整数,我们实际上是要编码 的关键字,用户将提供给我们。 好了,所以今天在工具箱中的工具实际上是将要更新设备。 在讨论板中,我们将看到的东西一样,“为什么不工作的呢?” “为什么不提交50个工作吗?” 通常的解决方案实际上只是以更新您的设备。 所以,如果你只是运行在一个终端窗口,在您的设备须藤的yum-Y - 这是一个标志,是的,更新的一切 - 更新, 那么您的设备更新,如果需要的话。 它不会伤害,如果你已经是最新版本的设备。 然后,它会说没有新的更新可用,您可以继续工作一起。 但是,这是很好的执行,即使你每次打开设备 因为我们仍然非常 - 有时,如果我们进入一个错误 - 修复它在家电。 因此,请确保您有最新版本的设备 运行该更新存在。 好的。既然我们正在处理的信件和不断变化的,加密的东西, 我们要真的想成为最好的朋友,我们的ASCII图。 有无数的人在网上,如果你发现。甚至自己动手做。 基本上,每一个字母,每一个数字,每一个字符 与他们有关联的数字, 所以这是很好的实际的信一起看他们的ASCII值。 这肯定会帮助你的问题集。 真的帮了我在这个问题上设置的一件事是把它打印出来, 我所经历的,我会绘制就可以了, 写,“如果去那里,然后......” 样的画上记号,成为最好的朋友,你的ASCII表。 然后,我们有一些其他的工具,在我们的处置。 这一次,而不是提示用户的所有输入 我们要做的组合。 我们要促使他们对于某些输入, 但我们也将只使用命令行参数。 所以,当他们运行自己的程序,通常你说/你好,例如, 如果你的程序hello.c的。 但是,这一次,而不是只是说,他们可以把字,参数之后。 因此,我们要使用他们传递给我们的任何作为自己的输入, 如此巨大的感染力,不仅仅是提示整数,但也使用命令行参数。 然后,我们将进入数组和字符串,我们将使用了很多。 这只是一个例子,1个mini ASCII图。 正如我所说的,每一个字母对应一个数字, 如此熟悉。它会派上用场。 后来当我们开始做一些ASCIIMath的处理与数字 - 加,减他们 - 那么绝对是一个好参考这个图表。 因此,这里是一个恺撒密码 - 的东西,你可能已经打了一个例子。 这仅仅是一个轮。从本质上讲,有一个外字母表,然后有一种内在的字母表。 所以,这里有一个例子恺撒密码,但一个关键的0。 从本质上讲,A是一致的A,B与B对齐,一路到Z 但后来说,例如我们希望有一个关键的3。 然后,我们会旋转的内轮使A与D,等等。 所以这基本上就是我们要做的。 我们没有一个车轮,但我们要做的是使我们的程序 种转移的字母和我们一起一定量的数字。 因此,正如我之前说的,我们将要处理命令行参数 以及得到的整数。 所以,用户将您的凯撒程序运行/凯撒说。 然后输入一个号码之后。 这个数字代表的关键,移位, 有多少次你要旋转的内轮您的恺撒密码。 所以你在这里看到的一个例子。 如果我们在我们的凯撒密码,输入的字母从A到L 然后输入D O的,因为这是每一个字母转移的3倍以上, 类似的例子,我给你的车轮。 那么,如果你输入的,例如,这是CS50! 那么它也将所有的字母。 这是一个重要的事情在这两个凯撒和维琼内尔的 是,我们将跳过任何非字母。 因此,任何空格,字符等,数字,我们要保持相同。 在这种情况下,我们只是要转移的字母。 因此,正如你看到的,我们只有在车轮提供给我们的信, 所以我们只需要转移的字母和字母进行加密。 因此,要做的第一件事,你看到的用法凯撒问题集2 是运行凯撒,然后输入一个数字,当你在终端上运行。 所以,我们需要做的是,以某种方式获得该密钥和访问它。 因此,我们要以某种方式看到它的将是第二个命令行参数。 第一个是/凯撒,将是下一个关键的数字。 所以,我们诠释的主要(无效),开始我们的C程序。 我们要了一层剥开一点点 实际看到的,而不是将我们的主要功能无效 我们实际上是在处理有两个参数。 我们有一个int,名为ARGC,然后一个字符串数组被称为argv的。 因此,argc是一个整数, 它代表了传递给你的程序中的参数。 然后,argv是实际传递的参数列表。 所有的参数都是字符串,所以argv的一个数组,列表,字符串。 让我们来谈谈关于数组的一点点。 数组本质上是一种新的数据结构。 我们有整数,我们已增加一倍,我们的字符串,现在我们有阵列。 阵列的数据结构,可容纳的相同类型的多个值, 所以基本上,你想要的任何类型的列表。 从本质上讲,如果你想要一个整数都在1个变量列表, 然后,您将创建一个新的变量是int类型的阵列。 所以数组是从零开始的索引,这意味着该数组的第一个元素的索引为0。 如果数组的长度为4,在这个例子中,那么你的最后一个元素将在索引3, 这是4 - 1。 因此,要创建数组,你会做这样的事情。 假设你想要一个双阵列。 这也适用于任何类型的数据类型,虽然。 所以说,你想有一个双阵列。假设你想调用它的邮箱。 就像你会初始化任何其他双, 双,然后你会说这个名字,但是这一次我们把方括号, 然后是电话号码会有阵列的长度。 请注意,在数组中,我们不能永远改变的长度, 所以你总是要定义和选择多少箱, 您的阵列将要举办多少个值。 因此,要在你的阵列设置不同的值,你要使用下面的语法, 正如你看到的幻灯片上。 你有邮箱索引0将被设置为1.2, 邮箱索引1设置为2.4,等 所以,现在我们已经回顾了阵列位,让我们回到argc和argv。 我们知道,argv是一个字符串数组。 因此,当用户通过在 - 说,他们正在运行的程序 - 他们说/你好大卫·马兰, 已经为您实际上是来了什么argc和argv是什么程序做。 所以,你不必担心这个问题。 ARGC在这种情况下,因为它看到3个不同的字之间用空格分隔。 因此,然后在此实例中的阵列,第一个索引将/你好, 下一个,下一个大卫·马兰。 有没有人看到马上之间的关系是什么ARGV,  数组,argc是吗? 是啊。我们将进入一个例子,args.c. 让我们来看看,如果我们可以利用的关系2。 在这里,您可能会发现,在家电的默认应用程序 打开c文件有时是Emacs的。 但是,我们希望用gedit来处理,所以你可以做什么,你可以用鼠标点击你的C文件, 去“属性”,“打开方式”,然后选择gedit中,设置为默认, 现在你的程序应该打开gedit中,而不是Emacs的。 完美的。 所以在这里我有一个程序,我想打印出每个命令行参数。 因此,无论用户输入,我想基本上是把它送回给他们一个新的生产线。 那么,什么是结构,我们可以用它来遍历东西 - 的东西,你可能在你的pset 1? 如果你想要去的通过设置一些事情呢? >> [学生] For循环。 For循环。没错。因此,让我们开始用for循环。 我们必须为int i = 0。让我们开始一个标准的初始化变量。 我要离开的条件为一组,然后说我+ +,要做的事情。 好的。 所以,回想起ARGV,如果argv是列表中的参数传递给程序 argc是参数的个数在程序中, 那么这意味着argc是本质上的argv的长度,右, 因为有将是为argc多个参数的值。 因此,如果我们要遍历每个元素argv中, 我们会想每次访问该变量在argv在给定的索引。 这可以表示为这,对不对? 在这种情况下,这个变量代表了特定的字符串 因为它是一个字符串数组 - 特定的字符串,给定的索引。 我们想要做的是什么,在这种情况下,我们希望将其打印出来,让我们说printf的。 而现在,argv是一个字符串,所以我们希望把这个占位符。 我们希望有一个新的生产线,只是为了使它看起来好。 所以,在这里,我们有一个for循环。我们不具备的条件。 所以,我从0开始,然后每次要打印给定的字符串 在该阵列中的特定索引。 那么,我们什么时候要停止打印出数组中的元素呢? 当我们已经完成了,对不对?当我们已经走到了尽头的数组。 因此,我们不要超过过去的数组的长度, 我们已经知道我们需要积极寻找的长度和argv是什么 ,因为它给我们,那是什么? ARGC。没错。 所以,我们想要做的这个过程中的argc次数。 我不是在正确的目录。 好的。 现在让我们把参数。没有错误,这是伟大的。 因此,让我们运行ARGS。 这是什么要回到我们的身边呢?只是要打印出来。 “您输入的ARGS到程序中,我要去给它回给你。” 因此,让我们说我们想说的ARGS富酒吧。 那么它打印出来寄回给我们。好吗? 因此,有一个例子,如何使用argc和argv 知道的argc表示argv的长度。 请确保你不会超出了数组的长度与数组访问一个 因为C肯定会喊你。 你会得到的东西称为分割故障, 这是从来没有的乐趣,基本上是说你试图访问的东西 不存在的,不属于你的。 所以一定要确保,特别是零索引,我们不希望 - 喜欢举例来说,如果我们有一个数组的长度为4, 该数组的索引4不存在,因为我们从0开始,在零指数。 当我们从0开始,这将成为第二个性质一样的for循环。 因此,只要记住这一点。 你不想,曾经访问数组的索引,你也达不到。 因此,我们现在可以看到我们如何才能哪种类型的访问 命令行参数传递的。 但是,正如你看到的字符串,argv是一个字符串数组。 因此,它实际上是整数,但在凯撒我们要处理整数。 幸运的是,为我们创造的功能,实际上可以将字符串转换为整数。 也正是在这里,我们不处理用户输入我们提示 在这里输入的关键,所以我们不能实际重新提示,并说, “”哦,给我另一个整数,也就是说,如果是不正确的。“ 但是,我们仍然需要检查是否有正确的使用方法。 在恺撒只允许他们通过1号, ,所以他们有运行。/凯撒,然后他们给你一个数字。 所以ARGC有一定数目。 这是什么号码,如果他们要传递给你。/凯撒,然后一键吗? ARGC是什么? >> [学生] 2。 >>双。没错。 所以,你想,以确保argc是2。 否则,你基本上拒绝运行程序。 它主要是说,国际主要的功能, 这样的话,我们始终在良好的实践的一档成功的节目结束时返回0。 因此,如果说,他们给你的命令行参数,而不是2 或给你,例如,你会做什么是你要检查 ,然后返回说,没有,我不能继续进行这项计划。 [学生]有可以在您的文本中不能有空格。 >>请原谅我吗? [学生]你想加密的文字不能有一个空间。 “啊! ,我们正在试图加密的文本,这实际上是后话 当我们给该文本。 所以现在我们只是接受命令参数的实际数目, 实际位移的凯撒加密。 [学生]:为什么你需要,而不是仅1 ARGC? 1号。 右。我们之所以需要2个为argc,而不是1 是因为当你运行一个程序并说/凯撒/个招呼, 实际计算作为命令行参数。 那么,已经占据了1,所以后来我们在输入1张额外的。 所以,你输入的命令行参数是一个字符串。 你想要做什么,凯撒,我们要处理一个整数, 所以,你可以使用这个atoi函数。 基本上,你在一个字符串传递给它,然后它就会回报你回一个整数 如果可能的话,使该字符串转换为整数。 现在还记得,当我们正在处理与printf或GetString时,这样的事情, 包括具体到我们的库。 因此,在一开始,我们开始与的散列标签标准I / O,H,类似的东西。 好了,atoi的是在这些库, 所以我们需要做的是,我们必须有正确的库,。 所以,记得演练1,我讨论了手动功能。 您键入的人在你的终端,然后由一个函数的名称。 因此,这将带来它的整个列表的使用, 但因为它会带来哪个库属于。 所以我把它留给你使用的手动功能ATOI 你需要包括能够使用atoi函数库。 因此,我们已经拿到了钥匙,现在它得到的纯文本, 所以,实际上是向您提示用户输入。 我们处理调用getInt和getFloat,因此,在同样 我们要处理的GetString。 但是,在这种情况下,我们并不需要做任何做或while循环检查。 GetString的肯定会给我们一个字符串, 我们要进行加密的用户给我们。 所以,你可以认为所有这些用户输入的字符串是正确的。 大。 那么,一旦你已经拿到了钥匙,一旦你已经得到了文本, 现在剩下的就是你来加密明文。 只是为了迅速覆盖了行话中,明文是用户给你, 和密文是你返回给他们。 所以字符串,能够通过实际信信 因为我们要转移的每一个字母, 据我们了解,字符串,如果我们剥离层, 我们看到,他们真的只是一个字符列表。 一个后。 因此,我们可以将字符串作为数组,因为他们是字符数组。 所以说,你有一个字符串命名的文本, 并在该变量的文本存储,这是CS50。 然后在索引0的文本将是一个大写字母T,指数1小时,等等。 然后用阵列中的argc在args.c的例子, 我们看到,我们不得不遍历一个数组 所以我们必须从i = 0迭代,直到我是小于的长度。 因此,我们需要一些方法搞清楚什么是我们的字符串的长度是 如果我们要遍历它。 幸运的了,有一个功能,对于我们来说,虽然后来在CS50 你一定能够实现自己的功能,使您的 可以计算一个字符串的长度。 但是现在我们要使用字符串的长度,所以strlen的。 你传递一个字符串,然后它会返回一个int值,代表你的字符串的长度。 让我们看一个例子,我们可能能够遍历字符串中的每个字符 做一些。 我们想要做的是遍历每个字符的字符串, 和我们想要做的是,我们打印每个字符1 1 但我们添加的东西在它旁边。 因此,让我们开始用for循环。 INT I = 0。 我们就要走了空间的条件。 我们要重复,直到我们到达字符串结尾的,对不对? 那么,什么样的功能为我们提供了字符串的长度? [听不见的学生反应] 这是命令行参数的长度。 但我们要使用的功能,让我们的字符串的长度的字符串。 所以这是字符串的长度。 这样的话,你有一个字符串,它通过。 它需要知道它需要计算长度的字符串。 那么在这种情况下,我们要处理的字符串s。 大。 所以,我们想要做的是什么,让我们的printf。 现在,我们要处理的字符。我们要打印出每个人的个性。 当你想打印出一个浮动时,你可以使用这样的占位符%F。 一个int,你会使用%d。 同样,一个字符使用%C说我要打印一个字符 是存储在变量中。 所以,我们都这样了,让我们添加一个句号和一个空间给它。 我们使用哪一个角色? 我们将要使用我们的字符串的任何字符。 那么,我们将要使用的东西,用绳子, 但我们要访问某些字符。 因此,如果一个字符串就是一个数组,那么怎么办,我们访问数组中的元素? 我们有那些方括号,然后我们把在那里的指数。 因此,我们必须方括号内。在这种情况下,我们的索引,我们就可以使用。没错。 因此,我们在这里说,我们要打印一个字符后面跟着一个点和一个空格, 该字符将是我们的字符串s中的第i个字母。 我只是要节省。好吧。 现在,我要执行字符串的长度。 因此,我们有一个字符串名为OMG,现在它更强调。 同样,让我们​​说,我们确实希望得到来自用户的字符串。 我们怎么可能这样做呢? 在此之前,我们是如何得到一个int? 我们说调用getInt,对不对?但是,这是不是int,让我们的GetString。 让我们把字符串的长度。在这里,我们没有进入一个特定的提示。 所以我不知道。 我要去把我的名字在这里,那么我可以做的事情之一 我给你一个单词的每一个字母或类似的东西。酷。 所以这是字符串的长度。 所以我们又回到了恺撒。 我们有一些工具,我们如何遍历字符串, 我们如何访问每个元素。 所以,现在我们可以回去的程序。 正如我之前提到的,在ASCII表,你最好的朋友, 你将看到的数字,都与每一个字母。 所以在这里说我们的明文是我晕! 然后这些字符有一个数字,它与ASCII值, 即使是单引号,即使是空间,甚至是感叹号, 所以,你要记住这一点。 所以说,我们的主要用户在其命令行参数包括6。 这意味着,这是我的第一个字母,这是代表了73, 你想返回到他们的任何字母所代表的ASCII值73 + 6。 在这种情况下这将是79。 现在,我们要进入到下一个字符。 所以接下来的索引1中的明文将单引号。 但是,请记住,我们只希望来加密信件。 因此,我们要确保的撇号保持不变, 我们不改变从39到45什么是。 我们要保持它作为一个单引号。 因此,我们要记得只加密被字母 因为我们希望所有其它符号在我们的程序中保持不变。 另一件事,我们想要的是保存资本。 所以,当你有一个大写字母,它应该保持一个大写。 小写字母应保持为小写。 因此,一些有用的功能,能够处理仅加密信件 并保持维护资本化的东西 因而isalpha,isupper,islower功能。 所以,这些函数返回一个布尔值,。 基本上,true或false。这是一个大写的吗?这是字母数字吗? 这是一个字母,本质上。 因此,这里有3个例子,你将如何使用该功能。 基本上,你可以测试是否由该函数返回的值是true或false 基于该输入。 无论是做不加密器的东西或密码,或确保它的大写字母, [学生]:你能不能解释多一点,你如何使用它们?是啊,肯定的。 因此,如果我们回头看看,在这里,我们有资本我,对不对? 因此,我们知道,我去O,因为我是O + 6 但我们要确保的O将是一个资本O. 因此,基本上,这是一种将改变我们的输入。 因此,无论是大写或不会种改变我们处理它的方式。 因此,然后在那个特定的索引,如果我们使用isupper函数, isupper(“I”),返回我们真正的,所以我们知道它的上部。 那么此基础上,以后我们将进入一个公式 您将要使用的转移在凯撒的东西, 这样的话基本上,会是一个略微不同的公式,如果是大写 而不是小写。有意义吗? 是啊。无后顾之忧。 我讨论了一些加入了一封信,没有引起太大意义 除非我们了解这些字符 是一种互换整数。 我们做的是一种使用隐式转换。 我们将进入铸造了一下之后你在哪里取一个值,你把它变成一个不同的类型 比原来的。 但是,这pset中,我们就可以种交替使用的字符 及其对应的整数值。 所以,如果你只是包住一个只用单引号括起来的字符, 然后你就可以用它来工作的整数,它作为一个整数处理。 因此,大写字母C至67岁。小写的F,涉及到102。 同样,如果你想知道这些值,看看您的ASCII表。 因此,让我们进入一些例子,你也许可以减,并把它们添加到 实际上,你可以真正的工作与这些字符,交替地使用它们。 我说,ASCIIMath是要计算一个字符的另外一个整数 然后显示所得到的字符,以及所得的AS​​CII值。 所以在这里我说 - 这部分我们将处理后 - 但基本上,我是说,用户应该说运行ASCIIMath沿的一个关键, 我的意思是,关键是要数 我们要添加这个人物。 所以在这里请注意,由于我要求的关键, 因为我要求他们给我的事情, 我只希望接受/ asciimath和关键。 因此,我将要求argc是等于2。 如果不是,那么我将返回1,程序将退出。 所以我说,关键是不能将是第一个命令行参数, 这将是第二个,你在这里看到, 我打算把它转换成一个整数。 然后,我将设置一个字符为r。 请注意,可变的字符的类型实际上是一个整数。 我可以使用r为整数的方式,是由这些单引号包围它。 所以回到我们的printf语句,我们有一个占位符字符 然后一个占位符的整数, 字符表示的字符,而且的整数是关键。 因此,我们要在结果中添加2一起。 因此,我们要新增R +什么,关键是, 然后我们要打印的结果。 所以让我们asciimath。这是最新的,所以让我们,只是运行asciimath。 哦,不过看,它不会做任何事情,因为我们没有给它的一个关键。 因此,当它刚刚回来,我们的主要功能,它只是返回给我们。 那么,让我们通过在一个关键。有人给我一个号。 >> [学生] 4。 4。好吧。 所以R增加了4将会给我们V,对应的ASCII值118。 那么它是有道理的 - 其实,我可以问你,你怎么想的ASCII值的r,如果r + 4 118吗? 然后,是的,r是114。 因此,如果你在ASCII表中,然后,果然,你会看到,R是代表了114。 所以,现在我们知道,我们可以添加整数的字符,这似乎很简单。 我们只是要遍历一个字符串,如我们所看到的一个例子之前。 我们会检查它是否是一个字母。 如果是的话,那么我们将它转​​移什么,关键是。 很简单,只是,当你喜欢这个, 你看,Z,代表了122,然后会给你一个不同的角色。 我们其实是想留在我们的字母表,对不对? 因此,我们需要找出一些环绕着种方式。 当你到达ZED你想要增加了一定的数量, 你不想进入超越ASCII字母部分; 你想换一路A. 但请记住,你仍然保留的情况下。 因此,知道字母不能成为符号 就像符号都不会被改变。 在过去的pset你绝对没有必要, 但一个选择是使用的模函数来实现你的贪婪的pset。 但现在我们将需要使用模量, 所以我们就在这个有点。 从本质上讲,当你有Y,X模,让你x除以y的其余部分。 下面是一些例子。我们有27%15。 基本上,当你减去15的27多次可能没有得到负 那么你得到12左。 那么,这有点像在数学方面,但如何才能真正使用这个呢? 这将是有用的为我们的wrapover。 对于这一点,让我们只想说,我问你,分为3组。 有时候,你这样做组和类似的东西。 说,我说,“好吧,我希望大家可以分为3个。” 你如何做到这一点? [听不见的学生反应]是的,没错。数。好吧。 让我们做到这一点。你要开始​​? [学生计数] 1,2,3,4。 但是,请记住... >> [学生]:哦,对不起。 这是一个很好的点。 你说,但我们真的希望你说的,因为我们只需要3组。 那么,如何 - 不,这是一个很好的例子,因为这样你可能会说,1? 4和1之间是什么关系? 好了,4 MOD 3为1。 所以,如果你继续,你会2。 因此,我们有1,2,3,1,2。 同样,你实际上是在第5位。你知道如何说,而不是5? 你说5 MOD 3 2。 我想看看多少个组,每组3遗留下来的,然后为了我 这样的话,如果我们继续沿着整个房间, 然后我们会看到,我们一直在实际应用对自己的MOD功能 种数。 这是一个更多样的实实在在的例子,你可能会使用模 因为我敢肯定,大多数人可能都经历这个过程中 我们不得不计算。 上模有任何疑问? 了解的概念,这将是非常重要的, 所以我想,以确保你们明白。 [学生]如果没有余数,它给你的实际数目? 如果其中的第3,他们已经做到了,这给了他们,他们实际上是什么, 或将它已经给了他们听不见] >>这是一个很好的问题。 如果没有剩余的模 - 所以说,你有6个模3 - 给你回0。 我们将谈论了一下后。 哦,是的,例如,第三人 - 3模3实际上是0,但她说3。 所以,这有点像一个内层的catch,例如, 像好吧,如果MOD为0,那么我将是第三人。 但是,我们就会陷入一种我们可能会想如何处理是什么0后。 所以,现在我们有某种正面的方式映射到正确的字母与zed。 所以,现在,我们已经讨论了通过这些例子, 我们种凯撒如何可能的工作。 您看到的字母,然后你看到他们转移。 所以,让我们试着表达式。 这个公式实际上是在规范中给你, 但还是让我们通过每一个变量意味着什么?样的期待。 我们的最终结果将是密文。 因此,这表示,在第i个字符的密文 将对应的第i个字符的明文。 这是有道理的,因为我们总是要排队的这些东西。 因此,它是第i个字符的密文加K,这是我们的关键 - 这是有道理的 - 然后我们有这个mod 26。 记得当我们有ZED 我们不希望进入的字符,所以我们希望国防部 种环绕的字母。 后ZED你会去一个,B,C,D,直到你得到了正确的号码。 因此,我们知道,ZED,+ 6,会给我们f,ZED来,因为在A,B,C,D,E,f。 因此,让我们记住我们知道,可以肯定的是ZED +将会给我们f。 在ASCII值,z为122,,f是102。 因此,我们必须找到某种方式,使我们的凯撒公式给我们102 后在122。 因此,如果我们只是套用这个公式,('Z'+ 6)26%,这实际上给你24 因为122 + 128; 1​​28%26为您提供了24余数。 但是,这并不真正意味着F。这绝对不是102。 这也是不是字母在字母表中的第6。 所以,很显然,我们需要有某种方式的调整这一点点。 在常规字母,我们知道,z是26日的信,和f是第六届。 但是,我们在计算机科学,所以我们要去指数在0。 这样的话,而不是z为26号,我们会说这是25号 因为a是0。 现在让我们套用这个公式。 我们有z为代表的25 +,它给你31。 31 MOD 26给你5余数。 这是完美的,因为我们知道f是第5个字母在字母表中。 但它仍然是F,对不对?它仍然是102。 那么这pset中,是一个挑战将试图找出的关系 之间的转换之间的ASCII值,按字母顺序排列的索引。 从本质上讲,你会想要做什么,你想开始的ASCII值, 但你要以某种方式翻译成一个按字母顺序排列的索引 然后计算出它应该是什么字母 - 基本上,其按字母顺序排列的索引是什么 的密码字符 - 翻译,后面的ASCII值。 所以,如果你掀起你的ASCII表,然后尝试和发现之间的关系,比方说,102和5 或122个和25个。 我们已经得到了我们的主要的命令行参数,我们得到的明文, 我们已经加密了。 现在,我们剩下要做的就是打印出来。 一对夫妇不同的方式,我们能做到这一点。 我们可以做的其实是打印的,因为我们走。 当我们遍历字符串中的字符, 我们可以简单地只打印正确的,那么当我们计算它。 或者,您也可以将其存储在数组中,有一个字符数组 和迭代结束时,整个数组,并打印出来。 所以,你的选项,有一对夫妇。 请记住,%c是将要打印字符的占位符。 因此,我们有凯撒,现在我们转移到维琼内尔, 这是非常相似,凯撒只是稍微复杂一些。 所以基本上与维琼内尔的,你要通过一个关键字。 因此,而不是一个数字,你将有一个字符串, 等,将作为您的关键字。 然后,像往常一样,你会得到一个提示用户的字符串 然后加密被它然后给他们的密文回。 所以我说,这是非常类似的凯撒,除了没有移位了一定的数量, 数实际上是要改变每一个角色对角色的。 代表的实际数量转移,它代表的字母键盘。 所以,如果你在一个移位,例如输入的,那么这将对应于0的移位。 因此,它再次返回按字母顺序排列的索引。 什么可能是有用的,如果你看到的,我们实际上是在处理与ASCII值 以及字母,以及按字母顺序排列的索引, 也许找到或制作自己的ASCII表显示按字母顺序排列的索引从0到25, a到z的ASCII值,所以你可以看到种的关系 并勾画出和尝试,并找到了一些模式。 同样,如果您正在发生转变在一定的情况下,由f - 这可以是小写或大写的F - 那将对应5。 我们好为止吗? 其计算公式为维琼内尔是一个有点不同。 基本上,你看,它只是像凯撒, 除了恰为k,而不是我们有k个指标j。 请注意,我们不会使用我,因为基本上,关键字的长度 不一定是我们的密文的长度。 这将是一个更清楚一点,当我们看到一个例子,我有位以后。 基本上,如果你运行你的程序的关键字,ohai, 那么,这意味着,每一次,,ohai是要成为你的转变。 因此,这取决于你在什么位置,在您的关键字, 你要改变你的某些密文字符由该金额。 同样,就像恺撒,我们要确保我们保持资本化的东西 我们只加密器字母,而不是字符或空格。 所以,回头给该撒,你可能已经使用的功能, 的方式,你决定如何转移的东西,它应用到你的程序在这里。 因此,让我们的地图了这一点。 我们有明文,我们已经得到用户的GetString 说这句话的...是CS50! 然后我们有一个关键字ohai。 前4个字符是非常简单的。 我们知道,T是将要由o偏移, 那么h将被移位由h,i的要被移位了。 这里你可以看到一个为0, 所以后来的终值是相同的字母前。 然后,s是由i偏移。 不过,你有这些时期在这里。 我们不希望来加密,那么我们不改变它的任何东西 只是打印出期间保持不变。 [学生]我不明白你怎么知道这是移 - 你在哪里 - “”哦,对不起。 在顶部在这里你看到的命令行参数ohai在这里, 那将是关键字。 所以基本上,你骑自行车在字符的关键字。 [学生]等将被转移 - 所以,O对应于一定数量的字母。 [学生]。但是,你在哪里得到了CS50部分? 哦。这是在GetString的,在那里你会说,“给我一个字符串进行编码。” [学生]他们打算给你这样的说法转移的 然后你会问你的第一个字符串。 >>呀。 所以,当他们运行的程序,他们要包含关键字 在其命令行参数时,运行它。 然后,一旦你已经检查了,他们实际上已经给你,而不是更多,而不是更少, 然后你要促使他们为一个字符串,说:“给我一个字符串。” 所以,在这种情况下,他们已经给了你这...是CS50! 那么你要使用,使用ohai和遍历。 请注意,这里我们跳过了加密期间, 但在ohai,下一个我们的立场,我们用O。 在这种情况下,这是一个有点难以看到,因为这是4, 让我们继续位。只要坚持,我在这里。 然后,我们有i和s,然后将其由o和h分别翻译。 然后我们有一个空间,这样的话,我们知道,我们是不会来加密空间。 但是请注意,而不是去一个在这个地方,在这里, 我们加密的 - 我不知道,如果你能看到 - 就在这里。 因此,它不喜欢你实际上是预定的,说,O都在这里,H这里, 一个在这里,我在这里,H,O,A,I,O,H,A,I。你不这样做。 你只能改变你的位置的关键字 当你知道你将要加密一个实际的信。 请问那种有意义吗? 好吧。 因此,只要一些提醒。 你要确保你只在您的关键字前进到下一个字母 如果您的明文中的字符是字母。 所以说,我们在邻。 我们注意到,下一个字符,i索引的明文,是一个数字,例如。 然后,我们不推进J,我们的关键字的索引,直到我们达到另一封信。 同样,你也想开始的关键字,以确保您概括的 当你在它的结束。 如果你看到这里,我们是在我,下一个是O。 所以,你要找到一些能够概括的方式开始您的关键字 每次你到达终点。 如此反复,什么样的运营商回绕在这种情况下是有用的吗? 例如关闭计数一样。 [学生]百分号。 “是啊,百分号,这是模。 因此,模将在这里派上用场,当你想换您的ohai在索引中。 只是一个快速提示:尝试认为有点像计数包装过的关键字, 在那里,如果有3组,第4人, 他们的人数,他们说的是4 MOD,这是1。 因此,尝试,并认为这样的说法。 正如您所看到的配方,只要您有词,然后PI,然后KJ, 你想,一定要保持跟踪这些。 你不需要我打电话给它,你不需要把它称为Ĵ, 但你要确保你跟踪你的位置,在您的明文 以及你的位置在您的关键字 因为那些不一定是相同的。 不仅关键字 - 它可能是一个完全不同的长度比你的明文。 此外,您的明文,有数字和字符, 所以它不会完全匹配起来。是。 [学生]有一个功能改变的情况下? 你可以改变一个大写字母A?是啊,肯定有。 您可以检查出 - 我相信它的TOUPPER,所有1个字。 但是当你试图密的东西,保存的文本, 这是最好的,基本上有独立的情况下。 如果它是一个大写的,那么你要转移 因为在公式中,当你回头看我们如何种下去 代表数字的ASCII方式之间交替 与实际按字母顺序排列的索引,我们要确保 将是你要使用某种模式。 另注上的图案,真的。 你一定要与数字打交道。 尽量不要使用幻数,这是风格的一个例子。 所以说,你想每次移动所喜欢的东西 - 好了,这样的提示,另一个扰流板,当你将要转移的东西 通过一定量时,尽量不要代表一个实际的数字 而是尝试,看看你是否可以使用ASCII值,这将种更有意义。 另注:因为我们正在处理的公式, 即使你的TF知道你可能会使用什么模式, 最好在您的宝贵意见种解释的逻辑,如, “我使用这种模式,因为......”一种解释模式,简洁地在您的宝贵意见。 [这是演练2]如果没有其他问题,然后我就留在这儿一点点。 祝你好运与您的pset 2:加密的到来,并感谢。 [学生]:谢谢你。 >>谢谢。 [媒体离线介绍]