[音乐播放] 杰森赫塞豪恩:好,大家好。 欢迎来到科。 这是CS50,我们非常 首超一节。 大家都知道,下周 规则部分将启动, 但本周我们都在一起。 还有就是我自己。 我的名字是贾森。 我在计算机科学系讲师。 我们有安迪,谁是CS50的头TA。 而Scaz,布莱恩Scassellati教授, 他在计算机科学教授。 我们是在耶鲁大学的CS50头。 您可以随时发送电子邮件 我们heads@cs50.yale.edu。 我们将在讲座。 我们会在办公时间。 如果有过什么我们可以 为你做,你需要什么, 随时接触到我们。 那么,我们今天要做? 或者在此之前,有什么 来了这个星期? 因此,办公时间为周一,周二, 周三和周四,8:00至11:00。 还有的网站上日程。 节,就像我提到的, 在下周开始。 而且你会发现这个星期什么 计时您的部分是,今天是什么日子, 和你的TA是谁。 问题1在周四是由于在 中午,周五中午至深夜的一天。 是的,你有九晚了几天。 而且有九个问题集。 而且只能使用一个 每道题集下旬的一天。 是的,实际上,所有的问题 集将于周五中午。 这是所有。 所有的细节都在教学大纲。 每个星期五,我们的午餐。 我们想使这个大 当然感觉有点小。 所以,欢迎您RSVP。 免费的午餐与其他 同学们和工作人员。 cs50.yale.edu/rsvp。 所有这些事情, 我在屏幕上, 多,你可以找到cs50.yale.edu或 cs50.harvard.edu,如果你去哈佛 而在看这个网上。 同时在这些网站上,有 一吨为你的资源。 每个讲座不仅具有视频 讲座,但也注意到。 有人将观看 讲课和做笔记给你。 所以,你可以只支付 在讲座的关注, 或者您可以使用他们的笔记/我们 笔记来补充自己的笔记。 有网上的幻灯片。 源代码 - 一切 大卫都要通过讲座, 或Scaz都要通过讲座,这 源代码可在网上 还有,像我,提到影片。 部分,同样地,都将被拍摄下来。 所有这些幻灯片将可用。 所有这些代码将 可为您服务。 还有的网站,短裤 CS50的工作人员花费5到10 分钟经历的主题为您服务。 其中一些人已经过 在习题中遇到。 办公时间,正如我所说,星期一 至周四,8:00至11:00。 CS50研究是一个奇妙的资源。 有实际问题, 样本幻灯片,已知错误 学生喜欢碰到, 基本上对每一个主题中,我们 将覆盖在这个过程中。 最后,在这张幻灯片 至少,Reference50 它给你的信息 在所有的C函数 你所能可能希望 使用和许多,许多。 再次,点点点的 在屏幕的底部 是表明甚至还有 在这两个网站上更多的资源: cs50.yale.edu,cs50.harvard.edu。 那么,我们今天做什么? 首先,我想给 你的资源。 已经做了一个。 看看我们。 现在,我们要投奔 数据类型和运营商C. 然后安迪会在这里和 在C中去了图书馆,printf()的, 一个函数,你已经 熟悉或将很快成为非常 熟悉。 而且你还可以去了 条件和循环。 然后最后,Scaz 会在CS50 ID。 如果你还没有鸽子在 已经在习题集1, 以及如何使用 终端和有用的命令 然后给你一些演示和 实践编码在CS50 ID。 以前我跳这个 在这一侧的内容, 没有任何人有任何问题这么远吗? 太好了。 行。 更换齿轮。 [换档] 那是我移 齿轮在手动汽车。 因此,在C数据类型,你不能只是有 一个变量x,并将它是在第10行, 的整数,说不定数字1, 第20行,一个十进制数10.5, 然后一对夫妇行 后来一个字符串,我爱CS50。 在C语言中,变量只能是 一件事,只有一件事。 所以你必须给他们的类型。 而在此板上,我们 有类型的列表。 有字符,这 代表角色。 所以这是一个字母A,B,C, D.这也可以是一个空间, 或者也可以是 新行字符。 有整数,这只是 数字,全numbers--或整数 rather--但没有小数。 对于小数,我们有 浮点数。 浮点数 与小数的数字。 再就是多头头寸,这是 本质上较长的整数。 你会发现,长 是8,而一个int是4。 我会得到,在第二。 这是因为多头可以存储连 比int多个整数可以存储。 双是一个长期的浮动。 最后,我们有 串,其是一种类型的 你可能已经使用过。 如果包括包括hashtag #includeCS50.h在源文件中, 那么你可以使用一个字符串类型。 它实际上没有内置到C. 有一对夫妇的其他类型也是如此。 但这些都是与校长的人 您将使用和遇到的问题。 c以,我又提到, 每一个变量 - 它 只能是一种类型的且只有一个类型。 这是因为C是一种静态 类型化的语言,而不是 动态类型语言 如果你创建一个变量在哪里 你可以改变什么是存储在 它在程序中去。 在这里的右手 一边,我有不同的尺寸 这些类型的字节的数据。 这样一个字符是1个字节。 这是8位。 这意味着,因为8 位有八个0和1。 我们看到这些演示在第一 周与二进制灯泡。 随着8位或1个字节,我们可以 表示数字从0到255。 对。 如果所有8位均为0这是0。 如果第一位是1,这是数 1,等等,所有一直到255。 这就是为什么对于字符可以 有本质上最多255, 但是这足够覆盖所有 字符我们需要使用。 对于整数,你可以0, 那么你有2到32减1。 这些都是多少选择 你有整数。 长期以来,你有0 到2〜64减1。 所以,你有很多很多, 更多的选择,为多头。 字符串,这是一个问号 因为这是一个悬念以后。 是啊。 我可以告诉大家的 在他们的座位边, 就像那是什么问号? 这是一个悬念。 我们将最终覆盖的大小 字符串和多谈谈字符串。 因为字符串其实是 培训车轮之一 我们在这个带上 当然,在开始 再起飞后 对,因为在C字符串 实际上指针 字符数组。 但同样,这是一个 扣人心弦以后。 在我继续前进的任何问题, 评论,这个幻灯片的担忧? 行。 我一定是一个梦幻般的讲解员。 此外,当你在编程, 你要使用这些运算符。 很简单的标志,可以做简单的 操作,与你可能 已经很熟悉了。 例如,在右侧 右手边,我们看到的补充。 要添加,你只是做一个加号。 所以,你可能有 两个变量x和y。 你可以在你的代码做X + Y。 也许你想用于:说你 有7号和3, 你想存储 在一个变量中称为总和。 你可以做INT的类型,空间 总和,所述变量的名字,= 7 + 3; 那能店总和? 有人吗? 如果我在总和= 7 + 3。 什么将存储在总和? 你可以只喊出来。 听众:10。 杰森赫塞豪恩:10! 这是完全正确的。 怎么样的总和= 7 - 3, 我只是用了几许的迹象。 这是怎么回事存储? 听众:4。 杰森赫塞豪恩:4。 总和可能是错误的名字 该变量,但4将被存储。 为了繁衍C,使用小 明星的性格,你不使用X。 来划分,使用前向 斜线而不是分裂的象征。 而对于模,使用百分比符号。 所以我们可以说我想看看INT Z = 7%3,什么将被存储在Z' 所以,这是本质 问是什么模办? 有谁知道什么模呢? 是啊。 Y 4。 扬声器1:这是余数。 杰森赫塞豪恩:它是 其余的,当你划分。 所以7除以3余数2 1。 所以1将存储。 你做减法, 但它是如何工作。 这就是模运算符一样。 它需要通过一些它除以 其他号码,并返回到你 其余的。 如此反复,7%,3为您提供了1,因为 7 3 2 1余分, 和返回余。 那么,让我们回到了 一步到位的除号。 如果我做了7 /除以3不 任何人都知道这是什么会回来? 扬声器2:2。 杰森赫塞豪恩:为什么2,而不是2.333? 扬声器2:我觉得它削减 关闭整数之后。 杰森赫塞豪恩:所以 这是完全正确的。 在C语言中,如果你做了分工 两个整数7除以3, 它得到了答案, 在这种情况下,2.3333永远 它认为,小数点和 小数点后挑起大梁事事休 它只是返回2。 所以,如果我做了8除以3。 实际上,我们知道 这回2.666, 但在扒事事休 十进制,截断了这一切, 而刚刚返回给你2。 因此,6除以3,7分 3,8除以3, 都将回报给你2。 任何人都不会知道,或者有一个猜测, 至于我怎么能真正得到 完整的答案,如果我想要那个小数点? 是啊。 前进。 扬声器3:使用浮动? 杰森赫塞豪恩:你是什么意思? 扬声器3:因为你说的 浮动是数字[听不清] 杰森赫塞豪恩:对。 所以,这是完全正确的。 图7是一个整数。 但是,如果我想反过来说 成浮点数, 我将不得不存储 作为7.0,因为计算机 真是stupid--我们看到, 用PB和J example-- 它只会做完全 你告诉它。 所以,如果你写的7,它 认为这是一个整数。 如果你写7.0,即使我们 知道那些东西是相同的, 它把那像 浮点数。 所以,如果你没有7.0分 3,或除以3.0, 它会说,好了,现在 我们正在处理的花车。 我会回报给你2.333333永远。 但不是真的永远,因为 因为我们也看到在讲座中, 这些浮点数 并不完全精确。 所以,如果你想要的小数, 或小数的一部分, 那么你必须use--其中之一 必须是一个浮点数 和计算机必须了解 这是一个浮点你 处理,而不是一个整数。 在该表上的任何问题 右手侧,到目前为止? 或者你的左边,你的 离开了,你的左手边。 是啊。 扬声器4:对。 对于就像一个普通的 整数,你会 写 - 将你写浮动? 杰森赫塞豪恩:是这样。 好吧,如果你想创建 一个变量,它是一个浮动, 你需要说浮法 z等于什么。 扬声器4:确定。 杰森赫塞豪恩:但是,如果我想 做7除以3,并获得了小数, 我会做浮动Z = 7.0 / 3.0;和 这会给我的浮点 号。 扬声器4:确定。 杰森赫塞豪恩:如果我这样做 像INT Z = 7/3, 这会给我一个整数, 因为这些都是整数。 那有意义吗? 扬声器4:是的。 杰森赫塞豪恩:OK。 太好了。 有关该表的任何其他问题? 真的吗? 我太激动了。 行。 所以,你会使用一些其他的东西, 经常在条件或循环, 是这些类型的operators-- 这些类型的布尔表达式。 当我们了解到,==就是你 用它来检查,​​如果两件事情都是平等的。 所以在这里我检查如果x == Y,让我们 再次假设x是7和y为3。 所以,如果我写了7 == 3,什么 将返回给我吗? 这是真的还是假的? 听众:假。 杰森赫塞豪恩:OK。 我觉得每个人都可以得到这一个。 所以每个人,那能回来吗? 听众:假。 杰森赫塞豪恩:假。 太好了。 7不等于3。 因此,7 == 3将返回false。 你有没有等号,所以如果我 被查7!= 3,那能回来吗? 听众:真。 杰森赫塞豪恩:真。 优秀的。 有人很言之凿凿 背部和理解。 然后,你必须小于运算符, 小于或等于操作员, 大于运算,更大 于或等于操作员。 因此,人们更全面的检查。 如果我有7大 大于或等于3。 那能回来吗? 听众:真。 杰森赫塞豪恩:真。 是。 这回房,背面 房间的,梦幻般的。 您可以将这些 表达式如果你喜欢,还有, 带有逻辑AND这是 &&或逻辑OR这是|| ||。 所以现在你可以测试两个 事情together--是不是可笑吗? 这是为什么笑? 所以,如果我想,我能说的是7 大于3与2小于4? 好吧,如果7大 比3,这是事实。 2小于4,这是事实。 所以,这整个事情将返回true。 如果我测试了7比3和 - 我只是挑选随机数这里 - 4小于2,好,这是假的。 所以真假作出虚假。 你可以去和你结合的 很多条件在一起,你想。 没有任何人有任何问题, 评论,关注这么远吗? 而且我看你拍照的一些 在屏幕上,这是我感激我。 但愿,这不是Snapchat。 我们希望,这对你的笔记。 但所有这些都将 要在网上提供。 所以,你不必 利用这一图像。 就像我提到的,应有尽有 会为你在网上提供。 行。 我即将得到 台下,所以是否有人 不想多说什么 在此之前,会发生什么? 有问题吗? [插入VOICES] 杰森赫塞豪恩:哦,停下来。 你们是太好。 行。 我要挂牌。 我们走吧。 ANDI彭:我们要做的 现在是一个尴尬的MIC变化。 杰森赫塞豪恩:我 要采取这一关。 ANDI彭:欣赏支持,伙计们。 你能听到我吗? 好了吗? 完善。 美丽。 让我掖了研究。 行。 所以,我要做到像一个巨大的 信息倾倒在你们现在。 而且没有任何后顾之忧,如果你 不继的每一个小线是什么 我要告诉你。 正如杰森说,一切 完全联机。 只要我们将尝试引进 大家的概念覆盖 在一些幻灯片。 所以只要跟着。 不,如果你不明白的忧虑 一切;然而,如果在任何点 你觉得失落,提高你的 另一方面,我们就会停止,无后顾之忧。 酷。 所以,我认为有些事情,大卫有 已经种提到讲座 那种和贾森已经暗示 今天是一个图书馆。 因此在编程时,我们有 这些东西叫做库。 其中,从本质上讲,所有的 他们只是一组 的功能,即 本质上只是代码的 已经被写入由 别人说我们都可以 我们的程序中使用。 那么,如何正常 图书馆的工作,对不对? 你进入图书馆的门。 你把所有这些 书籍可以拉出来 您可以访问信息 在那些书。 同样的事情在编程。 你有一个已经库 写了由其他人。 而这样就可以了, 作为程序员或学生, 可以访问该库 通过包括hashtag的#include。 例如,在C我们 有三个C--最 常用的三C标准 libraries--输入/输出库, 串库, 和数学库。 所以,在你的第一个 夫妇习题集, 那些将三个 那你主要使用。 因此,大卫已经 讲座中解释说, 标准I / O库,或 标准输入/输出库 正是这么做的。 它可以让你在你的代码,输入 从用户和输出任何 到屏幕上,基本上 它打印到屏幕上。 所以,任何时候你使用任何功能, 例如函数printf(),其 我们要投奔的下一张幻灯片, 一定要包括标准I / O 库要不然你不会 能够使用的printf()函数。 因为你作为程序员 从来没有真正写到功能, 你只是冒用 在你自己的代码别人的代码。 这是否有意义的人呢? 酷。 然后,我们基本上是沾到 该文件string.h库和文件math.h 图书馆,.H只是表示库, 其他图书馆,你最终会 是你的代码中使用。 然而,为了 这个库,我们也 这个分类 - 我们也有have-- 什么是所谓的CS50库, cs50.h,我们在那里,为 你细读创造 许多重要和有用的功能。 所以,你作为一个程序员 可以捎带关闭 我们已经写了这样 这一功能的提供给你 供您使用。 我将涵盖几个 功能常用 但要知道,这些都是 所有googleable在线。 随意,拉起CS50库和 然后你把所有的功能出现。 是啊。 扬声器5:所以,如果你不 使用该软件 提供给我们, 类,这是否 意味着我们不得不下载并找到 这个头文件自己,并告诉 它是计算机? ANDI彭:大的问题。 没错。 因此,这就像如果你不 在图书馆实际存在的, 有没有办法为你 其实去访问它。 因此,同样的事情 在C,你的编程 要确保你使用的是我们的 家电,因为图书馆已经 被纳入进去。 然后当你的hashtag #包括,图书馆的存在。 是啊。 好问题。 每个人都好? 酷。 好吧。 因此,我们会打, 本质上,是什么 所述第一函数 我们作为程序员 将被我们的代码中使用。 这就是所谓的printf()函数。 因此,printf()函数,因为我 已经在最后一张幻灯片说, 包括在标准I / O, 标准输入/输出库。 所以一定要确保无论你using-- 哦,让我抢激光pointer-- 每当你使用 在printf()函数, 你必须包括标准I / O 库否则,当你编译, 你会得到一个错误 因为电脑会像, 哦,我不知道在哪里的printf()是, 你不告诉我在哪里的printf() 是。 井的printf()被包括在 标准I / O,所以当你用printf() 确保有 上面一行代码。 因此,例如,printf()的 这里是一个函数。 它所做的就是打印出来的东西 内的括号给用户。 会有人想借此刺 在这行代码的权利 这里是要打印出来? 因此,应答是在屏幕上。 有人吗? VERDI:底部。 ANDI彭:威尔第,你为什么不走 直截了当地说出了整个语句? VERDI:你好,我的名字是 安迪,我20岁。 ANDI彭:啊,可爱。 因此,在这条线,我们要 打印出来,你好,我的名字叫安迪, 我今年20岁了,这 其实一个真实的陈述。 语法。 于是几个语法问题的 你们要确保你知道的。 行情。 双引号告诉 计算机里面的一切 将要被打印出来。 里面可以一切 只是究竟如何 您键入它,除了 一般在年底, 我们将要包括 一个hash--哦sorry--破折号ñ。 因此,一个破折号ñ。 有没有人想以此来猜测 什么,做我们的代码? 是啊。 扬声器6:把它放在一个新行。 ANDI鹏:没错。 因此,所有这样做是 让无论发生什么事 在此之后,该语句之后, 要打印到一个新行。 所以,当你写你的 代码,您不要随意有事情 上涨到年底 你不想要的。 这一切变得 整齐地打印一行 然后我们开始在下一行。 有谁还记得那是什么 当我们编码分号呢? 是啊。 扬声器7:声明。 ANDI彭:对不起? 扬声器7:是否结束的声明? ANDI彭:是的。 因此,在C或任何编程 语言中,分号 表示一编程线的末端。 因此,例如,在英语中,我们使用期限 说,哦,这是结束一个句子。 在编程中,同样的事情,我们有一个 分号来表示一个行的末尾。 通常情况下,当你 开始编程, 你会发现你 忘了加分号 然后再尝试运行 代码和它不工作。 而你喜欢啊,我不知道 知道为什么,这应该是工作。 有可能到头来你可能忘了 分号或支架或东西 某个地方。 所以,这是重要的是要记住。 酷。 好吧,举手,如何 很多人在这里有过 采取AP计算机科学或 在Java的编程之前,永远? 行。 可爱。 这不会是适用 然后,但在Java,则 有一些所谓的System.out.println 中不存在C. 因此,在C,只要你 要在添加变量 到任何你想要的 打印出来,有 一个特定的语法,我们要使用。 这就是所谓的 placeholding--本质 我们的地方添加占位符 整数或可变的 我们要打印。 所以当你们可以看到,我们已经包括 这里一个新的库头文件。 在CS50库。 而载有CS50库中 是我们将使用一个通用功能 在我们的课程叫调用getInt()。 有谁要采取刺伤 什么调用getInt()有可能会做。 听众:[听不清] ANDI彭:对不起。 听不见你。 麦迪,任何人。 曼蒂:哦,它会提示 你一个整数。 ANDI鹏:没错。 所以这个功能,另一个 功能是已经 写了由别人 我们可以在请他发言。 所有这就是提示你,用户, 任何你想要的代码输入 正在运行,并且它存储whatever-- 在这种情况下,我们调用getInt() - 荷兰国际集团, 所以这意味着我们 获得的整数。 而且我们要存储 在另一个整数 我们已经刚才所谓的年纪。 有意义给大家? 酷。 所以,现在我们已经存储在该整数, 我们已经从用户提示, 在这个变量中,我们 int类型被称为时代的创造​​, 我们可以继续的地方 在我们的printf()函数。 因此,语法通常是printf()的是 这无论在实际的物理 行,你希望包括整数, 你这样做,符号在那里, 百分比符号,与 您要的变量类型。 因此,在这种情况下,年龄是一个整数。 所以,你要包括 %我,因为它是一个整数。 然后经过你 声明中,你会 做逗号和 变量的名称。 所以在这里,我们要打印 出,你好,我的名字叫安迪, 而我的空白岁。 Hashta--或sorry--, 年龄无论我输入。 所以,如果我输入 20我调用getInt()在这里, 它会打印出完全一样的东西。 但是,如果我想输入的东西 否则,可能像40或45, 然后你会看到反映 因此在代码中。 所以这是一个例子 的东西在其中 它打印出来,并期待 你仿佛这是同样的事情, 但罩下方 计算机实际上有 非常不同的事情发生。 酷。 好吧。 那么,如果我们想要多个变量? 非常的方便。 一样。 我们也有一个新功能 这里所谓的GetString() 也包括在CS50库中, 所有它的作用是提示用户 为一个字符串,它是 刚一组字符, 因此喜欢的句子或类似的名称。 所以在这种情况下,我们将有两个 占位符%s的字符串和%I 为整数。 而我们将遵循 由两个变量 我们希望包括,在订单 它们出现在句子中。 因此,例如,我的名字是 空白,我想一个名字在那里, 所以我打算先有名字。 再后来,我想 年龄,希望有年龄第二。 所以,如果我想输入,你好, 我的名字叫安迪,我20岁。 如果我输入岸堤和20, 同样的事情将打印; 然而,现在我们已经有了两个存储 名称变量以及INT。 是啊。 扬声器8:它会 能够运行,如果你切换 姓名和年龄在那结束了吗? ANDI彭:是的。 这是非常好的问题。 所以长话短说,没有。 由于名称和age--什么 变量的类型是什么名字? 扬声器8:字符串。 ANDI彭:什么 变量的类型是年龄? 扬声器8:整数。 ANDI彭:所以在这里,我们有一个占位符 字符串和整数,对不对? 所以,如果你要切换这些, 计算机不会知道。 这将检查一个字符串, 如果你试图给它一个int, 它会像 等待我很困惑,你 告诉我,我应该是 配发的内存类型为int。 而当就在这里, 它要求整 你给它一个名称 和一个字符串代替, 它也将是非常混乱的,它 将不完全运行,你需要的方式。 所以在这里,命名和语法 用于运行代码非常重要的。 每个人都好? 是啊。 麦迪。 曼蒂:在这里,我知道我们已经看了 在类的例子,他们会问在哪里 什么是你的年龄,你叫什么名字。 在这里,那又是它doesn't-- 如果我们运行这段代码, 它不会要求是什么? 但是,你只是输入两个数字 然后它会运行这样呢? ANDI彭:是的,没错。 所以,如果你想为它 显示器,请输入您的年龄, 你可以再补充一个printf()函数 上面写着,请输入您的年龄, 它上面。 这是一个很好的问题。 是啊。 扬声器9:那么,就已经是 包括在调用getInt()[听不清]。 ANDI彭:不,它实际上不是。 因此,所有这样做仅仅是 提示空屏幕 到用户输入的东西。 如果你想它,如果你想让它打印 出来的东西,告诉用户喜欢, 请给我你的年龄,那么你 必须printf()的那个自己。 因为每个人都使用这个 功能不同的东西, 你可能会被存储时代, 你可以存储地址, 你可能会被储存的电话号码。 所以这真的取决于 你的球员的个人用途 你希望它是什么的话。 是啊。 扬声器10:所以,我只想澄清,在那里 做你输入的名称和年龄 因此,它显示了在地方的%s? ANDI彭:作为用户? 扬声器10:是的,像我该怎么办 使得它 - 我在哪里把安迪, 和我在哪里把20? ANDI彭:是的。 所以,如果你要 实际运行这段代码, 我没有实际运行 代码,这仅仅是现在在这里。 如果我要运行的代码,我会 编译代码,使文件, 运行代码,然后将有 只是两个空格,我将其输入。 是啊。 当你玩你们会看到 周围与自己的代码。 所有我们要向右移动 入的下一个章节什么 我们将涵盖当今。 我们打​​算去了什么 条件语句是。 所以,如果你们还记得 从讲座回忆, 条件语句, 所有却已是一家集 的说明在计算机中 其中,如果某个条件为真, 你执行的代码 内的这一条件。 因此,在Scratch--本质 从今天的大主题 是,你们已经全部 看到一切背后的逻辑 我们正在覆盖。 而我们正在做的是 翻译的东西 这是非常直观的 从无到有,硬编码它 到语法,我们将使用 对于这是C类 所以从逻辑上讲,这一切都堵得 是一段代码就在那里。 是啊。 行。 我们也进入一个if ... else 声明这仅仅是一个额外的层 复杂的if语句 其中,计算机需要看看这个 并认为,如果这种情况是真实的,做的 任何的这两个括号内, else--样的等等之类的默认值,如果 它不符合condition--做到这一点。 这就像在一个岔路口。 如果它的外面下雨了,我把 在一个防雨外套,还有什么别的 别的我不把一个雨衣。 这是否逻辑意义的人呢? 酷。 好吧。 因此,像硬例子 这一点,我们将在C见 是,如果我想创建一个 变量调用功课小时。 如果作业时间少 超过五个,我说生命是伟大的。 太好了。 不过,说的斗争是real-- 这是我们这一切星期一 下午起来学山都 可能做正确的now-- 听众:[笑气] ANDI彭:他们的方法,我们 会,向你表示感谢。 我们要硬编码的方式 这在C是if--让我们假设 我们已经有类型的变量 int,名为功课小时就在这里。 如果作业小时小于 5 printf()的,生命是伟大的。 记住保持/ N,因为 你想后,新的生产线。 否则打印的斗争是真实的。 大家是否明白如何 我从这个块转换 到这个代码块? 酷。 好吧。 所以,现在我们要看看 多重如果语句完全。 因此,让我们假设 该计划的目的 为我们提示了一个档次的用户。 我们提示符下使用调用getInt()的 级,并且它们的输入值, 你想显示 他们得到了什么样的档次。 所以,如果我来设计一个程序,我 在我们所有的目光意味着通常情况下, 90-100是A,80-90是 乙,等等等等。 什么是不对的 一段代码,它不是 做我想做的事情。 是啊。 扬声器11:他们有下限, 但他们没有上限。 ANDI鹏:没错。 大家有没有听到她说什么? 还有的将是上 限制,但没有下限。 对不起,反过来, 下限,没有上限。 所以,你想 采取刺伤说 什么将被印刷在该 屏幕如果我要运行该代码。 扬声器11:一个错误? ANDI彭:一个错误? 伟大的猜测,并不完全正确。 没有任何人有另一种刺? 是啊,阿龙。 AARON:如果你把 东西大于90, 它会显示所有你得到的成绩。 它会告诉你得了A, 你有一个B,你得到了一个C. ANDI彭:是的。 这是完全正确的。 所以,这会是美好的。 然而,它们是相互 独家的,我想。 如果我要运行这段代码。 然后让我们只说,我 输入的95级。 所以95现在存储在 整型所谓的档次。 所以C是一门语言 运行了从上到下, 所以它要永远 运行到底部。 所以它要来这里,看是否 级是大于或等于90, printf()函数,你得到了一个A.太好了,我 有一个95,这是大于90。 这将打印, 我得到一个答:这是怎么回事 看看这个,如果,这是怎么回事 说,还有95也大于80, 这将打印也得到了GOT A,B感叹号,等等等等 等等。 因此,当我们都可以看到, 这是一种常见的错误 当我们认为可能会出现 编写代码看出来的。 任何人,在任何问题 为什么这是怎么回事? 太好了。 行。 那么,我们如何解决这个问题,显然是 下一个逻辑问题。 好了,我们有这些美丽 事情如果叫别人,如果别人 如果else语句。 所以你可以看到,如果你想 改变这种状况的问题, 你想使每个 条件相互排斥的, 您将添加一个else ... if语句。 而这些course--的认为他们是 梯子,还是喜欢上了ladder--梯级 这些可以添加多达你 希望尽可能多的条件,只要你想。 所以在这里,如果我输入级为95。 如果等级大于95, printf()的,我得到了一个A.大。 这将看到一个else ...如果 而且它会知道,哦,不, 我已经执行的第一人。 我知道 - 或者第一if--我知道, 我没有看任何这些 因为其中的一个 已是事实。 因此,它会从上往下运行。 一旦第一个是真实的,那么 它会跳过所有的休息 的东西...... IFS。 那有意义吗? 因此,在这种方式你 不同层次的检查的 并尽快其中之一为假,则 其余的都还可以,他们甚至不会检查。 酷。 好吧。 因此,这是一个不同的例子 排序条件语句 我们看到较少,但 我们将看到和使用它们。 而且他们往往更 有效的某些情况。 因此,我们有什么所谓 switch语句。 所以在我们讨论什么是一个else 语句中,if ... else语句。 在这里,我们有什么 所谓的switch语句。 因此,当我们使用开​​关 语句是关键? 因此,在一个switch语句,你 通常情况下,通常情况下,其实你 只能输入整数您 你正在检查的变量。 所以,如果我想查查看 如果某一number--例如 一个档次,如果我有一个90。 我想它,看看如果这是一个A, B或C.我能有这里的情况。 然而,这起案件 是另一个恒定。 所以在这个意义上说, 可以切换语句只 检查两个数相等。 它不检查为别的。 所以,这件事情是非常 小心,当你使用这个的。 所以在这里,如果我想查查看 如果我的90级等于90或80 或70或60,然后打印 相应的等级, 我能写的 在switch语句。 因此,它会来到这里,检查 这个整数等于这个常数? 如果不是,它会跳过。 是不是等于常数 2,等等,等等, 直到你打的默认情况下, 如果他们都不是相等的。 只要其中之一 被设定为相等的, 它会做到这一点 一行代码和休息。 这意味着它会打的 运行,破裂,只是完全跳过 到代码的底部。 因此,在这个意义上说的那种功能 就像if的else if else if语句可。 所以这里有一个具体的 例如,对于你们。 因此,让我们假设,我想 创建一个名为成立的变量。 我想提示用户输入 这一年,他们的学校正式成立。 所以,我可以在这里创建一个switch语句。 而让我们只说,我输入1636。 这里这段​​代码是要见开关 成立时间等于1636。 这将看情况 1636年,哦,这些都是平等的, 的printf()你不应该 在那所学校北上? 因为我们假设他们不这样做 到这里,如果他们去哈佛, 突破并跳到结束。 如果我输入1701,这 我想大家都会投入, 它会跳过此情况下,来 到案例二是1701年, 和打印欢迎来到耶鲁大学! 打破,跳到结束。 否则你可能正在服用此课程 在网上,其中case--真棒欢迎 以Yale--它会进入 默认打印,您好上网! 而打破。 是啊。 SPEAKER 12:您可以使用其他 默认情况下,而不是在那里? ANDI彭:没有,因为 这样,这个整体功能 开关建成,语法, 需要使用的情况下,默认的情况下。 这就像如果别人当此 之一,它的情况下,默认的情况下。是啊。 SPEAKER 13:你也许已经说了这一点, 但你有两个以上的案件? ANDI彭:是的,你可以 有,只要你想尽可能多的情况下。 把它看成只是想 无限增加的。 扬声器14:如果你 交换1701 1636年, 它并没有真正做 有差别吗? 它只是要检查它。 ANDI彭:这是一个 非常好的问题。 我们会触及 这以后,只是 知道这是开关 声明infinitely--它的 超过它,如果更高效 否则,如果因为它的运作 使用不同类型的功能 可以让你,基本上,只是 直接跳转至 如果您需要所在。 是啊。 扬声器14:酷。 谢谢。 ANDI彭:是 扬声器14:你不能 做情况下,像大于。 ANDI彭:没有。 所以,这是什么限制了对 switch语句是,你有 有常数只,只有整数。 是啊。 行。 因此,这是什么,你 球员都会遇到的次数减少, 但我只是想 在情况介绍吧。 我们这里有什么 被称为三元运算符。 凡从本质上讲,它就像一个 if语句编译成一条线。 在这里,我会去到下一行中, 下一个页面,因为它更容易看到的。 所以,我们都看到了这一点吗? 这是很容易理解。 如果我想创建一个名为变量 名为字符串s,如果一定数目的 我给它小于100,我 要分配较低的字符串, 否则我要分配高。 这在这里是做同样的事情 这八行代码在做什么。 所以在这里我想创建 一个变量字符串。 这是我的条件 检查,如果一个数小于100, 那么您分配的低价值, 其他指定的高值。 这些幻灯片将在网上,无后顾之忧 如果你们没有得到这个下来。 这仅仅是一个简单的方法,更 编写代码的有效方式。 行。 所以,现在我们要 输入的内容,对于大多数人来说 就像一个非常,非常混乱 件事想在第一。 环路部分。 所以我们今天要谈 大约有三种类型的循环。 我们将开始一段时间 循环,再来谈一个do while循环, 然后说说for循环。 所以基本上,对于更 视觉学习者在那里, 我们本质上是一个图形化 描写一个什么样的while循环一样。 因此,在编程时,你将开始 并进入循环在某一点。 你检查的条件。 如果条件为真, 你内心执行的代码。 而你再回头来您检查。 如果它仍然是真的,你继续运行 一圈又一圈,这个代码在一个循环。 然而,第二即 条件为假, 你要打破和结束循环。 这在本质上是 语法你要使用。 而一定条件是 真正做到这一点,如果这不是真的, 你要跳到结束 和前进与您的程序。 行。 有没有人有一个例子 什么可能会潜在地发生 如果我尝试运行这段代码? 顺便说一句,SAJ--这是Scaz,安迪, Jason--我们将签署我们的邮件, 爱,SAJ。 这就是我们。 行。 任何人有一个例子,还是有 什么这将打印的想法? 样的一个很难回答的问题。 所以在这里,记住状况 我们正在检查的同时,真实的。 因此,虽然这是真的,这是 付印,我爱SAJ! 有没有在我们最好的任意点 更改为任何其他方式? 没有,对不对? 所以在这里,我们有 遇到什么可能 将要窃听了很多 你的程序,无限循环。 你会发现,如果你 运行这段代码, 它只是要保持 印刷,我爱SAJ! 虽然我们赞赏的支持, 我们不希望你的电脑 崩溃是因为你 保持印刷我爱SAJ! 所以,请,请, 避免无限循环 因为它永远不会 以评估为假 和你永远也不会 离开循环。 而你要 被吸入天长地久。 酷。 行。 第二类型的循环 我们将谈论今天 是while循环,做while循环的做的。 它之所以被称为do while循环 因为你有做,一段时间。 因此,这是非常类似,而 循环,但有一点点不同。 在这里,你打算怎么办 无论公司的这里面 而在一定条件下是真的。 所以,如果我是C和我的电脑 顺着这一段代码, 我看看顶部。 我去到C,我说的做这件事情。 然后我检查,而这 是真的,我要重复它。 不过,虽然这是假的, 然后我往前走 我从来没有回到那个循环一次。 任何人都可以花刺 有什么区别 这个循环和一个我们之间 只是看着是实际。 是啊。 SPEAKER 15:条件 来代替前后? ANDI鹏:没错。 所以她说的条件 来后,而不是之前。 最终,所不同的 这和while循环之间 是,你只是打算怎么办 任何的这里面不管 无论您的病情 真的,然后检查条件。 所以在这种情况下,你 always--以这种方式, 你总是要确保 无论是内至少运行 检查,看看前一次 如果你想让它再次运行。 这里有一个例子 当我们会使用它。 因此,举例来说,如果我想有 int类型的变量命名的时代, 我想提示 他们的年龄的用户, 我会做的printf() 你几岁? 年龄=调用getInt(),它 是提示用户。 而有些人会真的很烦人。 而且你不想在错误的 有人程序输入一样, 哦,我是负4岁或什么的。 在这种情况下,如果它们 做到这一点,这个计算结果 为true,这意味着我要去 必须保持回去和这样做。 因此,这是要保持 再次提示用户 给你像一个真正的 年龄号和它的 要保持回去和重做 它,直到他们给你一个真实年龄 大于一,或不为零。 因此暗示,暗示。 这将是非常,非常有用 为你的PSET问题之一。 是啊。 扬声器16:哎呀,对不起。 ANDI彭:是的。 扬声器16:有没有,不 是一个混蛋,但 - ANDI彭:不用担心。 扬声器16:--are有 这里不同的规则, 还是你只是忘记 把报价? ANDI彭:哦,是的。 对不起,这是完全是我不好。 这是肯定 应该是一个报价。 接得好。 那将无法运行。 行。 因此,循环的最后一个类型,我们将讨论 约,最终同类产品中最 复杂的for循环。 如果你不知道不要担心 知道这意味着什么。 这是相当混乱在第一。 我们一起去了一个例子。 所有这一切发生在一个for循环 是,你有三个语句 你要去包含。 因此,对于某一件事情,你 要初始化变量。 你要的条件添加到 此循环将继续运行。 然后,在的结尾 循环,你要更新它。 您可以更新变量 要跟踪。 因此,我们通常使用 for循环的时候,我们 要运行一个循环 一定量的时间 我们已经知道,哦,我想 这个循环就像10次执行, 那么你do--我过去 下页的一个例子。 所以在这里,例如,在刮,如果 想要的东西,重复10次, 你不得不说的是, 重复10次我爱SAJ! 这是一种更可接受 展会对我们的支持 而不是无限循环。 在这里,你会如何 过渡到C和写 这是int--我要创建或 声明一个int类型的变量命名的我。 我要初始化 为0,所以我= 0; 这将是我的病情。 所以i小于10。 然后在end-- 你是最后一个发言 将不得不是的更新 恰好变量i什么 在您的for循环的结束。 因此,它是一种令人困惑的,因为 这条线的不同部分 都发生在不同的 类型的循环。 但我去了一个 那伪代码示例 也许解释 只是好一点。 所以在这里。 这就是我们刚才看到的循环。 基本上伪代码,是什么 在这个程序中, 首先是我创建 我,初始化为0。 我检查,看看我是 小于10,在这种情况 第一次是 因为0小于10。 因此,环路将运行。 然后我会打印这一行。 然后在该行的末尾,右 在这里,我打算做增量我,我++, 所有的手段是 由一个递增它。 所以,我现在是1。 因为它曾经是0,如果我 增加它的,它现在是1。 然后,我要回去 到循环的开始 我检查车况。 是条件还是真的吗? 是的,1仍低于10。 因此,这将再次打印此, 去,然后加我,并检查 条件 不断,不断, 直到你最终得到 到这种地步,我是10。 你要打印10次 然后我会等于10。 你要检查的条件。 比10小10? 不,那是假的。 因此,该环是不会 运行,这将打破, 而你要 继续与您的代码。 所以当你们看到的,这 是一个真正伟大的例子 一个循环,你可以设定在 运行一段指定的时间量。 每个人都清楚了吗? 是啊。 扬声器17:约增量如何 指数,它是不同的编码? ANDI彭:你can--我们会去 在这个下一张幻灯片。 好问题。 是anyone--之前,我谨 on--任何人都糊涂了, 因为这是一个非常艰难的概念。 不用担心,如果you're--确定。 酷。 好吧。 只是一般的幻灯片。 这个while循环做 循环完全一样的事情了。 这只是写的不同。 你们可以仔细阅读幻灯片 在稍后您方便。 但是,仅仅知道有多重 写同样的事情的方法 以发生在不同的循环。 行。 所以,现在我们的问题得到了什么 如果我们有一个循环内的循环。 我们正在转化为现实 盗梦式的东西在这里。 当你想要做的事情多 其他的事情里面倍 该做的事情多次,你 想要什么叫做嵌套循环。 对于那些你们谁第一个看到这一点, 得到非常困惑,所有我们在这里做 是有循环,其中一个 我们有行的变量。 但是它里面,我们也有另一种 用于可变称为柱的循环。 我强烈建议大家 谁是困惑,首先保持 track--画了这一点,画了这一点。 不要试图正当理由 通过它,画出来。 在你的头,在这片 纸,或什么的,写一行, 跟踪哪些行是公平的。 写专栏,跟踪 什么列等于。 并跟踪的是什么 打印出与每一个迭代。 这个循环的每次迭代,每 那个大循环迭代, 只是一味地按照逻辑。 我向你保证, 你一定会喜欢你所看到的, 因为它也很 适用于您的问题集。 酷。 好吧。 所以,最重要的事情 那你们可能都 想着现在, 是你的习题集1秒, 这是由于周四/周五。 在您的water.c程序, 暗示你将会有 以提示的用户输入。 在您mario.c程序 你将有 使用嵌套的for循环,这是 一个for循环的for循环里面, 打印金字塔块,基本上 像什么马里奥跳通过。 然后在你的greedy--或者 找零,如果有的话你们 曾经听说过that-- 你将必须非常 细心的第一个浮点值。 记住浮动小数和 整数是不一样的东西。 跟踪哪个是哪个。 而你要使用 条件语句,也是如此。 好了,最后一件事。 我有留下一两分钟。 样式。 因此,这是一些不 实际上实现的效率, 或代码的实际运行。 然而,它影响我们的 您的平地机,为你的读者。 它会影响你自己,如果你 试图找到一个问题。 它会影响您的代码的可读性。 所以风格,当你试图像 如果你的风格的一篇文章为英语, 没有段落, 你拥有了一切样 的混在一起在同一行,它 使得任何人真的很难 读你的文章,即使 你的观点在逻辑上是健全的。 同样的事情在编程。 你可以有可怕的晦涩 码Scaz将覆盖, 和它仍然可以运行和功能。 但对我们来说,因为你的可爱助教,谁都会 可以阅读和评估您的pset时, 这不是很好。 所以,请为求 我们和你自己的, 当你试图修复 在你的代码中的问题, 和你想 看你自己的代码,使 一定要遵循一些约定 我们打​​算走了过来。 所以第一。 给你的变量有意义的名称。 如果你想存储的整数 所谓的年龄,请其命名为年龄。 不要将其命名高度。 当你想 存储时代的高度, 它使一切 很迷惑我们。 我们不喜欢被人混淆。 你不喜欢被人混淆。 没有人喜欢被混淆。 如果你想创造的东西, 它命名为一些有意义的事情。 然而,在用于循环,单 字符变量通常是罚款。 而在for循环,如果你只想要我, 与J,K,随意仅仅做到这一点。 一致的初始化。 那么,是什么意思呢? 这意味着在技术上,理论上, 你可以发起并创建 在同一行上的多个变量。 因此,例如,我可以创建 称为scaz_age的整数, 和整数称为andi_age = 20, 和整数称为jason_age 在同一行上。 而且我也可以指定只有一个 他们,而不是其他人值。 我们请你,请不要那样做。 因为在这里你已经基本上建立 三个变量,但是它们中只有一个 实际上有一个值。 然后,当我们 试图读取你的代码, 或者如果你试图修复 在你的代码中的问题, 这是非常令人困惑遵循。 因此,只要你的可读性,对于 我们的可读性,不这样做。 一致的大括号。 有些人喜欢把自己的 大括号在不同的地方。 这其实并不重要。 只要确保你在一致的 自己的代码,你喜欢把他们。 一致的间距。 如果你把一个空间后, for循环,始终做到这一点。 那种就像不要在做 有些地方,不要在别人去做。 只要是一致的。 其次,如果有人想 细读CS50风格指南, 我们正式有一番风情指南, 告诉你这些公约, 加上更多。 这是在网上。 这就像cs50.net/style 或类似的东西。 你可以google一下。 一致性是关键。 所以不用担心什么 其他人都在做, 只要确保你 在你自己的代码相一致。 任何人有关于什么问题吗? 是啊。 扬声器18:所以正确的事 做初始化就是 让他们都在一个单独的 行,是你在说什么? ANDI彭:所以我很少有这种情况发生。 但是,如果你想,如果你想 要像节约空间,在你的代码, 或什么的,你可以做到这一点。 我们要求你只是不初始化 有一件事,而不是其他人。 所以,如果你想要做INT scaz_age,INT andi_age,INT jason_age,这很好。 只是不初始化一个 而不是其他的一切。 有问题吗? 好吧。 我要通过关闭 麦克风,激光指示器, 和着指挥棒Scaz在这一点上。 这是尴尬的。 这里是。 BRIAN SCASSELLATI:谢谢。 是如何形成的声音? 声音是好的? 。 优秀的。 行。 所以,大家好。 我要去尝试工作,通过 一个实际的例子和你在一起。 我们要使用CS50的 开发环境,什么所谓 集成开发环境。 你已经看到了这个 证明在讲座。 而在习题集1,你 将有机会 使用它,和玩 它,并习惯于它, 因为我们要使用它 通过本学期的休息。 所以在这个IDE,你有什么期待 就像一个非常传统的文件浏览器 过在一个面上。 你已经有了一个部分了 顶你要去哪里 看看你的源代码,你 CFILE,你写的代码。 上下底,你会 有一个终端窗口 你会使用到 这两个编译程序 并运行或执行程序。 行。 因此,只要给我们一点点 的基础上,在终端窗口中, 你会是 使用一组命令 这是整个标准命令 大多数Unix或Linux系统。 所以,如果你曾经使用过 任何形式的Unix,Ubuntu的的, 或任何其他调味剂, 这些将要看起来很熟悉。 如果你还没有,请不要担心。 没有什么复杂的他们。 他们只是用不同的 语法,不同的命名 约定比你以前见过。 因此,要列出文件 一个特定的目录中, 他们将使用 命令称为LS或列表。 如果你想看到的一切 与所有的细节, 你会使用命令 行参数使用ls -l命令。 这会告诉你一切 更详细地,包括 该权限的文件。 要更改目录, 你会使用cd命令。 而你就可以更改目录 既要到你的主目录。 这只是CD全部由 本身,光盘有两个 点会返回上一层 级别到以前的目录。 而且你还可以cd到一个 子目录通过键入CD 和该子目录的名称。 您还可以创建新的目录。 而且我们要走路 通过这次在短短的一分钟。 但是,仅仅把 一切都在屏幕上。 所以,你可以看到他们。 您也将有能力 直接操作文件 在命令行。 您将能够复制他们, 移动它们,或者将它们删除, 也就是说,有效地将其删除。 该CS50 IDE给你完整的 命令行参数的力量。 这意味着你也可以 这样做非常危险的事情。 行。 例如,你可以 除去,或者说是删除, 不求回报的文件 进行确认。 你甚至可以删除 recursively--那 破折号 - [R flag--整个 子目录及其所有内容。 行。 他们列在红色的,因为你 每次应考虑“危险” 你看到的那些东西。 行。 好吧。 现在,终于,这个事情是 将是真正有价值的给你, 是有几个不错的招数 要知道,你正在浏览 通过这个终端窗口。 首先,你可以清除屏幕上 任何时候只需键入明确。 而且你会看到 我这样经常。 你也可以显示 一个文件的文本 通过键入以上,然后文件名。 然后,您就可以滚动回来, 提出与刚刚与空格键 和箭头键。 如果你有,因为我们今天的演讲做了, 该连续运行的程序 在无限循环,你 可以停止该程序 通过键入控制执行, 即按住Ctrl-C组合。 而且你可能必须做 这种多次。 计算机得到远远领先于你。 你有时需要 给它一个尝试几次 之前它实际上会通过。 您还可以 通过命令排序 您刚刚输入使用向上键, 箭头键,然后向下箭头键。 什么是最有用的是,而不是 打字了长文件名, 您就可以使用Tab键 自动完成几条指令。 现在,我们将演示 所有这些,在短短一秒钟。 所以,如果你不记得 他们,不要担心。 这些事情,你会 拿起和使用,因为我们走。 行。 因此,在C--不像在Scratch-- C是编译型语言。 这意味着,我们将采取一个源 file--这是你写的文字, 你写的命令 的printf()语句,环, 一切else--,我们要 采取该文件,并把它关闭 到一个程序调用编译器。 那么编译器将 你写的文字 并把它翻译成 二进制指令 您的电脑 实际上是使用。 这就是所谓的对象 或可执行文件。 如果你看一下这个文件,你会 看到你写的代码。 如果你看一下这个文件,你会 看个字符的随机序列 使没有任何意义。 这是因为这是二进制。 这并不意味着你必须阅读。 但是,任何时候你想 运行的东西,你要什么 在运行是这个目标文件。 因此,当我们与这些合作 文件,我们会用C编写的文件 然后,我们将编译它,使用 命令类似于make将调用 编译器铛的C语言。 并且,将产生一个对象 文件,就像一个出来,或在此情况下, 这个名字,我的文件,我已经把研究。 好吧。 因此,让我们真正尝试这一点。 所以,我想出了一个例子 是我想尝试。 和的事情之一 让我着迷的动画。 所以我们要尽量做到 动画的一点点 仅使用ASCII字符。 人物我们现在可以打印出轻松。 因此,这里是我的最好的尝试 创造适合你 兔子的动画 通过高草运行。 他在那。 行。 所以,他没有跑呢,但他 在高高的草丛站在那里。 现在,如果我是一个漫画家, 在老同学 版本的动画,我 会做的是我将产生 这个兔子在草地上的图片。 然后,我会产生 另一个picture-- 另外他们所谓cell--了 有兔子只是稍微移动。 然后第三个是有 兔子感动得远一点。 我会产生一个完整的 序列这些细胞。 一些地方的兔子已经结束 到左侧。 然后缓缓移动,人们 由一个向中间。 然后从中间 到正确的。 如果我当时真的 幸运的话,我可以把它在一起 我可以动画。 还有就是我的兔子 通草运行。 这是我的伟大的PowerPoint 欺骗的一天。 行。 因此,这是因为它得到很好的。 行。 所以,在这里,人们有更多的时间,这里是我们的 兔子在草地上运行。 SPEAKER 19:再次。 BRIAN SCASSELLATI:一 更多的时间,所有的权利。 这是你的兔子。 行。 所以,我们今天有什么 做的是我们要去 尝试的过程自动化 的生产这些细胞。 我们不会完全得到以点 能够把它们放在一起。 但是,我们要尽量自动化 产生该序列的过程。 这是很多东西, 今日动画等。 也就是说,你没有做的事情不一定 通过绘制一切手工制作。 我们用电脑自动化 零件的过程。 行。 因此,让我切换 现在我们CS50 IDE。 和我已经us--,让创建 我放大这里一点bit--我已经 为我们创造了一个出发点。 我们要求你坐每次 来写一段代码, 我们真正要你做 是我们要求解决的一个问题。 而这样,你应该 想想这样做 是通过启动与一些 该解决方案的简单零件。 然后从该部分打造出来的。 这就是我们今天要做的。 因此,而不是试图全部一次 写整个一串代码这是 要生产这些 10动画细胞, 我们要开始,而不是 与该作品一件。 然后,我们将构建一个 周围的那一点点 多一点,多一点。 现在谈谈好事 解决问题这样 是,它可以让你开始 总是与你知道的东西 作品和介绍一款渐变。 这是一个伟大的方式 学习如何编写, 因为每次你犯了一个 变化,你看到什么影响了。 行。 因此,这里是我们的出发点。 行。 所以在我的文件的开头, 我已经哈希包含(#include)stdio.h中。 这让我可以得到 printf()函数工作。 我然后我有我的主要功能。 这看起来还是有点 神秘的或不明显的一些你。 没关系。 所有这说的是, 主要功能需要 没有arguments--无效的手段 没有在C.它 按照惯例,返回一个整数。 主总是返回一个整数, 通常一个代码说事 顺利或不顺利。 行。 但主要必须具有该 现在构成了我们。 我再放入三行代码。 而且随着每行 代码,我已经把评论。 现在,人们的事情, 我们将坚持这样做, 它是如此重要 编程实践, 是要始终注释你的代码。 总是在记 英文注释的东西 你认为 代码是应该做的。 这样,以后当你回来的 它,你可以看看它,你可以说, 哦,我记得我是什么 尝试做这个。 或者当TA坐下来与你 尽量帮你在办公时间, 他们可以看看这个去,我 看看你想要做什么, 而是,这是 到底发生了什么。 行。 所以,我有三个部分,以我的代码, 我将首先打印 一些点在开始。 然后我会打印出我的 非常看中的兔子。 然后点在最后的一些位。 而这三种打印报表应 很熟悉,你在这一点上。 所有这一切我做的 他们每个人是我 打印出的字符序列。 有没有涉及到的变量。 一切都只是持平。 行。 所以,如果我现在下去给我terminal-- 让我们来看看,如果我能得到这个回out-- 而我要再次键入明确。 扬声器20:我们用 双斜线评论? BRIAN SCASSELLATI:可以 使用double--肯定。 有多种方式来 离开C.一个评论 的方式是使用双斜线。 另一种方法是使用一个斜杠和一个星 然后关闭与一个明星,一个斜线。 好吧。 首先,我要 从这里开始浏览周围。 所以,如果我去我的主目录, 我已经改变了目录存在, 我要去看看,看看有什么 在该目录中,LS,列出。 我要看到我 有两个子目录。 让我们使这个有点大 在这里,以便我们都可以看到它。 我可以看到我 有两个子目录。 我会改变目录 进入工作区。 而我要的类型只会出 它的一部分,然后只需按一下Tab键。 而且它会完成剩下的我。 花式。 我会看看,看看工作区。 而现在,我的工作 在超部分 我们是在教现在。 所以,我会去到该目录中。 最后,再看看吧。 而且我有这个文件bunny.c。 好所以让我清楚的一次。 而且我要再次声明,我now-- 仍然留在该目录 并且它告诉我,我在 该超部分目录。 我要继续前进, 让我的程序的兔子。 而该命令,使兔子, 虽然听起来有点古怪, 还调用铛编译器。 而且它产生的 我的输出, 可执行funny--的 可执行文件被称为兔子。 行。 我可以再和这听起来 更糟的是,执行兔子。 行。 让我们看看会发生什么。 行。 这是一点点 我所期待的。 我有我的兔子图片在那里, 样的,但我希望它所有的本身。 我错过了什么? 扬声器21:斜线L或斜线ñ。 BRIAN SCASSELLATI:斩ñ。 行。 因此,让我们回到这里。 我会离开的。 我会重新回到这一个。 让我们来看看现在 从我的主要功能在这里。 所以,我应该怎么办? 我想结束就行了。 所以,我加入了注释。 我会在一个printf()。 而且我有什么投入? / N。 行。 我有什么用结束了吗? 分号。 好吧。 现在的人真的 重要的事情是要确保 每当你做出改变 在你的代码,你保存它。 如果您还没有保存你的代码,你 要注意到一个小星星在那里。 这星说你 已经没救了这些代码。 如果我现在编译它,它不是 要反映的任何更改, 因为编译器查看文件 这是磁盘,而不是只是文件上 在编辑器中打开。 好吧。 因此,让我们将它保存,然后我们会去 对上到这里,回来了。 下来到我的终端。 而让我们再次清除空间。 我们可以继续前进,多了一个 时间让我们的兔子计划。 并执行兔子。 这也不起作用。 错误的斜线。 所以,如果你看一下我有,我把 / N在那里,但我有错的斜线。 一切你的电脑 做的是非常明确的。 好不好? 标点符号的一个小错误, 突然间,你没有得到你想要的。 好吧。 因此,让我们放大出来了。 我们会回去。 那么做出非常快修。 我们会把正确的斜线研究。 我们会保存。 我们会放大。 出于某种原因,这不是 快乐,但让我们继续 我们将回到终端在这里。 它清除掉。 我们将进行放大。 而一个更多的时间,我们会让兔子。 而现在果然,它的工作原理。 万岁。 行。 因此,让我们努力使今天 多了几分一般。 让我们来看看,而不仅仅是 打印一个特定的框架, 让我们来看看,如果我们可以让这个 这样我们就可以得到所有10 这些动画帧 我们希望有。 如此反复,让我们 此一步骤的时间。 让我们先来概括它,不是 让我做的所有的帧, 但让我做任何一 框架,我可能想。 所以,有什么区别 在帧之间? 是兔子一样吗? 听众:是的。 BRIAN SCASSELLATI:是的。 有什么不同? 听众:位置。 BRIAN SCASSELLATI:它的位置,对不对? 以及如何控制它的位置? 多少点我 将在开始 而且我有多少点 将在末端。 所以,我有五处 开始和五个在末端。 让我们来替换五连一个for循环。 行。 而且我要创建一个用于 环现在会说, 我要打印一些数 的圆点在开始。 我将使用一个变量。 比方说,怎么样我作为 计数器在我的循环。 而我要声明它往上顶。 然后在for循环 我需要做三件事情。 我需要做的第一件事情 是我需要初始化我。 我应该怎么初始化 它开始呢? 0。 行。 然后,我需要说的,有什么 终止条件? 什么时候应该停下来? 那么多少个点你 要打印在这一个? 听众:五。 BRIAN SCASSELLATI:五了吗? 怎么样让我们做什么 不同的,我们做了五位。 让我们表明,它的不同。 扬声器22:两个。 BRIAN SCASSELLATI:两个。 行。 所以,如果我想两个点, 我应该放在这里? 听众:三。 BRIAN SCASSELLATI:三。 行。 多少次是 要办理什么手续? 这是怎么回事要经过 三次,0,1,和图2,是吗? 好吧,让我们回到到两个。 现在,我们会得到两个点。 什么做我想做的每一 一次我去通过循环? 什么必须改变 每次我办理什么手续? 扬声器23:添加一个点。 BRIAN SCASSELLATI:我一定要坚持下去。 我要加一个点。 我要打印一个点, 通过每次循环。 但我怎么保存,如何跟踪 很多次,我经历过的循环? 我用我,那 变量,该计数器。 所以每次经过,我要去 一个递增计数器。 现在,这是相同的 我的话说:I = I + 1。 没关系。 我能做到这一点that--我喜欢 速记,所以我会说我++。 行。 让我们做同样的事情 这儿的底部。 那种只有我做了一个。 我将让你们 完全做到这一点。 好吧。 所以,我应该写在这里? 这是我的for循环。 我会做一个printf(),我要去 为让这个我只打印一个点 在该底部。 我应该怎么写 这里面现在循环? 好了,首先是什么 变量我应该使用? 扬声器24:J-。 BRIAN SCASSELLATI:我可以用学家 我可以使用相同的吗? 我还可以再用吗? 是啊。 这是确定的,因为是 我使用了这里, 我不要再当需要他们 我得到了这一点。 所以,我应该初始化我来? 扬声器25:10。 BRIAN SCASSELLATI:0。 我应该怎么检查? 多少点我现在需要在最后 如果我有两个点的开始? 我需要8月末,还等什么 我应该检查一下,我少than-- 听众:七,八,九。 BRIAN SCASSELLATI:听说七人。 我听到了八强。 我听见九岁。 行。 所以我们都在正确的 ball--杰森说:10。 行。 如果我需要两个点的 第一位的,又有多少呢 我 - 我需要8个点的 最后埃德蒙顿我放了两个加上面, 我应该放下下面? 听众:八。 BRIAN SCASSELLATI:八。 因为这是要 算上0到7。 这就是通过环路八次。 行。 什么我必须做底? 观众:我++。 BRIAN SCASSELLATI:我++。 好吧。 所以,这看起来相当不错那里。 让我们来试试吧,让我们看看会发生什么。 行。 所以我们要保存它。 尼斯和保存。 我们将放大出来。 我们将尝试在这里的终端。 我们将进行放大。 哎呀。 我们会,更多的时间, 让我们的兔子计划。 并继续前进,执行兔子。 它就在那里。 因此,有我们的兔子。 其中,它有两个点的开头 和8个点出在末端。 大家还我? 行。 因此,我们建立起来。 我们造成了一辆小兔子, 一个特定帧。 现在,我们已经能够 概括说来构建 更,不同种帧。 现在,让我们继续前进,并有 它产生的不只是一个框架, 但让我们产生10 帧,在那里我们慢慢地 让兔子把所有 横跨字段的方式。 好吧。 让我们回去。 我们会尽力了。 那么什么才是我真正需要改变这里的? 我需要做什么改变? 扬声器26:首先,您需要 改变点的最大数量 在开始。 因为如果我们正在做的10点, 这将需要多达规模。 BRIAN SCASSELLATI:是的。 所以,现在我有几分是硬 要始终做到两个点开头 始终做到8个点底。 我想建一个循环,对不对? 因为我不希望 建立只是一个兔子图片, 我想建立10兔子的照片。 所以,我需要建立另一个循环, 当我经过这个循环, 我想换多少 点我打印开头 多少点我打印末, 基于通过环路循环 算我一个。 好吧。 因此,让我们得到另一个柜台。 别人的面前说Ĵ, 所以我们会再拍学家 而现在,我们要 for循环另建。 什么是循环中去? 这东西已去 内循环,对不对? 难道兔子有 走在循环中? 我需要在一个小兔子 其中每个10帧? 听众:嗯。 BRIAN SCASSELLATI:是的。 我想在每一个兔子 在10帧的,对不对? 怎么样的圆点 最后,我需要吗? 行。 所以,我要缩进所有的人。 我要强调的是 这一点,我会打标签。 这就是将他们推向全国各地 一点点,这样很容易让我 看看有什么环路中。 然后,我将结束它。 比如说。 好不好? 现在,在该循环 我building--哎呦, 做出这样你就可以see-- 我有我的计数器j。 我会在0开始的。 多少次,我想 要经过这个循环? 听众:10次。 布莱恩SCASSELLATI:10次。 那么什么号码,我应该把在这里? 听众:9,10。 布莱恩SCASSELLATI:9,10, 有人在得说11了吧? 我想两个点前 并把小于2我。 我想8个点, 我把小于8我。 现在我想通过10 次,所以我把Ĵ少than-- 听众:10。 BRIAN SCASSELLATI:10。 在那里,我们走了。 而我做底到j是什么? ++,增加它。 行。 现在,这里的棘手的部分,什么是 会发生什么,现在如果我这样做? 我要去打印10帧? SPEAKER 27:我认为, 他们都会是相同的。 BRIAN SCASSELLATI:他们会 都是一样的,对不对? 因为所有的人都仍在继续 把两个点开头。 但我不希望它们都 有两个点的开始。 多少点我 想在开始? 听众:更改。 BRIAN SCASSELLATI:我 想要改变,对不对? 所以,我有什么在这里,正在改变 每次循环经历? 听众:的点数,J。 BRIAN SCASSELLATI:J-, 点的数量。 所以,我可以改变这是学家 第一次通过 环,那是什么打算呢? 我该怎么设置J可在第一? 听众:0。 BRIAN SCASSELLATI:那么有多少 次我该怎么做呢? 0。 通过循环,J的第二时间 将是1,因为我加一。 多少点我要去打印? 1。 通过循环的第三次, 多少点我要去打印? 听众:三。 BRIAN SCASSELLATI:J-将是3。 多少点我要去打印? 哦,对不起,J将是2。 多少点我要去打印? 听众:2。 BRIAN SCASSELLATI:2。 好了,所以我要保持 递增的,因为我们走。 如何向下跌破? 善有善报这儿? 我不想8总 在结束了吗? 扬声器28:10。 BRIAN SCASSELLATI:我想10点? 我希望它改变了。 所以,我怎么想它改变? 听众:[听不清]。 BRIAN SCASSELLATI:嗯,如果我 有五个点在开始, 多少个点的我在最后得到什么呢? 听众:五。 布赖恩SCASSELLATI:如果我有 6点之初, 多少才能获得在结束了吗? 听众:四。 布赖恩SCASSELLATI:如果我有 7点在一开始, 多少才能获得在结束了吗? 听众:三。 布赖恩SCASSELLATI:如果我 有Ĵ点之初, 多少才能获得在结束了吗? 10-j的。 行。 所以让我们尝试了这一点。 所以,我要拯救我们的兔子计划。 我们再次将缩小。 我们将去到我们的终端。 我们将清除它。 并进行放大。 我们将让我们的兔子节目,再次。 我们将执行它。 嗯,哦。 等一下,让我们缩小。 难道我得到10帧? 那么,有多少兔子 我看到那里? 1,2,3,4,5,6,7,8,9,10。 我得到了10帧。 他们都是一样的吗? 听众:是的。 第 BRIAN SCASSELLATI:没有。 这第一位的, 兔子是远在左边。 而在这里,兔子是远在 SPEAKER 29:对。 BRIAN SCASSELLATI:那么, 我怎么忘了怎么办? 扬声器30:启动一个新行。 BRIAN SCASSELLATI:我忘了 开始一个新的生产线,再次。 同样的错误,我之前所做的。 好吧,让我们去解决这个问题。 现在,我还有代码 在那里做一个新的生产线。 为什么不工作? 扬声器31:这不是在循环中。 BRIAN SCASSELLATI:哦, 它不是在循环中。 这是正确的。 它在这里坐在外面。 而for循环就是一切 就是这样的文字里。 所以,我要动 这里面的for循环。 我将标签在它前面 表明它在正确的地方。 而现在,我们将重新保存。 我们会缩小。 我们将切换到我们的终端。 放大。 我们将重塑我们的兔子计划。 而现在,现在我们已经得到了我们的10帧。 [掌声] BRIAN SCASSELLATI:OK。 所以。 我们的嵌套这里的for循环。 我们能够生成在 我有多少点希望内环 打印在开始的时候,在末端。 和外环控制 多少帧我是建设。 我们从一个小小的 问题的核心, 我们从该点建造出来。 好吧。 让我们做一个步骤。 你准备好了吗? 有一件事在这儿, 样的,我们实际上已经得到了 更多的复杂性比我们所需要的。 让我们一起来看看。 因此,在我们的兔子节目, 如果我缩小这里, 我实际上做一些相同的 事情一遍又一遍。 我该怎么做那类的 同样的事情重复了两次? 扬声器32:打印点。 BRIAN SCASSELLATI:是 我打印这些点的两倍。 说真的,我应该有 此评论到这里。 我打印了一些点在 开始,一直在这里。 然后,我打印了一些点底。 我做那种完全一样的东西。 我们要开始 致力于在未来几周内 是能够利用这些区块 我们使用了一遍又一遍代码, 并通过一个过程 所谓抽象, 我们要拉他们出来, 一旦写出来,这样我们就可以 一遍又一遍重复使用它们。 因此,让我们试试吧。 准备好了吗? 我们将利用这个代码块。 而且我打算把它救出来。 而且我要define-- 向下在底部, 我打算写一个新的功能。 它不会返回任何东西。 而且我要叫它printDots。 这将需要一个 参数,一个整数, 说howManyDots我应打印。 而不是打印Ĵ点和现在,我 打印告诉howManyDots我应打印。 而且还有一个小问题在这里。 任何人都知道它是什么? 我有什么说的上市 在这里没有定义? 听众:[听不清] BRIAN SCASSELLATI:那么怎么样 多点是指直到 在这里,但我使用的变量i。 所以,我要采取的变量i 我要去下来定义它在这里 代替。 所以,现在它要stay--哎呀, 得到了大写锁定somehow--我 要保持我倒在这里。 所以,现在这里是我的小功能 或子程序,它说, 多少点我要去打印? 而且它会通过这个循环, 一遍又一遍打印出来。 那么我可以修改我的程序在这里。 而且我怎么调用该函数? printDots。 所以,我会打电话给printDots。 多少点我要打印 第一次小兔过吗? 听众:J-。 BRIAN SCASSELLATI:J-。 多少点我要打印 在最后,兔子后? 10-j的。 还有一件事我很想念。 正如你在演讲今天看到的, 我们要声明printDots 高达上面给的原型。 行。 因此,我所做的是我一直在努力, 隔离的代码重用一部分 我已经做了一遍又一遍。 我一直试图将其拉出,使 所有这一切都包含在一个地方。 这样一来,如果我有一个错误的地方, 我只需要解决它在一个地方。 好吧。 因此,让我们将它保存。 而且,我们要确保它的工作原理。 因此,让我们走出去。 我们将再次去我们的终端。 我们将进行放大。 我们会作出这样的兔子进程。 呵呵。 它给了我一个警告。 它是什么告诉我? 那么在任何这些 时候,你总是希望 滚动到第一个error-- 现在就这一个,我只得到了一个。 它告诉我bunny.c,上线 8,第9栏,有一个问题。 它说,你已经声明这 变量i,你还没有使用过。 现在通常,这是 还不是最坏的错误。 这是一个容易解决。 而事实上,我们可以回去研究。 我们可以回到兔子。 在这种情况下,所有的我们 所要做的就是摆脱我, 因为我们没有使用 我在主了。 我们只是用它 在我们的子程序。 因此,让我们保存。 我们会回去。 并进行放大。 我们将更多的时间做兔子。 还有一次是我们的10帧。 行。 提供给您的任何时候 一个procedure--呀。 SPEAKER 33:我有A--我很困惑。 你能回去的代码? BRIAN SCASSELLATI:是的。 SPEAKER 33:所以,当你写的 你的原型,争论你 有它命名叫的howmany? 但是,below-- BRIAN SCASSELLATI:哦,是的。 SPEAKER 33:--called他们的东西 不同的,我不明白。 BRIAN SCASSELLATI:为什么 他们是不同的。 所以这是一个很好的问题。 所以现在的问题是,上升 在这里,我写的howmany, 而楼下,我写了howManyDots。 其原因是,在你的原型, 它实际上不重视 给你把的姓名。 它所真正关心 是,它是一个整数。 它希望知道的形式 对你把什么。 现在stylistically-- oops--我应该 不,是我喜欢做这些比赛。 行。 因为这会保持它 我更容易记住。 但是,这是我的错呀。 SPEAKER 34:所以对于 原型去上班,就 写作这一行, 写原型, 允许函数来 右下方它去年底 和检索是什么意思? BRIAN SCASSELLATI:这是什么意思 是当编译经过, 它从顶部 你的代码底部。 什么这个原型是, 是它基本上是一个承诺。 它说,那里将是 一个函数定义的地方。 这将是所谓的printDots。 而这将需要一个参数 那将是一个整数 并且它会返回 什么都没有,空类型。 行。 我向你保证这将是 某处定义的道路。 但是,任何时候你看 那,你下去 通过其余我 主要的功能,我想 你可以把它看成一个函数 这需要一个整数输入。 因此,当编译器出现故障 通过这一点,它认为这一承诺。 当它下来, 一直走,一直走, 它找到的第一次 printDots被提及。 它说,呵呵,你给 我这个学家生的一个整数。 嗯,你答应我,会 是一个整数,这是正确的。 没关系。 然后终于,下来 在最底层, 之前,我到年底我 文件,我兑现我的诺言 我定义它。 好不好? 扬声器35:所以,saves--的 程序将保存空白 它可以追溯到并填充在结束了吗? BRIAN SCASSELLATI:这不是 关于内存分配。 它实际上只是什么 类型是你希望看到的。 如果这件事情有一个 参数或五个参数? 应该有它的整数是 给它,或字符串? 这一切都在寻找 做的是检查, 你给我 正确的说法。 好不好? 好吧。 让我离开你 另外一个位来看待。 ASCII艺术不是伟大的榜样 动画,因为它是今天。 但是,当然,也有人拿东西 他们推到自己的极限。 这是,正如大卫展示 在讲座中,一段代码 你应该在任何情况下 尝试复制自己。 因为它是可怕的文体。 事实上,它的设计是为 困难的,因为可以读取。 行。 所以,再一次做,让我们放大在了这里。 我现在要去走,更改目录。 我要转到上一级 的水平,回到我的工作区。 然后,我会改变目录到这个 我已经创建了其他目录。 这是国际 混淆C程序设计大赛。 混淆手段硬 如可以理解。 所以,请不要如果你吓到 在这去,我无法读取。 这是它的点。 好不好? 但是,我们有这个 精彩的节目,我是 将只需键入更多的关注一下。 让我们来看看,如果我能缩小 只是有点,所以你可以看到它 这就是该程序。 它的命名endo.c. 它看起来像这样桶 一种字母F-L-U-I-D在里面的。 这其实是一个程序。 这是写在最不起眼的 这样,作者可能可能 写下来。 但它是一个奇妙的小片的 产生流体动力学模型。 因此,我们打算给 这种模式的输入端, 看起来的这样, staired集集装箱 一些液体,一些 液,在顶部。 我们将有它模拟 发生了什么吧。 所以,我会调用该函数,内。 而我给它的 ,我已经有输入文件。 还有就是我们的ASCII艺术的缩影。 一个完整的流体动力学模拟 在代码只有几行运行。 现在,什么是居然真的 令人惊奇这个小程序 是,我现在要停止它, 所以我打算用什么命令? 听众:控制-C。 BRIAN SCASSELLATI:控制-C。行。 因此,我将使用Ctrl-C组合。 C,它会停止它。 我会再次清除。 而现在我要调用 程序,执行程序, 使用本身作为输入。 我们将看到流体动力 模拟它融化。 行。 请不要让该程序 是因为混淆了你的东西。 这只是这样我们就可以结束 一些冷静和有趣。 行。 祝您好运与你的习题集。 我们很乐意回答 课后问题。 谢谢了,伙计们。