[音乐播放] 戴维·J·马兰:好吧。 这是CS50,这 是第2周的端部。 所以,今天,我们要 继续我们的样子 我们是如何表现的东西 下面的hood--搬走 从喜欢整数的数字 和浮点值 并专注于字符串和 最终更有趣的节目。 但是,我们也将看看在 夫妇域专用problems--的 其中第一个将在 是涉及到密码学中, 艺术加扰的信息, 你上面的看这里 是无线电孤儿安妮的图片 秘密的解码器环从昔日。 其实,这是很原始的形式 和cryptopgraphy儿童友好的形式 由此该环有两个disks-- 1内1外。 并通过旋转其中的一个,就可以 本质上线像一个字母 到Z与其他字母 像通过A.乙换句话说, 你可以从字面上旋转的字母, 从而想出的一个映射 信件,信件,这样,如果你 想送一个秘密消息 到有人喜欢安妮,你可以写 您的消息,然后旋转 字母,即,如果您的意思是 说“A”,而不是你说的“B” 你的意思是说“B” 你不是说“C” - 或一些更聪明 比that--然后,最终 只要安妮有此解码器 环,她可以解码该消息。 现在,你可能还记得,其实,这 在一个非常有名的电影,是使用 在播放广告nauseum 圣诞季节。 让我们来看看这里。 拉尔夫PARKER:“无论是 众所周知,在汇总 拉尔夫·帕克兹委任 小孤儿安妮秘密的一员 圆,有权全部 其发生的荣誉和利益。“ 拉尔夫·帕克(话外音): 签名小孤儿安妮。 会签,皮埃尔·安德烈! 在油墨。 荣誉和利益, 已经在九岁的时候。 [音乐播放] [无线电聊天] 拉尔夫PARKER:来吧。 让我们开始吧。 我不需要所有的爵士乐 关于走私者和海盗。 播音员:听明天 晚上的最后冒险 的黑色海盗船。 现在,是时候让安妮 秘密信息给你的成员 的秘密圈。 记住孩子,只有会员 安妮的秘密圈 可以解码安妮的秘密信息。 请记住,安妮取决于你。 设置您的销到B-2。 这里是message-- 12,11,2-- 拉尔夫·帕克(话外音):我 我在我的第一次秘密会晤。 电台播音员:--25,14,11,18,16-- 拉尔夫·帕克(话外音):哦, 皮埃尔是伟大的声音在今晚。 我可以告诉大家,今晚的 信息是非常重要的。 电台播音员:--3,25。 这是从伊能静自己的消息。 记住,不要告诉任何人。 [喘气] 拉尔夫·帕克(话外音): 90秒后,我 在唯一的房间 房子里的9个孩子 可以坐在隐私和解码。 啊。 “B”。 [笑] 拉尔夫·帕克(话外音): 我去到下一个。 “E”。 第一个字是“是”。 是的! 现在来了更容易。 “U”。 [笑] RANDY PARKER:噢,来吧,拉尔夫。 我得走了! 拉尔夫PARKER:我马上下来,马。 啧啧飕飕。 “T” “O”。 “一定 以“。”一定要“是什么? 什么是小孤儿安妮 想说什么? “一定要”是什么? 母亲:拉尔夫,兰迪得走了。 请你出来? 拉尔夫PARKER:好吧,妈​​妈! 我马上就出来了! 拉尔夫·帕克(话外音): 我越来越近了。 张力是可怕的。 那是什么? 地球的命运 可以挂在平衡。 母亲:拉尔夫,兰迪的得走了! 拉尔夫PARKER:我马上就 出来,哭出声来! 拉尔夫PARKER (话外音):几乎没有! 我的手指飞了! 我的心是钢的陷阱。 每一个毛孔振动。 这几乎是清楚的! 是的! 是的! 是的! 是的! 拉尔夫PARKER:“一定 喝你的阿华田。“ 阿华田? à照出的商业? [音乐播放] 拉尔夫PARKER:狗娘养的。 (笑) 戴维·J·马兰:所以这则是 惊鸿一瞥的密码是什么 可以为this--à 喝从昔日。 所以简单公告。 如果你是自由的这 周五下午1:15,并会 想加入我们CS50 午餐前往该网址在这里。 先来先服务如常。 但随着时间的推移,我们将确保 大多数人谁愿意参加 可安排明智的。 所以字符串。 我们有Zamyla--人 你现在见过最有可能 在习题集1--的 名字是这样拼写。 并假设你输入她的名字 成计算机程序,是 使用类似的getString。 为了检索 这些按键,怎么 做才好较 字符串,一句话,一个段落, 或多个字母这样的吗? 我们谈最后一次约 整数和问题 出现整数溢出 和浮点值 和问题 出现在精度范围内。 随着弦,我们至少 有一点更灵活 因为strings--刚 在现实天下 - 可以是一个漂亮的任意长度。 很短的,长的漂亮。 但即便如此,我们要 发现电脑有时可以 运行内存不足,甚至没有 存储一个足够大的字符串。 但现在,让我们开始显现 字符串的东西在这些箱子 这里。 所以六个这样的盒,其中每个 代表一个字符或“字符”。 所以记得“字符” - C-H-A-R--是 在C中的内置的数据类型中的一种 这有什么好看的,你可以用 之类的,作为一个构建块, 一块拼图,如果你愿意,形成 较大的数据类型,我们将继续 调用“弦”。 现在,是关于思维有用 这样的事情在这样的字符串? 嗯,事实证明,我们可以 实际利用这种结构 实际访问单个字符 在一个非常简单的方法。 我要继续前进,创造 一个名为“stringzero.c” 但你可以把它叫做任何你愿意的话。 而在球场上的网站是 已经是这个例子中前进, 所以你不需要 输入所有的东西。 而且我要继续前进 和第一次做INT主要作废。 而在几天之内, 我们将开始捉弄分开 虚空是什么在这里,为什么它的 整型旁边主,等等。 但现在,让我们继续 复制粘贴。 我要宣布一个名为s字符串。 而我要的回报 GetString的在任何用户类型。 这将是一个简单的 程序,没有说明, 我只是盲目地 期望用户知道 怎样做才能保持它的简单。 而现在,我将有一个for循环。 我的for循环里面,我 将有INT I变零。 我是,也只是一个惯例, 索引变量计数, 但我可以把这个我想做的事情。 我要做的i小于than--好 Zamyla的名字是6个字母。 所以我要努力 代码那里了。 然后对我有用。 而现在这里面的卷发 括号我会做的printf, 我想打印一个 字符一次。 所以我打算用%下 也许是第一次。 然后,我要打印的每张 性格上自己的路线。 所以我要放 小反斜杠Ñ那里。 关闭股票​​。 现在我想要做的东西在这里。 我想打印出来的 在字符串中的特定字母, S,因为我遍历 从零上多达六个。 换句话说,我要 打印s的第i个字符。 现在我该怎么办呢? 嗯很像箱子 这表示在这里, 种,想起了拳击的概念 在信中,您同样可以做到这一点 语法简单的通过指定在C中, 我想打印输出S的第i个字符。 使用方括号 您的计算机键盘上 在美式键盘上的 一般在你的返回键。 因此,这是不完全正确 然而,正如你可能已经注意到了。 不过,我要种 一味地在这里开拓进取。 而我要做的事情做出字符串0。 但我没有这样做的,如果让我们看看 无法预料的一些常见的错误。 这是怎么回事编译? 不,我错过了一大堆东西。 图书馆听说。 那么,哪头文件 我可能要在这里补充的吗? 是啊。 听众:您需要 标准I / O [听不清] 戴维·J·马兰:优秀。 所以,我需要标准I / O。为了什么 这样做的目的我想标准的I / O? 对于printf的。 所以,包含了stdio.h。 你也建议我加入 在CS50的图书馆是什么原因呢? 有字符串。 所以我们会看到什么 CS50的图书馆正在做 创建一个字符串的这个概念。 但现在,你可以认为 它作为一个实际的数据类型。 因此,这似乎是一点点清理。 现在我要继续前进 确实做到让字符串0。 编译。 所以这是很好的。 所以./string0让我放大,使我们可以 看到更加紧密地发生了什么。 输入。 Z-à-M-Y-L-A输入。 我们已经印出来Zamyla的名字。 所以这是相当不错的。 所以,现在让我们继续前进, 再次运行此程序, 并输入了Daven的全名。 惊喜,惊喜。 输入。 嗯。 我们没有印刷Daven的 全名字正确。 现在,这应该是显而易见的 回想起来的原因是什么, 样的,愚蠢的设计决定? 是啊,我硬编码了 6里面我的for循环。 现在我这样做只是因为 我知道Zamyla的名字 将是六个字母。 但可以肯定这不是 一般的解决方案。 所以,事实证明,我们可以动态 找出一个字符串的长度 通过调用一个名为的strlen函数。 同样,故意 简洁的命名只是 以使其更方便地输入。 但是,这等同于 得到一个字符串的长度。 我将返回到我的终端 窗口并重新编译运行。 但它吼我。 隐式声明的库函数 strlen的使用unsigned int型const-- 我迷路了。 完全。 因此,特别是作为 眼神开始呆滞 像这样的错误信息,重点 老老实实的前几个字。 我们知道问题出在 8号线,如下所示。 而且它是在字符串0.c。 隐式声明 库函数strlen的。 使一般要 是错误消息的格局。 隐式声明的东西。 因此,在短期,你有什么我似乎 这样做就线8条,在这里。 什么可能的解决方案是偶数 如果你从来没有使用strlen的自己吗? 听众:不同的库中的一部分? 戴维·J·马兰:第一部分 不同的库。 因此,特此声明,可以这么说。 它提到了一些文件 比stdio.h中和CS50.h.其他 现在它在哪儿定义的? 说实话,你要么只是 知道这一关你的头顶, 或者你google一下,看看。 或者知道这一点,我已经打开了,在CS50 设备上的终端程序,这 是只大,全屏版 什么是gedit中的窗口的底部。 而事实证明,有一个 同样简洁的命令,称为 男子手册,在那里,如果你键入 一个函数的名称,然后按Enter键, 你会得到相当 神秘的文档。 这只是文字一般 看起来有点像这样。 这是一个有点势不可挡 乍看之下。 但是,坦率地说我要去 让我的目光呆滞 而只专注于部分 我关心的时刻。 这是这样的。 它看起来像结构 东西我很熟悉。 事实上,手册页,所以 说话,会告诉你 在什么头文件中的函数 像strlen的定义。 所以我现在要回去gedit的。 而且我要继续前进, 加上这里的#include 并保存文件。 我要清除屏幕 控制L如果你一直想知道。 而我要重新运行make string.0,编译这个时候。 ./string.0 Zamyla。 这似乎工作让我走 进取,与达文波特重新运行它。 输入。 而这也似乎工作。 因此,我们可以做得比这好一点, 不过,我们可以开始整理东西 最多只是一点点。 我要去实际 下面介绍一件事。 我要继续前进, 它保存在不同的文件。 我要去打电话 此文件string1.c刚 为与代码一致 你可以在网上找到。 让我们集中在 完全相同的代码。 事实证明,我已经 是一种了结 理所当然的是,我的笔记本电脑, 并且反过来,CS50器具 有很多记忆,很多 内存,有很大的空间的字节 我在其中可以存储字符串。 但现实的情况,如果我输入长 够了,够按键, 我可以在理论上类型 在多个字符 比我的电脑 实际拥有的内存。 这是有问题的。 就像一个int只能 算如此之高,从理论上讲, 你只能塞进这么多字 到您的计算机的RAM或随机 存取记忆体。 所以我不得不更好地预测 这个问题,甚至 虽然它可能是一个罕见的 角落里的情况下,可以这么说。 不会发生的时候,可能会发生。 如果它发生,我不 预测和计划吧, 我的程序可以做谁知道。 冻结,死机重启,等等。 一些预期可能会发生。 那么,我该怎么办 现在,今后真的, 之前我曾经盲目 使用一个变量,比如s的 已分配的返回值 其他一些功能如GetString的, 我要确保 它的值是有效的。 所以,我只知道,从已经阅读 CS50的文档的GetString, 最终,我们将会为你在, 该形式返回一个特殊的符号 称为NULL,N-U-L-L中的所有 帽子,一旦出了问题。 所以通常情况下,它返回一个字符串。 但除此之外,如果它返回n-U-L-L-- 我们最终会看到什么是真正的 是指:这只是意味着 坏事发生。 现在,这意味着,就像在刮, 我可以在这里查询的条件在C中, 如果s不等于NULL。 所以,如果你还没有见过这个, 这也就意味着不等于。 所以它的对立面 平等的平等,其中还记得, 从单一的不同 等于,这是分配。 所以如果s不等于 空,才做 我想执行的代码行。 因此,换句话说, 之前,我在潜水盲目 并开始迭代 在S和处理它 就好像它是一个序列 人物,我会先检查, 等一下,是绝对不是 等于这个特殊值,空值? 因为如果是这样,坏的事情都可能发生。 而现在,假设坏事 发生意味着你的程序崩溃, 而且你不一定能恢复。 所以,坦率地说,它看起来丑陋。 种它现在混乱的看了一眼。 但是,这将变得更 不久熟悉。 但我要提出 现在另外一个改进。 这是一个改善的正确性。 我的计划是现在比较正确的,因为 在罕见的情况下,没有足够的记忆体 存在,我会处理这件事, 而我就什么也不做。 至少我不会崩溃。 但是,让我们做一个最终版本在这​​里。 和一个文件名为string2.c。 我要粘贴 相同的代码只是一瞬间, 而我要强调这 线,11日,在这里,一会儿就好了。 现在的实际情况是,聪明的编译器 像锵能够解决这一问题,我们 幕后 没有我们曾经知道。 但是让我们想想这 从根本上是有问题的设计。 这行代码,当然, 他说,初始化一些变量i为0。 这是非常简单的。 什么又是这样的 声明中,在这里,我有用,在做什么? 我们已经看到过,但我们 没有真正谈论它。 听众:递增岛 戴维·J·马兰:递增岛 因此,在每次迭代中通过 这个循环中,每一个循环中, 你是递增i增加1。 所以它变大,大,和 做大,直到循环终止。 它是如何终止? 那么有这个中间 这是我们以前使用的条件。 你见过在 预排在P组。 但是,这是什么意思吗? 请执行下列操作循环,使 只要i小于什么? 听众:字符串的长度。 戴维·J·马兰:本 长度的字串。 所以它转换很干净 英语在这个意义上。 现在的问题是,每一次我 通过此循环迭代理论上 我在问这个问题。 为i小于s的字符串的长度? 为i小于s的字符串的长度? 现在也是我改变在每次迭代? 是的。 因为+ +的。 所以,每一次迭代i的越来越大。 但为s挺大的,或 较小,或改变在所有? 号 所以在设计方面,其中一个轴 同时,我们试图评估代码 在课堂上,这种感觉有点愚蠢。 就像你从字面上看, 在每一次迭代 这个循环的要求 同样谴责的问题了, 又一次,又一次,和字面 这是永远不会改变的。 至少如果我没有碰s和 试图改变s的内容。 因此,我可以做得比这更好一点。 而我什么都做不 声明只有一个变量i, 但第二个变量我会随意, 但传统上,正调用它。 分配N个相等的 第字符串的长度。 然后在这里,我要 做一个聪明的小优化,使 可以说,在一天结束时 不再是正确的或不正确的少 比以前。 但它是一个更好的设计。 在事实上,我使用 更少的时间,更少的CPU周期,因此 说话,回答同样的 的问题,但只有一次。 上一般的任何问题 改进的原则, 说,程序的效率? 是吗? 听众:你为什么 使用[听不清]? 戴维·J·马兰:好问题。 那么,为什么我们把+ +上月底 í而不是I的开始? 在这种情况下,它具有 没有功能的影响。 而在一般情况下,我倾向于 使用后缀运算符 所以,这是一个更加清楚一点的 至当操作正在发生。 对于那些不熟悉的,还有另一种 语句,让你可以做+ +我。 这些都是功能 在这种情况下,等同 因为没有什么别的 周围的增量。 但是,你能想出 宗和代码行 其中有差别。 所以一般情况下,我们不 甚至谈论这个。 因为坦率地说,它使你的 代码性感,和排序的雨衣, 和更少的字符。 但现实是它的很多困难, 我想,即使我来包装我的脑海 周围有时, 操作的顺序。 所以顺便说一句,如果你 真的不喜欢这样, 即使这是种性感 看,你也可以做I + = 1, 这是对的丑陋版 postfix的增量同样的想法。 我这样说,你 应该取笑它, 但你会看到代码 一些之前长的漂亮。 [笑] 戴维·J·马兰:是吗? 是啊。 问题在中间。 听众:你需要说INT N' 戴维·J·马兰:你这样做 不用说INTñ。 所以,因为我们已经说过诠释, 你不必说了一遍。 美中不足的是,n具有以 具有相同的数据类型,因为我。 所以,这只是一个在这里方便。 是啊。 听众:你可以去比 打印字符s支架我又? 戴维·J·马兰:当然可以。 所以%C,从去年召回 时间,只是一个占位符。 这意味着把一个char这里。 反斜杠N,当然,只是 手段把换行符这里。 所以,刚刚离开,现在, 这片新的语法。 这是从字面上说,抢 字符串称为S去得到它 第i个字符,可以这么说。 我一直说的第i个字符 因为在这个循环的每次迭代 这是因为,虽然我们打印 出,头s支架0, 作为一个程序员可能会说。 那么S支架1,则S 支架2,然后是3,然后是4。 当然,它是一个变量, 所以我只是表达它与I。 键,虽然是实现, 特别是如果你不 被驯化了这个世界 编程时,我们都 似乎从零来算,得 现在就开始从零计数。 因为字符串,第一个字符时, ž在Zamyla是好还是坏 要住在的位置数为零。 好吧,让我带 我们回到这里Zamyla 看看到底发生了什么 在引擎盖下方。 因此,有型铸造这个概念。 你可能有实际 玩这个已经, 也许对黑客 的P版的设定之一。 但是,类型转换只是指 在C和能力的其他语言 到一种数据类型转换成另一种。 现在怎么可能,我们看到这个 很直截了当? 所以这一点,召回,是开始 的英文字母。 和上下文,还记得,从 就像一个星期前是ASCII码。 美国标准守则 信息交换。 这只是一个很长的路要走 的说法,从字母的映射 为数字,从数字到字母。 因此通过并购在这里,点点 点,线了,召回, 十进制数65就到了。 我们没有谈 这个明确的, 但肯定有相似 数字为小写字母。 事实上,有。 世界决定有些年头 以前,小A,小写, 将是97。 和小B是怎么回事 为98,依此类推。 和任何其他关键 您的键盘,还有 会是位类似的模式。 或者等价地,一个十进制数。 因此,在手头上的问题, 那么,我们怎样才能 其实看到这个引擎盖底下? 所以,我打算去到gedit的一次。 而非类型 这一个从无到有, 我要继续前进, 刚刚开放的东西 从今天的代码称为ASCII码为零。 和ASCII零看起来是这样的。 因此,让我们环绕这是我们的想法。 因此,首先,我已经评论 代码,这是很好的。 因为它的字面意思 告诉我会发生什么, 显示大写字母的映射。 现在,我不太知道我 那是什么意思,所以让我们推断。 在英语中,也许 有些技术人员英语, 什么呢行18出现 在做我们呢? 就在第18行。 它是什么引起? 什么是它要在这里揭开序幕? 听众:一个循环。 戴维·J·马兰:一个循环。 又有多少次是 要去迭代? 听众:[插入VOICES] 六次。 戴维·J·马兰:不六倍。 听众:26次。 戴维·J·马兰:26次。 是啊,对不起。 26倍。 为什么呢? 嗯,这是一个有点怪异,但 我已经开始从65计数。 这是奇怪的,但不是错了。 这不是每个说不好。 而我做的,只有 因为,在这个例子中, 我有点期待 资本A为65。 现在这不是最优雅 的方式来做到这一点,来样硬编码 深奥的价值观,没有人 是意想不到的记忆。 但是现在,请注意,我 这样做起来,通过65加26。 因为显然我什至不希望 做算术在我的脑海。 因此,我将让编译器做。 但是在每个循环中,每次迭代 循环的,我递增岛 所以,现在这个看起来有点神秘。 但是,我们应该具备的基本建筑 与块明白这一点。 %C只是一个占位符字符。 %i是一个占位符,一个int。 而事实证明,通过使用该 新的语法,这个括号,所以 可以说,这样的数据类型 圆括号内, 我可以强制编译器把 我岂不是一个整数,但作为一个字符。 从而表明了我的性格 相当于这个数字的。 现在到这里,这个代码 几乎是相同的。 我只是想让 超清晰的事实 那我开始在97, 这是小写。 在经过了26个字母。 而我doing--一遍, 铸我可以这么说。 或类型转换我可以这么说。 从一个int为char。 这样最终的结果将是, 坦率地说,我们的信息已经知道了。 我要作 ASCII-0 dot--不是C点。 请注意,你可能做了 错误,因为我只是做了意外。 请ASCII-0。 现在我该怎么办./ascii-0。 我就放大了,可惜 它会在屏幕上滚过。 但是我们看到整个图上 Google地图97,B映射到98, 如果我们进一步向上滚动 A,当然,映射到65。 所以这只是说 我们一直在鼓吹, 有这个对等,是 事实上在实际的情况。 所以这是一个快速修改。 让我打开ASCII-1.C。 并请注意这个聪明,排序 的,澄清这一点。 这是ASCII-1.C,并 看到这个疯狂的事情。 这真正得到的心脏 什么样的电脑在干什么。 虽然我们人类会 在letters--而言不算 我不开始思考, 没事A则B, 并使用它们来计算物体。 你当然可以说,我要 初始化一些变量称为C-- 但我可以把这种现象称之为anything-- 所以C初始化为资本A. 因为在一天结束时,计算机 不在乎你存储的东西, 只在乎你怎么想 呈现这些信息。 你怎么要电脑 解读比特的格局? 因此,这是不是我 一般会建议这样做。 这真的只是一个例子, 传达你绝对可以 初始化为char整数。 由于下方的 当然,一个char的引擎盖, 仅仅是一个数字,从0到255。 所以,你当然可以 把它放在一个int内。 什么这也 表明的是,我们 可以从一个转换 键入到另一个,在这里, 最终打印同样的事情。 而事实上,这一点,我会解决online-- 是为了这么一说,再一次,在这里。 让我打扫一下网络,我们将 看到在网上漫游的需要, 目的是什么在那里。 行。 所以最后一个例子,现在涉及 A和B的,然后我们会 拿东西了一个档次。 因此,与A和B的并 C'S的资本 和等价物,让我们 看看这个例子,在这里。 另一个代码示例。 我们会开一个的 已经作出,所以我们 不必键入它 全力以赴从零开始。 并注意在期待 我们使用多个头 文件,其中之一是 我们的新朋友,string.h中。 现在这看起来,在第一 一眼望去,有点神秘。 但是,让我们看看,如果我们不能理性 通过什么是怎么回事。 首先,我从用户得到一个字符串, 我把该字符串中的变量 称为S。 复制粘贴,从之前。 在第22行,我显然 做什么 我做了一个刚才我遍历 在s中的字符。 这里的新花样使用 字符串的长度,优化未成年人 存储该字符串的长度为n, 而不是调用一次strlen的, 又一次,又一次。 而只是检查我是小于n。 现在这里,事情就变得 有点有趣。 但它只是一个应用程序 这种相同的新思路。 什么英语呢 Š支架我代表? 听众:每个计数 人物[听不清]。 戴维·J·马兰:计算每个字符。 甚至更简洁, Š支架我代表的是什么? 你会说。 不要把你当场这里。 听众:Well-- 戴维·J·马兰:所以,如果这个词is--如果 该字符串是Zamyla,这starts-- 听众:--you处理 人物separately-- 戴维·J·马兰:好。 没错。 方括号表示法可以让你 单独访问每个字符, 所以š托架0将是对 字符串中的第一个字符。 š托架1将是 第二,等等。 所以这个问题我问, 这里,在这种条件下是什么? 是S更大的第i个字符 大于或等于小写? 而这是什么意思,在这里, 与双连字号? 听众(合):和。 戴维·J·马兰:和。 这只是相当于此。 而不是在C语言的关键字,你必须 使用时,烦人,符号与符号。 而这一点,相反,却要求是 的s的第i个字符小于或等于 为小写ž? 再次,这里的地方 理解底层 实施了 电脑是有道理的。 请注意,即使我有 在点点点在那边, 貌似从a到z的小写字母 所有连续的值从97上了。 而同样的大写开始65。 因此,外卖,然后, 的是,在英国, 你会如何​​形容 什么线24是干什么的? 是吗? 听众:在24它的检查,看看 是否每一个字符是小写。 戴维·J·马兰:这是检查是否 每个字符是小写字母。 因此,更简洁,是 Š小写的第i个字符? 这就是我们 在这里表达逻辑, 隐晦一点,但 最终很直截了当。 是S的第i个字符小写? 如果是这样,这里的东西在哪里 得到一点心灵弯曲 就一下,如果是的话,请 前进,打印出的字符。 所以这只是一个占位符, 但什么性格? 我为什么要做Š级别I 减去在这里体现在哪里? 那么这里看到的格局。 实际数字并不重要,这么多。 但是请注意,97是 如何远离65? 听众:32。 戴维·J·马兰:32。 多远是98 66? 听众:32。 戴维·J·马兰:从大C小C 2 32。 因此,有来自32跳 一个字母到另一个。 所以,坦白说,我终于忍不住 简化这一点。 但后来我种硬编码 这种低级别的理解 没有读者是有史以来 要理解。 所以我要推广它作为我 知道小写字母越大。 我知道的大写字母 较小的值,具有讽刺意味的​​。 但是这实际上等同于 话说减去32从s支架岛 因此在这些情况下 信,如果信 恰好是一个字母,小写字母 A,我减去32, 什么样的影响确实有, 在数学上,在小写? 听众:Capitalizes-- 戴维·J·马兰:以大写字母了。 事实上,这就是为什么我们的 程序被称为利用零。 这个程序不是 大写字母, 检查它是否是后 的确是一个小写字母。 否则,在第30行,我该怎么办,如果 它不是一个小写字母,我很 看着在特定 迭代循环中。 刚刚打印出来。 所以不改变的东西 这甚至不是小写。 限制自己 通过小Ž稍微。 现在,这是相当神秘的。 但在一天结束时,这 就是我们,曾几何时, 必须实现的事情。 如果我不是开放的资本 1,哦,感谢上帝。 有一个函数 叫上可 难道我们只是做了一切 在一个相当低的水平。 我们上有趣的是, 因为它是在一个文件中声明, 你只知道这个 通过检查文档, 或者被告知,比方说,在课堂上,在那里 它的存在,在一个名为文件ctype.h。 因此,这是我们的一位新朋友。 并且上不正是 它的名字所暗示。 您可以通过在,作为一个参数之间 这些括号,一些字符。 我要传递的第i个字符 第使用我们看中的新符号 包括方括号。 并采取了猜测,究竟是回归 对上价值显然会 要? 大写字母。 大写字母。 所以,如果我通过在小写, 希望,通过对上定义, 它会返回一个 大写字母A。否则, 如果它不是一个小写字母 首先,我只是把它打印出来。 事实上,请注意 这里第二个朋友。 不只是上存在, 但是低,这 实际上回答了这个问题对我来说。 现在,谁写了这些东西, 以前的10秒里,你知道吗? 实施上,是 降低使用这样的代码。 但同样,有一致的 这个想法抽象出来的​​, 之类的,较低水平 实施细则。 而站在人的肩膀上 谁来到了我们面前,使用功能 像到上部和下部是,这 奇妙的是够漂亮 命名该说什么,他们做的是 精彩的范例采用。 现在,事实证明,如果我读 该手册页,说,要上, 我学别的东西。 所以,男人TOUPPER。 这是一个有点势不可挡。 但注意,这里的提 我应该使用头文件。 顺便说一句,因为这 是一种误导,功能 采用整数,而不是字符 错误检查的原因。 但是,我们也许会来 返回到在将来。 但是请注意,在这里,要上转换 如果可能的字母C为大写。 所以这是非常简单的。 现在,让我们成为一个更具体一点。 让我们来看看的部分 根据返回值的手册页。 返回的值是 转换后的字母。 或c,如果转换 是不可能的, 其中c是原始输入。 我知道,从这里,从 该参数来上。 那么什么是这个外卖? 返回的值是 转换的信, 或c,原信,如果 的转化率是不可能的。 有什么可以改进,所以我 让我的代码的设计吗? 是吗? 听众:您可以删除的东西。 戴维·J·马兰:我可以 去掉else语句, 而不仅仅是else语句。 听众:您可以删除[听不清]。 戴维·J·马兰:我可以 移除整个叉 在路上,如果其他人干脆。 因此,我们确实让我打开 这样做的最终版本, 利用-2,注意只是怎么样,如果 你会,性感,代码现在越来越, 在我从一些减少 七,所以行短短四年, 我有意的功能 通过简单地调用到上层, 通过以s支架i和印刷 取出,用占位符%C, 特定的性格。 现在可以说,有个bug, 或错误的,至少风险, 在这个程序中。 所以才回来 到一个较早的外卖, 我应该怎么可能还做的 这个程序,使其更加坚固, 因此,有没有办法它可以 崩溃,甚至在极少数情况下? 听众:请确保它是不是NULL。 戴维·J·马兰:确保它不为NULL。 所以真的,使这个超级 正确的,我应该这样做, 如果s不为NULL,则 请继续执行 这几行代码,其中 那么我可以缩进那样, 然后把我的右花括号。 因此,良好的搭售在一起的两个概念。 是吗? 听众:你能不能用 一个do while循环,而不是? 戴维·J·马兰:莫非 我做了do while循环? 听众:--you要确保 你实际上[听不清]。 戴维·J·马兰:莫非 您使用的是DO WHILE? 简短的回答,没有。 因为你即将 引入另一个角落的情况下。 如果该字符串的长度为零。 如果举例来说,我只是打 输入,而没有输入Zamyla。 我要交给你回一个实际 字符串,因为我们最终会看到, 具有零个字符。 它仍然是一个字符串, 它只是超短。 但是,如果你使用DO WHILE, 你要盲目 尝试做一些与 对于该字符串, 而什么也没有去那里。 听众:嗯,如果你做了 做[听不清],而S-- 戴维·J·马兰:哦,我看看,让 获取来自用户的字符串。 所以,简单的答案,你 能,并保持纠缠 他们给你一个字符串,它是 短到足以装入内存。 当然可以。 我只是选择不。 如果他们不给我的字符串I 希望,我辞职,我放弃了。 但是,绝对,为此目的, 你可以完全做到这一点。 因此,库的头文件 我们现在熟悉了这些,在这里。 标准I / O,CS50.h,string.h中, 文件ctype.h,并有确实,等。 你们当中有些人已经发现 在math.h.数学库 不过,让我介绍一下,现在,到 这个资源是CS50的工作人员,达文, 和Rob,以及加布特别 有放在一起。 这将很快链接 该课程的网站。 这就是所谓的CS50参考。 这只是给你一个快速 它的味道,工作原理如下。 让我去reference.cs50.net。 在左手上,你会看到 方压倒性列表 功能附带℃。 但是,如果我不管,就目前而言, 关于类似的strlen, 我可以输入它。 它过滤下来的名单 只是我所关心的。 我会点击它。 而现在在左边, 你会看到什么,我们希望 是一个比较简单的,人 如何友好的解释 该功能的工作原理。 返回字符串的长度。 这里有一个故事大纲,这里是你如何 用它在头文件而言, 以及在什么样的功能方面 看起来像它的参数条件。 然后在这里,退货 字符串的长度。 但是,对于那些你更舒适, 实际上你可以点击更多的舒适, 与此内容 页,现在,将改变 是什么样的默认值 你所使用的手册页。 换句话说,CS50 引用是一个简化 手册页的工作人员,为学生。 特别是那些不太舒服 和在之间,这样就 不必尝试包裹 你的头脑身边,坦率地说, 一些相当神秘的语法 和文档的某个时候。 所以,记住这一点 在未来的日子里。 所以在这里,再次,是Zamyla。 现在,让我们提出一个问题,那就是 多一点人访问。 由于长安,谁是被 印刷更多的大象 马不停蹄的这几天。 我们有一个机会,给 客场至少其中之一。 如果我们能够得到的只是一名志愿者 来在最多绘制在屏幕上。 怎么在这里? 上来吧。 你叫什么名字? 亚历克斯:亚历克斯。 戴维·J·马兰:亚历克斯。 好吧。 亚历克斯,上来吧。 我们即将看到你 手写在屏幕上的位置。 好吧,很高兴认识你。 亚历克斯:你很高兴见到你。 戴维·J·马兰:好吧。 因此,超级简单的运动。 酒吧是不高 让大象今天。 你在玩的GetString的作用。 而且我会直接告诉你 你已经得到的字符串。 并假设你, GetString的,被称为。 和人,和我一样,有 键入Zamyla,Z-A-M-Y-L-A。 只是继续前进,就写Zamyla 屏幕虽然你得到它 并将其存储在某个地方存储。 什么将是几个留有​​余地 其他words--没关系,坚持下去。 [笑] 所以Zamyla,优秀。 所以,现在假设你, GetString的,被再次调用。 因此,我为您提供,在 键盘,使用其他名称,贝琳达。 好吧。 而现在,下一次的GetString是 叫我输入类似加布, G-A-B-C。你真的走 到心脏的随机存取存储器。 这是借鉴一切 完全随机。 行。 [笑] 亚历克斯:对不起,我的笔迹是坏的。 戴维·J·马兰:不,没关系。 又有怎样的罗布,R-O-B。行。 好。 所以,我没想到你会 种打下的东西出来是这样的。 但是,我们可以使这项工作。 那你怎么去铺设 这些字符在内存中? 换句话说,如果我们想 这个长方形的黑色画面 作为代表 计算机的RAM或内存。 并记得RAM是刚 一大堆的字节, 和字节是一大堆位。 而位在某种程度上 实施一般 用某种形式的 电力硬件。 所以这是排序的 分层,我们已经讨论过 现在可以理所当然的。 你怎么去 决定在哪里写 罗布对加布与 贝琳达与Zamyla? 亚历克斯:我只是做了它在 命令你告诉我。 戴维·J·马兰:这是事实。 但管辖,你把 贝琳达的名字和Gabe的名字吗? 亚历克斯:什么都没有? 戴维·J·马兰:[笑] 那么这样的作品,这很好。 所以,电脑是小 比这更有序。 所以,当我们implement--呆在那里 在短短moment--当我们真正 实现类似 GetString的在一台电脑, Zamyla可能会奠定了相当多 像你这样在屏幕上,在那里。 什么是关键要注意 在这里,有什么亚历克斯做了, 有是怎样的一个分界 其中每一项的话,对不对? 你没写 Z-A-M-Y型L-A-B-C-L-I-N-D-A-G-A-B-- 换句话说,有一些样 划界这似乎是, 之类的,随机的间距 这些不同的单词之间。 但是,这是很好的,因为 我们人类现在可以 可视化,这些都是 四个不同的字符串。 这不只是一个序列 地段字符。 所以一台电脑的话,同时, 可能需要一个字符串,如Zamyla, 把每一个这些信件 里面的内存字节。 不过,这个数字要大得多, 当然,大于6位。 有一大堆的RAM。 所以,从今以后,这 箱格会 代表什么亚历克斯刚 在这里做在屏幕上。 而现在,亚历克斯,我们可以为您提供 蓝色或从长安橙色大象。 亚历克斯:我要一个蓝色的大象。 戴维·J·马兰:一个蓝色的大象。 因此,一个热烈的掌声, 如果我们可以,亚历克斯在这里。 [掌声] 亚历克斯:谢谢。 戴维·J·马兰:谢谢。 这样的外卖的是,即使 种模式随时间变化的,在这里 在黑板上,有这 各串之间的分界 亚历克斯得到了我们。 现在的电脑,坦率地说, 可以做同样的事情。 种他们可以噗通 字符串的任何地方在RAM中。 在这里,在这里, 在这儿,在这儿。 他们可以这样做。 但是,当然,这是 可能不是最好的规划。 对不对? 如果我一直在问亚历克斯 得到的名字,也许他会 多放些到这里,也许最多 在这里,看过来,看过来,最终 在这里。 但有更多的规划,当然, 我们可以打好的事情了更干净。 事实上,这就是一台电脑一样。 但美中不足的是, 如果下一个字符串,我得到 后Zamyla是什么 像贝琳达, 建议我们会写 字母b相对于该网格? 你会去哪里? 为a的右侧, 下面的Z,下面有一把? 什么你的第一直觉是什么? 听众:下面的Z。 戴维·J·马兰:所以Z轴下方。 这就是美丽的 简单吧? 这是一种整齐,这是我们做什么 在键盘上,当我们按下回车键, 或电子邮件时作出 物联网项目符号列表。 但现实的情况是,电脑 尝试更有效率, 和补习班肯定之多 数据到RAM成为可能, 这样你就不会浪费任何字节。 这样你就不会浪费 任何屏幕房地产。 与该问题,虽然是 如果我们硬是​​把信 后B A,我们如何来 知道Zamyla的名称结尾 和贝琳达的名字开始? 所以,你们人类只是建议,好了, 按下回车键,基本上。 把它放在楼下。 甚至亚历克斯做了,刚开始写作 低于前一个下一个名称, 和下面的那一个,并 那么下面的那一个。 这是一个视觉提示。 电脑有另一种视觉提示, 但它是一个小更简洁。 正是这种质朴的性格。 反斜线0,这也许是 让人想起反斜杠n个, 等等,现在。 特殊的转义序列。 反斜线0的方式 代表捌零位成一排。 0000 0000。 你表达的方式是不 按键盘上的数字为零, 因为实际上这是一个ASCII字符。 它看起来像一个数字,但 实际上是一个十进制数 表示圆 字形,圆形字体。 同时,反斜线 零表示,从字面上 把捌零字节来到我身边。 因此,这是有点武断。 我们本可以用任何图案 位的,但在世界 决定好几年 以前,该代表 字符串在内存中的端部, 只是把一大堆零。 因为我们可以检测到。 现在,意味着无信 字母可以表示零。 不过没关系,我们已经看到了 我们使用的是65在97就到了。 我们没有取得任何进展 接近为零。 因此,贝琳达在计算机的内存 实际上要去这里。 我在黄色绘制它只是 要引起我们的注意。 并请注意,同样,这 完全是任意的。 我画它作为一个网格。 如,内存只是一些实物。 它不一定 行和列,本身。 它只是得到了一大堆的字节 在硬件某种程度上实现。 但是,如果贝琳达后我 键入Gabe的名字, 他将在这里结束在内存中, 如果我输入Daven的名字, 比如,他会在这里结束。 我可以继续 即使写的名字。 不幸的是,如果我尝试 写一个超长的名字, 我可能最终会耗尽内存。 在这种情况下,GetString的是 将返回NULL,因为我们说。 不过,值得庆幸的是,至少在这个视觉 在这里,我们没有得到想象中的那么远。 现在有什么好看的是,这 对待事物的总体思路 在盒子是为 c代表的功能 和很多语言, 已知为阵列。 一个阵列是另一种数据类型。 这是一个数据结构,如果你愿意。 在它的结构感真的, 种,看上去就像一个盒子,至少 在你的脑海里。 数组是一个连续的 相同数据类型的序列, 背靠背背靠背。 所以一个字符串,在其他 也就是说,是字符数组。 字符数组。 但事实证明,你可以有 事情束阵列。 实际上,我们可以把连 在数组编号。 这样的形式,其中 我们将要开始 声明这个数据 已知为阵列结构 也将使用方括号。 但是这些方括号将要 有不同的含义在此上下文。 让我们来看看它,如下所示。 假设我打开 在这里一个新的文件。 我保存这为ages.c. 我会在我的文件夹中保存这个位置。 现在我要继续前进 并开始键入的东西 像包括CS50.h,包括 stdio.h中,诠释主作废。 然后这里里面,我想 先有所谓的年龄为int。 而且我会用它来获得 从他或她的年龄的用户诠释。 但此方案是指使用由 多的人,不管是什么背景。 我有一排人。 所有的人都必须输入自己的 年龄也许一些,我不知道, 竞争或事件 他们已经到达了。 所以旁边的人,我 需要另一个变量。 因为如果我只是做 时代变调用getInt,这是 要揍,或覆盖 前面的人的年龄。 所以这是没有好处的。 所以,我的第一直觉 也许,哦,没事, 如果我想要得到多人的 ages--我们称之为age1, INT age2得到诠释,诠释age3得到调用getInt。 现在我要使用 这里是一些伪代码。 做一些与这些数字。 我们会离开的另一天是什么 我们正在做的吧,因为我们只 关爱的时刻 关于age1,age2,age3。 不幸的是,有一次我 编译这个程序 并把它在实际的用户面前, 什么是根本设计不良 我似乎决定了呢? 是吗? 听众:[听不清] 戴维·J·马兰:是啊, 我还没有尝试过 要弄清楚有多少年龄 我真正关心? 如果我有少于三个人在这里, 因此,少于三个年龄段, 我仍然盲目期待3。 上帝保佑4达人秀。 我的计划是不会甚至支持他们。 所以这个,说来话长 总之,不是一个好习惯。 对不对? 我基本上是复制和 粘贴代码,只是调整 变量名。 而且,我的上帝,如果你有,不是三 年龄,但10或100,甚至6500 大学生,例如。 这不会是特别 优雅的代码,或可持续。 你将不得不 每一次重写程序 你对人的改变数量。 所以,值得庆幸的是,在我们的实际 ages.c文件今天, 我们有更聪明的解决方案。 首先,我要借用 构建我们已经用过几次, 此做while循环中,为了得到 的人在房间的数目。 我只是去纠缠用户,再 又一次,直到他或她给我 n的值是一个正整数。 我可以使用,最后 时间的获得正面的诠释。 但是,我们没有这方面的 实,让我继续 并重新实现了这个想法。 现在在这儿,这是新的把戏。 在第27行,作为评价 在第26行指出, 声明一个数组中 存储每个人的年龄。 所以,如果你想要得到的,而不是一个整数,不 两个整数,但一大堆的整数。 特别是n个整数,为N可能 有三个,也许是100,也许是1000人。 语法很简单,就是 比方说,你想要什么类型的数据? 你想打电话 该内存块? 那你要拨打的网格 看起来像这样形象地? 而在这里括号,你说 你要多大的数组是。 因此更早的时候,我说的 语法是有点不同的位置, 我们还是用方括号, 但是当我在声明数组, 内部的数 方括号方式 要在阵列是多大做的。 与此相反,当我们使用S 支架刚才我,S,A弦, 的确是字符数组,但 当你没有声明一个变量, 与此关键字在这里, 你只是得到 具体的指标,具体的 元素的数组。 一旦我们知道了,剩下的 这很简单。 如果有新的我第一次去打印出来 什么是人编号i时代。 在这里我只想说人排名第一, 人排名第二,个人第三。 而我只是在做算术, 让正常人一样, 我们从一本算 程序,而不是从零。 然后我打电话调用getInt,但我存储 在年龄答案级别I。 这是第i个年龄在数组中。 因此,而上一次我们在治疗 这些箱子的字符为Zamyla的名字, 及其他。 现在,这些方块代表 32位或4个字节 我们可以在其中存储 一个int,一个int,int类型。 所有这一切,再一次, 具有相同的数据类型。 现在我做一些愚蠢的, 像时间的推移,只是 证明写这个程序。 然后到这里,我再次重复 在阵列说一年以后, 人的头号意志 是什么岁。 并弄清楚, math--我的意思是,这 不是很复杂算术: 我只是补充自己的年龄。 只是为了演示,再次,这一点。 正如我可以索引到一个字符串,S, 这样我就可以索引到年龄的数组, 像有。 那么,这是怎么回事要带我们? 所以我们会看到,最终, 在天几件事情来。 一,这一切的时候, 编写自己的程序, 像马里奥,贪婪,信用。 你已经输入的名称 该程序并按下Enter键。 然后获取用户的输入。 用的getString,调用getInt, getLongLong,或类似物。 但事实证明,C支持 一些所谓的命令行 争论,这是怎么回事,让我们 实际上得到的是你输入的话, 在闪烁提示, 之后,你的程序的名称。 因此,在未来的日子里,你 可以键入类似撒, 或./caesar 13号,此后。 我们将看到如何工作的。 因为的确,在 问题设置两个,我们 要为您介绍 到了一点东西 让人想起拉尔夫年代 挑战早前制图。 艺术争先恐后的信息。 这其实是很 不禁让人想起拉尔夫一样。 这是一个加密的例子 算法称为ROT13,R-O-T 13。 这只是意味着旋转 字母在字母表13个地方。 如果你这样做,你会看到现在 是什么,也许,一个熟悉的短语。 但在路上,我们要使用 这一点,最终是更普遍。 P中设置两种,标准版, 您将实现一对夫妇的密码, 一个叫凯撒,一个叫的V @ genere。 他们两人都是旋转 密码,在某种程度上你 把一个字母到另一个字母。 而凯撒是超级简单。 你加一个,你加13, 或者一些人数达26。 的V @ genere不上 每个字母的基础。 所以的V @ genere,你会看到 在规范中,是更安全的。 但在这一天到底是什么 你将实现和P设置两个, 是您同时使用该密钥 用于加密和解密。 参照转弯的过程中 纯文本,一些原有的消息, 成暗号文字,这 什么是加密的。 然后再解密它。 在黑客的版本, 同时,你会 负责类似的东西 在精神上,我们会给你 一个文件,从一个典型的Linux,或 Mac或Unix的计算机名为Etsy的 密码,其中包含一个全 一串用户名和密码。 而这些密码都 被加密或散列, 可以这么说,更恰当 您将在规范中看到的。 而黑客版将挑战 你服用的输入这样的, 和破解密码。 也就是说,搞清楚什么 人的密码居然是。 因为,事实上,密码是 通常不存储在清晰, 和一般口令 应该不难猜到。 这不是常有的事。 而我认为我们会做的是 总结了几分钟 一眼特别 口令选择不当 从电影,你可能还记得深情。 如果没有,你应该租房。 [视频回放] -Helmet,你恶魔,这是怎么回事? 你在做什么,以我的女儿? -Permit我介绍 才华横溢的年轻的整形外科医生, 医生菲利普Schlotkin。 最大的隆鼻的人在 整个宇宙和比佛利山庄。 - 您的殿下。 - 鼻腔的工作吗? 我不明白。 她已经有了一个隆鼻。 这是她甜美的16本。 不,这不是你的想法。 这是非常非常糟糕。 如果你不给我 组合的气屏, 医生Schlotkin会给你 女儿回她的老鼻子。 - [喘气] Nooooooooooooo。 你从哪里得到的? - 所有权利。 我要告诉,我会告诉。 不,爸爸,没有。 您不得。 -You're权亲爱的。 我会想念你的新鼻子。 但我不会告诉他们的 组合不管。 - 非常好。 医生Schlotkin,做你最糟糕的。 - 我的快乐。 - 不! 等待,等待。 我会告诉。 我会告诉。 - 我知道它是可行的。 好吧,把它给我。 -The组合之一。 - 酮。 - 酮。 - 两个。 - 两个。 - 两个。 - 三。 - 三。 - 三。 - 四个。 - 四个。 - 四个。 - 五。 - 五。 - 五。 -so的组合之一, 二,三,四,五。 这是最愚蠢的组合 我曾经听到了我的生活。 这就是那种东西的的 白痴不会对他的行李。 - 谢谢你,你的高度。 [遥控点击次数] - 什么你做什么? -I关掉了壁。 不,你没有,你 关掉了整部影片。 - 我意有所指按错键。 - 嗯,把它放回去吧! 放电影回来! - 是的,先生! 是的,先生。 - 让我们走,阿诺德。 来吧,格雷琴。 当然,你知道我会 必须向您这一点。 - 嗯? 没有工作? 哪来的王? - 它的工作,先生,我们 有组合。 -Great。 现在,我们可以把每一个最后一口气 从地球Druidia新鲜空气。 有什么组合? - 酮,二,三,四,五。 酮,二,三,四,五? - 是的。 - 这就是惊人的。 我有同样的 结合我的行李。 准备空间球1 立即离境。 - 是的,先生。 - 和改 结合我的行李。 [关门声音] [CLINK门击中头盔] -Ahh。 [完视频回放] 戴维·J·马兰:这就是它的 CS50,我们会看到你下周。 旁白:现在,深 思考,通过Daven法纳姆。 DAVEN FARNHAM:编码中的C是 比刮了这么多困难。 printf的,划痕是一个谎言。 [笑SOUNDBITE]