[音乐播放] DAVID马兰:大家好。 这是CS50的超部分。 分配的部分将不 开始一个星期。 所以今天,我在这里with-- 玛丽亚:玛丽亚。 DAVID马兰:--to实际 看看问题 设置之一,课程的 第一周的材料, 让你用面向CS50 IDE,有点 的Linux,操作系统那的 上IDE中运行,以及 看看一些过渡 从零开始到C领先 长达问题集之一。 因此,事不宜迟, 在问题集中的一个, 你会是 推出CS50 IDE,它 这是基于网络的节目 我们为了使用环境而定 写程序。 它的设计看起来非常 让人联想到典型的计算机 运行的操作系统 系统称为Linux。 但是,它在所谓的云, 这意味着每个人都在类 其实可以有他或她的 自己的帐户,并使用它,以及。 因此,大多数人可能从未使用过 之前或者Linux环境 甚至一个命令行环境。 和命令行 环境是不同的。 它的所有文字。 它的所有键盘命令。 而且它没有鼠标移动,没有图标, 没有对话窗口,没有菜单。 这是纯粹的文字。 所以刚开始,它种 的感觉就像一个步 向后复杂的条款。 但它最终被很多 功能更强大,当然, 对于计算机科学家,最终。 因此,让我们一起来看看。 在这里,我在CS50.io,通过这 您可以登录到CS50 IDE。 而就像在刮,有 三个主要方面来此屏幕。 等的左手侧,我们有 会是怎样的文件浏览器。 还有的这个文件夹中 顶,这是正确的,现在空 因为我摆脱我所有的 超部分之前的文件。 而这也正是我们将 保存我们写的C文件。 在右上角,我们有一个地方, 我们所有的代码会得到写入。 事实上,如果我点击这个加号,这 是打算让我选择新建文件。 在这里,我可以开始写C代码,或者, 确实,任何数量的其他语言。 然后在底部的地方 说jharvard @ ide50--和你的将 说的东西有点 different--什么这个叫什么? 终端窗口。 是啊。 因此,终端窗口 所谓的命令行 接口,通过它,你可以进行交互 与底层操作系统。 而现在,我们要 让很少使用this--的 只是编译,看看 我们看到错误消息, 并运行我们的程序。 但最终,我们将 这样做的多,以及。 你甚至可以安装软件 和管理您的工作空间 CS50在IDE中,也是如此。 但更多的是一些其他的时间。 因此,让我们继续前进,写 一个非常简单的程序只是 经过一个热身 hello.c的,这也许就是 我们可以写出简单的程序。 我已经打开了一个新的标签。 我要继续前进, 说包括标准io.h. 然后,诠释的主要(无效)。 然后的printf(“你好,世界” 反斜杠N,密切报价, 关闭括号和分号。 好吧。 所以,现在发现我的窗口没有标题。 所以,我很快会 上去文件,保存。 而且它是非常重要的 我把这种不是“你好”。 所以有一个非常常见的错误, 尤其是在问题的设置之一, 是意外只是打电话给你 节目“水”和“贪婪”和“马里奥” 或“信用”等。 但是,你真的想使 确保您有文件扩展名 因为这是唯一的方式, 编译器和还代码编辑器 知道你 实际上编写C代码。 因此,让我继续前进,然后点击保存。 现在也一样,什么CS50 IDE 已经为我们做的这也是 语法高亮一切。 因此,它是由一切非常丰富多彩。 而整个目的 不能正常工作。 这只是吸引我的目光投向 在概念上不同的部分 这个方案的。 因此,让我们继续前进,编译这个。 我可以编译此 在几个方面。 并且在一个星期的 老派的方式,我们做了 这是字面上的 命令line--“铛hello.c的。” 然后,我敲回车。 而且似乎什么都没有发生 在终端窗口。 但没有改变的IDE? 其中,再次,IDE只是手段 集成开发环境。 它是说一个奇特的方式 这个集成开发 环境,用于开发软件。 那么,在UI没有变化? 你有没有注意到什么 这是不同的,玛丽亚? 玛丽亚:我发现了一些 在IDE50夹在这里。 DAVID马兰:是的。 所以在这里,不仅 我们是否有“hello.c的。” 我们也有“的a.out”,这是 样一个程序一个愚蠢的名字。 不过说实在的,这是一个默认的名字 当你只是编译代码的程序 不要告诉编译器 什么样的文件输出。 所以,如果我要运行这个,我 需要告诉compiler-- 或者说,我需要 告诉工作区,我 要运行调用的程序“的a.out。” 输入。 还有的“你好, 世界“。现在的”./“。 其实是很重要的。 虽然通常我们只 写的命令的名称, 当它是你已经计划 写的,你要说“./” 因为这明确地告诉Linux 要运行一个名为程序 “a.out的”这是在这一点,在那里点 意味着这个目录是我目前 中,这恰好是 所谓的工作空间,“a.out的。 因为如果我只是说:“a.out中,”回车, 我要得到“a.out的命令不 找到“因为computer-- 因为我发明了“a.out的;” 它没有附带computer-- 不知道去哪里找它, 即使它是正确的 在我的鼻子,可以这么说。 好。 所以,我们可以改变这 是“铛邻打招呼hello.c的。” 如果我敲回车,什么程序 这是怎么回事输出给我吗? 什么是文件的名称? 是啊,在后面。 那就对了。 “您好。” 因此,“你好”将是 节目的名称 因为我们使用了所谓的 命令行参数,这仅仅是 改变的行为的一种方式 编译器实际输出 特定的文件名。 事实上,如果我放大 并寻找在这里, 现在我不仅是“的a.out”和 “hello.c的”,而且“你好”,以及。 所以,现在我可以做“./hello,”回车。 还有的“你好,世界”。 但lastly--这 现在将公约 我们在整个​​使用 学期,typically-- 是你也可以只是说“让你好。” 事实上,它说这完全取决于 迄今为止,因为它已经存在。 让我继续前进,捞出,用 rm命令,这两个“的a.out” - 并说“删除普通文件a.out的?” 这只是意味着,你 确定要删除吗? 我会说是的。 然后,我会删除 “你好”,而不是“hello.c的。” 我会说“是”明确, 但“y”为足够,以及。 如果现在通知我 键入ls--其中,召回, 意味着列表中 - 它列出了所有 在我的文件夹中的文件。 事实上,如果我放大 出去看左上角, 它证实了什么 此文件夹中,甚至 虽然它在这里标注为IDE50 而不是工作空间,它只是“hello.c的。” 所以,现在在这儿,如果我 执行“make你好”,回车, 现在我看到一个更长的命令,但一 那将会更复杂的命令 将在今后数周内有用。 现在我可以说“./hello。” 因此,让我们快速浏览 一些其他的Linux命令。 那么我们为什么不采取一步 回来居然看C的具体 一般,从头开始转变 到C,然后总结了一下 在第一个问题 在C设置的所有权利。 所以我要继续前进,只是干净 我的工作区控制-L刚 保持屏幕整洁。 但是,没有功能 影响并非如此。 回想一下,我们已经看到 一些命令了。 因此,我们已经看到了铿锵,通常你 不必手动执行了。 我们将改用化妆。 但是,我们也看到了LS,它显示了 在我的目录中的文件清单。 现在为什么那里 - 有两家 现在的文件,“你好”和“hello.c的。” 为什么会出现一个明星或 之后,“你好”星号? 那是什么表示,基于 对我们在每周一看见? 你怎么看? 什么是星意味着什么? 玛丽亚:For--节目“你好”? DAVID马兰:“你好*”。 是啊。 哦耶? 哦,可执行。 那就对了。 这样就意味着 “你好”是可执行的。 因此,我们确实,这就是为什么 我能做到“./hello。” 好吧。 所以,还有什么我可以做吗? 嗯,事实证明,我可以 还创建目录。 因此,让我继续前进,创造, 例如,一个“PSET1”目录中。 而问题集规范 可以让你做的正是这一点, 所以你不必今天记住。 但“MKDIR PSET1”似乎 到没有影响。 但同样,没有错误信息 通常是一件好事。 所以,如果我输入“LS”now--啊,现在 我有一个名为可执行文件 “你好,”一个C文件名为“hello.c的。” 然后是斜线,所以 讲,意味着这是一个目录。 因此,我们确实,现在我要打开它。 我不双击它像 在图形用户界面,图形环境。 我不是说“CD PSET1。” 输入。 没有什么有趣的似乎有 除非发生了我的小提示 这里 - 这是提醒Linux的方法 我我在哪里,所以哪个文件夹打开。 这只是明确地告诉我, 相对于图形。 如果我键入“ls”,为什么我看到另 立刻提示,你认为, 当我列出PSET1的内容是什么? 玛丽亚:你可能不 在有什么。 DAVID马兰:是的。 然后我们还没有明显 在那里创造了什么 因为我刚刚创建的目录中。 现在,如果我想创建一个file--为 例如,我可以创建一个新的文件。 然后我会去 保存并保存为, 像“mario.c”如果你正在做 PSET的一个标准版本。 然后,像任何Mac或PC,只 选择文件夹“PSET1,保存。 而现在的文件是空的。 但是,让我们再次放大一秒钟。 让我们在这里做的LS。 现在我们看到的“mario.c”。 因此,有一些其他的命令 值得记住了时间 - 清除或控制-L是我所 被击中; MKDIR我们已经看到了; RM我们所看到的,还有,这是 去除或删除文件。 当心你可以also--,如果你看看 在网上的教程,你将RM -rf 是说一个很常见的方式 删除有东西在它的文件夹。 只要是超级,超级小心。 -rf意味着递归 删除不管它是什么 你想删除 并强行将其删除。 这样循环的手段,如果它是一个文件夹 与文件夹的文件夹的文件夹, 删除所有的人。 并强行手段甚至不 问我是或不是,我是肯定? 所以这是一个超级危险方法 删除很多东西很快。 但beware--往往做一个勇敢的 学生意外删除,也就是说,PSET 1,例如。 玛丽亚:如果他们只是 做-r,他们会 问他们的每一个文件。 DAVID马兰:这是 适度烦人。 玛丽亚:是的。 DAVID马兰:所以这就是为什么 我们这么多人,自包含, 我在使用-rf的习惯。 但它是危险的。 因此,买家当心。 然后,MV是怎么样的 有趣的命名。 因此,这是移动命令, 这感觉有点怪异 因为你的确可以用它来 从一个地方移动到另一个文件。 举例来说,假设我搞砸了。 假设我创建 一个新的文件处理器集。 我将它保存为“greedy.c。” 但是假设我不小心将它保存 在IDE50--所以在我区本身 而不是在PSET1。 你可以看到尽可能多的左上方。 有“greedy.c。” 还有的几个解决方案。 所以一个,我可以使用 超级用户友好的方式 只是拖放。 而这实际上 解决这个问题。 但是今天,我们想看看 更神秘而强大的方式 对这样做。 因此,让我走“LS”的PSET1。 而我只看到“mario.c。” 让我继续前进,做“CD ..”。 所以CD再次改变目录。 “”是指什么有关系吗? 上次我说:“CD PSET1“进入PSET1。 所以当我说“CD ..”,我在做什么? 向后。 是啊。 因此,这将所谓的父母。 进入上一层,像 退出了一个文件夹中。 所以输入。 事实上,看看它的所作所为。 这让我感动刚刚进入工作区,而不是 成PSET1,这是在工作区中。 而现在,如果我输入“LS” 有一大堆的东西。 在有“greedy.c”。 所以,现在让我用MV来字面上 移动“greedy.c”到PSET1。 所以很多Li​​nux命令 工作完全是这样。 他们没有参数或者他们需要一 参数或他们采取两个命令行 参数等等。 在这种情况下,它的 从字面上做什么 它说,尽管succinctly-- 移动greedy.c到PSET1。 输入。 好像没有什么改变。 但是,如果我再次做了LS,贪走了。 如果我做“CD PSET1”,回车,然后 LS再次,现在是在正确的地方。 顺便说一句,如果 一些reason--特别是 如果你有间歇性 网络连接 或者你走动 校园里与你的笔记本电脑的盖子 关闭,然后打开它 再次和您的工作空间 似乎有点不同步,没有什么大不了的。 只需重新加载浏览器 窗口,它应 重新同步,以使左侧 文件浏览器看上去完全 如终端窗口。 不用担心。 如果有疑问,重新载入页面,所以 只要你已经保存的文件。 好。 因此MV也可用于重命名文件。 让我们来看看 在这份最后的命令。 所以suppose--并且这是 超级常见的,也很早。 有些学生偶尔创建一个文件 所谓的,让我们say--什么别的? 像“WATER.C。” 所以,我就吆喝,为 没有任何理由,全部大写。 但是这不是 正确的文件名, 如果仅仅是因为我们的问题集 规范没有告诉你 将文件保存为全部大写“WATER.C。” 相反,我们预计 小写的“water.c”。 而且,事实上,这是 问题的,因为check50, 你要去一个程序 在的问题,以满足 设置一个自动测试 你的代码的正确性 是要骂你,如果它不能 发现在所有的小写字母“water.c”。 所以我需要解决这个问题。 因此,许多不同的方式来 做到这一点,其中第一个 需要控制或右键单击 文件名,只需要改变重命名。 完全好这样做。 但同样,今天,让我们 做一个小票友。 让我们用MV来改变 “WATER.C”到“water.c”。 所以,你还可以用第一个参数 将其重命名为第二个参数 如果第二个参数是不是在 事实上,文件夹或目录名。 好吧。 最后,一​​点点trick--所以我在 此刻我的工作区目录。 如果我想进入PSET之一, 我当然可以键入“cd PSET1。” 但它是如此繁琐的输入“PSET1”或 长文件名或目录名 仍然。 所以,很多时候在Linux中,有什么 你能做的就是开始输入“PSE” 和刚刚获得无聊,打标签,并让 计算机数字出来给你。 超级有助于进入这个习惯。 唯一的缺点是,如果你有 启动多个文件或文件夹 以字母“P”或 “PS”,你可能有 键入前几个 电脑知道该怎么做。 玛丽亚:我们喜欢的快捷键。 DAVID马兰:这将 为您节省了很多时间。 而且,正如我们所说的讲座,你 可以在历史上滚动,上下, 找最近执行 命令,以及。 好吧。 所以,现在,让我们把注意力转回 以一个简单的程序,你好世界。 因此,我们完全编译这一点。 而现在,我们为什么不拿 看看数据类型 然后从一些过渡 相应的划痕块C. 玛丽亚:真棒。 所以,现在你已经开始 C语言编写程序, 我们将开始讨论 有关数据类型和变量。 因此,某些数据类型,你 想知道从现在开始 是那些是 以蓝色突出显示。 因此,我们有INT第一, 它代表的整数。 而持有整数,因为你 可能具有guessed--所以1,2,3, 和任何其它整数 你能想到的。 DAVID马兰:而且也不利。 玛丽亚:而且还消极的,是的。 和0。 然后我们有花车,其中 是浮点数。 所以这是所有的实数 有小数点。 所以5.0,5.2,并且甚至更 小数点后的数字, 同时,也是消极的。 然后我们有焦炭这是一个字符。 因此,我认为我们谈论 这在今天的讲座。 但是,我们有字母,example-- A, 乙,C--可以存储作为char。 但是,我们有更多的符号 可以存储为char。 而这些被存储为ASCII。 然后我们有布尔, 这是布尔值。 而那些评估为True或 假或1和0。 DAVID马兰:重温使 布尔来自CS50库。 所以,它没有内置到 C,但它的超级有用 以具有真假的概念。 而且即使你 可能think--有趣的事实。 布尔技术上需要多少位, 确实,表示真与假? 多少位,你认为 你需要,最大限度地? 是啊,只有一个。 所以,事实证明,Ç 不能给你只是一个位。 度量的最小单位 你可以为8。 所以这是一个有点浪费他们你 使用中的整个字节或八个比特, 代表真或假。 但是,这只是它的方式 由CS50库中实现C语言。 玛丽亚:然后那些我们 不是要谈论的广泛 右now--双, 这是更大的浮动。 龙多空 还可用于整数。 DAVID马兰:的确。 在PSET一个黑客版, 我们实际使用很长很长。 但对于标准版, 它不应该是必要的。 玛丽亚:酷。 好。 所以operators--你应该 可能熟悉其中的大多数。 此外,+;减法, - 。 对于乘法,我们有*。 所以不是在X,我们平时使用。 事业部,我们有反斜杠。 和模是我们最后的运算符 我们要谈论现在。 这是一个运营商,使我们能够 拿一个除法的余数。 因此,如果我们有4%2,4分 由图2是2用的0剩余部分。 所以4%2为0。 4%3是1。 4%,5 4,你可能已经猜到了。 请记住,当使用所有这些 经营者利用PEMDAS规则。 DAVID马兰:所以要清楚,如果你 做4%2,为什么是0,到底是什么? 玛丽亚:因为4除以 图2是2用的0剩余部分。 因此,模给我们,剩下的作为 反对分裂的结果。 DAVID马兰:事实上, 我们会发现这是很有帮助的 为是,在一些问题 这并不一定是, 如果你想拥有 限制自己的作用 一个数字范围 像0到的东西, 您可以使用模环绕 早于像2十亿 或四十亿值 我们已经谈到了讲座。 玛丽亚:是的。 即使在“贪婪”我们可能。 DAVID马兰:是的,在 问题集之一,也是如此。 玛丽亚:是的,不错。 DAVID马兰:好的暗示。 玛丽亚:对不起。 布尔expressions--所以 布尔型的操作, 我们要谈的所有 这些是你在这里看到。 所以现在,我们有两个 等号列出的平等。 因此,这些都是进行比较。 到目前为止,我们只看过一等号。 这时候,我们分配 一个值的变量。 因此,如果我们已经看到INT N = 5,则 我们给5到变量n。 但是,如果我们想用==进行 相比之下,我们可以检查如果n == 5。 而如果n == 5,那么这是真的。 所以布尔运算符 让我们,基本上, 评估布尔 表达式为真或假。 所以没有equals--我们有 感叹号和equals。 因此,我们也可以查看如果n 不等于5--因此n!= 5。 小于,小于或等于, 大于,大于或等于, 然后我们有逻辑 与和逻辑或。 而那些让我们能够评估 多个布尔表达式一起 基本上走到一起 一个完整的布尔表达式。 因此,如果我们想找到一个号码,说: 大于5但小于15 与此同时,我们将使用 逻辑AND运算,以查看是否n是 大于5 &&Ñ小于15。 DAVID马兰:在这里, 同样,它真的很容易 早早就意外 只使用一个单一的符号 或单竖线。 并希望编译器会 骂你,因为他们实际上 具有非常不同的含义。 对于那些好奇,他们是 用于位运算, 操作上的各个位。 但是,你想对他们在这里。 和超级重要的是, 第一个,等号, 这是运营商的平等作为 反对赋值运算符。 玛丽亚:与竖线 位于删除和收益之间。 DAVID马兰:是的。 在一个典型的美式键盘。 玛丽亚:是的。 因此,让我们直接进入 条件语句。 在刮,你 已经看到,大概, if语句,让您 检查如果事情是真的,那么 做别的事情。 所以,你可能会想 检查你的精灵是 接触一些其他的精灵 或者你的屏幕边框。 然后你可能会想 结束游戏或做其他事。 这样的语法说 是“如果(条件)。” 所以,如果你的精灵是感人的东西, 然后要做的就是花括号内。 然后我们有if-else语句。 否则让我们做一些事情 如果条件我们 在开始时检查是不正确的。 因此,如果精灵的触摸 边境做到这一点,否则做其他的事情。 因此,否则做别的事情。 然后我们有一个简单的例子这一点。 因此,如果(military_time <12),我们 想给printf“早上好!” 否则我们将 printf的“晚上好!” 基本的例子。 DAVID马兰:好。 玛丽亚:酷。 所以现在我们有switch语句。 交换机一般都能发言 让我们做了很多同样的事情 我们刚才讲 有关使用if语句。 例如,现在我们有 switch语句的一般形式 这使我们能够 一个变量调用ñ 并比较了很多 不同的值,在这里我们 呼吁CONSTANT1,CONSTANT2。 我们可能有更多的。 而那些被称为案件。 因此,如果我们有一个开关 statement--这个作品 仅用于integers--我们有一个 变量在这种情况下n值。 如果变量n是 等于CONSTANT1,我们 将执行一些代码段 或者说,我们想要做的事情。 然后我们将打破。 因此,突破意味着, switch语句 将停止,如果执行 n等于CONSTANT1, 然后你的程序将继续进行。 这将退出的出 switch语句,它会 继续做别的事情。 然而,如果n不等于 CONSTANT1,然后案例CONSTANT2 将被检查。 因此,如果n等于CONSTANT2,其他 的代码段会被执行。 然后它会打破 如果这是等于它。 然后我们就可以有also--不 不一定,though--默认的情况下, 如果n不等于将发生 任何你所列举的案例。 与在默认的情况下,我们还 不需要休息不一定 因为switch语句就知道了 它需要的默认后结束 情况下,如果是这样的话。 DAVID马兰:但在风格上, 我们始终把它放在那里。 玛丽亚:是的。 DAVID马兰:是的。 因此,特别是在开始的时候了, 尤其是在那些较少 舒服,我会亲自 只是建议坚持与IFS 和IFS-别人的和的if-else-IF-别人的 等等,如果仅 因为他们是一个小 更直接。 这是一个很好的优化,或者 有时甚至是美学上它 使得代码更易读。 而事实上,可能 期中,我们将看到一个问题 设置它只是看起来更好 并且更容易阅读的人 通过使用switch语句。 不过不要担心 执着于这个为时尚早。 玛丽亚:是的。 如果你有if语句很多, 它可能只是不是很可读。 它可能不是非常快 让你通过它。 所以,sw​​itch语句可以 是非常有用的,也是如此。 而且,不要remember--不 忘了把休息时间在那里。 DAVID马兰:不记得这一点。 玛丽亚:因为这样你可能会下降 通过从一个案件到另一个。 所以我们可以说这种情况下CONSTANT1 没有一个break语句在里面。 然后,我们可能告吹 里面的情况CONSTANT2。 同时,我们也不想这样做,如果 我们已经达到的情况下CONSTANT1 它是等于n。 因此,例如,如果我们有一个可变 n表示包含一个类号, 我们希望看到什么 如果n等于50级的is--, 我们要打印“CS50是 计算机科学导论一。“ 然后,我们要打破。 就是这样。 然而,如果n等于 51,我们将 打印“CS51是介绍 计算机科学II“。 然后,再次,我们要打破。 但是,如果那么我们就把124,61,任何 你可能会想其他的号码, 或程序是不会 认识到这一点。 因此,它会说,“对不起,我 不熟悉的类。“ 而这将打破。 DAVID马兰:所以你真的可以看到 中频,否则的话,其他人的想法在这里。 这只是不同的语法 表达完全相同的想法。 玛丽亚:没错。 现在,我们有我们的三元运营商。 因此,三元运营商 3 parts--的条件, 事做,如果 该条件是真的, 然后事做 如果该条件为假。 所以你看,基本上, 的是,这里的语法。 我们有问号, 那么the--我们怎么叫呢? DAVID马兰:结肠。 玛丽亚:结肠。 谢谢。 抱歉。 因此,让我们来看看我们的榜样 看看我们是否可以this--感 class_num == 50。 所以在这里,我们看到我们的布尔运算符== 用于比较变量class_num 50。 所以class_num存储的整数。 如果该整数 等于50,那么我们 将存储“大卫·马兰” 里面的字符串教授。 如果班级人数不 等于50,“不是大卫·马兰” 将是教授。 DAVID马兰:谢谢。 因此这似乎相当于 什么,你会说,乍一看? 玛丽亚:对我来说,似乎 像if-else语句。 DAVID马兰:是的。 而事实上,这是一种 一个漂亮的单行的, 可以这么说,对于实施 究竟逻辑的if-else 但这样做的一切一步到位。 玛丽亚:没错。 是啊。 所以if-else语句可能 占用了大量的空间。 他们可能是太长时间 一些简单不过的了。 因此,这可以是非常 简洁,非常漂亮。 所以,现在我们正在进入观察 一次又一次地执行一些东西, 所以检查的 条件多次 然后继续做一些事情 而条件为真。 因此,这给我们带来了 很好地进入while循环。 到左侧,我们有 我们的第一个while循环。 因此,虽然事情是真的, 一次又一次地做一些事情。 所以一定要注意,我们的 条件这里在顶部验证。 而我们的我们称之为第二loop-- 这一个做,而loop--我们做一些事情, 然后我们检查的条件。 如果该条件 仍然是真实的, 我们再回去做的事。 这样的主要区别是,其中 该条件检查。 以及码可能永远 执行如果条件不 真正的while循环。 而随做,而 循环,我们有码 即至少要执行一次。 然后,当条件 仍然是真实的, 我们可以回去里面再次重复。 那么,为什么你认为我们会用 一个do-whil​​e循环在while循环? 对。 因此,如果我们想提示的 用户对某种类型的输入, 如果我们要问他们 输入他们的姓名, 我们希望至少让他们一次。 如果他们确实进入 这个名字,我们不 又要问他们 因为我们已经知道了。 但是如果它们不进入 他们的姓名,或如果他们 进入东西是 显然不是一个名字, 我们还是要继续 要求他们对自己的名字。 DAVID马兰:而在演讲中,我们有一个 像这样的得到正INT 例如,那里什么也没有到 首先检查一下,因为你甚至还没有 得到一个int。 所以我们想要做的this-- 您可以通过user--一个int 然后检查一下,也许, 一遍又一遍又一遍。 玛丽亚:没错。 对于loops--确定。 For循环可以让我们做的差不多 同样的事情,也是如此。 它实际上是完全一样的东西。 因此,有没有什么 您可以为循环做 你将无法 做while循环。 但对于循环可能看起来有点 更多的复杂语法 因为它们具有 三个部分里面有什么 是以前只是 条件与while循环。 因此,第一个部分,你的大海, 最左边的,我们有“INT矮人= 0”。 因此,这是我们 初始化我们的变量。 然后我们有一个分号 和“矮人<7”。 因此,这是出 条件实际上是。 所以,这就是我们将有 把刚刚在同时loop-- “而矮人<7”。 这里,云在 中间我们的for循环。 因此,“dwaves <7”。 然后,我们的最后一部分是“矮人++” 这就是我们更新我们的变量。 所以,最重要的事情 要知道的是,这 是要通过这个循环 七次并执行七次。 因此,我们有七个 矮人,和他们都 会说,“我在这里 帮你,白雪公主“ 因为他们已经准备好 帮助白雪公主。 随着while循环,我们会做 初始化和更新 满足条件内,再次,但 之前或while循环中 确保we--因为 我们总是需要的部分。 因此,为了确保我们有 他们,我们会一直还增加他们 上,只是没有在括号内。 DAVID马兰:所以它看起来like-- 在讲座中,例如, 我几乎总是使用一样,我和 n和很无聊的变量。 它看起来像您可以使用更多 巧妙地命名变量了。 玛丽亚:是的,它实际上是非常好的 使用多一点的描述变量 因为特别是如果别人是 读你的代码 - 也许你是平地机 或者如果你合作 与somebody-- 你要确保他们 了解你在做什么。 好。 因此,这是一件很funky-- for循环内的for循环。 我不知道,如果我们之前已经看到了这一点。 可能不会。 但是,我们其实可以有this-- 如此循环,而不是循环。 所以想也许走没有人 我穿过这是怎么回事吗? DAVID马兰:我要一刺。 玛丽亚:酷。 DAVID马兰:OK。 因此,spoiler--我们要打印的东西 这是在底部右下角 那里。 玛丽亚:对。 是啊。 DAVID马兰:所以我们刚刚 把该样品的输出存在。 因此,我可以从推断 你是最上面的循环 迭代行 最外层循环,可以这么说。 而你遍历 列与最内层的循环。 直观地,这 应该有希望才有意义 因为性质 每一个我们所看到的节目 之前,printf的,这是 功能我们使用,最终, 有打印的东西的能力 出基本上逐行。 象,一旦你输 一个新的生产线,有 没有加倍背部和打印的东西 在屏幕更高,至少 不是用printf这样。 所以在这方面,它使 某种意义上说,最外层循环 应该是指各行 因为对于每个给定行, 你会想 打印出XXXXX,然后 移动到下一行,XXXXX。 因此,行是第一位的。 然后在每个 行,你打印的列。 如果你想做到这一点 相反,它可能不会 出来,你打算。 玛丽亚:是的。 我们只是不能回去 上一行用printf的。 DAVID马兰:这有什么有趣 按今天的大约范围聊天, 实际上,是该行是一个int 该公司在最上面的循环声明。 但是请注意,它仍然是 内部,可以这么说, 大括号的 紧随其后, 即使它不是技术上 在这些大括号内。 因此,行范围为 代码片段的全部, 两外循环内 与内循环的内部。 但与此相反,在那里 是列在范围? 可变列? 是啊,只有在里面循环。 这没关系,因为我们没有访问 它的花括号外面。 我们所要做的就是打印出新 线在最后出现。 所以,实际上是确定。 因此,这具有这样的效果,它看起来像, 的操作的三行和四列。 玛丽亚:对。 所以首先我们通过我们的第一行。 而就在我们的第一行,我们做的 四列的第一行内。 因此,我们打印出四个X的。 然后我们就可以退出循环,因为 我们已经印了四X的。 我们打​​印新的生产线。 然后我们经过 同样的过程两个行 使一共有三个。 DAVID马兰:而且值得注意的是 字体的只是一个假象,事实 样品输出 似乎如此多高, 好像还有更多 行比列。 但它只是因为X 高度大于宽。 这一切发生的事情有, 加上线之间的空白。 玛丽亚:对。 凉。 DAVID马兰:好的。 因此,快速浏览一下问题集之一, 采取任何问题,然后宣布休会? 好吧。 因此,在问题设置一个,还有三个 主要挑战,大势所趋。 但首先,你会发现 这个问题集 说明书中,作为与许多 pset时,今年秋天,是要带你 通过一些热身练习, 你指出了几个资源 你可能会或可能 没见过了。 例如,CS50 拥有一套短裤, 这是短视频, 没有什么不同这一点,但该 很话题specific-- 也许五分钟, 长度为10分钟的循环或 上条件或算法 或更高版本的更多 先进的主题,也是如此。 而我们一般嵌入 这些成难题 集使学生 有哪些资源 审查可能具有材料 已经来在演讲或部分。 但是,这样一来它更集中 更在他们的指尖。 我们也往往在问题嵌入 集东西叫做演练。 因此,几乎所有我做的例子 在讲座中,这里的舞台,我们也 在已经拍摄的摄像头 推进更慢, 更贴心的演练由我的 我的笔记本电脑的代码,一行行 因此,在课堂上,我们经常会 脱脂通过某事或某人 将与插 回答的一个问题。 但它并不一定下沉 在每个人的观众。 所以,你会发现代码走查 对于大部分的实施例 我们在这里做演讲,让你 可以通过它按照自己的节奏走 快退或快进或 完全跳过,如果你愿意的话。 经常会有一些 热身问题,这 请你进行排序 强化这种材料 并确保您舒适前 你继续处理器集的其余部分。 然后,当然, 有处理器集本身。 和的事情之一 我们很刻意 做CS50是几乎每一个无趣 或智力无趣 机械的步骤, 你可能需要做的 几乎总是非常有据可查。 在长期的过程中,我们将 开始提出更多的反问句 像记得如何做这做那? 但通常情况下,你会发现 该习题集给你 通过力学 东西使 有趣的,智力的挑战 最终都是留给你的学生。 随着中说,Zamyla,我们向他 不停地谈到今天的讲座, 是我们长期的工作人员1 成员谁也持有演练 像马里奥特定PSET问题 和贪婪,虽然不是水这一年。 而且它是在那些 演练,她经常 提供了一些提示和技巧 如何进行,从来没有告诉你 到底该怎么做,但 rather--像的状态下, 如果你will--给你至少一 几个想法,这样就看你的, 最终,决定 如何接近他们。 玛丽亚:有点像一个高层次 逻辑的理解是什么 我们要求你这样做。 DAVID马兰:没错。 而且,事实上,Zamyla的 演练旨在 经常回答 在那里问到的问题 我开始了,特别是当 这些长规格 有点令人生畏给所有的文字 和图像,他们有他们。 所以water.c,你会发现 你已经完成后, 实际上是相对简单的。 绝对是一帮 你要一鼓作气 靠在墙上你的头试图 弄清楚为什么它不编译 或者为什么它没有运行正常。 但是,一旦你完成 它,一旦你 花一些时间与任何摔跤 那你可能有缺陷, 你会发现,它的 在很短的程序。 它可以在短短几分钟来完成 行代码,其中大部分 我们在这里看到的讲座已经,如果 你组装正确的积木。 正如我们建议 在这里,它会问 您可以指定多少分钟 有人走在校园里洗澡。 我们在这个问题说明 设置流动水的速率 在一样,低流量的淋浴 头,很像宋飞夹 我们昨天看到或 相反物。 然后你只需要 做数学了一下, 用C来告诉really--算术 我们知道有多少,大概,瓶装水 就是相当于,如果我们 采取一个n分钟的淋浴。 现在,在mario.c,这是去 要稍长程序。 它仍然不会长期是这个。 短短几行比water.c更长。 但是,这将是机会 重现老同学马里奥 从超级马里奥金字塔 兄弟或者一些后续。 它不会看起来更漂亮 或者丰富多彩的作为一个人也没有。 我们只是用很少的#标签 像我们这里在屏幕上 使用ASCII文本。 但是,这将接近同样的想法。 而且这将是一个 锻炼第一眼 似乎只是很simple-- 打印一个简单的金字塔。 但是,有一对夫妇的特点 在这里,很有意思。 请注意,最右边边缘 金字塔实际上有宽度两种。 因此,有两个相等 身高列,这 使得它需要一点点 思想位,使 确保你得到了完全正确的,因为 而不仅仅是一个完美的角度的 线。 所以这是一个有点角落案件 但比赛的实际比赛。 而且,这也是非显而易见的,在第一 一目了然如何打印空白。 所以,当我看 示例输出这里 - 而且它也是在spec--它 那种看起来像一个矩形, 但一个对角线的 矩形已经砍掉了, 它只是空格,可以这么说。 所以,一个经常被问到的 这里的问题是一如既往的好, 我怎么动的#标签 到正确的? 或者,我怎么打印空白? 它实际上更容易 比大多数学生认为。 对? 你可以通过可视化地接近它 按下空格键一次或两次 或三次。 因此,即使与我们的printf几乎 总是打印出一个字符串或一个int 或者像“你好一句话, 世界“或一系列字的, 你也可以只打印 报价,空间,引文结束。 这实际上给 你一个空格那里。 所以记住这一点,并 不overthink这一点。 你真的要 决定逐行逐行, 没有什么不同的例子 刚才,有多少的 列应该是白色的空间和 有多少人应该是井号标签。 这将需要一些时间,但它的 各种各样最终逻辑谜题。 玛丽亚:是的。 但再逐行逻辑 是要在这里是非常有用的。 DAVID马兰:是的。 我想示例代码,你gave--甚至 虽然这不是一个完整的程序。 您还需要int和主 和无效的和的#include stdio.h中, 很多从演讲的东西。 但积木 似乎是在那里。 然后最后是什么 多一点的算法。 所以,事实证明,任何时候你 进入CVS或便利店 有人递给你的 出纳票据或硬币的变化, 事实证明,他们,人类, 不管他们是否意识到这一点, 可能正在使用什么 所谓的贪婪算法, 因此,如果你欠,说,$ 21日 在变化,因为出于某种原因 你买东西很便宜 与CVS的一个非常大的法案, 这将是非常烦人,如果 收银员给你21单曲,更有甚者 然而,一大堆硬币。 相反,什么是合理的人 可能要做的是他们要去 抢$ 20,然后$ 1钞票,和 交给你只有两个法案在这种情况下。 玛丽亚:所以他们正在寻求减少 他们给回你的变化。 DAVID马兰:没错。 而同样的处理硬币,以及。 如果你欠,说,$ 0.50, 希望你不想要50便士。 你不是想要两个 宿舍,例如。 现在,这确实承担 该出纳员具有 足够的每一个教派的 他或她可能想给你。 但是,我们让你承担 尽可能多的问题。 和目标,最终是 在C代码实现贪心算法。 因此用户被允许 在键入多少 改变他或她是欠与美元 而仙,某种浮点 值可能。 然后你需要做的数学和 弄清楚算法,好了, 有多少硬币,我可以给 你最少给你 正是这样的变化量。 但是,将是一个 这里几个棘手的部分,对吧? 像有全 不准确的问题。 玛丽亚:没错。 因此,浮点 值具有不精确。 难道我们谈论这个讲座的今天? DAVID马兰:我们做了 最后一次演讲。 我们谈论的不精确性。 而你不想欺骗用户 多少变化,他或她是欠。 这样一来,演练,在 问题设置规范, 想一想,最终以 你如何减轻这些不精确 错误,有可能。 这是可以避免的,当然,对于 我们谈论的投入。 而且,事实上,pennies-- 也许我们会推迟到Zamyla, 我想,对于花样那里。 所以,最后,你会发现一个 问题的进展,本周, 其中第一个是非常小的, 然后介质,然后一点点大。 但是,所有的人都使用的建筑 从过去的这个星期块, 从这个超部分, 问题设置规范 让你在无数的资源。 但尽管如此,如果在所有挣扎, 尤其是那些不舒服 没有事先的背景下, 来到办公时间 在周一和周二和 周三和周四。 进入CS50通过讨论 课程的网站, 通过它,你可以聊天 与工作人员和同学们。 但最终,我认为, 最好的建议是刚刚起步早。 它不是那种类的,你 要在周三开始的pset 晚上,或者更糟糕的周四晚上。 玛丽亚:我最好的建议是 已经开始在星期一。 DAVID马兰:周一。 所以,如果你还没有开始already--没有。 但是,即使没有星期一,然后周二。 越早越好。 而这就是原因 当然,有这么多晚天 给你一个有点 心理压力 应尽早开始,但仍让 事情滑,当事情需要更长的时间 比您预期的。 玛丽亚:你想利用 办公时间尽量您也可以做到。 DAVID马兰:有什么问题? 好吧。 那么,我们为什么不这里休会?