扬声器1:所有权利。 欢迎回来。 这是第二周的CS50,我们有 迄今已使用的功能,但 很大程度上他们是理所当然的。 其中有,我们用printf 印刷的副作用 在屏幕上的东西。 我们已经用得到诠释,获得浮动。 但是如果你要创建 你自己的功能,因为有些 你可能已经开始 做习题集,虽然 不严格要求? 好吧,让我们继续前进,并重新 只是要求用户问题 他们的名字和印刷上的东西 屏幕上,但尝试分解出一些 我们的共性 迄今为止,在我们的代码中看到。 所以,我的意思是下面。 我要继续前进,并创建 一个新的程序,只需调用 它HELLO.C像往常一样。 我要继续前进,给自己 包括标准io.h在顶部。 我打算也给自己 先发制人CS50库,以便 我不会在由编译器大叫。 现在我要继续前进 声明INT为主,无效。 然后在这里,这是我想要的地方 开始外包功能 我本人的一些其他功能 会写,但不 目前存在。 例如,假设我想 写一个函数,让我 打印出来打招呼,逗号和 然后一些用户的名称。 而不是继续做的printf 你好,%,岂不是很好,如果 只是有一个函数调用 printf的,但打印的名字吗? 所以,换句话说,我希望能够 写一个程序,确实有点 这样的事情。 首先,我要去说的printf 名,从而提示用户 他或她的名字给我,然后我 使用熟悉的字符串s 声明一个字符串。 给我一个字符串类型的变量, 它s,存储在该 导致调用get字符串。 但是,现在在过去的几周,我将不得不 有些不厌其烦地做了个招呼,S / N。 换句话说,我们已经看到了这 例如一堆的时候,它是一个 简单的例子,因为只存在一个 行代码,所以它真的不是一个 大不了再次键入。 但是,假如这行代码 实际上成为一种负担,而 它不是一个代码行,但它的10 行代码从现在开始的几个星期, 你只是累 复制和粘贴或 重新输入相同的代码。 那岂不是很好的,而不是做 printf的招呼,%s和等等, 那岂不是很好,如果有刚 一个函数调用打印名称 需要一个参数 - 换句话说,它需要输入 - 然后分号。 所以这个功能,它不会 是很好,如果存在? 然后,我就不必担心 printf是什么,%s和所有 这些复杂 不是所有的,有趣的。 它们是有用的。 因此,打印的名字,可惜,是不是 发明了40多年以前。 没有人想到把它写。 但是,这有一个美 编程语言,就像在 从头开始,您可以自定义块,所以 在C和大部分的语言,你能 定义自己的功能, 您可以定义自己的函数。 因此,即使我们得到主要由 自动免费的,我们可以声明 我们自己的函数。 所以我要在这里做出一些房间 向上顶,我要声明我 自己的功能,去寻找一个 有点奇怪,但我们还会回来 回此之前长。 我会说作废,从而 说明这个函数的 的东西,会产生副作用,但是它 不回我的东西在 同样的方式,得到int或 得到字符串本身。 我要去给这个函数 命名打印的名字,我要 这家伙是要采取指定 一个字符串,我要那个叫 字符串名称。 我可以打电话给我想要的任何东西,但我 希望我的代码是自我描述。 换句话说,如果一个你 打开这个文件,读它,你可以 由此推断那名排序 输入它应该扮演什么样的角色。 低于现在,我要打开 大括号和封闭的大括号, 等注意到我一直遵循相同的 图案上线四到七个 我一直在关注一个好星期加 现在之间,说,行九 14这主要组成。 换句话说,打印名称 是另一种功能。 现在,编译器是不会知道的 自动调用这个事情, 因为我真的只是发明了它, 但它仍然会知道调用main 自动,然后当然是在 13号线,我要求我自己的函数。 因为我已经声明了函数 上四个主前行, 这是怎么回事教编译器 什么报价,引文结束,“打印名称” 意味着它应该做的。 所以我给它一个新的自定义排序 阻塞的背景下,说,划伤。 所以在这里,我可以把这些很常见 或反复出现的模式的代码,我把 写在课堂上的printf %s的招呼,S / N“ - 我希望把这里什么呢? S· 所以我想在此上下文中。 因此,发现这里有点二分法。 因为我声明我自己的函数 我已经有点随意地被称为 它打印的名称,因为我 括号中指定 函数有一个参数的类型 这是一个字符串 - 所以它是一个字 或短语或类似的东西 - 我打电话来,这样的说法的名字,那 意味着这是唯一的变量 范围,可以这么说,是名。 S只之间存在着哪两个 花括号,当然? 真是好啊,就像10号线通过 14,所以只是想在周一不能使用 S,但是我能做的就是传递 将S打印的名字。 打印的名字,只是恰巧给它 一个别名,同义词,一个绰号, 调用它的名称,现在 在此行中使用它。 所以,现在让我再去救,缩小。 让我继续前进,使打招呼。 看起来不错。 也吐不出来任何错误。 /你好输入。 我叫什么名字? 大卫。 和打招呼大卫。 所以,不是所有的精彩, 只是觉得现在。 现在你有相同的成分 就像我们在划痕 使我们自己的函数。 但有一点的疑难杂症。 假设我真的没有想过 这,其实我没有 真正思考它写道: 该功能在这里。 感觉完全合理的。 划痕有没有概念 在脚本中的位置。 你可以把一个在这里,一起来这里, 一起来这里,它可能会开始 看起来有点混乱,如果你不这样做 整齐地躺在它,但它不 无论身在何处,身体的脚本 屏幕上。 不幸的是,在C - ,这一点不像 Java和Python等语言 和别人,你可能很熟悉 - 不幸的是在C语言中,为了不 不要紧,因为手表是什么 现在将要发生。 默认功能是怎么回事 执行,当然是主力。 主要是要调用print名 线八条,但遗憾的是, 编译器甚至不知道该打印名称 存在,直到它到达11号线, 不幸的是, 将是为时已晚。 因此,让我们做你好。 该死的,产生的两个错误。 所以,现在让我向上滚动到非常 首先,我们应该总是做, 注意到我大喊大叫, “隐式声明函数 打印的名字。“ 因此,我们已经看到了这条消息之前, 隐函数声明。 当我们看到这样的错误呢? 当我没有包括一个图书馆。 如果我忘记的cs50.h,我会得到 大声呵斥在字符串或诠释。 但是,在这种情况下,该功能的打印 名字是不是在图书馆,对不对? 严格地讲,它在这个文件中,所以 什么是真正的问题吗? 不幸的是,在C语言中,它需要你 如此令人难以置信的字面意思,如果你 要调用的函数的名称打印 存在,你要么必须实现 该功能在最上方, 代码,以便降低它的访问 功能,但坦率地说,这将成为 草率的速度非常快。 就个人而言,我喜欢把主第一 因为那是非常清楚这是什么 乍一看程序做。 再加上,你可以进入奇怪的角落 情况下,如果x要调用 y,但y进行调用,你只是 身体不能真正把一个 在另一个的上面。 但事实证明,在C语言中,我们可以 解决这个问题很简单。 我要放一点点的空间 这里,我只是去 先发制人,尽管有些 冗余,要教 存在一个函数的编译器 称为打印名称,它需要一个字符串, 我要打电话 它命名分号。 所以现在第四行,这是我们 以前没有见过,是一个声明 功能打印的名称,但它是唯一的 一个承诺,这个函数会 最终被定义,最终 得到实施。 现在我可以独自离开,因为 现在是这样定义, 实施,排序最后一公里 执行本 特定的功能。 所以,坦率地说,它是愚蠢的,这很烦人, 但是这是C的方式,它是 因为它需要你很夸张 并且,作为一个计算机坦率地说应, 只有不正是你告诉它 做什么,因此,顺序是很重要的。 所以记住这一点,并再次启动 通知复发图案。 赔率是你愿意,如果你还没有 已经开始遇到消息 这样,乍一看似乎 完全隐秘的,但如果你开始 看这些关键词像 “隐式声明”提到的 在这种情况下,功能 - 坦率地说,你 有时甚至可以得到一个小绿 胡萝卜符号,告诉你在哪里 这个问题可能是 - 你就可以开始通过自己的方式工作 但看不见的错误消息。 任何书面问题 这样的功能? 让我们做一些事情,这是一个 更引人注目的一点。 而不是仅仅做的东西,有 打印的副作用,让我去 提前并保存新的文件,我们将 调用这positive.c,即使它是 要有点不同 而最后一次。 而这个时候,我想重新实现 最后一次的positive.C例如, 强制用户给 我的一个正整数。 但我有使用INT一次。 那岂不是一直很好,如果有 一个函数叫做正整数 我可以只外包 一块功能? 所以,这里的区别是,我们将 实施获得正整数,但不像 打印的名字,有一个副作用 - 没有返回的东西对我来说, 一个数字或一个字符串 - 正整数,当然,要 ,希望返回一个正整数。 因此,让我们做到这一点。 包括cs50.h,包括标准io.h. INT主要无效。 现在在这里,我要继续前进 让我们说,整型,叫它N,等于 获得正整数。 就像INT已经存在 因为工作人员写的,我要去 承担的那一刻得到 存在正整数,现在我要去 继续前进,说的printf, %I / N“,N感谢。 所以,现在如果我编这程序, 事情发生在我的终端 在屏幕下方的窗口? 我去可能会得到, 像以前的同样的错误。 因此,让我们试试这个。 做出积极的。 再次,隐式声明 功能,正整数。 因此,我们可以解决这个问题 一对夫妇的方式。 我要保持它的简单,只是 在这里把我的声明,并得到 正整数。 我需要的是所谓的签名。 签名只是指 美学 程序的第一行。 所以,你应该得到积极 int返回? 所以一个int。 我的意思是在理想情况下,它会返回 像正整数,但 不存在。 我们从来没见过,在我们的数据 类型,所以我们必须要处理 事实上,我们很少有 数据类型。 但是,我们可以返回一个int和公正 我们相信,这将是积极的。 这将被称为 获得正整数。 现在它的参数如何? 是否采取任何输入? 是否需要任何输入? 因此,它并不需要知道 事先什么。 获取字符串不,不诠释。 printf的 - 它需要有一定的 输入传递给它 - 和打印名称 需要一些投入,但得到 没有正整数。 所以,我要明确地 告诉编译器无效。 虚空是没有别的。 因此,虚空里面意味着什么 这些括号,分号。 而现在在底部的我的文件 - 再次,我只是一种肛门 这里将主要在顶部, 是很好的做法,因为这样一来, 任何时候你或其他人 打开你的文件, 功能是正确的。 您可以下潜从方。 所以,现在我要重复这一点, 正整数无效,但我不 打算现在打分号。 我要打开大括号, 现在我需要借 一些想法从周一。 所以当你还记得,我们做了一些 喜欢做以下,而 东西是真实的。 和我做了什么? 像给我做了一件 我的一个正整数, 点点提示。 我想,我可以用任何词语。 然后,我用什么? INT N等于得到诠释, 它没有参数。 并注意到其中的差别。 当你调用一个函数,当您使用 一个函数,你不把无效。 你只有这样做,当声明 功能,教学的编译器 它应该期望。 所以你不需要把 丧失自己有。 现在我的条件是什么? 中,n为不等于正, 但是这只是伪代码。 所以,我怎么表达这种更干净? 因此,小于或等于零。 如此反复,发现你可以做 小于或等于。 尽管这是两个单独的 符号,你可以做 您的键盘等。 但仍然有一个缺陷, 我搞砸了最后一次了。 我必须声明 - 究竟。 我必须声明Ñ外 循环。 因此,我需要n放在这里,我不 想在这里重新申报 免得我得到了新的变数。 我只是想在这里指定一​​个值。 现在我不太在这里完成。 让我提前获得自己 和假装我所做的。 做出积极的,现在 有一个新的错误。 控制已尽 非虚空功能。 因此,新的错误消息,但如果你有种 梳理分开的话, 可能暗示了什么是错的。 控制。 控制只是意味着订单 在程序的操作。 在计算机的控制和 出事了。 因此,到达结束 非void的函数。 什么样的功能是它显然 指什么? 非void什么样的功能? 所以正整数,和一点点 混乱中那么好, 它是一种无效的。 它有一个规范其无效 参数,但它的输出要 是n型。 因此,在左边的字是 所谓的返回类型。 这里的内侧上的字 零个或多个参数 一个函数具有。 所以,我需要做什么? 在这一点上,在我的代码中,线21在那里 闪烁提示现在是,我 里面有一个正整数 的变量名为N。 我怎么给它回到主? 从字面上看。 返回N分号。 因此,正如一块科尔顿返回 我的答案纸,下降 在小黑裙的那张纸 盒子放在桌子上,做到这一点 代码,你从字面上只写,返回 N,仿佛科尔顿 交给我东西物理回来。 在这种情况下,发生了什么 正整数是要交还 什么是大概是一个积极的 整数给谁呢? 这价值在哪里结束? 在此变量中,结束了,正和 然后我们继续与九号线。 因此,换句话说,为了 操作,这个程序将启动 执行和编译器的实现, 哦,你希望库? 让我去里面抢什么。 哦,你要标准的IO库? 让我去里面抢什么。 编译器对自己说什么 当它击中四线? 哦,你答应落实 函数调用得到积极的,但 我们会回来,后来, 沿着这些线路的东西。 诠释主作废只是意味着这里 我的程序的胆量。 7号线仅仅是一个大括号。 八线是说在左,给 我的32位整数,叫了N。 在右手侧,它的 并称获得正整数。 现在,让我们暂停的故事,因为现在 我不要让我的光标向下移动。 我现在光标在这里,因为下山 现在正整数执行。 INT N声明。 做到以下几点。 printf的给了我一个正整数。 从用户获取一个int,它存储在N, 也许这样做一遍又一遍。 这个循环意味着,这段代码可能 执行向上和向下再这样 了,但最后,当用户 合作,给了我一个积极的 INT,我打了21号线,在这一点上 号交还,哪一个 现在我应该突出? 九。 控制,可以这么说,返回 九号线。 这行现在负责。 所以,这就是已经发生的所有 引擎盖下,但这次 当我们使用的功能,如printf 或什至得到别人的串 为你写的,被移交控制 去别人的代码行 通过一行一行。 这只是我们不能看到它,我们 真的无法描绘它在这 在其他一些计划,因为它 硬盘上的文件 我们不知道。 因此,让我们实际编译 并运行此。 做出积极的。 编译,这就是进步。 /阳性。 给我一个正整数。 让困难。 负1。 为零。 让我们给它50。 感谢为50,所以控制 现在已回来了。 任何问题,那么,是什么? 是吗? [听不清]。 再说。 哦,好问题。 因此,您可能会注意到这里的并行 我是那种上切割一个角落的。 在第12行,我说,正整数 返回一个int,而是由相同的 逻辑,按理说,在 六,行我说,主要的回报 int,但是我们从来没有什么 在我们的节目呢? 我们从来没有提 这个关键字回报。 因此,原来,在C,至少 我们使用的版本 在1999年,在技术上,这是 自动为您发生。 每当你执行一个程序,你 实现一个叫做main的函数, 该函数将返回零 默认情况下,如果你不说,否则, 和零仅仅是一个惯例。 世界返回零,从而 表示,一切都很好, 有效地离开我们四亿元 可能的事情,可以去 错了,所以,如果我们回到一个,那 可能意味着一个代码,这意味着 事情出了错。 我们可以返回两个,这意味着 这个其他的东西出了问题。 我们可以回到四亿元, 这意味着其他的事情出了错。 而如果你现在想想你自己 PC或Mac,你可能还记得, 有时你会得到神秘的错误信息 从你的软件 使用,有时它也有一个人 友好的描述,但有 通常是一个代码或数 在屏幕上? 如果这不浮现在脑海中, 只要保持眼睛。 这是典型的这是什么意思 代码。 他们包括在Microsoft Word和 其他程序,因此,如果你提交 与该公司的错误报告,你可以 告诉他们,哦,我得到了错误号码45。 一些程序员在公司后面 可以看一下,在他或她 代码和说,哦,那是因为我做了 这个错误,这就是为什么用户 得到这个消息。 但坦率地说,它只是一个小 分心和有点乏味 得出这样的结论,至少在我们的 前几个节目,所以我们 被省略它。 但是,这一切的时候你的每一个 功能主要有偷偷 行自动为你添加 编译器,只是按照惯例 为您节省一些时间。 [听不清]。 你不需要把它包括在主。 这很好。 你需要包括它,如果你是 实现这样的功能。 否则,函数平面 出是行不通的。 但在主要的,这是没有必要的。 在一个或两个星期,我们会开始得到 这种习惯一旦我们要开始 标志着错误。 真是个好问题。 这么快口头休息一提的是 这个星期五,我们不会吃午饭 本身,而是我们将有一起吃饭 一些学生和工作人员。 如果您想加入我们,感受 自由去cs50.net/rsvp。 这个星期五下午6:00。 空间总是有限的,但我们会 继续做这些近 每周的基础上,如果空间 用完这个星期。 所以峭壁吊钩,我们离开 周一是字符串实际上 被索引到,这只是意味着你 可以得到的第一个字符, 第二个字符,第三个字符 等等,因为你可以 有效想到一个字符串,如 你好,在这种情况下,五 箱子里面的字母。 你可以在每个人 箱子用什么语法我们 上周一推出? 这些方括号 键盘上的。 只是到零的位置。 我们开始计数为零,所以支架 零标志着支架一小时, 标志着E,等等。 等等一切的时候,我们已经 使用字符串,输入“你好” 和“世界”和其他的东西 屏幕上,它被存储 这样在箱子里。 并采取了猜测。 每个方块代表什么物理 您的计算机内? [听不清]。 对不起? 字符。 因此,一个字符肯定的情况下, 的字符串和一个字符是否是刚 8位或一个字节。 所以,你可能至少有隐约 熟悉的事实, 计算机内存。 至少有两种类型的存储器。 一个是硬盘保存 永久的东西,那就是 通常大的,所以你可以有电影 和听音乐等等。 然后你有另一种类型的内存 被称为RAM,R-A-M,随机存取 记忆,这是内存类型的 您的计算机时所使用的 运行,但如果你失去动力或 电池模具,任何存储 在RAM中消失,如果你失去权力 完全是因为它不是 执着。 您通常,这些天, 演出的演出,也许更多。 RAM的上攻是它的许多 以更快的速度比硬盘 甚至是固态硬盘,这些天, 但它通常更加昂贵,所以 你有少。 因此,今天的谈话真的是指 到RAM中,这些不同的存储器 只存在而出现的电力 被送入您的计算机。 所以,当你键入H-E-L-L-Ø输入 键盘,H是将在一个 字节的RAM,E是去 另一个字节的RAM, 字的其余部分。 所以回想一下,我们能够 做最后的时间是这样的。 让我继续前进,打开文件 我们称为string.c,并召回 它看起来有点儿 这样的事情。 让我实际上回滚和改变 它究竟是什么样子, 字符串s的长度。 所以看这里的程序。 我们包括CS50图书馆,所以 我们可以用得到的字符串。 我们包括标准io.h 这样我们就可以使用printf。 我们为什么包括string.h中? 上周一,这是新的。 所以,我们想要的字符串的长度。 STR楞。 人民决定多年前, 我们只是简洁。 而是叫它“字符串的长度,” 让我们把它称为“STR楞”,让 世界数字表示出来,所以这是 我们获得与string.h中。 这是熟悉的。 这是熟悉的。 这是熟悉的。 这是一个小新。 在第22行 - 我们会回来的 这一点,但现在知道了 - 你只知道这个从有 阅读文档,或者如果 你知道C处已经 - 串有时会搞砸。 如果用户是真的对抗性或 不合作,他或她只是 不输入任何内容或键盘 类型这么多在键盘上, 它淹没了计算机的内存, 从理论上讲,字符串可以返回 以外的东西 字符串中的字符。 它可以返回一个特殊值,称为 在全部大写,N-U-L-L,这是NULL 只是一个所谓的警戒值。 这是一个特殊的价值,标志着 在这种情况下,一些不好的事情发生了。 它是一个字符串的情况下。 所以我简单的检查,以便空, 长话短说,STR楞 等功能,配有C​​,如果 他们期望一个字符串,但它们传递 字符串的情况下,如果你传递 他们NULL,计算机或程序 只是彻底的崩溃。 它会一直挂。 它会抛出一些错误信息。 不好的事情会发生。 因此,尽管这仍是 不明确 - 这将使更多的意义,在一个星期或 - 第22行中,这仅仅是一个 例如,自我防御的错误检查 以防万一时间 百万出错, 至少我的程序不会崩溃。 所以,如果s不等于坏的东西, 我有这样的循环,这是 在那里我们有其他 新语法。 我有一个循环从 零s的长度。 然后,在这里,我是一个打印输出S 支架,但为什么我用%C 突然而不是%s甚至 虽然s是一个字符串? 这是一个字符,对不对? S是一个字符串,但S支架的东西, Ş支架其中i是零 或一个或两个,这是一个个人 字符串中的字符,所以对于 printf的需要通知 它确实是一个字符期望。 然后记得,这样做什么 程序实际上做什么? 在列打印出来。 是的,没错。 它只是印的字,我键入 一列,每行的一个字符。 因此,让我们再次看到这个。 所以字符串。 编译OK。 。/串。 让我输入H-​​E-L-L-ø,回车, 事实上,我得到它,每行一个。 因此,让我在这里做一个优化。 如果你仔细想想,特别是如果 你编程之前,还有 可以说是一个低效率在24行。 换句话说,它不一定 最好的设计。 简单,至少一次 记住STR楞是什么,但它是 潜在的做了愚蠢的事情。 可能是什么? [听不清]。 没错。 它检查s的长度 每一个时间,即使 H-E-L-L-O总是会 五个字符。 每次通过这个循环, 五个不改变。 我可能会递增,但什么 是s的长度在每个 这个循环迭代? 五,五,五, 但我仍然要求 再次提出质疑,并一遍又一遍。 坦率地说,现在的电脑是如此该死 速度快,没​​有人会注意到一个 在这种情况下的差异,但这些种 可怜的设计决策能 如果编译器本身开始增加 并不试图解决这个问题, 通常不会, 至少在家电。 所以我要做到这一点。 我要后添加一个逗号 我的第一个变量。 我要去给自己的另一 变量,调用N,仅仅通过 约定为数字,然后我 分配n的字符串值 s的长度。 然后我要改变 我的条件是什么? 我要改变我的病情 而i是小于n。 所以,现在,我多少次 检查s的长度? 一旦,但它是确定检查我反对 Ñ​​一遍又一遍,因为现在那些 值实际上并没有发生变化。 现在,现在,任何时候,你只知道 调用一个函数,有一个位 开销,没有足以阻止你 真正从使用过的功能,但 肯定有一行代码 - 线将得到 更有趣过不了多久 - 有一个机会去思考,如果我 输入这个代码,有多少 时间会执行吗? 你将开始看到随着时间的推移 你的程序的性能 的确改变。 事实上,这个问题我们已经设置 在过去几年里做涉及 实施,你可能还记得 周为零,一个拼写检查器,但 拼写检查,旨在支持 150,000加的字典 也就是说,我们给你们。 你将不得不编写代码加载 到RAM中,所以进的那些话 盒子,就像我们看到在屏幕上瞬间 前,然后尽可能快地 可以,你必须能够回答 的形式问题,是这个词 拼写错误? 这是单词拼写错误? 这是单词拼写错误? 的东西,像我们什么 在过去几年里做的是把它变成, 尽管上的选择,在选择基准, 各种各样的竞争,据此, 使用较少的RAM和学生谁 时间,更少的CPU周期,落得 冒泡到顶部的一点点 领导板或排名,我们把 当然我们的网页 在过去的几年中完成。 如此反复,完全可选的,但是这 讲的设计机会 处于领先地位,一旦我们开始 建筑顶上一些 基本构建块。 因此,让我回到这个图 只是片刻,露出一点 更多的东西。 这的确是一个字符串,我们已经采取了 利用几个库 标准io.h - printf的。 printf的,在其他的事情。 cs50.h,这已经得到int和得到字符串 等等,string.h中, 有STR楞。 但事实证明,那里的又一。 坦率地说,有很多很多的头 文件声明函数 图书馆,但这个文件ctype.h 实际上是要有点 有利的,因为我要去 继续前进,实现一个 这里的其他程序。 让我去进取,不断开拓的东西 提前叫我写 capitalize.c,让我们 看看这是如何工作的。 请注意,我使用,在这个版本 ,三个熟悉的文件。 请注意,我在第18行, 获取一行文本。 注意,在第21行,我声称 下面的代码是怎么回事 把握,无论用户输入 ,我怎么做? 好吧,我考虑 - 从上一次的教训 - 我声明我n和迭代 在字符串中的字符。 然后这是块什么 在24到27行的代码 做外行的条款吗? 小写字母。 没错。 如果s支架 - 因此,如果第i个 为s的字符,这是一个特定的 字符串中的字符,大于 或等于小写a - 记得双符号 表示 - 与人品同在支架I,S, 小写的Z小于或等于 这意味着它的一个或B或C或 点,点,点,或Z,这意味着 它是小写。 在这种情况下,我想要做的是什么? 好吧,我可以做这个有点 若有所思,但 让逗除此之外。 我要调用printf打印%C 因为我要转载本 字符在屏幕上。 然后,我要采取Ş支架I, 第i个字符,那么为什么 我在这里做这个小动作, 小写a减大写字母A? 那是什么要给 我,一般来说? [听不清]。 没错。 我真的不记得 - 65资本A.我真的不 记得什么小写一个是, 但不管。 计算机知道。 所以说,小写a减号 大写字母A,是它的怪异 从另一个减去一个字符,但 引擎盖下的字符是什么? 他们只是数字。 所以,无论这些数字, 让电脑记住它 人类,而不是我。 因此,A是小写a减去资本 要给我一个差异。 这恰好是32,这将是 的情况小写b和资本的乙 等等。 它保持一致,谢天谢地。 所以我基本上说, 小写字母,减去该 标准的差异, 有效地改变小号支架I ,当然小写,大写, 没有我真的有想 或请记住,什么是那些 数字,我们谈到八时 志愿者来到舞台上吗? 同时,在其他的,如果它不 确定一个小写字母 由24行,只是把它打印出来。 我只想触摸 字符 实际上原先小写。 所以,让我们来看看这个。 使利用。 编译后,“确定”。 /利用。 并让我输入H-​​E-L-L-Ø 小写字母,回车。 并注意该转换 转换为大写。 让我这样做再次 不同的字。 怎么样D-A-V-I-D与第一D 资本化,作为一个名字,通常是什么? 回车键。 请注意,它仍然是正确的。 它只是输出,第一个D不变 通过该else结构。 所以记住,于是, 夫妇的东西在这里。 一,如果你想检查两个 一次的情况下,你可以和他们 我们一起预测。 以这种方式可以比较字符 有效治疗字符 数字,但坦率地说,这是如此该死 神秘的,我永远会记住 如何想出这个从头开始 而通过它的推理相当 时间一点点。 那岂不是一直很好,如果有人 在那里写一个函数调用是 降低可以回答我真或 假的,这个人物是小写? 令人欣慰的好,谁写 ctype.h中确实做到了。 让我上去这里的ctype为c 类型,现在让我去这里, 重写此行如下。 因此,如果这就是所谓的低,我要求,S 支架,然后我要删除 这两条线完全。 所以,现在别人的,我希望,写 一个函数调用较低,并且 原来他们做了,他们宣布 它里面ctype.h的。 现在,我要离开27号线 孤独,我要离开31号线 孤单,但看到我多少 收紧了我的代码。 现在它的清洁剂。 少,难以期待通过 因为现在的功能,而且,是 如此奇妙只是把它命名为 做什么它说。 所以现在我要保存这个。 我要缩小。 就像在Scratch你可以有 布尔值,布尔值true或 假的,那到底是什么 有效降低回报。 让我重新编译。 让我重新运行。 现在让我们再次尝试, H-E-L-L-O,回车。 这是相当不错的。 然后再试一次,确保我 没有螺丝的东西。 这是资本。 但是,这是不够好,因为 其他的事情,我从来没有去 记住,除非我真的通过它的工作 仔细,说,纸 这该死的线。 那岂不是很好,如果有 一个功能叫上? 那么它原来有 ctype.h中。 我要继续前进,并键入 - 让我带回到该行。 而不是在这里,让我继续前进 并说,替换为%C 调用这个函数的结果 上的s的第i个字符。 现在发现它越来越 一点点的平衡。 我必须继续跟踪有多少 括号,我打开和关闭。 所以现在更清洁。 现在,这个程序是越来越好 更好的设计,可以说是,因为它是 很多,很多更具可读性,但 它没有让我们纠正。 使利用。 /利用。 H-E-L-L-O。让我们再次运行它, D-A-V-I-D。 OK,所以我们仍然在 相当良好。 但是,现在上。 我建议,还有一个更 我们可以做出细化,这将是 真的很不错,真的可以收紧 了这个代码,而真正给我们五个 的五设计,例如。 什么将是很好的摆脱? 好吧,看如何该死的长块 代码只是简单做一下。 现在,顺便说一句,你可能有 过去的这个超大断面 周末,你不严格需要 当你只是有一个大括号 一行代码,尽管我们提出 保持他们,以便使其多 更清晰,像在划痕的U形 块,里面有什么分支。 但不会是很好,如果上, 其输入时,把它变成 大写的,如果它不是,会是什么 是美好的,在相反的情况下​​,如果 它已经是大写吗? 只需将它穿过 离开单干。 所以,或许是这样做的。 我可以尝试,只是希望 这不,但让我 引进另一件事。 而不是使用内置终端 窗口在这里,记得, 这个广场的黑色图标给你一个 更大的终端窗口,我可以满 筛选,如果我想要的吗? 因此,原来他们是那种奇怪 命名,但有这些东西叫做 手册页,手册页,男子短, 我可以访问这些由 键入man - 我想输入什么? 人上。 现在发现,如果存在 函数里面的电脑, 这种情况下的设备,这仅仅是 Linux操作系统,它是怎么回事 给我一个略带神秘的组 输出,但你会发现随着时间的推移, 它总是相当多的格式化 相同的,所以,你开始习惯它。 注意在顶部上, 显然是同一文档 为降低。 这是谁写切割一些 角落,并把它在一个页面上。 这些东西的目的 生活是转换 字母大写或小写。 请注意,根据剧情介绍,该男子页面 教我我有什么样的文件 包括用这个东西。 它给我的这些签名 功能,其中,即使 虽然我们现在只 关心一个。 现在这里是一个描述。 上转换信 c到大写,如果可能的话。 还不启发,但让我 现在看起来下返回值,这件事 交回。 因此,返回的值是, 如果转换的字母或c 转换是不可能的。 什么是C? 原来的字符。 原来的字符,我们知道 ,通过再次上升到 故事大纲,谁写了这 功能决定的输入 到上,以降低仅仅是 随意名为c。 他们可以把它叫做什么最 他们想要的,但他们保持了 简单为c。 所以,我已经咨询手册页。 这句话安慰我说,如果 它不是一个小写字母,这是 只是给我C,这是 完美,这意味着我可以摆脱 我的其他条件。 因此,让我回去gedit中, 现在让我这样做。 我要我的printf语句复制。 我要继续前进,右内 循环打印出来,并得到 摆脱目前整个if结构。 是不是一个坏主意,这是非常 多正确,符合 我们所鼓吹的一切, 只是没有必要的。 只要你意识到一些库 函数存在别人 写道,或者你在其他地方写的 文件,你可以使用它,真正 开始收紧代码。 而当我说的东西,如良好的作风, 一个事实,即这个人被称为 功能上,或以前是 低奇妙的是有用的,因为 他们非常的描述。 你不会想打电话给你的职能 x和y和z,其中有 多了,少得多的意义。 该系列的任何问题 改进? 所以我只想说一个 外卖店甚至是你自己的问题 - 也许问题集,但 肯定P设定两年以后,即使 当他们不一定正确 意味着他们是完美的只是 还特别精心设计的。 这是其他轴 开始思考。 因此,这是一个字符串在你的 计算机的内存,但如果你有一个 一大堆的字符,如H-E-L-L-ø 里面的RAM,并假设 你在你的程序中调用得到的字符串 多次这样的,你 一次调用get字符串,那么你 再次调用get字符串。 嗯,什么事情 随着时间的推移发生? 换句话说,如果你有一个线 代码,虽然脱离了上下文,像 字符串s得到 - 让我们做到这一点。 字符串名称等于串。 因此,假设该行代码是 要求用户为他或她的名字。 下一行代码是问 用户输入他或她的学校,和 这下一行,依此类推。 假设我们不断地问 另一个用户,并 又和另一个字符串。 他们会留在内存 在同一时间。 不会撞。 学校没有其他覆盖。 但他们都 结束了在内存中? 那么,如果我们开始在屏幕上绘制, 我们可以用这个东西 这里就像一个黑板上,如果这个黑色 矩形代表我的电脑 内存,我要随意地开始 将其分割成小方块, 其中每一个代表 一个字节的存储器。 坦率地说,如果你有1GB内存 这些天来,你有一个亿字节 在您的计算机的内存,所以 一个10亿这些广场。 所以我只想说,这 是不是真的到规模。 但是,我们可以继续绘制所有这些 显然不按比例的平方,而这 集体代表 我的电脑的内存。 现在我们只是做点,点,点。 所以换句话说,我现在提示 用户获取字符串给我一个 字符串,会发生什么? 如果用户键入“你好”,结束 在H-E-L-L-O。但是,假设 然后用户类型 - 其实,我不应该这样做 你好,因为我们要求 他们为自己的名字。 因此,让我们回去,如果我能做到这一点。 所以,如果我为我的名D-A-V-I-D型, 但记得,第二行 代码串再次 得到他们的学校。 这个词在哪里,用户 要去旁边的类型? 好吧,也许它打算进入 H-A-R-V-A-R-D。因此,即使我 绘制为两行,这仅仅是 在你的一大堆字节 计算机的RAM。 现在有一个问题,因为现在如果我 这是非常合理的使用RAM 但那种幼稚的方式,你能 没有明显区别? 一开始和 一端,对不对? 他们有点模糊起来。 因此,原来的电脑 没有做到这一点。 居然让我在时间上向后滚动 几个字符,而不是哈佛 后立即用户的名称, 用户实际得到的,后面 的场景,一个特殊字符 插入的 为他或她的计算机。 / 0,否则被称为空字符 烦人称为N-U-L时,未 N-U-L-L,但你把它写为/ 0。 这只是所有的零位是一个标记 之间的第一个字,用户的 被键入和第二。 因此,哈佛实际上现在结束了 的字符序列,因为这 1/0。 因此,换句话说,通过让这些 定点值,8个连续的零 位,你现在可以开始区分 从另一个的一个字符。 所以这一切的时候,什么是“你好”是 实际上是“你好”/ 0 同时,有可能很好 相当多的RAM 里面的电脑。 让我现在做另一件事。 事实证明,所有这些广场 我们一直在画画,他们是: 字符串,但更一般地, 这些东西都是阵列。 数组只是一块内存 背靠背背靠背, 您通常使用数组方式 本方括号。 因此,我们要看到这些颇有几分 随着时间的推移,但让我继续前进, 开拓,我们姑且称之为它的年龄。 并且注意到我们能做些什么 这些相同的招数,一点点 多一点这里的语法。 所以这个程序的第17行 - 其实,让我先运行程序 所以我们可以看到,这件事情做什么。 让我叫年龄 编译这个程序。 /年龄。 在房间里有多少人? 3。 时代的第一人吗? 18,19,和20。 现在有些可笑的是,我只是 有一个程序,青睐那些 三个人。 因此,有明确的机会 这里一些有趣的算术。 值得庆幸的是,数学是正确的。 18至19日,19去 至20,等等。 但是,什么是真正的意思是 说明这里是我们如何存储 这三个人的年龄。 什么让我放大 怎么回事。 因此,首先,这些前几行应该 得到相当熟悉。 我只是提示用户 房间里的人的数量。 然后我使用int和做一会儿 再这样做一遍又一遍。 我们已经看到了这种模式,但 第27行是新的,其实挺 有用的,将成为 越来越有用。 请注意,在第27行有什么不同 是我声明 INT称为年龄,但等待。 这不只是诠释年龄。 这些方括号, 在其内部是n。 使托架n在这种情况下,不 里面的一个printf语句,在这里,但 在这唯一的第27行,这条线是 说,给我Ñ整数,其中每个 是int类型。 因此,这是一桶水,可以这么说,, 在这种情况下,三个整数回 背靠背,让我有效 有三个变量。 替代方案中,是 清楚,应该是这样的。 如果我想第一个学生 年龄,我可能做到这一点。 如果我想第二个学生 年龄,我可能做到这一点。 如果我想第三个学生 年龄,我可能做到这一点。 上帝保佑我们需要大家的 年龄在这个房间里 - 我的意思是,这是一个了不起的大量复制, 粘贴一遍又一遍。 加一次我编这程序, 如果另一名学生走在了 那扇门,现在我的电话号码 的变量是不正确的。 所以有关阵列不错 一旦你开始感觉自己 复制和粘贴,赔率是这 不是最好的方法。 数组是动态可能。 我不知道提前多少人 将要在房间里, 但我知道我需要他们的n,,我会 找出n当时间一到。 现在这行代码意味着,给我一个 像这样的内存块 其中在屏幕上的盒数 是完全依赖于n 用户输入 所以,现在这个程序的其余部分是 什么,我们实际上是非常相似 只是做的字符。 请注意,我有一个for循环 在第30行开始。 所以,正确后,我得到的数组,我 迭代y等于0到n。 我只是有这个指导性的printf 消息说,给我的年龄 #%我的人,所以, 数二,数三。 我为什么这样做呢? 坦率地说,人类更喜欢从一数 起来,而计算机科学家, 零就到了。 计算机科学家都不会 使用这种程序,所以我们 刚开始计数 在一个正常的人一样。 现在在第33行,请注意咯 不同的语法一块。 在该类型的变量i个年龄 阵列是会得到一个int。 最后,现在,这仅仅是 这里算术下来。 我决定在一个单独的循环,权利要求 一些时间的推移,现在在这 单独的循环,这些行执行。 从现在起一年,我将是我 岁,但注意到这一点是不 变量i。 现在,这是我为int%。 第一个占位符通知我 插上i加1,所以我们指望像 正常的人。 然后的价值,他们的年龄, i年的时候,我采取年龄支架 - 为什么我这里加一做? 他们只是年龄。 这是我愚蠢的选择方案。 他们只是账龄为一年。 我可以输入任何数字 其实我是想在那里。 那么什么是居然全部 这里的相关? 好吧,让我居然向后滚动 在这里,画一幅画 什么样的景象。 我们将与我们的未来做什么 习题集二是涉足 密码学的世界。 所以这是一个字符串中的字符,所以 多个字符序列, 不这样说? 这不是在网上版本 幻灯片。 因此,我要求这等于这一点, 从多年的愚蠢广告 以前,实际上可能还记得 它的起源之一。 因此,这是一个例子,加密 或加密。 事实证明,如果你想 实际上发送信息或股份 信息与别人牢固, 像类似这样的消息,你可以 争夺字母。 但通常情况下,话 不炒随机。 他们以某种方式置换或改变 在某种程度上,这样 - 哎呀。 这是一个有趣的搅局下一次。 所以,你可以映射显然是什么 O到B.通知行 资本明智的。 显然,R变为E。 显然F-H-E-R变为S-ü-R-E。所以 它原来是一个映射,并在 这种情况下,有一个非常愚蠢的 映射,如果有人已经想通了? 这是一种叫做 腐13,旋转13。 这是最愚蠢的加密 机制,因为它真的只是 增加了13到每一个字母, 愚蠢在这个意义上,如果你只是 有一点空闲时间,在你的手中 和一支铅笔,或者你只是觉得它 通过在你的头上,你可以试试 所有可能的补充 - 一,二, 三,点,点,点,25只是 旋转整个字母表, 最终,你会找出 这个消息是什么。 所以,如果你做了这样的事情在 小学传递讯息给您 最好的朋友,如果你的小学 老师简单地通读 消息和蛮力强行解决方案, 你可能得到 的答案。 现在,当然,在现实世界中, 密码学是更复杂的。 这是一个从文本片段 计算机系统,用户名和 密码,几乎所有我们做, 这就是你的密码可能 如果存储在硬盘样子 开车,但以加密的形式。 这不只是一个字母旋转, A是B和B是C,这是 更为复杂的,但它使用 一般被称为秘密密钥 加密。 这幅画告诉 故事与几个图标。 在左侧,我们有什么 我们会打电话给纯文本。 在世界上的密码,平原 文本只是原始消息 写在英语或法语 或因任何语言。 如果你想对它进行加密,我们将通过 它形象地通过一个挂锁,所以 一些类型的算法,一些功能 或程序,有人写道: 希望,打乱字母 更复杂的不仅仅是增加13 每个人。 你摆脱这一进程 中间还有被称为密文。 这么样一个性感的字。 它只是意味着它的加密 纯文本版本。 如果你有同样的秘密, 13或减13,你是否能够 解密,这样的消息。 因此,在问题设置两个之间的事情, 你会做,如果在黑客 版,你将不得不写代码 破解这些密码,搞清楚 他们是什么,他们是如何 加密的,虽然我们不给你有点 指引前进的道路。 在标准版中,我们将介绍 一对夫妇的密码,加密 机制,一个叫凯撒,一 称为VIGENERE,仍然 其中A成为旋转密码 的东西,B变成的东西,但 你必须做编程 因为确实是有一个秘密 重点涉及的是一个典型的数字 或关键字,只有 这些发送者和接收者 消息应该明白。 现在,这实际上已经变身 在现实世界中。 举例来说,这是小孤儿 安妮的秘密解码环, 实际上可以实现这些 旋转密码 - B成为A成为的东西, 东西 - 一对夫妇的车轮, 一个在外面,在里面 例如,如果你旋转滚轮或 戒指,你实际上可以排队的 字母与字母不同, 得到一个秘密代码。 所以作为扣人心弦的今天, 我想我会做什么,是有点 倒退,如果你打开​​电视 12月24日,你可以看 电影广告nauseum 24小时成一排。 但今天,我会打开它在这里 短短两分钟的,给我们 与教学相关的圣诞故事 一个名为拉尔夫的小家伙。 [视频回放] 是向所有人, 拉尔夫·帕克现获委任为 成员小孤儿安妮秘密 圆和有权 荣誉和利益 发生于此。 签名,小孤儿安妮。 会签,皮埃尔·安德烈·墨。 荣誉和利益已经 九岁。 [喊RADIO] 来吧,让我们得到它。 我不需要所有的爵士乐有关 走私和海盗。 听明天晚上 结论冒险的黑色 海盗船。 现在,它的时间安妮的秘密 各位成员的留言 秘密圈。 请记住,孩子。 只有安妮的秘密圈的成员 可以解码安妮的秘密消息。 请记住,伊能静得靠你了。 设置引脚到B2。 这里的消息。 12,11,2 - 我在我的第一次秘密会晤。 -25,14,11,18,16 - 皮埃尔是在今晚大声音。 我可以告诉今晚的消息 是非常重要的。 -3,25。 这是一个消息从安妮自己。 记住,不要告诉任何人。 -90秒后,我唯一的房间 在房子里,一个九岁的孩子 可以坐在隐私和解码。 啊哈,B.我去到下一个。 E.的第一个字是“是”。 S. 它现在更容易。 U. 25。 这就是R。 来吧,拉尔夫。 我得走了。 - 我会被降权,马。 哎呀。 -T。 O.一定要。 可以肯定的是什么? 什么是小孤儿 伊能静想说的? 可以肯定的是什么? 拉尔夫,兰迪得走了。 请你出来? 所有权利,马。 我马上就出来。 我到现在越来越近了。 张力是可怕的。 它是什么? 地球命运 挂在平衡。 拉尔夫,兰迪得走了。 - 我就出来 哭出声来。 几乎。 我的手指飞了起来。 我的心是钢的陷阱。 每一个毛孔振动。 这几乎是明确的。 是的,是的,是的,是的,是的。 - 务必喝阿华田。 阿华田? 一个照出商用? 王八蛋。 [END视频播放] 音箱1:这是CS50,而 将习题集两个。 下周见。 扬声器2:在接下来的 CS50,发生这种情况。 扬声器1:一个主题,我们没有 看着迄今 函数指针。 现在,仅仅是一个函数指针 一个公共的地址 功能,但很像 - 儿子 -