[Powered by Google Translate] DAVID J.马兰:好吧,这是CS50,这是 本周二开始。 谢谢。 让我们从这里开始,一个电话。 我要拨打617-BUG-CS50。 CS50:这是CS50。 穿梭男孩,按1。 在开始之前,请按9。 DAVID J.马兰:所以他说,班车男孩,请按1。 因此,我们准备按1。 CS50:您的起源是什么? 对于四,请按1。 马瑟,请按2。 斯顿,请按3。 拉蒙特,请按4。 纪念品馆,请按5。 在开始之前,请按0。 DAVID J.马兰:我们会按四。 CS50:下穿梭离开这一刻,在1:10 PM, 然后在1:20 PM,1:30 PM,1:40 PM。 这是CS50。 DAVID J.马兰:这是CS50的声音。 这是一个例子的最终的项目, 例如,你可以咬向 学期结束的时候。 比如,,shuttleboy.cs50.net存在 - 其实一个项目,我第一次写后,CS51 回来时,我是一名大学生。 这里的灵感当年,他们所有的 印刷穿梭巴士时间表,以及有没有 寻找的东西了网上的概念。 所以,我的鸽子在一个周末,通过浇 印刷的时间表,并把它移植到一个计算机程序。 当时,所述计算机程序发生了要写入 在C,你居然跑了它在输入班车男孩 闪烁提示,如我们已经做了迄今。 但这些年来,它演变成瞬间 消息槐树。 最近到本网站的发展,成 基于短信的工具,以及这个基于语音的工具。 这是暗示在各种各样的事情,你可以 学期结束为自己做的。 例如,在那里,发生班车男孩的短信版 操作如下。 ,你的手机上,如果你发送一条短信到41411 然后发送的的特殊符号sboy,请为班车男孩, 其次是由A和B,其中A是一个原点和B是一个 目的地 - 例如,博伊尔斯顿空间四 - 你应该在几秒钟内是一个文本 从航天飞机男孩的消息告诉你什么时候 未来几年的班车,从A点到该 B点。 这是一个更普遍的例子,被称为什么 使用API​​。 因此,举例来说,这里只是shuttleboy.cs50.net的, 实际的基于Web的化身。 但强调这一点和其他应用程序的数据,CS50 已开发的所有暴露的形式在这里给大家 的API,应用程序编程接口。 而这仅仅是一种奇特的方式,人们喜欢说,我们对 互联网和其他人花了一些时间来创建 为了抢从我们的数据和软件,您可以使用 然后在上面建立自己的应用程序 该数据集。 因此,举例来说,这班车男孩API页面在这里, 恰好是在CS50手册,基本上文件 你可以去CS50服务器的数据要求。 例如,如果你熟悉CSV文件,逗号 分隔的值,这些都只是形式的快速和肮脏的 类似Excel的文件。 所以,你可以问班车上所有的男孩的所有数据 房子和他们的GPS坐标,你会得到 回来了,从本质上讲,一个类似电子表格的, 然后,你可以阅读到自己的程序,然后 产生的结果,就像班车男孩本身 发生做的事情。 对于那些比较熟悉的,更现代的数据表示 包括JSON,JavaScript对象表示法。 东西会回来给你走向 学期结束的时候。 但是,这只是其中的几个CS50自己的API。 而令人兴奋的事情,现在,这些天来,Facebook和 Twitter和谷歌,几乎每一个受欢迎的网站了 有某种形式的API,这意味着如果你读了 在他们的网站上的文档,你注册一个 帐户,您就可以开始编写软件之上 有任何工具或数据公司提供的。 因此,我们自己的教学研究员几年 写了Mac版本的。 因此,在左上角的链接标题为“苹果在这里,你其实可以 下载你自己的Mac上运行的Mac OS部件的做 同样的事情。 因此,它是所有有关的数据集上,像这样的。 但更向本学期结束。 所以我们来看看真正的快速的一个错误,只是一种获得 事情回暖的今天,与回想起一些 事情,我们看到在上周。 特别是,让我去拉起来,说, 这个例子在这里。 Buggy1.c,这是本课程的网站上,如果您想 喜欢下载并戳在自己周围。 但是,让我们在这里的放大在这相当短节目, 超快速的回顾一下一些基本构建块, 我们真的要开始考虑是理所当然的。 因此,蓝色的东西,在第1行至第9行,只是 垒球的问题。 所以,这些都只是意见。 他们有没有功能上的意义。 但他们在这个意义上,他们的意见笔记 我的人,做自己的事情,所以在演讲后 讲座中,我实际上可以记得这是什么程序 没有读通过一行行 在我的脑海里重新创建历史。 此外,如果有人喜欢我把这个程序 你,这是更清晰的你,因为这样的意见, 是什么程序实际上做,或至少是 程序应该做的事情。 无论它是正确的,是另一回事。 现在,在C,多行注释,回想一下,上线 这里是神奇的符号,/ *。 这意味着在这里来了一个注释的开始。 并没有什么别的事情,直到你到达终点终止, 这是* /,相反。 因此,事实上,我这里有80个,一些奇怪的恒星从 从左到右依次是真的只是一个审美的细节。 它没有功能上的意义。 第11行吗? 通俗地说是什么? 那是什么? 听众:包括标准。 DAVID J.马兰:OK,好。 因此,它包括stdio.h中的库。 那么,是什么意思呢? 那么,在这个文件中,stdio.h中,一大堆的 函数声明 - 那是别人写的代码。 声明一个函数,在一个完美的例子, stdio.h中 - 现在最喜欢的? 因此我们知道printf,最常用的方法之一,使用,当然 在初期,该库是存在的。 如果我排除该行的代码,铛大喊 在我一些有关使用未声明的符号。 东西未申报的可能是关键字,因为 我们没有告诉编译器输出看起来 喜欢,除非我们有该行。 而更多的地球,真的,该行说的是 打开该文件,stdio.h中,无论它是在服务器上的 硬盘驱动器或设备的硬盘驱动器,复制粘贴 到我的文件,没有我的 做手工。 现在,一旦我们在这里为主,不久我们将开始 梳理int和空洞。 但现在,让我们来看看在三线 在15到17。 这里,我要求车。 7号线在我的评论说:“如果打印10 星号,但没有。“为什么这不是打印的,其实, 10个这样的明星吗? 观众:[听不清]。 DAVID J.马兰:没错。 所以,请注意,我们从0开始计数。 这实际上是一个编程惯例 计算机科学,更普遍,开始计数 从0而不是1。 这真的只是来自于事实,即 例如,当我们有八人在舞台上时, 没有人举手,他们 所有有效的零。 因此,它只是种一台计算机公约, 因此,从0开始计数。 如果是这样的最低数量,你可以以二进制表示。 所以,在这里,我们已经开始初始化i为0。 我们设定i等于0。 但后来我犯了这个错误,在这里,说我是小于或 等于10。 但是,如果你认为,如果我是从0开始,然后我去 ,1,2,3,4,5,6,7,8,9,10,实际上,我要 打印到屏幕上的11颗星,因为我已经走了 和等于10。 因此,简单的办法是什么? 观众:[听不清]。 DAVID J.马兰:只要将它更改为小于。 如果你真的想,你可以做到这一点。 但在一般情况下,是不可取的。 因此,从0开始计数的东西,你应该 通常习惯。 现在,这整个结构本身? 这条线的15 demarks一个for循环。 因此,对于是不是一个函数。 这只是一个声明。 这是一个循环结构,就像我们所看到的划痕。 它由三部分组成。 请注意,这里是第一部分 左边的分号。 两个分号之间的中间部分。 再有就是右手部分的权利 第二个分号。 现在,这些做什么? 观众:[听不清]。 DAVID J.马兰吗? 是吗? 观众:初始化。 DAVID J.马兰:初始化。 所以,这是什么意思呢? 我们已经声明了一个变量叫我。 它的类型是int,因为我已经指定了INT I。 我初始化i的值为0。 那么,这是什么真正的意思吗? 它是有效的电脑说:嘿,给我足够的 内存,足够的RAM,以适应数字,然后把 0,块RAM。 顺便说一句,有多大,是一个int通常情况下,至少里面 的产品? 观众:32位。 DAVID J.马兰:32位。 因此,这意味着32位,否则被称为4字节给我, 并把值0,这是很容易的,因为 它只是意味着将所有的位为0。 所以,现在,这里的第二部分是条件。 和条件,顾名思义,就是检查 再,再而三,是否是真还是假。 因此,这只是说做下面的几行代码 - 即第16行,因为这是唯一一个缩进 下 - 所以,只要i小于10。 通过这个循环的每次迭代后,做 递加在这种情况下,这是一+ +。 现在,它不具有为i + +。 这可能是我 - 。 但如果我这样做,什么行为会 这个计划吗? 观众:这将是一个无限循环。 DAVID J.马兰:这将是某种形式的无限循环, 除非我们很幸运后2负亿左右。 也许事情会环绕,只是性质的有限 数,我们已经分配给一个int的位数。 但它肯定是要遍历远远超过10 肯定超过11次。 而现在,正如顺便说一句,我+ +和i - 真的只是语法糖。 什么是多一点,这只是速记符号 明确写入如下: I = I + 1。 这是相同的到i + +。 它只是一种看起来更漂亮,说我+ +。 它更简洁,更具可读性。 因此,大多数人做,而不是。 但是,这是相同的功能,以 我们刚才看到的东西。 因此,在短期,快速修复这里只是说重复我的 从0一路攀升至不到10个。 然后,我们将确实得到10颗星。 所以,让我们来试试这个。 让我打开终端底部。 让我进入的目录,这是英寸 我要手动编译铛现在。 而且我要编译为buggy1.c,输入的。 现在buggy1,为什么没有这样的文件或目录 被称为buggy1? 观众:[听不清]。 DAVID J.马兰:是的。 因此,它实际上是名为a.out。 所以,记得,如果你只是运行铛,铛 编译器,和你没有指定你想要的名称 给你的程序,它会默认为a.out的。 事实上,如果我做LS - 哎呀。 我没说 - 黑与白的问题的一些 你所面对的已得到修复。 但是,让我这样做。 在那里,我们有a.out的左侧。 因此,我们必须运行a.out,而不是buggy1。 所以,让我继续这样做。 。/ a.out格式,回车。 而我显然没有做什么呢? 观众:保存。 DAVID J.马兰:我的文件。 所以,很容易通过点击控制S,或去解决 文件,保存,就像在大多数程序中。 让我走在这里,清屏,再次运行它。 仍然是一个错误。 这是怎么回事 - 观众:你没有编译。 DAVID J.马兰:啊,太好了。 我没有编译它。 像一个白痴,我在看代码,看看什么是错的。 所以的的铛buggy1.c,现在的a.out。 和不快,保存。 因此,它看起来有点难看,因为没有新的生产线 在程序的任何地方。 但同样,这只是一个审美的细节。 至少,如果再算上这些的时候,我们应该 现在看到10个这样的恒星。 那么,关于第二个热身的例子? 所以在buggy2的,我要求这个版本中,也将打印 10颗星,每行一个。 所以这一次,我有一个换行符,只是为了让 事情有点漂亮。 但不是我所得到的是这样的。 因此,让我做铛buggy2.c的,Enter键。 现在,它再次名为a.out。 输入。 我只看到一个新的生产线,只有最后一个新行 我的提示移动到下一行。 ,但显然我已经打印*,然后一个新的生产线, *,然后一个新行。 但是,什么是这里的错误? 是吗? 观众:[听不清]。 DAVID J.马兰:没错。 因此,不像有些语言,如Python中,缩进 实际上有功能意义,在 语言,如C - 正如我们将看到的,PHP,JavaScript的 - 的的缩进是真的,只是为了人类的利益。 因此,事实上,我已经缩进了16和17号线看起来不错, 但它没有功能上的意义。 如果我想这两条线执行的一部分, 循环,那么我必须把它们括在大括号内这样做。 你只能砍那个角落,省略了花括号,如果 什么情况下? 观众:只要一行。 DAVID J.马兰:只要一行。 所以,这只是一个很好的排序,排序的语法细节,使 你不要浪费时间写三行,其中两个是 花括号,只是写了一行代码。 但是,如果你有两个或两个以上的线,我们 确实需要做到这一点。 所以,现在让我保存这个。 让我继续前进,重新运行铛。 然后让我重新运行a.out的,现在我让他们每行一个。 现在,a.out格式是怎么样的一个愚蠢的程序名称。 我怎么能告诉锵给我一个文件名 更重要的是用户友好的,像buggy2本身? 一个更清楚一点吗? 观众:[听不清]。 DAVID J.马兰:OK,所以我其实可以采取非常 用户友好的快捷方式,只是写buggy2。 我不指定,C在这种情况下,并按下回车键。 做确实是编译buggy2.c我 问铛做到这一点。 具体而言,它会调用铛铛,它运行使用方式 比我真正需要的命令行参数或开关。 随着时间的推移,我们会回来,所有这些不同的 神秘的连字符号的表达的意思。 但就目前而言,这只是救了我的麻烦 记住,不必输入所有的这些 不同的连字符号的表达。 上攻,最终是 现在我有buggy2。 如果我想做到这一点,不过,我手动 而是可以做到这一点 - 铛-O buggy2然后buggy2.c的。 这同样给我一个名为buggy2。 因此,在短,铛的编译器。 使仅仅是一个用户友好的工具,我们将使用更多的 多,因为它只是开始 简化对我们的事情。 而我们,最后返回0。 现在,只因为,但我们会开始戏弄的那部分 今日(星期三)。 对任何有任何疑问? 是吗? 观众:[听不清] LS的报价有吗? DAVID J.马兰:OK。 当我输入ls命令报价,那是我做了一些神奇的 幕后修复一个bug。 我忘了,好像我们已经告诉你了 讨论板,做的 - 我们会做到这一点现在 - :sudo的议案Ÿ更新appliance50,。 哎呀,这拼写正确的。 因此,设备,就像是一个操作系统。 它的运行这个名为Fedora操作系统。 而现在,因为我的Internet连接速度较慢,我已经 真的大清洗。 因此,运行sudo yum更新,我们告诉你做的 习题集,基本上是喜欢跑步的自动更新 在Mac OS或Windows。 和的原因,这在一开始的 问题集,因为当我们创建设备时,我 搞砸了,我不小心让所有的程序看 黑色在黑色屏幕上,这就是为什么你没有看到他们 默认情况下。 但设备的最新版本修复了这一点。 我会解决这个问题在休息,一旦我有上网 连通性。 因此,在报价只是隐藏我的错,非常谨慎, 显然。 其他问题吗? 是吗? 观众:不使来自? [听不清] DAVID J.马兰:好问题。 在哪里做从何而来? 这是一个Linux程序已经存在了很多年,长 前CS50。 它配备了如Fedora操作系统。 它不来从CS50库。 事实上,来自CS50库的唯一的东西, 到目前为止,我们已经看到的,是GetString时,调用getInt,所有的 这些获取的功能,以及字字符串,并在一定 程度上,这个词的布尔值。 但是,我们会逗,除了当我们深入到CS50 设备本身。 所以,是的,还有一个问题在这里。 听众:当你说,然后车,请问该怎么 计算机知道[听不清]? DAVID J.马兰:好问题。 所以,当你只需要运行使buggy1或使buggy2,如何 做知道吗? 因此,默认情况下,如果您键入buggy1,寻找一个 文件名为​​buggy1.c。 然后执行的适当铛命令, 从而覆盖默认的输出文件名为a.out。 事实上,如果我们看一下在做什么 - 让我们退出。 如果我们看一下实际上是做什么的,让buggy2, 它已经是最新的。 因此,让我的rm命令删除, 程序我以前写的。 键入Y-E-S确认,我想删除它。 如果我现在做,请注意,在这个很长的线, 这最后一件事,在这里:-O buggy2。 所有品牌做的是通过这样的说法,可以这么说,到 铛,我没有自己输入。 好了,所以快速夫妇的行政 公告。 因此,对于部分,从而正式开始了这一未来 周日,你会总是要带上,如果 你有一个,一台笔记本电脑。 如果你没有一台笔记本电脑,也达到了我的 把我丢一封电子邮件。 我们会找出一个工作流程。 一般,你会发现在部分是,他们的一部分 的概念,部分动手。 我们会专门用一节的问题, 本周的问题集,通过一些走 从演讲的概念性材料。 而这一切在目前的习题集。 而且我们还深入到一些实践活动,有时 其中将被要求提交,有时 哪些不会。 例如,第一周,他们注定只是作为一个 热身运动。 你会发现,这些问题真的只是。 这意味着他们是相当小的,但不一定 重要的程序写的,不一定 令人兴奋的和自己,但良好的机会 练习用的语法,新的功能,在一个舒适的 部分,在那里你有几个你的同学表现为 以及您的TF。 随着时间的推移,我们要做的是使用称为CS50空间的工具, 据此,而不是仅仅使用CS50家电,你会 而不是去一个网页在浏览器中,你就可以 在部分编写代码在浏览器窗口。 然后,如果你选择的,你的助教可以显示 不管它是你在你的屏幕在浏览器中输入 窗口在全班同学面前,无论是匿名或 公开,因此,他或她可以步行通过与 你的同学,你做得很好,你没有做的很好。 再次,放心,所有这一切都可以很好匿名。 但是这将是一个很好的机会,让更多的 类似讲座的互动性允许的。 在此期间,我们将这些东西叫做超级 部分,这是可选的,但是是向所有人开放 类的,这样你可以做到这一点更合 问题的设置。 这里的时间表。 这是也发布的网页cs50.net。 请注意,这里是一个黑客特定 明天下午。 我们会拍一个今天和明天,发布者 在24小时内在线。 所以,如果你不能做任何的这些时间,不用担心。 再次,日程安排在线cs50.net。 在切片本身而言,你应该得到一个 电子邮件,指示你去的过程找到的网页 你的部分。 如果生活发生了改变,你需要改变你的部分, 不是一个问题。 返回到相同的URL,cs50.net/section,奇异, 你会填写类似的表格,这样就可以 然后给我们您的喜好。 同时,我们会作出跟进,本周的结束,我们所能 容纳。 上周,记得,我们提出使用CS50讨论的, 该课程的讨论工具,在课堂上。 因此,我们不得不问的40个问题,和 在演讲回答。 因此,它似乎很好地工作,因此,我们将继续 努力做到这一点。 如果您在演讲过程中,不只是感觉很舒服提高 你的手,而不是一个问题。 cs50.net/discuss,张贴在那里,我们的教学 研究员将接听电子或提高 匿名问,这取决于您的名义手 问题的性质。 的反馈,一般的pset会 在一个星期内返回。 因为它需要一小会儿的部分实现 均衡,第一pset中,0和1,将一点点 延迟沉淀下来的东西。 但敬请期待,在未来几周内。 好吧,让我把我严重 只是一瞬间的声音。 因此,这实际上是一个有趣的气候 具有这个讨论中,与所有其他的事情 在校园内与之有关的事情。 但CS50当然有其历史的这个特殊的 主题,每年在尽可能多的,这门课程,对许多人来说 年,广告板之类的大约3%。 最近一年,2011年,CS50广告登上35名学生。 ,我想,这是不是由于缺乏明确性。 实现课程的教学大纲中,有一个页面 说明,解释的线条。 重复相同的语句上的每一个 问题设置第一页上。 所以,我今天提到这真的只是为了让 人们重视。 我们已经尝试了不同的东西。 我想,今天我们会做的只是花一点时间来 其实看过去的情况下,已经提出了一些。 而不是让这些肮脏的小秘密,其实 指出学生做了什么,以及我们如何检测 它和真正的首要动机是什么 甚至讨论这个问题。 因此,随着中说,该行基本上是这样的 - 根据教学大纲,你不客气,你被鼓励,以 与同学交谈。 这就是全部的这些合作的目的 办公时间安嫩伯格和鼓励的人 最后的项目协同工作。 当它来的时候,其实写的,但界线 您的最终解决方案。 说到英语,完全正常,伪代码, 完全罚款。 通过电子邮件发送同学PSET,让他们看 屏幕上的手继续键入, 过线。 不要看教学大纲的特定行。 但为了画一幅画,这是怎么不幸的是 现实中,实现有网站在那里, 有这一类的解决方案和许多其他类。 事实上,你或约3%,你知道这存在 这意味着,我们知道存在的。 事实上,有这样的网站,在那里你 可以花钱找人做你的问题集 - 这是 实际的情况下,来到了去年。 这是一个网站叫做odesk.com。 和TIM的名字是这里的人到底是谁发布 本网站,并要求别人做他的pset 7 这种特殊情况下。 那么,odesk.com是非常谷歌能,我们也没有 在谷歌搜索非常好。 在这里,有网站 - 这是相当 残酷的,坦率地说。 [笑] DAVID J.马兰:关于本网站的有趣的事情是,如果 你读了“关于”页面,他们谈论他们的企业 文化和客户服务是他们的头号 优先顺序,以确保您的任务获得 开启时间。 再次,但在所有的严重性,事实上,这些网站 存在,实现我们也认识到, 这些类型的站点。 给你什么样的感觉形成一般 需要,我们一般不会有很大的丑闻,人们 任何形式的大规模合作,而是 它的这些弱点,深夜的时刻,你有 很多工作要做,这是上午04点00分,你累了,和你 心里对自己说,好吧,让我来看看我的 室友或朋友的代码等。 的表现,这不幸的是涉及学生 像这样的学生B一起提交一个提交的东西 这样的事情,其中​​肯定的是,在一台电脑 理科类,是非常简单的计算机科学家 检测软件。 这是另一种常见的范例,在那里,你 一起工作的人,也许说 英语,就好了,伪代码。 但后来它的时候,实际提交,pset时 刚刚获得通过电子邮件或Dropbox或类似的交换。 但是,在不那么明显,这是企图使 发生了什么事,那么这就是提交的。 这也是,不跳闸,写得很好件 之类的软件,我们必须实际检测 这些各种各样的东西。 事实上,我们要做的是运行的软件比较所有 今年提交的文件对过去一年的 意见书,反对一切我们发现在 互联网,在那里对每一个招聘网站。 这一切都非常自动化。 因此,我们这样做真的很大公正的97%的 真正的工作在这方面和其他的驴 类,并把所有的努力,使工作 他们最终提交的是自己。 我可以去的年龄。 去年的情况下,只是极少数。 一些学生提交的这些文件相同的pset 2, pset中3,PSET 4,6,PSET 9 5,PSET的pset。 在这种情况下,这是竞猜0并在去年,其中两个 学生提交相同的这句话在许多 其他“类型的请求 - ”点,点,点。 因此,即使在一类600,我们发现这 对提交的测验。 因此,在短期,这 - 坦率地说,我讨厌这种 谈话 - 但是这的确是一个刻意 今年尽量压低这个数字。 因为即使我们说这些事情每 今年,我觉得现实有得住就可以了几个 比平常多秒,其实只是指出 ,看起来可能,嗯,没有什么大不了的,至少 回想起这个特殊的时刻,无论是在公平性 你自己和你的同学在这里。 所以,如果你有任何问题就行了 ,请伸出手,就我个人。 但是我的回答永远是,完全强调, 最后一分钟,在晚一天的现金。 或者,如果这是一个问题,没有任何迟交天数, 说实话,亲自给我发电子邮件。 我们会想出一些东西。 请不要把你的时间在哈佛的风险。 现在,我想我们应该减轻情绪,所以我 包括下一张幻灯片。 [笑] DAVID J.马兰:此网站是伟大的。 事实上,我有点心烦意乱。 有这一个。 那么这个人是惊人的。 好了,所以想到,小猫在深夜时, 这些决定。 好,那么更多的乐趣和不太严重的东西,比如 条件。 好,那么我们短暂交谈,了解这些。 这是这可能是相当熟悉的 从头开始的世界。 在世界上的划痕,我们有这方面的需要,有时 去岔路。 可以这样做或这样或那样的东西在这里。 而当我们要做到这一点,我们就可以使用,在C,这一点,如果 else结构。 那么在这里我们有布尔表达式。 例如,布尔表达式在这里,我们可以或 他们在一起,在这个意义上,我们有这个条件,或 这一条件。 我们可以和他们一起,在这个意义上,我们要 检查此条件,但该条件。 在这里,我们有一个switch语句,这是不那么 类似的语法上的那些种条件,但它 允许我们这样做相当于,如果,如​​果,如​​果,否则, 如果,并通过简单地枚举他们个案等 由个案。 于是,我们看到了这些最​​后的时间。 然后我们就开始接触后,循环类的东西。 我们刚才看到其中一个。 但也有其他循环结构。 比如,这一个在这里。 因此,虽然(条件),一次又一次地做这件事情。 因此,从根本上说,这之间似乎是不同的 这里for循环,这个while循环? 这for循环,这个while循环。 是吗? 那是什么? 观众:[听不清]。 DAVID J.马兰:好。 而在循环条件,显然有 更多的语法。 有这样的初始化,此更新。 在while循环中,只是有这个条件。 如此看来,这是一个有点缩减兑 循环,这意味着如果我们希望有变量,我们希望 有递增,我们实际上有 我们自己做这件事情。 所以,让我去进取,不断开拓gedit的。 让我切换到设备。 让我们做一个快速的小例子, 区别之一从其他。 在我的脑海,我应该说的一件事。 我特别提到了名添。 蒂姆是确实有人,有学生试图找到做 他们为他们的功课。 我们没有添在特定的部分。 因此,实现好,免得我透露一个学生,是不是学生。 这是一个素不相识的人在互联网上做的事情 由代理在去年。 因此我们发现了。 因此,在这种情况下,在这里,让我继续前进, 打开一个新的文件。 文件,新建。 这给了我一个标签。 让我继续前进,将其保存为loop.c. 让我走,单击“保存”。 那么在这里,让我们继续前进,并开始写 等级。 让我放大。 现在,我们要做的诠释主要(无效)。 现在,让我继续做(INT I = 0; 哦,我+ +)。 现在我要继续做打印的明星,我 前面所做的那样。 然后在课程结束后,我们只是要 打印新的生产线,只是让我的提示 不看所有的凌乱。 返回0。 似乎语法上是正确的吗? 到目前为止。 所以,让我们来看看。 因此,让我放大了,进入我的终端窗口。 让我继续运行循环,因为我把这个 事情loop.c. 所以循环。 似乎编译OK。 让我跑环,现在输入。 它似乎已经印刷了10位明星。 因此,让我们将它转​​换为一个while循环,看看有什么 种问题,我们绊倒。 因此,而不是这个,让我就在这里说,而我是 小于10 - 让我摆脱的for循环。 好了,我们已经有一对夫妇的问题。 因此,条件是相同的,但我明显缺失 初始化。 我错过了递增。 那么应该怎样编译器可能会告诉我,当我尝试 编译这个程序? 是吗? 观众:[听不清]。 DAVID J.马兰:好。 因此,它会说类似未申报 - 在这种 在这种情况下,变量。 事实上,使用未声明的标识符我。 所以这是在对比的语言,如PHP, Python和Ruby,有些人可能是熟悉的, 在那里你可以开始使用一种变量 不管三七二十一,而不必担心有关声明 明确的始终。 在C语言如Java和C + +,你必须要 超明确。 如果你要一个变量叫我,你一定要告诉我 它是什么类型的变量。 因此,我们要解决这个问题如下。 我要在这里输入INT I,因此, 我声明了一个变量叫我。 现在,我已经跳过一个步骤。 我显然没有初始化它,但让我们看看,在 品牌铛停止抱怨。 因此,让我重新制作这个节目。 好了,现在它只是抱怨 出于不同的原因。 “变数”我未初始化的时候用在这里。“好,那么 这是非常清楚的。 初始化设置它的值等于。 我们还没有这样做,所以让我来试试等于0。 现在,让我们再试一次,然后重新运行铛。 编译时间。 我运行它。 但是又大又老的无限循环,因为我已经做了 初始化时,我已经做了的情况,但我从来没有做过 任何形式的递增。 那么,我该怎么办递增? 那么,在一个while循环,那感觉就像我要去有 做它的内部循环,因为非常类似于第一个 本周的的做循环结构的例子,如与 袜子和计数,我们不得不这样做 在最后的东西,想回去到下一行。 如果我继续做这个,我+ +吗? 让我们甚至不能编译这个。 赶上我了。 什么是错的吗? 观众:[听不清]。 DAVID J.马兰:这绝对不是整数。 这是我。 和花括号,像以前一样, 缩进是不够的。 所以,现在我有这个。 因此,虽然我是小于10,打印的明星, 然后递增。 的方式,而循环的作品,只要你打的 底部的循环,在这种情况下,看起来像10行, 它会回到6号线,在这一点上, 条件将被再次审核。 ,如果我仍然低于10,我们会做8号线和 然后按9,然后我们会打10,并返回至6,再和 一遍又一遍,这样,只要i小于10。 因此,让我们重新运行。 好了,我们已经编制了还好。 让我重新运行循环。 现在它实际上似乎工作。 所以,这里的长处和短处? 嗯,到目前为止,有其实并没有一个整体的巴解组织 - 太可爱了。 所有的权利,这是一个 - 啊,那是个意外。 好吧,让我们回到for循环。 因此,for循环是不错的,因为他们是超级明确。 即使他们写的是一个有点笨拙,这是 非常强大,它可以让你做 多件事情。 While循环不似乎有一个巨大的量的值 然而,因为它感觉就像是我们必须做更多的工作。 我们必须把初始化在这里, 更新在这里,我们要记住做的一切。 因此,我们会看到在while循环的时间,实际上是借 只是不同的背景,不同的数据 列表和哈希表等结构的事,我们会得到 学期中。 但现在,知道有这第三类被称为一个做 while循环。 我们已经看到了这个简单。 这可能是超级有帮助的pset 1。 任何时候你想要做的事,然后检查 用户合作,如果他们没有,再这样做,一做, while循环适合自己的那种逻辑。 因为作为从顶部到底部的顺序在这里表明, “的字面意思是”做到这一点。 一次又一次的做到这一点,可能是什么? 也许这意味着调用getInt或GetString和 调用getInt或GetString的检查值,然后大呼小叫 在用户,如果他们没有要求他们合作, 再次,一遍又一遍。 如果您想要做的事一次, 然后检查一些条件。 所以,让我们来试试这个。 让我真正改变现在到do-whil​​e循环。 我要继续前进并执行以下操作。 因此,请执行以下操作。 让我们做INT I =调用getInt(),但让我们先告诉用户 该怎么做。 有那么一点点不同,这一次。 “给我一个int”。 所以,我会使用printf。 现在我来这儿的,我要做到这一点 而我,比方说,大于 - 让我们来看看,我是,让我们说,小于0,或I 大于10。 换句话说,我想一个数字从1到9,只 随意。 所以,我使用的是组合布尔表达式,这里 确保i是小于0或大于10时,在其中 情况下,我会在这里做这个循环。 所以,再一次,做到这一点 - 而i是小于0或i是大于10。 现在让我们继续前进,做到这一点,一旦我们做到了这一点。 让我们做一个快速的完整性检查。 printf(“请谢谢你,我是%d”,I)。 因此,这个简单的程序要求用户类型为int的, 确保是在一定范围内,1至9, 感谢用户,提醒他们什么,他们只是 输入的,只是作为一个小的完整性检查。 但是,让我们来看看,如果这个工程预期​​。 让我去低着头,并重新运行make循环。 嗯。 “使用未声明的标识符'我'”。这很奇怪。 我想,我们议决。 相同的症状,但不同的代码。 是吗? 观众:[听不清]里面的两个,我们必须 [听不清]。 DAVID J.马兰:没错。 因此,这实际上导致我们的主题被称为范围。 原来,C,再次,它真的需要你从字面上。 如果你做这样的事情,你声明一个int 然后将其分配一定的价值,但你这样做,里面的 一对花括号,什么C也就是它假设你 只希望知道,因为我存在于那些32位 这些花括号的情况下,行范围内 6至9。所以我宣布,它被赋予一个 在第8行,但只要你以外的 9号线以下的花括号,我不再是 范围,可以这么说。 S-C-O-P-E。它不再是在正确的上下文。 所以,现在有没有我,所以,虽然我们甚至没有 宣布它在所有。 那么,什么是修复这样的事情,如果 原因是,我花括号内声明的, 显然是坏? 在这里吗? 观众:[听不清]。 DAVID J.马兰:是的。 因此,我们可以初始化外面。 因此,让我继续和删除的声明部分, 我指定的类型,并让我在这里做起来。 因此,在第5行,现在说“给我一个int。”我呼叫它。 请注意,在第9行,我并不想这样做,因为我 已经有32位。 我不想问电脑中 不同的32比特。 我想使用相同的32位。 而现在,因为我是第5行中宣布,它仍然是合法的 使用它在第11行和第12行。 因此,让我尝试重新编译,看看 如果铛停止叫喊。 使循环。 因此,现在是“隐式声明函数 调用getInt“在C99是无效的。”那是什么?“ 是吗? 观众:[听不清]。 DAVID J.马兰:是的。 所以,现在,我实际使用的调用getInt,这是不是 这只是配备了C.这是来自CS50。 因此,我们需要在这里。 让我回去的迅速下降 在这里,重新运行。 好了,终于。 现在我们已经解决了,其它的错误。 让我跑去循环,并看看会发生什么。 “给我一个int。”我给它11。 我给它-1。 我给它富。 我给它5。 而现在,它确实工作的。 但提示改变的原因就在这里。 为什么说重试这些时间,但给我一个 int的三倍吗? 这是为什么行为有什么不同? 听众:给它一个字符串。 DAVID J.马兰:你说什么? 观众:你给它一个字符串。 DAVID J.马兰:是的。 所以我们给它一个字符串在这第三次尝试, 当我输入foo的。 foo是一个字符串。 这显然​​不是一个int。 CS50已实施的方式调用getInt的是,我们 不检查,如果事情是小于0或大于10 你,因为我们该如何提前知道什么样的 int的你要吗? 最低限度,但我们可以检查你的,没用户至少 输入一个整数? 如果他们没有,我们喊在用户键入“重试” 在屏幕上。 所以,现在我们有一个程序的循环。好吧。 现在,这是一种更好的结构? 因此,这是事情开始变得有些混乱, 事实上,你一定要记住在这里声明一个变量 如果你想使用它里面的一些 花括号外。 但是,即使这看起来有点神秘 一目了然,只是,记得简单的逻辑。 为了使用任何C,它是否是一个函数或 它是一个变量,你必须包括它,如果它是一个函数 在一些图书馆,或者你需要声明它。 但现在你需要额外注意的事实, 你宣布它在正确的范围内。 你不把它得紧紧的括号内。 所以,让我真正回滚。 如果我们回到我们的例子前面的内容,和我一起去 为int i = 0; <10; i + +,和我 做printf的明星,这样,然后关闭括号,现在 printf的,我是现在 - 根据同样的逻辑,会发生什么事,当我尝试 编译这个程序? 观众:无效的标识符。 DAVID J.马兰:这是另一种无效的标识符, 未声明的标识符。 现在,原因是有一点不同。 这里显然没有花括号,但同样 的想法,同样的故事,适用范围。 如果你像我声明了一个变量内的 循环,即使你没有明确的书面的花 括号,认为他们在精神上仍然存在,在 情况下,我是唯一有效的内部循环。 它是无效的,一旦你到下一行,这 这种情况下,现在是10。 因此,只要几个问题的范围之类。 好吧,什么问题吗? 正确的,所以这是一个简单的小程序, 打印小星星。 但是,让我们来看看,如果你还记得这首歌。 这是一个令人难以置信的讨厌的歌曲,孩子们会唱 校车等。 但好处是,它有这样的周期性, 据此,它的“99瓶啤酒在墙壁上, 99瓶啤酒。 拿一个,通过它,98瓶啤酒 墙上。“的歌曲,然后重复97,然后96,然后 95,94,一路下降到0,如果你真的得到了, 远在总线上。 因此,这是一个很好的方案的实施进行排序,因为我的 上帝,如果你可以只实施这几个 行代码,你可以吐出这整个歌词 歌曲相当快。 但前进的道路上,我们现在就可以开始梳理除了一些 这些基本的循环结构,现在也 介绍,我们写自己的函数,返回值 我们通过左右。 但是,第一,为什么我们不继续前进,并采取我们的五分钟 在这里休息一下吗? 当我们回来时,我们会唱这首歌。 好了,所以我们又回来了。 我说,我们现在唱这首歌时,我的意思是 通过编程,而不是口头上。 所以在这里我们beer1.c,这是一个实现 特别的歌。 而仅仅是明确的,对于那些不熟悉 这件事情的样子,让我继续 使beer1,回车。 现在让我跑beer1,我们会看到什么 - 有多少瓶 啤酒有吗? 我会输入99,喜欢的歌。 输入。 现在,如果我们通过滚动 - 很抱歉 - 如果滚动通过这一切,我们会看到, 这确实唱整首歌曲。 等待一分钟。 我的滚动条有点乱。 让我们用更大的窗口。 因此,beer1,99,我们走吧。 所以在这里我们唱整首歌曲,更快, 计算机,它可能是我们。 所以注意到,虽然,这里的周期性质。 它说99,然后99,然后拿一个下来,通过它 围绕“98。 现在,它重复了一次又一次。 因此,这实际上是一个绝好的机会某种 循环结构。 请注意,我这里种切割一个角落。 请注意,我说:“在墙壁上的98瓶啤酒, 在墙壁上,97瓶啤酒“,这仅仅是 当我们得到一个瓶啤酒,我没有 担心的英语语法。 但我们也可以解决这个问题的,如果一点点 的情况下,也许。 如果这个数字是单数,继续说:“瓶子”, 否则,如果它是多元的,说:“瓶”。 但现在,我完全切断那个角落。 因此,让我们来看看我们有什么。 因此,我们在上面已经得到了一些意见。 我包括这两个库, 我们已经普遍了。 现在让我向下滚动到第一 实际的代码行。 第17行揭开序幕主。 21和20号线将有多少瓶啤酒? 然后调用调用getInt。 现在我有一个位的完整性检查。 因此,这是一个约定,我们现在将开始采用 更严格检查用户的输入。 有时候,你只是不希望促使他们再次 一遍又一遍。 如果用户螺钉和不配合,挺好的。 退出,只是不处理。 所以这是我在这里做什么。 如果n是小于1的,我只是骂的用户, “对不起,这是没有意义的。”然后我去 随意返回1。 所以,再一次,这仅仅是一个惯例习惯。 现在,只要相信。 但到现在为止,我们一直返回0,因为 我们说过的话返回0表示什么呢? 观众:成功。 DAVID J.马兰:成功,仅此而已。 所以,现在我们终于开始思考 非成功 - 换句话说,角的情况下,错误条件 - 现在我有一个无限供给,或至少四个亿 可能的事情,可以去在我的程序错误。 我就可以开始给他们分配单独的数字。 现在,一般就足够了刚刚返回 0以外的东西。 因此,我们现在简单地返回1。 但是,返回1的原因是,一旦你返回 1,你猜对其余的程序会发生什么情况? 它停止。 就是这样。 因此,事实上,我返回1是有效的 短路这个程序的执行,使 第27行以下将继续执行。 一旦作为主要的回报,就是它了。 所有权利,因此,如果用户合作,我们到达第30行 因为他们中键入一个合法的号码,这是我的 这首歌的实施。 所以,我第一次打印一个换行符,只为 美学。 我现在有一个for循环。 请注意,我做的事情位 不同的方向。 我没有想得多做得少,我没有做+ +。 相反,我可以说初始化变量i,它设置为等于 N,用户输入的数量,然后执行以下操作,所以 只要我是大于0的,然后我 - 一旦你完成了这个循环的一次迭代。 因此,我们可以使用for循环倒计时为好。 现在,这是相当多星期的东西现在,用printf。 因此,打印“%d的啤酒瓶在墙上。”打印“%d 瓶啤酒。“”拿一个下来,传递它。“打印 “%d个啤酒瓶在墙上。”因此,它仍然是%d,但 注意的参数printf是不断变化的。 在逗号后面,我有我的,因为我想说的是99。 这个逗号后,我有我的,因为我想说的是99。 这个逗号后,我有我 - 1,因为我想说98 这第一次迭代中,等等。 现在在这里,我只是有一些鸡毛蒜皮的话。 然后第42行,返回0,按照惯例,表示 一切都正常。 那么,如果我弄错了吗? 一个常见的​​错误是什么? 那么,如果我不小心说好了,我要算 下降到0,我想0的啤酒瓶在墙上吗? 所以我说,我是大于或等于0。 这是怎么回事,是我现在的症状看,如果我重新编译 beer1并运行它呢? 观众:阴性。 DAVID J.马兰:是的,这是要去负。 这是一个令人难以置信的一个off-by-one错误, 常见的错误。 让我们回到终端窗口 在这里,所以我们可以看到更多的时间。 输入,99瓶啤酒。 关闭,但我们就非常轻微太远。 我们唱的歌曲太远了,这样,我们现在打的 负数。 因此,它不是那么回事。 好了,这样我们就可以很容易地解决这个问题,回去 它曾经是。 但有一些机会 改善? 好吧,让我们我打开beer2.c,向下滚动这里,并采取 看看这个版本。 什么跳出来的第一件事情就是在你为不同的 在这个版本在这里? 观众:[听不清]。 DAVID J.马兰:是的,所以没有更多的我,是因为它发生在 我说你知道什么,我询问用户的n,然后我 设定i等于n,然后我改变了我,但我从来没有 接触N键。 那么到底什么是你点的分配另外32个 位叫我,这样我可以有一个不同的变量? 因此,在这种情况下,我认识到不必要的 设计功能。 我现在去说,而n是大于0的,去 进行打印同一首歌,通过一个n的printf的 第二个参数,N - 1,第二个参数在这里。 然后在这个循环的每次迭代,继续前进,只是 减n本身。 现在,在功能上,这个方案 会是相同的。 如果我输入99,正开始在99。 我递减,递减,递减,递减。 我要一路下调至“一瓶啤酒 在墙上,一瓶啤酒。 拿一个,到处传递。 0的啤酒瓶在墙上。“结束,因为我做 得到正确的条件。 这是大于0。 我没有犯这样的错误。 因此,这是更好的,版本1或版本2? 所以,我听到了一堆怨言了两个。 为什么是两个呢? 那是什么? 观众:[听不清]。 DAVID J.马兰:哦,好吧。 因此,它不会低于0,但要记住,在一个版本, 原来正确的版本不低于0或者去。 所以请记住,这是正确的版本。 因此,让我们至少比较正确的版本。 什么是赞成的版本的参数 两个分别是,嗯,更好的吗? 是吗? 观众:它使用较少的空间。 DAVID J.马兰:好了,所以它使用更少的空间,对不对? 而使用一个版本的32位为n,然后又 32位我。 版本只使用32位为n,所以 似乎是一个加号。 其他的想法? 有谁不想争辩赞成,1? 是吗? 观众:你必须使用额外的代码为n - 。 DAVID J.马兰:好,确保万无一失。 所以这是公平的。 所以这只不过是,至少对我来说 - 我的意思是,这其实感觉稍微复杂一些,但事实上, 我不能在一个封装了所有我的逻辑排序 线条美,for循环,for循环可以。 在这里,我有钉在这n - 在循环结束时,由于 它的必然逻辑。 但它种磨我走错了路,只是因为它 似乎从这里的逻辑分开,即使 再次,它是必要的。 其他的想法? 是吗? 观众:[听不清]。 DAVID J.马兰:是的。 那么,如果你去,在结尾的歌曲,希望 再次打印出这首歌的名字吗? 打了99瓶啤酒,如“谢谢”,或者什么 这样的傻吗? 但问题是,你想进入到原来的值。 事实上,你已经突变或改变n在每 迭代,因此破坏了其原有的价值 意味着你不能做到这一点底。 可以说,现在,我们可以清楚地不想要做的 ,在这种方案。 那么,谁在乎呢? 但是,这是一个非常有效的一点。 而且说实话,现在真的是没有人 正确的答案。 他们两个人都同样正确。 我可以确信无论哪种方式。 我会说,在一般情况下,这是一个很好的原则,如果你 要求用户为某个值,并且将存储在变量 如N,只是有点原则上,它可能是好 保持周围。 和任何你想要的数据变异,一遍又一遍, 给自己一个该变量的副本,只是让你 有机会到原来的。 你花32位,但现实的情况是这样的 电脑,喜欢,2 GB的RAM,这些天, 我们纠缠了32位? 真的不是什么大不了的。 甚至在此设备,用半的演出或 千兆字节的RAM,32位和64位, 没有什么大不了的。 当然,今天,这将是不堪重负的大小的方法 程序本身,这将是几百 千字节,如果不是几百兆,这些天。 因此,合理的关切,没有一个正确的答案。 但至少这些都是想法,应该开始 经过你的头脑吗? 由于在pset中0,即使我们真的只有预期 正确性,或者至少是否认的各种错误, 你可能也遇到过,因为我们向前迈进,设计 将是另一个重要方面,编写代码 也是我们的评估代码。 因此,至少给想这样的事情。 只是因为一些作品,并不意味着它的好, 并不意味着它的精心设计。 而那是一个的教学研究员的东西, 问题集将帮助我们逗随着时间的推移。 好了,怎么样,让我们​​说,这个版本吗? 让我做的东西一点点性感这里的时刻。 首先,让我摆脱这一点。 现在让我们来解决这个语法问题。 所以,我想在这个版本中修复的语法,所以, 而不是仅仅说括号中的S,如“瓶” 或“瓶” - 我不想砍那个角落 - 我也想动态地打印出来的字“瓶” “瓶”,从而利用这些%S占位符。 所以,我需要有条件地检查i的值是什么。 如果是1,我想说的“瓶”,而如果它的任何东西 否则,我想说的“瓶”。因此,让我们尝试这样做。 所以,如果我== 1,然后就让我去,并宣布 - 我需要一个字符串,所以让我做字符串s1,因为它是 第一个字符串我只关心现在。 我会说:“瓶子”。然后,让我们来看看,串 S2 - ,我将解释我要去的地方在一个时刻 - “瓶”。所以记得,在这首歌中,我们需要能够 打印的东西,两个不同的词可能。 因此,如果我们回头看看在这里要注意的是,当我们到达 这个例子在这里,“两瓶啤酒在墙壁上, 两瓶啤酒,一跌,通过它,我想 这第四行说:“一瓶啤酒 墙“,所以我需要决定,我想说的”瓶“ “瓶”吗?所以,我要武断地说,没事的, 我现在宣布一个名为S1的变量,字符串 一,要插在这里和这里, 因为这些话都是相同的,只是因为 歌曲的性质。 我现在就打电话给S2的话,我想 最终会出现在这里。 现在,从字面上看,满分100分的99倍,它的将是 在这种情况下,因为是复数,2 复数,4个是复数。 但在这个角落里的情况下,我们得到为2,然后按1,或 即使是1和0,我需要这样的逻辑。 所以,我必须花一些时间在我理解的正确的代码。 所以,如果我这样做,如果我== 1,则集合S1等于“瓶” 和S2等于“瓶”,因为这将是1 瓶,而这将是0瓶。 而这里,这是什么代表什么呢? 只要是明确的。 这仅仅是一个评论。 因此,事实上,你可以有单行注释意味着你 注释你的代码,但另一种常见的 范例,也就是如果你有一个超级短的短语, 你想要把自己和它只是更具可读性,把 正确的代码行的末尾,你可以 绝对做这样的事情。 所以,现在如果我这样做呢?否则,如果i不等于1。 因此,砰等于 - 被称为“砰”的惊叹号。 因此,砰= 1。 所以,如果我是不等于1,什么我不是想这样做吗? 那么,第一个字我要的是什么吗? 因此,字符串1用于多瓶“瓶”, 那么这将是复数的“瓶”为好,现在。 我们来看看这实际上是让我们 我们想要去的地方。 所以,现在如果我在这里向下滚动,请注意,我堵在 不仅是我,但S1。 我堵在我和S1。 然后向下这里,我减1,这是相同的 之前,但s2的。 换句话说,我想改变基础的英文单词 这个逻辑。 现在,已经有一些在这段代码中的问题。 什么是已经出了门坏了吗? 是吗? 观众:[听不清]。 DAVID J.马兰:没错。 所以,我已经侵犯范围的教训。 所以,我宣布s1和s2,但我已经做了它里面的 花括号,里面是啊,这段代码将工作 直到第42行,但只要我打43号线,你猜怎么没有 不再存在? 好了,你猜怎么着不再在范围 - 既不s1或s2。 因此,我们必须解决这个问题。 因此,让我删除的声明。 我会离开的变量名,这里删除 并删除在这里。 在什么线我真的应该声明这些东西吗? 观众:[听不清]。 DAVID J.马兰:是啊,所以可能 在这里,直到33上下的。 因此,字符串s1和字符串s2。 而事实证明,我可以做到这一点。 如果你声明了两个变量相同类型的, 实际上,你可以只用一个逗号和做到这一点。所有 正确的,所以我现在有两个变量 - s1和s2。 我给他们分配这些值 条件在这里,或者在这里。 然后我使用了下面。 如何以及现在去上班? 那么,它仍然是一个小马车,但至少让我们看到 有多远,我们已经得到了。 所以,让我继续,并beer3的。 是这beer3吗? 是的,这是beer3。 现在让我们我继续运行beer3的。 399 99。 我们可以跳过其中的大多数。 在这里,你看那个。 “在墙壁上一瓶啤酒,一瓶啤酒, 一跌,通过它周围,啤酒瓶在墙上。“ 但我提请你注意,只有一半的解决方案。 类搞砸了这里。 因此,它似乎角落的情况下出现时,我等于什么 两个值吗? 观众:1。 DAVID J.马兰:2和1。 这是不为1,而不是1。 这真的只是这些这首歌曲的最后两段。 那么,什么我不是想要做什么? 因此,我似乎已经陷入的情况下,如果我是== 1, 那么第一个字是“瓶”,但第二个字 “瓶”。但在这里,我想改变这是== 2。 而如果是这样的话,我该怎么想的 第一个字是什么? 观众:“瓶”。 DAVID J.马兰:“瓶”,所以两瓶。 然后,这个词在这里应该是 - 观众:“瓶子”。 DAVID J.马兰:“瓶子”,单数。 好吧,让我们放大了,回到这里,重新运行make, 重新运行,99式再次beer3。 好吧,“分割故障(核心转储)。” 我做了什么错了吗? 观众:你不必值[听不清]。 DAVID J.马兰:啊,良好的出发点。 好吧,有什么错吗? 所以分割故障,我们其实要看到 这是一个几十倍的未来,是故意的。 但现在,这其实是什么意思? 几乎总是意味着你有一个分割故障 不知何故试图存取记忆体,RAM在您的计算机上, 不属于你的,你有没有问 操作系统。 因此,在这种情况下,请注意我做了什么,这是 在我的逻辑有缺陷的。 我已经指定S1和S2的值如果我等于1。 我也做了,如果i等于2。 但我没有这样做,在无限多的其他 可能性 - 特别是,3或4,点,99点,或点。 所以固定的,这可能仅仅是让我们的 有其他条件。 让我就在这里说,S1等于 - 在这里,它应该是什么? 观众:[听不清]。 DAVID J.马兰:“瓶子”,因为在通常情况下, 它只是同样的事情。 所以等于报价,引文结束,“瓶”。因此,对于复数 瓶,然后在​​这里,多个瓶。 好了,现在让我回到我的终端窗口, 重新编译,再运行它。 99。 哇! 让我们做一个快速的完整性检查。 从技术上讲,我们要阅读所有这些,以确保 他们是正确的,但让我们来看看 至少已知的罪魁祸首。 3瓶,2瓶,2瓶,1 瓶,1瓶,瓶。 我们似乎已经固定在至少它现在。 但这里的捕获量是什么神烂摊子这是 只是为了解决一个愚蠢的 一个字符的语法细节。 因此,有一个原因,我将这个角落种 早些时候,因为它是完全恼人的 写这么多的代码。 但事实证明,有更优雅的方式 表示完全一样的东西。 我们可以做到这一点,如下所示。 让我离开这了一会儿在屏幕上, 介绍一些被称为一个三元运算符。 这是一个班轮,只是为了让我们 生活一点点的性感,如许。 我要做到这一点,如下。 给我一个字符串名为S1,让我 分配如下。 (我== 1)? “瓶”,否则“瓶”。字符串s2得到(我== 2)? “瓶”,否则“瓶”。 所以,这里的区别又是什么呢? 这两行代码,我认为, 更换整个的混乱。 所以我把它称为一个烂摊子,只是因为它让我反感 走错了路,它是那么多行代码。 没有错。 这不是糟糕的设计。 喜欢,这是完全正确的,完全没有问题。 不过,编码很乏味,如果你有表达自己的 该死的专门一而再,再而再次用一个简单的 场景是这样的。 所以C有一些快捷键,像这样。 因此,这实质上是说声明一个字符串名为S1, 指定此值,这个值,如果我是== - 对不起,我应该说得更清楚。 声明一个变量s1,指定此值,如果这是真的。 否则,指定此值。 所以,换句话说,这是一个行的方式 如果别人说,但前进的道路上做一个赋值。 所以,如果我是1,然后继续前进,称此为“瓶”。和 那么这个东西,称之为“瓶”。同时,s2中, 第二个字,我们需要定义,如果i等于2,我们将 集S2“瓶”。否则,将其设置为“瓶”。有什么 这意味着现在是我可以通过这一点,并删除所有的 这些代码行。 当我说,有点可笑的是,这是目前 性感的性感,这是在排序的文体意识。 事实上功能,这段代码实际上是要 做完全一样的东西。 尽管它可能看起来有点神秘 一目了然,因为我们从来没见过这个结构之前,我 认为它是最终要这么多 可读性和更容易为我们人类排序 理解,因为现在你可以只读取 所有代码在一行上。 它仍然是类似的,如果这是在精神 条件,然后,这是内部的,如果这 是的else里面有什么。 但我们可以做到这一点只是更优雅的。 如果我现在回去,我的终端,删除所有 这些生产线,取而代之的只是这两个, 重新编译,重新运行的99瓶啤酒,请注意,我 语法是,其实仍然是正确的。 所以,再一次,事情开始。 2瓶啤酒,1瓶啤酒。 看起来是对的。 是啊。 因此,我们有一个更简洁的解决方案。 因此,这也一样,你获得更舒适的C,而不是 一定pset或第二,但 认识到这些结构可以让我们做的事情永远 更优雅。 现在,让我们在这里做的另一件事情。 让我走进取,不断开拓return1.c。 现在,让我们开始解决其他问题的方式, 使我们能够编写更复杂的代码。 所以这里有一个简单的小程序,其目的在生活中 是增加值。 其实,让我们退后一步。 让我这样做手工。 让我做包括和int的主要(无效)。 让我叫increment.c。 我该怎么办? 我要继续前进,这样说 - 我们所说的数字是相同的 - 诠释x。 所以int X取得的printf x是%d,新线,X。 所以,我打字快​​,但现在有点熟悉的东西。 然后,我会做x + +。 然后,我要再次打印相同的句子。 然后我将返回0只退出程序。 所有的权利,所以这是一个程序, 增加一个数。 它的第一要初始化的东西2,那么它的 要增加它,并再次打印。 因此,让我们的运行增量,令人难以置信的简单的程序。 但是,假设现在我要对多维数据集的值,这样做 东西有点乱。 我真正想要做X取得的立方。 所以,我可以使用什么所谓的pow函数,但我不 真的知道它在哪儿还。 所以,我要做到这一点,老式的方法。 x次,这等于x次,x倍所述。 所以我刺再次乘以它本身的价值, 一次又一次,使我们获得的权力 在这种情况下,共3。 所以,现在我要打印的数字应该是,正如我们将看到的 - 增量,因此它实际上并没有真正增加 了,但我们会离开的名称孤独 - 2和8。 现在,我们已经有了一个初步的机会细化 在这里,由此这种魔方事情乘以一个数字 由自己本身的感觉,这样做可能是 作为一个功能非常有用的,就像有人决定 年前 - 你知道吗,有用的,如果我们坐下 并写入输出使世界的其余部分可以用它 我们为什么不坐下来写一个函数调用的立方体 做这个魔方给我们,这样我们就不必手动 实施立方值的概念呢? 因此,一个简单的例子,但是让我们继续使用,这是作为一个 写我们自己的函数。 因此,到目前为止,我们已经用主,我们已经使用了其他 人的职能,但我们还没有实现我们自己的。 所以,在这里,我们走了。 我要继续前进,写一个函数,称为立方体。 我想,有需要的输入。 所以它的输入将是一个整数。 又是什么呢怎么办呢? 这将声明int输出输入的输入时间 次输入。 那么它会返回的输出。 然后,我现在要具体。 这个函数会返回一个int。 所以在这里告诉您如何编写自己的函数。 您可以决定什么是你的名字 功能将是。 而且一般的东西解释是不错的,所以我会 把它立方体。 然后,你必须指定它会返回什么,有什么 将是它的输出。 同时,我们也没有那么多的选项。 int,char和浮点型,布尔型,字符串。 现在,我要坚持用一个int,因为我想它 返回一个整数。 然后,你必须指定其输入,如果有的话,是什么。 如果多维数据集需要一个参数,需要的东西之间 括号,你必须给该参数的名称,使 你可以把它的东西,因为你正在实施或写 这个功能,你必须给它一个类型,在这种 案件正在为int。 因此,在短,多维数据集是一个函数,它接受一个整数 作为输入,并返回一个整数作为输出。 所以它是做什么用的输入? 那么,在第14行中,我声明了一个变量称为输出,和我 分配给它的值,输入时间输入时间输入。 然后,我返回的输出。 所以,我怎么使用呢? 我该怎么改变这些高亮显示的字符上线 7〜,你觉得呢? 观众:[听不清]。 DAVID J.马兰:是啊,所以多维数据集的x。 因此,x是一个变量,这意味着它拥有一定的价值。 幸运的是,它是整数类型。 因为x是一个整数,这意味着我可以将它传递到立方体。 即使我压倒一切的x的值的值 多维数据集x,迄今为止的情况下,任何时候你 有等号的一行代码,在正确的东西 被执行,然后被分配到 左侧值。 因此,操作的顺序是我们希望的。 所以做这项工作? 好了,让我去这里。 让我打开了我的终端窗口。 让我做增量,输入。 “隐式声明的函数”立方体“是无效的, C99。“顺便说一句,C99指的是C语言,因为它是 定义于1999年,是一个在版本更新 1989,这是一个较原来的更新。 因此,所有的手段。 所以,这是什么意思,“隐式声明 功能“立方体”是无效的吗?“就在这里。 在第12行,这是正确的。 观众:[听不清]。 DAVID J.马兰:那是什么? 观众:这是不是之前。 DAVID J.马兰:这是不是之前。 所以这是事情。 C是一种愚蠢的,或C编译器是一种​​愚蠢。 他们真的只能做你告诉他们做什么。 而他们,尤其是只阅读你的代码顶部至底部, 左到右。 因此,如果编译器,铛,阅读你的代码,1号线, 如何做到这一点。 哦,来这里主要的。 好吧,让我继续前进,声明一个变量x。 让我打印的东西。 7号线,到底是什么魔方? 这不是stdio.h中声明的。 它不来,我不知道该怎么办。 因此,铛刚刚捞出,并退出该错误消息。 因此,我们可以在一对夫妇的方式来解决这个问题。 多维数据集是什么,只是移动的,我们可以教铛 声明。 所以,我的剪切和粘贴上面主要。 现在认识到,只是因为主不再是第一,这是 默认情况下,仍然执行。 主要是主要的。 这是默认的函数名。 它并不重要,它是在一个文件中。 但至少现在铛已经看到立方体之前,我使用它。 因此,让我们来看看如果铛现在是非常美好的。 增加,并编译这个时间。 让我跑的增量。 而事实上,它似乎是工作。 现在,你可以拿出情况下,最终在那里 它把每一个功能是不可行的 以上所有其它功能。 你会陷在这个无限循环在现实中, 这家伙想在这里,但这个 家伙在那里。 所以,这并不总是工作。 幸运的是,C有一个更优雅的解决方案。 我打算把它这回是,只是因为我 喜欢的话,作为一个原则问题,即主永远是 在顶部,因为它只是很高兴看到这是什么程序 的默认操作。 我要在这里做了什么,宣布什么叫​​做 一个原型。 我要重新申报,我的立方体函数的字面意思 复制和粘贴。 其实,这是不是真的。 因此,从字面上复制和粘贴15行 第6行以上。 不要紧,哪行结束了。 它正好是在第4行。 但它确实有前主。 但是,注意到其中的差别。 4号线以分号结束,这意味着哎, 铛,把我的话,存在一个函数 称为多维数据集采用了一个int并返回一个int。 但我不会告诉你它是什么,但。 只知道,我承诺最终告诉你。 事实上,现在没事,这是在下面。 因此,这通常是更好的,因为这时的顶部 你的文件,你就可以背出,速射,一行 ,你的职责是什么名字,他们的 输入,其输出是什么。 更清晰,输入通常是指参数或 参数的代名词。 输出装置的返回值,这是什么 手回到我的身边。 因此,在这种情况下,在这里,多维数据集已宣布在顶部,但 定义,否则被称为实施,在底部。 所以,现在让我们回到这里,重新运行。 所以,现在让我继续前进,重新运行make,重新运行增量。 它现在似乎工作得很好。 所以,现在我们可以继续分解出类似的 这第四个版本的啤酒例子。 因此,让我向下滚动。 注意到,我种了心刚才的教训。 事实上,我是唱同一节再次 一遍又一遍,同样的合唱队中的歌曲,感觉 喜欢我为什么不成为一个功能的因素,出吗? 事实上,这应该是的动机之一。 另外一个事实,在世界上其他的人可能要 使用多维数据集的功能 - 这是一个很好的理由因素的东西,写你的 自己的自定义功能 - 如果有一个块中的代码,只是让你的程序 概念意义上说,你有种想给它一个 名称 - 像在这种情况下,合唱 - 那么你同样可以写,作为一个单独的函数。 你不写的一切,如果它只是在主 感觉清洁剂分离出来,并给它一个名称。 因此,在这种情况下,在这里,请注意,我有一个评论顶上 这个功能,只是唱 指定数目的瓶子。 请注意,在这里,我不需要调用这些 输入和输出的事情。 其实,这个时候,我只是叫我输入b瓶。 注意的,无效的建议是什么? 该合唱团 - 听众:不会返回。 DAVID J. MALAN:不返回一个值。 事实上,函数没有返回值。 他们可以做一些事情。 他们可以有什么是所谓的副作用,而在这种 情况下,仅仅是打印在屏幕上一大堆。 所以请注意,此代码在这里,我真的只是偷 前面的例子。 唯一的区别是,而不是利用i作为我 可变的,我现在使用b作为我的变量。 所以,我有b在这里,我有b在这里,我有b 减去1这里。 但代码是完全一样的。 但就现在向您展示如何我们可以利用这一点,让我去 进取,实际上这是一个循环。 (INT I = i> N时,我 - )。 所以,我偷了,从我们前面的例子。 在此之前,它是在第37行,我就已经开始 唱这讨厌的歌曲。 但是,我只是去,我现在请合唱团。 完成。 所以,现在这个循环在每次迭代中,我把这种 功能,合唱,,我碰巧写的。 它不是别人几年前写的。 但是,合唱团,同时,使用printf来打印 出这四行。 但事实上我打电话合唱一遍又一遍的 循环意味着,我要得到的,在最后一刻, 相同的歌曲,因此,我有。 因此,在短期,如果我现在回头看我的代码,即使 在功能上,这是等价的,发现它的 开始变得更可读。 我并不确切地知道如何调用getInt 实施。 坦率地说,我不知道如何合唱实施。 不过,这并不重要,我。 我不在乎,因为我现在可以排序的,作为一个人,读 这从顶部向底部。 因为这些功能根据他们命名 这样做,我的代码是越来越可读。 我们的计划复杂得多 - 学期结束,你会写几百行 代码语言,如PHP和JavaScript之类的 - 你会发现,它是如此容易得多跟踪 你做了什么。 当你开始与朋友或 合作伙伴或同事,你就可以写更多 大规模计划开始行使这些基本 积木。 因此,随着中说,为什么我们不收工了吗? 我们将看到你(星期三)。 [掌声]