[Powered by Google Translate] DAVID J.马兰:好吧,这是CS50,这是 结束第1周,所以研究卡的总数 同学,你今年是745。 我们很高兴能有这么多的过程中, 这学期,但即使这个过程是如此之大, 认识到,它的这些事情,比如周五的午餐, 办公时间,15人的部分,等等, 真正的意思创造这更亲密 环境。 因此,即使我们可能会收集每周一次或两次,在这里 桑德斯知道这么多你的经验,在此过程 非常动手的同时,你的同学 和师资队伍建设。 所以,在这里,我们走了,秋天2012年。 所以,记得我们最后一次上记下结束 不精确,谈论的数字表示。 同时,我们也发生的故障之一,在 现实世界中,当它来到误解 计算机如何工作。 那么,今天我们将重新审视这些想法另一个 继续我们的讨论的CS50客户端的 和C,这意味着什么真正的程序。 但是,第一,只是一对夫妇的旋风公告。 节本周日开始的第一周始终是一个 位的快速启动,因为我们刚刚在 您的截面形式。 我们正在做的是相同的,现在的教学研究员,现在 他们知道他们的日程安排,所以我们的目标是,通过 星期六的早上,跟进你与你的部分 转让和TF。 要认识到,他们就会开始第二天,周日 周一或周二。 然后,我们将容纳部分出现的变化,因为他们 在未来的日子里。 办公时间,同时,再次,今晚8日下午至11日,在 安嫩伯格,以及明天晚上。 即使问题集一般是由于上周四 中午,意识到你有五迟花, 因此,可用性,星期四办公时间 你的现金在那些已故的日子,因此,提交 上周五的东西。 让我从头开始更多的乐趣之中,其中 更低调的习题集。 我会挂到那些迟交天数,在战略上,只 在本学期后,当生活开始得到的方式 期中考试和其他类。 问题1,同时,将发布在球场上的 本网站将在课程的步行路程, 通过视频,这将被拍摄下来,在上周五下午2点30分 然后在网上发布的第二天。 因此,我们于周一结束。 我想 - 实际上,注意这里。 由于类 - 因为,桑德斯并不完全借给 本身以休闲Q&A回,来回非常好,我们 要尝试一些新今年,据此, 如果你不舒服提高你的手或你只是 宁可不要这样在一个房间里,举起你的手 我们将有一定的教学研究员和CA 在演讲的人员编制cs50.net/discuss。 所以,如果你有一个问题,因为我完全 一些不清楚的东西或你很好奇 主题,尝试张贴在那里。 标记,它与标签的演讲,我们将竭尽所能 今天和下周 - 我们就会试试这个 - 到外地 无论是电子,网络,或者如果它感觉就像是我们应该 真正解决这个集体,教学研究员之一 CA将提高他们的手,问 匿名您的代表。 所以,我们可以给它一个尝试,看看它的原理。 但是,通过各种手段,不断举手,你想。 所以我们最后一次发现,10%的十分之一, 事实上,0.1,就像你教多年以前。 其实,这样的值。 但是这还不是全部都是真实的,对不对? 我们只是有这样的约束,在计算机,据此,如果你 只有在有限的记忆体,RAM,或更多 特别是位很好,有只有有限数量 的事情,你可以代表。 例如,如果我们的零的个数,我们要 代表二进位,8位,位, 又是一个0或1,我们可能会 它表示为00000000。 这是一个有点不必要的冗长。 就像在现实世界中的十进位制, 一般地,如果你想要写的编号为123,我们 人类也许并不即使写00000123, 功能,这是完全一样的。 我们只是删除前导零,可以这么说。 在二进制中,我们可以做的是一样的。 二进制零,零和二进制为零。 你只需要一个单一的位。 但同样,最常见的在世界上的度量单位 的计算是字节,8个位。 仅仅因为一个位,好看不中用。 八位,而不是非常有用的,但至少,它更重要的是 有用的度量比一个单一的单元。 因此,用8位,我们通常会代表的二进制文件。 所以,在这里,我们有数字零,一,二,那么,作为 内特在我们的视频最后一个星期三,我们可以继续 向上计数到7,8。 然后,如果我们使用越来越多的位,我们 可计数到无穷大。 但是,如果你只有有限数量的这些位,因为是 任何计算机系统中的情况下,甚至导弹 系统,很好,你确实只有一个 有限数量的精度。 所以,如果你想代表的数字(如0.1),以及, 电脑挑选。 并且如果它仅具有有限数量的数字,它可以 代表,它可以接近0.1,但它不能 一定给你正是你想要的值。 而这仅仅是一个电脑的挑战, 引擎盖下的,令人欣慰的。 在本学期我们得更远,这些较低的水平 变得不那么有趣的细节,但可以肯定的 运用这些思想可以有一些非常现实的世界 的后果。 一个是一点乐趣。 你们有多少人看到了惊人的电影的办公空间吗? 如果你还没有,那是你的非官方 功课的一周。 但是,在办公空间中,研究人员在那部电影 优势,正是这种想法,但他们实际上偷 从另一部电影,你可能有 可见,甚至几年前。 因此,让我给你几秒钟的这个预告片 这个惊人的电影,这是非常 学术有关。 [播放影片] 其实,我被提拔。 我可以编写一个病毒,它们会撕裂, 将大的时间。 那么,它是如何工作的? 每当有一银行交易的兴趣是 计算,每天有成千上万的计算机结束 这些不足一仙。 但我不会做任何违法的事情。 非法?萨米尔,这是美国。 你必须向上帝发誓。 如果没有人知道这一点,但我们,所有的权利吗?没有家人,没有 女朋友,没有人。 [听不清]。 不要担心,人,我不会告诉任何人,无论是。 [电影结束] 好吧,也许我比大多数人更好地发现这部电影 这里的人,但在任何情况下,他们的病毒 努力创造 - 在电影中,随时会打电话给一些病毒, 它通常不是真正的病毒。 这只是有人写了一个程序,做一些事情。 在这种情况下,球员试图写一个程序 趁着他们的公司叫Innotech公司的 计算系统,从而计算机,也一样,甚至当它 说到钱,可不一定 正是代表钱。 因此,即使你可能有您的银行帐户0.10美元, 0.10,好了,电脑实际上可能会认为你有 这美分,在您的银行帐户。 所以这些人是有志于做的 - 和他们 偷的想法,事实证明超人III,其中 理查德·普赖尔做同样的事情 - 他们基本上是 编写程序,渴望采取一切尾随 号,所有的微小的,微小的,微小的分数 便士,及虹吸关闭,因此人类 想,哦,这是唯一的0.10美元存在,但所有这些 尾随数字,最终增加。 因此,一个绝妙的主意,它事与愿违欢快的, 尤其是电影。 但在现实世界中,也有更多的关于 这些事情的影响。 的原因之一潜入计算机领域的 再次,是科学,其适用性不 仅工程科学,但只是为了 其他领域。 因此,这是一个不太轻松的看看什么可以去错了,但 这也是相当睁眼,我认为,当涉及到 如何准确理解无所不在的技术,如 计算机和编程这些天来, 的软件的形式。 因此,这下一个剪辑是刚刚约为6分钟,继续 最后一次我们离开的地方,但让我们看看一点 在这样一个对这些问题的深入。 让我跳到我们离开的地方, 这是在这里。 我们有两个部分,约六分钟在这里。 [播放电影] 困扰现代火箭技术。 在1991年,开始第一次海湾战争中,“爱国者” 导弹经历了类似的种 数字转换问题。 而作为一个结果,20人,20名美国士兵被打死 约100人受伤,“爱国者”,这是应该 以防止传入的飞毛腿导弹, 没有发射导弹。 在伊拉克入侵科威特,美国发动的沙漠 风暴在1991年初,爱国者导弹 从伊拉克部署,以保护沙特阿拉伯和以色列 “飞毛腿”导弹的袭击。 “爱国者”是美国的中程表面空气系统, 由雷神公司制造。 “爱国者”拦截器本身的大小,它是关于 大约20英尺长,重约2000磅。 它携带的弹头,约 - 我认为这是大约 150磅。 和弹头本身就是一种高爆炸药, 它周围的碎片。 像霰弹的弹头外壳的设计。 该型导弹进行4每个容器 半拖车运输。 “爱国者”反导弹系统至少可以追溯到 20年了。 它最初被设计为防空导弹,以 击落敌方飞机,在第一次海湾战争。 当那场战争以来,陆军希望用它来拍摄 跌飞毛腿“导弹,而不是飞机。 空气伊拉克队就没有那么多的问题,但是陆军 飞毛腿担心。 因此,他们试图升级“爱国者”。 拦截敌方导弹在5马赫的速度行驶会 足够的挑战性。 但是,在的爱国者被送往服务时,陆军 不知道的伊拉克修改了他们的 打飞毛腿导弹几乎是不可能的。 发生了什么事,是飞毛腿导弹, 未来是不稳定的。 他们摇晃。 这样做的原因是伊拉克人,以获得600 公里,有300公里的射程导弹,花 重量的前弹头和 弹头更轻。 所以,现在的爱国者的努力来飞毛腿,和大多数 的时候,绝大多数的时候,它会 只是飞的飞毛腿。 一旦运营商“爱国者”系统实现“爱国者” 错过了它的目标,引爆的爱国者弹头。 为了避免可能出现的伤亡,它被允许 倒在地上。 这是大多数人所看到的,大火球在天空中, 拦截飞毛腿弹头和误解。 虽然,在夜空中,似乎是 在宰赫兰,成功地摧毁了飞毛腿导弹,有可能是没有 错误关于它的性能。 在那里,爱国者的雷达系统失去一个曲目 传入的​​飞毛腿从未发起因 一个软件缺陷。 这是以色列首次发现的时间越长 系统上,更大的时间差成为, 由于系统的计算机中的嵌入的时钟。 在惨剧发生前大约两个星期,在宰赫兰, 以色列国防部报告说, 系统失去的时间。 经过约8个小时的运行,他们发现, 制度越来越明显不准确的。 国防部回应,告诉所有的 爱国者不会离开系统 很长一段时间。 他们从来不说,很长一段时间 - 8小时,10 小时,千小时。 没有人知道。 在宰赫兰的军营驻扎在爱国者 有问题的内部时钟已经超过100小时 二月25日的夜晚。 它跟踪的约十分之一秒的精确度。 现在的十分之一,二是因为一个有趣的数字 它不能被以二进制表示,完全相同,这意味着 它不能被正好在任何表达 现代数字计算机。 这是很难相信。 但使用这个作为一个例子。 让我们来数的三分之一。 ,究竟有三分之一不能以十进制表示。 三分之一是0.333是无限的。 有没有办法做到这一点的绝对精度十进制的。 这也正是同样的问题发生在 “爱国者”。 系统运行的时间越长,成为时间更糟糕的错误。 运行100小时后,时间中的错误是只 大约三分之一的第二个。 但在5马赫的速度行驶在导弹的目标, 这导致跟踪误差超过600米。 在宰赫兰的士兵,这将是一个致命的错误。 现在的情况是飞毛腿发射检测预警 卫星,他们知道,飞毛腿在他们的 大方向。 他们不知道有人来了。 这是现在的爱国者的雷达组件 系统,保卫达兰,定位和跟踪 来袭的敌方导弹。 该雷达是很聪明的。 实际上,你会跟踪的位置,飞毛腿,然后 预测它可能会是今后一段时间 雷达发出一个脉冲。 这是所谓的的范围内的栅极。 然后,一旦决定有足够的时间已经过去了,去爱国者 该检测到的备份和检查的下一个位置 对象,它可以追溯到。 因此,当去到错误的地方,然后看到没有 反对,并决定,有没有对象。 这是一个虚假的检测和下降的轨道。 传入的​​飞毛腿从雷达屏幕上消失。 几秒钟后,砰的一声走进军营。飞毛腿 杀害了28和发射过程中是最后一个 第一次海湾战争。 可悲的是,更新后的软件在宰赫兰 次日。 而软件漏洞已被固定,关闭中的一个章节 多灾多难的历史的“爱国者”导弹。 爱国者实际上是一个缩写为“相控阵跟踪 拦截的目标。“ 所有权利,更悲哀的结果不太 了解这个世界。 外卖,从电影,真的是该解决方案 有被重新启​​动您的导弹防御系统 每一次在一段时间内。 如此反复,这门课程的目的之一,当然 一种更谦逊的规模比这些应用程序, 真正的开放究竟如何,你去了解每个人的眼睛 使机器做你希望他们做什么,以及你如何去 这样做是正确的,而沿途做 好吧,优雅,等等。 所以今天,让我们多一点点,这潜入,但 所以,我们不要走的太快,特别是那些少 舒适,而且还使我们能够保留的利益 那些更舒适,让我们迅速开始位 回顾一下其中的一些想法。 再次,要求离开,无论是在个人或网上,如果你有 的问题,所以我们可以让每个人都在同一页上。 因此,CS50电器,快速退后一步, 什么,你自己的话怎么办? 这是确定的,如果你不知道那些话,可能是还没有。 [听不清] 好了,所以通用接口 - 我们都可以共享。 当然可以。 因此,我们可以,例如,告诉你去一些 网站,下载该软件适用于Mac OS。 下载该软件适用于Windows,配置 这条路上。 但现实情况是,我们遇到无数的技术 支持的问题。 这些天,许多正在做什么的服务器端, 在计算世界中,特别是当它涉及到 Web开发和Web的应用程序,实际上是 经常在Unix或Linux计算机上,而不是 Mac或Windows电脑。 之间有利的一面,那么,这件事情被称为 CS50设备是我们将所有具有相同的环境。 因此,每个人都在同一页上,无论什么样的硬件,你 来到校园,但也将涉足准确 同样的环境下,你会使用朝 学期结束,以及网络的发展,以及在 其未来真实世界的应用。 因此,更具体而言,CS50电器是免费的一块 软件,可以让您运行其他操作系统, Linux操作系统,在这种情况下,在自己的计算机上,在一个窗口中。 现在,你不能只是下载设备。 你需要一个程序,播放或运行设备。 而这一块的软件一般称为 虚拟机管理程序。 虚拟机管理程序的形式,如VMware的产品, 虚拟保险箱,相似之处。 所有的公司的各种软件,包括免费的和 商业的一致好评。 你会看到什么问题说明如何设置1 获得免费的软件,用以 执行CS50电器。 一旦你,你就必须在你的Mac或PC上的一个窗口, 一个桌面环境,看起来很喜欢这个, 它在开始菜单一样的东西 底部的左上角。 它有一个Home文件夹,或主目录,在左上角 在那里,一个垃圾桶,等等。 因此,我们除了耻笑,因为我们去的必要的细节。 但现在让我们开始潜入C. 因此,C是这样的编程语言,精神, 从头开始,但远不如图形,但具有讽刺意味的​​是,远 更强大的,一旦你得到它精明。 因此,在C中,我们编写的程序编写源代码,这是 这类似英语的语法,类似的袜子 我们做了示范,最后一次,可让您 表达自己相当精确,如果 arcanely,到计算机。 那么,什么样的软件产品,你实际需要 编写程序的语言,如C,根据我们的 在周一的谈话吗? [听不清] OK,你只需要一个文本编辑器。 你不需要任何特殊的软件 本身编写程序。 你只需要一个文本编辑器(如记事本),在Windows, 文字编辑在Mac上,或所谓的gedit的,在世界上的 Linux中,我们将在这里使用。 就是这样,写的程序。 但写作只有一半的方程。 然后,您需要运行它们。 但是,为了运行程序 - 你不能运行的源代码。 你,而不是必须做什么它? 是啊。 DAVID J.马兰:您需要 编译它。 而且,别人编译的源代码是指 - [听不清] DAVID J.马兰:没错。 把它转换成零和一。 因为我们所有的人,这些天来,有电脑,有CPU的, 几乎全部是由一家名为英特尔, 英特尔内部,有你的这个大脑内 计算机,称为CPU。 ,大脑做的事情之一是,它知道 如何理解零和一的模式。 它知道什么图案位代表另外,什么 图案代表减法,什么图案 位代表打印,并创建一个可听见的声音。 因此,在短期中,CPU,加上与操作系统, 这是一块的CPU上运行的软件, 可以这么说。 总之,这两条都知道如何来运行程序, 我们人类写。 所以,如果我去到CS50电器在这里,我需要打开 一个文本编辑器,我可以访问 一对夫妇的方式。 我可以进入菜单,编程, 然后我就可以选择 - 不,不是的菜单。 我可以去配件/ gedit的打开 我的小文本编辑器。 或者更简单地说,我可以点击这个小图标在底部 左上角。 现在我这里的环境。 这是非常让人联想到的,只有一个简单的文本编辑器 一个或两个的差异。 在顶部,光标闪烁,这是 我可以开始写我的代码。 在底部的这个东西叫做终端窗口。 我可以做什么样的事情在这 所谓的终端窗口? [听不清] 好吧,我会运行命令。 周一上运行的一些命令,我​​们是一个小 神秘第一,但“列表中的ls,cd命令更改目录, RM,删除。 因此,这是一个老派的方式浏览您的 电脑,只用你的键盘和文本命令, 不大,一般,使用鼠标。 但我们所看到的,用不了多久,这实际上是给了我们一个 多一点力量,其中一个更精确一点 表达自己。 然后在左边,我们只是去看看, 当我们开始写作软件,一个小小的总结 程序,我们已经写在左上角。 但我们会再次看到,在不久的。 因此,让我们在这里做一些比较简单的。 首先,让我继续前进,到文件,保存,我只是 点击jharvard,在左, 再次,jharvard,我的主文件夹的名称,我 所有的个人档案,我现在是约翰·哈佛, 很快就会约翰·哈佛在这样的环境中。 他有主目录,我的文档等等, 我想保存,现在,这个文件中。 所以,我会打电话给它的hello.c。然后,我会去 进取,单击“保存”,现在我这里是一个标签 名为hello.c,这么多喜欢另一种类型的编辑器。 所以,现在让我继续前进,开始编写程序。 诠释的主要(无效)。 然后,我只是做了最后一次,输出,打印的格式, (“你好,世界!” 。); 几乎可以完成。 但是,我错过了几个细节。 从这项计划中,我真正需要的是缺少什么 它实际上编译? 是啊。 [听不见的? DAVID J.马兰:是啊,所以我需要包括标准 I / O库。 因此,这需要去以上的主,所以我只是要 它有一些空间。 我要去,做#包括。 注意尖括号。 顺便说一句,gedit是一个小的用户友好,如果 有时有点混乱,因为它试图帮助 眼睛注意哪些行了什么。 因此,事实上,我的光标旁边这个角度 支架,请注意它是如何突出等角度 支架加上这一个。 而这只是为了引起我的注意这样的事实,我 具有对称性。 对称的编程通常是一件好事。 同样,如果我将我的光标到最后,如何通知 花括号,是的,我有一个开放的 和封闭的,可以这么说。 好吧,我可以做一件事。 这不是绝对必要的,但良好做法,说 返回0。 返回0为我们做什么呢? 或者意味着什么? [听不清] DAVID J.马兰,但没有什么是错的。 坦白地说,这是很难的大部分时间去错在 编程这短暂的。 所以,我只是超级明确的,一切都很好。 我的人,当我运行这个程序时,可能永远都不会 看到0。 一般来说,这些数字被返回从主 只有抚养他们的头的人 出现错误。 你会得到一个小的弹出提示说系统错误,一, 两个,三个,或任何的数量是 实际上返回。 所以别的问题? [听不清] DAVID J.马兰:这是没有这么多的功能错误 但一个审美的。 我或许应该有一个换行符 这个字符串结束,所以,我们实际上是将光标移动到 下一行,并计划只是看起来有点漂亮。 所以,现在让我走我的终端窗口 和放大。 而这种事情在这里,这就是所谓的提示。 它只是提醒我,我是谁,jharvard设备, 器具是我在计算机的名称。 括号中的波浪线,波浪线符号, 代表着什么? 观众:主目录。 DAVID J.马兰:主目录。 所以,这只是说,你是在一个速记符号 您的个人文件夹中的所有文件的默认位置。 所以,现在,在这里,我可以输入ls列表。 我在这里看到的那一刻唯一的hello.c。 这是很好的,因为我刚才写的。 因此,让我继续前进,不要让你好。 请注意,我不打字使hello.c的。 相反,我只需要输入该文件的基本名称,你好。 做,因为我们看到在周一,也只是推断,我想 c文件。 所以现在我已经输入招呼。 现在,我看到这个相当长的命令,并会继续 看到这一遍又一遍。 但要清楚,铛,这个词刚刚出现, 这是实际的编译器。 Make是一个生成实用程序。 这只是一个更加用户友好的程序,节省了我, 从长远来看,键入了令人难以置信的乏味的长 这样的一个命令。 所以,你可以手动运行铛。 你可以输入,手动。 只是变得非常乏味的。 ,所以一定要仅仅是一个程序,可以简化我们的生活, 运行更复杂的命令给我们。 好吧,所以现在我应该有什么文件 在当前目录? 不只是hello.c的,但也打招呼。 所以,如果我要运行你好,还记得我说点斜线, 点手段去到当前文件夹,无论你 ,然后运行该程序名为hello的,而事实上,现在, 我的Hello World。 所有的权利,任何对工作流的问题或语法 我们只是做了什么? 好吧,让我们再次上升了一个档次的东西。 因此,这给人留下深刻印象,只写一个程序,只 曾经说:“你好,世界。 所以,我们改变了它,在星期一,说,你好,大卫。 这是一个有点多个人,但只是作为硬编码为 第一个版本。 所以不是所有的引人注目。 但是存在,在C,功能当然除了 打印功能,可以让您的用户输入。 的方式,我们这样做,有一天,情况如下。 其实我之前打印出来的东西,我第一次 从用户的东西。 因此,让我再这样做。 字符串s,其中s是只是一个任意的名称,在这里,对于一个 字符串,等于GetString的。 那么,什么是GetString的? 显然,它获取一个字符串,根据其名称。 但究竟是什么,技术上呢? 这是一个函数。 所以这是一个使用C本身功能不来。 CS50人员写了这个。 因此,对于使用这个,你不能只包括stdio.h中, 您还需要包括什么? 是啊。 因此,cs50.h,这仅仅是一个文件,我们几年前写的。 我们把它安装在你一起家电 所有的标准文件。 因此,在这些最初的几个星期之类的,我们将使用 这只是为了简化的过程中,做的非常基本的 之类的东西获取用户输入。 因为在几个星期内我们会看到,在获取用户输入 像C语言实际上是出奇的复杂, 特别是因为你不事先知道的,通常情况下,如何 太多的东西,用户要输入英寸 当你不知道多少数据,你不 我知道如何分配多少内存。 如果你真的有对抗性的用户是谁试图 入侵到你的系统,你的电脑崩溃,好了, 一般的攻击方法是,就像我一样 周一,键入一个长序列的随机字符, 按下回车键,看什么打破。 因为一般来说,如果程序中断,这暗示 ,潜在的安全漏洞。 这当然暗示了你,程序员,做了 错误,但更危险的是,你可能已经做了 与安全相关的错误,而且通常我们会看到, 机被攻破这一天, 在世界上的网页和方案, 命令行,像这样。 好的。 因此,字符串s = GetString的。 所以更具体,第6行做什么吗? 因此,在右边的功能得到字符串, 需要多少个参数? 好吧。 所以,没有。 一点点神智检查。 再次,是一个参数,只是输入到函数改变 在某种程度上,它的默认行为。 但是,在这种情况下,我并不想改变 GetString的行为。 我只想得到一个字符串。 所以,我什么也没有括号中的,然后我把一个 分号demarking的代码行的末尾。 现在,等号,不等于,本身。 这意味着分配,这意味着把任何得到 无论是在左边上的右内侧输出。 因此,在左边,我们说,我们已经宣布一个 字符串调用。 更特别的是,我们已经分配内存里面的 我们可以把位序列 字符。 但今天,我们已拨出 或宣布一个字符串。 好的。 所以,现在一旦我这样做,我想插入的价值 ,而不是大卫的价值。 因此,这是错误的,为什么呢? 因此,这只是字面上的硬编码的小号。 这是说“你好,”这是不是我想要的。 所以,我可以做到这一点。 百分号是一个占位符,但现在我需要 打印第二个参数传入。 回想一下,函数的参数分离 逗号,所以这里的一个逗号后,我把这个字母s。 在这方面,S是可变的,和printf, 在收到这两个输入 - 上的字符串的左侧,而在右边的变量名称s - 它会堵塞后者成为前者对我们来说, 只是打印出一个漂亮的美丽的字符串,其中包含 不管它是什么,我们键入。 所以,让我们来试试这个。 要继续前进,放大了出来,回到 我的终端窗口。 在底部放大了。 重新输入使招呼。 铛似乎已经重新运行。 我要键入。/你好,回车。 似乎没有发生,但在此提示 我可以键入一些东西,像内特,输入,而现在我们有 你好,内特。 ,我还可以再与Rob,等等。 所以希望现在这个程序的行为,我打算。 现在,不是所有的用户友好。 我不知道什么是对我的期望。 因此,我们可以肯定清理了一点点。 让我回到了这里,而不是只是潜水, 要求用户为一个字符串,让我明确地告诉 用户,我期待的是什么。 所以printf(“请输入一个字符串:” ); 所以这里不变量。 没有百分号。 只是简单的英语短语。 现在让我去的底部,然后重新运行我的程序。 但似乎什么都没有发生了变化。 为什么呢? 我必须重新编译它。 所以容易犯的错误。 但是,你不仅要保存该文件,但 重新编译程序。 所以,如果我重新运行make您好,现在铛运行。 现在,我可以运行。/打招呼。现在我看到“输入一个字符串:”。 好吧。 现在,这是一个有点更加人性化。 内特,输入,你好,内特。 好吧,让我们再试一次,并开始思考 关于角落的情况下。 所以就像在刮,我们鼓励你或正在 鼓励在规范中那种认为什么可以去 错了,如果你没有预料到用户可能做的一切。 因此,错误,可能会随之而来。 因此,输入一个字符串 - 这里一个角落的情况是什么? 有一个场景,我的程序员,可能不会有什么 预期? 是啊。 好吧。 那么,如果我输入一个像这样的数字呢? 好的。 因此,它仍然有效。 Gramatically是没有意义的。 但至少在程序的工作原理。 什么是另一个角落的情况吗? 我没想到的东西。 是吗? 好吧。 所以,我们可以做一些事情是一个非常,非常大的数字。 因此,让我们在这里做。 让我们我缩小为第二,我要强调。 无法复制并粘贴到这里。 好的。 所以我不能复制和粘贴在这个终端窗口,因此,我们将 它只是模拟。 让我放大了,要包装。 我不打算这样做太长时间,因为它不会 实际上打破了这一计划。 但它可能。 输入。 但事实并非如此。 好的。 但它是一个真正的角落的情况。 唯一的正确行为的原因,这样一来 说话,是因为CS50功能的GetString实际上是 引擎盖下的设计,我们将在几个星期内看到, 自动分配越来越多的RAM,越来越多的 从操作系统的内存,当它发现,哇, 你真的输入在相当长的东西。 现在,这是一个善意的谎言一点点。 如果我们确实暂停相当长的一段时间,我输入了 在键盘上像5十亿个字符 在这里,真的打复制 - 粘贴了不少,我们很可能 可能会导致程序崩溃。 只是有点难以模拟,用有限 的时间量。 另一个角落的情况下,我们可以尝试什么? 是吗? 是啊。 那么,为什么我们不回答什么? 因此,我们必须采取一些行动,因为否则 该方案的,要整天坐在那里闪烁。 但是,如果我只需要敲击回车 - 好了,现在,看起来还是错误的。 没出事,但也许现在有一个机会, 开始实施更严格的程序 实际检查。 而且,如果该字符串,这句话,我的字 输入的长度为0,好,也许我应该喊的 用户,或者告诉他或她再次输入一个字符串,从而使 我们得到正确的行为是什么样子,而不是 只是我的一部分的完整的监督。 问题在后面呢? 十进制数。 因此,我们可以尝试了。 1.10000005。 好像,只是工作其实没关系。 这实际上是预期。 尽管我们可能已经输入了数字,则或 数字越大所说,意识到,当我们输入用户 输入和我们使用的是GetString函数,不 无论什么我打字看起来像数字。 回想一下,根据ASCII,一切都在您的 键盘可以被映射到一个数值, 字符,一个字符。 因此,在这种情况下,即使我可能会输入一个数字, 计算机将想起来了,可以这么说,作为一个字符串 - 的东西,看起来像一个数字,但 实际上不是一个数字。 但是,这实际上是一个完美的SEGUE,因为现在我们可以 其实过渡到编写程序, 使用其他数据类型。 因此,除了使用字符,或者更确切地说,除了使用字符串, 认识到,我们在C具有其他数据类型,以及在 其他语言。 一个char,顾名思义,仅仅是一个单个字符。 一个浮点数浮点值,而这只是一个花哨的 说实数的方式 - 有小数点的东西, 在它与点的左和/或右的一些数字。 int是一个整数,它只是一个数字123。 而现在更有趣的事情,如双。 我们说什么了双是最后一次吗? 它是64,正确的。 而通常一个浮点数是32位 - 所以它的这个长在内存中,它使用32个零和的, 代表值 - 双是名副其实的两倍, 意味着你可以代表更大的数字, 你能代表更精确的数字。 所以,你可以有更多的数字小数点后的,但 在视频中说的家伙,即使是简单的东西 概念上有1/3不能代表正是由 电脑,因为最终你用完位,和 因此,你只能做0.33333333所以很多时候,在 这点,你刚才说我的代表 空间,我要的只是收工,并代表它 有些不准确。 很长很长 - 愚蠢的名字,但它是因为有一个数据类型被称为 而巧合的是32位,就像一个经常在C int是32位,但很长很长的 一般为64位。 因此,它只是意味着你可以代表大 超过这个数字。 好的。 所以,如果我们真的要开始代表的东西,我们 可能需要更复杂的类型,并 这就是为什么我们有字符串。 因此,在的CS50库,文件名为cs50.h,我们 实际上宣布的数据类型,可以这么说,叫串, 但字符串实际上并不存在。 再次,这是这些层我们要剥离 早在一两个星期,把它扔掉,和实际 看看下面的罩实际上是一个字符串, 它是如何派代表出席了会议。 我们也去看看布尔值。 那么什么是一个布尔值的背景下,从头开始吗? 这是真还是假。 因此,它只是一个值是真还是假,开启或关闭,或 0,但是你要查看的世界。 因此,在C,这要感谢的CS​​50库,这反过来又 包括引擎盖下方的另一个库,我们有 访问的数据类型,被称为布尔值, 从字面上让我们到指定的值true或false 在一个程序中的事情。 所以,让我们继续在这里写一个小程序, 涉及数字,而不是做一些事情。 因此,让我回去CS50电器,让我继续前进, 创建一个新的文件,这里所说的 - 让我们只说简单的东西,像math.c. 好的。 而现在我的程序上去的,我 通常要做的 - #中,这样我就可以使用 printf的,诠释的主要(无效) - 我们会回来,最终,诠释意味着什么 在这里,在这里的意思是什么无效,但就目前而言,只是知道, 你要启动这样的程序。 现在,我要继续前进,说的东西一点点 不同的 - printf(“请给我一个数字: 。); 然后,我该怎么办廉政n =调用getInt,因为它 原来调用getInt是另一个函数,在CS50库 除了getString。 而现在,我会做一些愚蠢的,像“感谢 的%d“,为十进制整数,然后逗号N, 然后返回0。 所以,再一次,返回0,有没有做我的 询问用户。 只是表示,大概,是在年底。 所以,让我去到我的终端窗口。 让我的类型进行数学,输入。 东西是错误的。 使数学不工作。 这是第一个错误消息。 为什么呢? 有点神秘,但是 - 是啊。 所以cs50.h. 如此反复,特别是早期,你会写你的第一个 程序的pset 1节,于办公时间内, 坦率地说,这将是压倒性的,有时这些事是什么 实际上说。 不过,你就会意识到非常快,他们开始下降 据此,这意味着你离开到桶 #包括的文件的顶部。 铛,编译器,通知你的 说,而美丽的,隐含的声明 函数调用getInt是无效的。 好的。 那么,是什么意思呢? 它只是意味着你已经隐式声明的调用getInt在 这个意义上,你没有明确宣布它。 要明确地声明int,你必须教 铛它的存在。 非常简单的解决方案就是教 包括本其他的的文件,cs50.h, 文件的开头。 因为从字面上看,哪些#include是告诉铛 几乎去找到该文件名为cs50.h,复印, 对我来说,它会自动粘贴到我的程序的顶部, 然后将其转换的源代码,零和的。 但是,这显然是非常乏味的,如果我们人类有 去复制和粘贴这些大文件的时间, 所以#包括所有的情况下自动 弄脏我的代码用别人的库。 图书馆是另一个文件包含的功能和 其他的东西,别人写的,我们是 利用我们自己的利益。 好的。 让我们再试一次。 使数学。 输入。 好。 因此,这似乎发挥了作用。 因此,让我现在运行的数学/数学。 输入给了我一个号码,123。 感谢为123。 现在,让我们尝试另一个角落的情况。 一个字符串是非常慷慨的,因为 字符串可以是任何东西。 可以像数字,看起来像 字符,看起来都像是单词。 但是,int类型是int。 所以,现在如果我困难的用户,它说:“给我 一个数字,“如果我尝试做一些事情(如0.1)? 嗯,这是一个数字,这是符合 语法我在这里使用,但引擎盖下的,我的 当然,使用函数调用getInt。 因此,让我们看看会发生什么。 回车键,然后重试。 好的。 让我是困难的,只需要敲击回车再次。 输入,回车。 因此,现在看来,调用getInt多一点 强大的比GetString的。 我们的工作人员,在这样一种方式,如果我们注意到实施 你有没有给我们一个int - 一个int是一个十进制数 包含零的人,三三两两,三,四,五,六人木球赛, 七,八,九。 就是这样。 没有小数点,没有人物,没有标点符号。 看来,我们有合作。 所以,让我来试试四,五,六,让我通过。 所以,真的,是肛这里,我可能会说:“给我 为了传达给用户一个整数“ 正是我打算。 现在,让我们觉得引擎盖下的。 我们不打算在,如何cs50.h实施今天, 该库。 但是,如果它口口声声说重试,重试,重试,什么编程 构建我大概用下面的罩 实现了吗? 因此,只要一个循环,对不对? 其中一个最简单的想法,我们从头看到。 永远的建设,重复建设。 据推测,在这个程序中,引擎盖下的,即使 虽然它的C语言编写的,而不是从头开始,它在做什么 什么叫如果用户永远不 输入整数,说重试,重试,重试,重试,所以 最后,当我们这么做的时候得到一个整数,那么你 跳出这个循环。 那么,还有什么其他的功能,我们可以使用在这里在CS50的图书馆? 好了,种明显的,至少基础上, 数据类型,我们现在知道存在。 我们实施GetString时,调用getInt,但在整个 这个词的第一个星期,你也可以使用getFloat先把及 为了得到精确的GetDouble和GetLongLong 数据类型,你想要的。 因为这里的关键细节是,不像某些语言中, Python和Ruby等,在那里你不一定要 声明变量的数据类型 - 你不必告诉计算机什么样的东西 你要放入变量 - C,你必须要非常精确。 所以,如果你想有一个变量n,一大块存储 在这种情况下,恰好是32位的,按照惯例,你 必须告诉电脑,这些位是 要存储一个数字 - 不是一个字符,而不是一个字符串,而不是一个float。 这解决了问题,我们有效地 跑进上周。 如果我们使用的是零和的数字,不只是代表 电话号码,但由于BS和CS,如何在世界上是一个 电脑要知道,这种模式实际使用的位 表示数字65,而不是代表 字母A,巧合的是,根据 ASCII,记得,相当于65? 因此,这些数据类型提供了上下文到电脑上,所以 它知道,如果这些位应该被解释为 int或一个字符串。 如有任何疑问,然后,在此吗? 是吗? DAVID J.马兰:好问题。 如果我们采取了stdio.h中,我们保存文件 - 让我去到终端窗口,并运行数学,放大 在进入 - 现在,我得到一个不同的错误,因为我含蓄地 声明现在什么功能? printf的。 所以,现在我已经创建了一个新的问题,它的解决方案是 本质上是相同的。 我需要把回来。 观众:[听不清] DAVID J.马兰:哦。 所以,如果我拿出 - 好吧,是的。 所以,如果我删除的标准I / O库包含 在这里,然后你说,如果我摆脱的printf,得到 摆脱了printf? 是。 这应该工作,因为我不再使用任何 - 哎呦。 我只是撒了谎? 哦,好吧。 这是不行的,因为我们刚刚推出了一个新的错误。 这是一个小更不言自明。 有什么问题吗? 未使用的变量n。 因此,这个错误是由于我们配置了 家电特别是迂腐,要真正大喊大叫 你的每一个可能的错误,即使它的种 这样一个非致命的错误 - 是不是真的这么大的 处理,我分配一个int,提出了一些,然后 只是做了什么呢? 因此,在功能上,没有。 这并不是要打破计划。 这只是一种愚蠢的,对不对? 有没有要求数量,存储的值 在一个变量中,如果你永远也不会做任何事情 有了它,无论它打印或保存。 因此,在这种情况下,锵确认一样多,并 它说未使用的变量n。 因此,我们可以解决这个问题,如果我们真正想要的。 但是,这是不是一种好的编程。 所以,我可以做到这一点 - 在这里,让我清楚的画面,使数学。 该工程。 我现在可以运行我的数学程序,需要输入 - 嗯,这是不好的。 接受输入,那就是,在这种情况下,所有它。 因此,实际上,让我们尝试另外一个角落的情况,我们 没想到的早期。 在这种情况下 - 在这里,让我们回到一个,这是一个 对用户来说更加友好。 让我回到这里,再次运行make数学。 哎呀,我做了什么错了吗? 得到进一步回滚。 好吧。 现在我们又回到了原来的状态,所有 是希望。 而现在,如果我遇到数学,123似乎工作。 但是,这不是一个真正的有效的证据,只是说 好吧,这工作的。 789的作品。 提交时间。 因为有其他角落的情况下。 一个字符串,没有真正给我们太多的麻烦通过键入 一大堆的字符。 但是,如果我输入? 击中了一大堆,这里的很多 - 所有权利,它变得有点无聊,所以我要 停在这里,我要按下回车键。 你到底发生了什么? 所以,这其实是可以解释的。 所以没有把它作为二进制吗? 一个好的想法,但没有,这是不是事实,即它把它 二进制,因为事实上,这仅仅是一个怎样的 巧合。 我们可以做到这一点。 因此,有没有,这是二进位制 可能是足够的了。 输入。 所以这是没有问题的。 还有什么呢? 没错。 所以想返回一个int实际上是什么。 这是32位解释 为一个数字。 如果您有32位,这意味着每个比特可以 是0或1,0或1。 因此,这意味着有两种可能性,该位, 这两种可能性,这两种可能性 位 - 所以这是2倍,2倍 - 所以这是2的32次幂的总数 排列零和的,如果你有32 占位符,0或1,在你的面前。 所以,如果我有2到32个,数学,那是什么? 因此,这是一个很大。 这是4亿元,给予或采取。 和4亿美元似乎并没有被打印出来在这里。 事实上,这看起来更接近至2亿美元。 但是,这是不是一个巧合。 事实上,电脑已经误解了我的大量, 我巨大的,然后我巨大的二进制补码序列,序列 大约2亿元,是如何解释的呢? 有一个上限的int。 有一个肯定,你可以代表的最大值。 但它通常为4亿元,对不对? 如果是2到32的约4亿美元,这似乎是 这是最大的数。 因此,没有余数,但一个好的想法。 负数。 所以,如果你有4亿的事情,你可以 代表这些不同排列的32 0 1秒,以及,它会随时原因,我们人类可能要 不只是代表正整数 但负整数。 事实上,这是假设的C。 因此,32位,你可以代表大致负2 十亿一路正2亿元。 因此,在这种情况下,我们真正看到的仅仅是 附带的能力,我们的整数,并且,因此我们有 可以说,溢出了整数。 我们试图把它塞进更多的位比实际上可以适合。 所以,最终的结果是,我们基本上都为1的位。 我们所有的位翻转,我们一直在努力,代表 最大的可能,但它显然不是近 大到足以代表两件事情,我刚刚输入的字词。 是吗? 观众:[听不清] DAVID J.马兰:好问题。 为什么我们不能只是表示该负 签名只是一个字符吗? 所以,我们绝对可以,我们可以然后保存 一个附加位。 但你仍然要代表破折号,和 这要花费你至少东西, 想必位。 所以,是的,我们可以为我们的数32位,但现在 我们需要另一位用于我们的破折号 符号,减号。 所以,现在我们有33位的值,我们可以这样做,但它的 只是没有办法做这项工作。 我们做了一个判断调用年前,32位是排序的 在这里的度量单位。 因此,我们将使用这些位有效 代表消极,31位代表的数量。 其他问题吗? 好的。 这是一个很大。 我们为什么不继续在这里我们五分钟的休息时间吗? 好的。 所以,再一次,不要过分强调数学的应用 的节目,就让我们把她的一个例子 在我们进入其他结构,只是因为它 将一些常见的障碍点上的一些说明 当它涉及到编写程序的基本。 在这种情况下,这样做的算术表达式,有一些 有趣的语法的相关性。 因此,这只是一个公式,我们可以将 温度从华氏摄氏度。 如果你不记得,这仅仅是一个公式。 因此,如果我们插在华氏32度,这是 冻结,这将是32减去32是0,而事实上, 0摄氏度也冻结。 这么快的完整性检查 - 这是熟悉的公式。 让我去到设备,但是,并开始 写一个程序称为一样,F2C“华氏 摄氏点C“。 在这里的顶部,我要开始用#include stdio.h中,我要诠释的主要(无效),并 再次,我们将在未来回来整数意味着什么 有无效意味着什么。 现在让我继续前进,执行一个程序, 基本上没有我们这个转换。 因此我们知道printf,比方说,华氏温度。 然后让我继续前进,从用户的价值。 我应该得到什么样的价值,如果我想从用户 他们给我一个华氏温度? 是吗? 你会建议什么? 是啊。 因此,浮动的感觉相当合理的。 再次,我们有几个选项, 迄今为止,我们已经看到了。 我们有些事如char,双,浮点型,整型,很长很长, 布尔,字符串。 所以这些,的浮动感觉很合理的。 我们可以用一个双,正确的,因为如果我们真的要 代表一个人的温度 - 98.60000 - 要做到这一点,我们可以使用64位,但感觉像 矫枉过正的温度。 因此,让我们一起去浮动。 现在,我需要一个变量。 只是为了让事情简单,我会打电话给它f,但我 可以很正确地调用它的温度, 但无论是好的。 因此,浮动f = getFloat先把。 只要我现在已经决定了,不过,我使用getFloat先把 需要做一个修正。 是啊。 因此,我们需要#包括的,否则编译器 要骂我们。 现在,我有一个浮动,让我继续做 转换。 因此,首先让我还养成早睡早起的习惯在这里 评论我的代码。 所以,再一次,评论的人,只是一个符号 不是程序本身的一部分,但它一个,帮助您 明白你做了什么,第二天早上,或下 月,它可以帮助你的教学同胞知道你做了什么 或者你打算做什么,所以它的 通常是非常好的做法。 每隔几行代码,写评论 你或你的同事。 所以在这里,我会说,“询问用户的温度。” 不必是一个完整的句子,只是一个简单的短语。 但在C注释背后的想法是,你的每一个 意见应赋予你 - 或说,,TF或同事的 - 撇去你的程序,不知道它究竟是什么 这么多的阅读代码,但通过阅读注释, 应该是简洁明了。 好了,所以现在让我继续说,“转换 华氏摄氏度。“所以我要继续做, 比方说,浮动Ç。 我们将保持摄氏浮点值。 ,让我带刺在此。 其计算公式为,再次在这里。 5/9次F零下32。 因此,让我们做到这一点。 因此,5除以9,减 - 哎呦,我把事情搞糟了。 时报。 因此,5/9倍f零下32。 所以F减去32,分号。 而现在,在这里,我要继续前进 并说,打印结果。 而这部分很简单。 printf的。 我该如何去打印此? 好吧,我可以说,“在摄氏这个数字是%f \ n”, 只是一些美学。 什么样的价值,我想在这里插入printf的 第二个参数? 好吧。 因此,只要C。 因此,我们将从这里开始,然后就返回0。 再次,它具有与数学无关。 它只是意味着一切都很好。 现在,这是正确的,这个程序吗? 好的。 所以,我犯了一些错误。 即使你不知道是什么程序,您可以排序 的推断回到小学 可能的错误在这里。 第一个是什么? 观众:[听不清] DAVID J.马兰:是的。 因此,我们漏掉括号内。 这是故意的,我没有括号的基调 滑动这里,因为这里实际上这个概念的, 操作,或优先级,使某些操作 - 乘法 - 有较高的结合,具有较高的优先级,比东西 如加法或减法。 因此,我们所做的这几年,只是为了清晰准确 首先应该做的是什么数学运算。 所以,我也许应该模仿的正是这一点。 否则,电脑大概要尝试做 类似9鸿沟5,再乘以F,然后减去 32从整个事情。 这不,事实上,我们想要做的是什么。 因此,让我们括号。 让我们添加我的括号,括号在这里。 让我们把这个在这里。 在这里,我只注意到另一个错误,我一路走来。 是吗? 观众:[听不清] DAVID J.马兰啊。 好。 所以,我们其实有相同的整数 从之前的分工问题。 我纠正这个问题,让我们来看看是什么症状。 但是我们要纠正一个 这里的其他错误。 是吗? 观众:[听不清] DAVID J.马兰:是的。 所以,我做了愚蠢的错误,但非常重要的。 电脑是不会视而不见,只是让 我用大写F,当我宣布变量 作为一个小写f,在第8行。 因此,我需要纠正在第11行我的资本,哪一个 刚才是一个大写F误。 这里怎么样? 这应该是小写的呢? 这是应该的,但是这是一个巧合。 ,%f有没有做的变量。 因此,只要是超清晰,让我继续前进, 重命名,简单地说,“温度”。让我重新命名 此“温度”。让我不能重命名。 因为,再次,%f全球范围内的意思,“浮点值。” 有没有做我的变量。 但“温度”的地方只是一个小罗嗦, 所以,我要回到我的小写字母“f”。 现在,让我继续我的窗前。 请F2C - 这是,再次,我的任意名称 给这个文件。 似乎已经编译。 让我跑F2C。 输入。 华氏温度 - 让我们做一个简单的一个。 32。 OK,纠正。 但是,如果我现在做的212沸腾 - 该死的。 好的。 所以,这显然不是正确的,如果你的TF尝试 至少两个值。 那么,是什么问题呢? 好了,你已经把你的手指上是什么问题。 但是,为什么是这样呢? 在这里,当我在做数学5分9。 因此,从理论上讲,是完全正确的。 完全一致的公式。 但是,计算机只能做正是你 告诉他们做什么。 我们有效地在这里告诉计算机 除以整数5的整数9 给我的结果。 问题是,但是,如果你做除法数据 类型,输出是输入的相同的数据类型。 因此,如果两个输入是这两种类型为int,输出将 是一个int。 因此,5除以9点东西。 但是,什么是最接近的整数点东西吗? 因此,它实际上是0。 所以,当我们讨论星期一,一切都小数点后 点被截断。 它只是被丢弃。 所以这是一个完全错误的,因为我可能也只是 乘0这里的一切。 现在,我可以在一对夫妇的方式来解决这个问题。 我能做到这一点。 5.0除以9.0。 从技术上讲,我什至不需要做的。 它足以使一个浮动的数字之一 - 或双 - 通过把小数点这里。 因为发生的事情是,当你将整数 一个浮点数或双,计算机的实现 哦,其中之一是更加精确。 我宁可让你更精确的比侧 您所想。 因此,将转换的结果 - 将一个浮点值,以及返回的结果。 因此,这将工作。 这将工作。 还有另外一个机制,我们将看到在 更详细的下周。 作为程序员,实际上,你可以告诉电脑 实际处理一个数据类型 虽然它是另一个。 所以,我可以真正做到这一点。 在括号中,我可以这样说(浮动),开 括号,关闭括号。 这是所谓的“铸造”。同样, 在此下周。 但是,这仅仅是一个纲领性的方式告诉 电脑,是的,我知道9是一个整数或长。 我不知道这是一个浮点值。 但把它作为这样呢。 因此,投的数据类型转换成 从一个到另一个。 坦率地说,这只是一个小的丑陋,所以我会建议我们去 只是转换回原来的建议 这些东西手动浮点值。 因为现在只是超级清楚是怎么回事,和 它不是所有的分心。 现在让我们回去到我的终端窗口中。 请F2C。 让我去,继续运行。 而且,顺便说一句,你感到厌倦,输入这些命令 一遍又一遍,认识到计算机,如Linux, 往往是很聪明的。 如果我撞了上去,我们可以通过我的整个历史 命令,向上和向下。 因此,在这种情况下,在这里,我可以去运行F2C。 我被大声训斥,因为我只是做了一秒钟前。 这已经是最新的。 所以,现在我可以再次运行F2C。 让我们尝试32华氏度。 现在,让我们尝试212华氏度。 唷。 似乎工作。 现在,这是很好的,但是感觉有点任意的, 我显示小数点后六位数字。 对吗? 如果你人在电视上的天气,你的doofus的 如果你正在读的温度 这个精确度。 所以,让我们简化这。 因此,让我们其实在这里,我的printf。 是的,我想自由浮动。 不过,我想现在指定的精度。 我是一个小的简洁。 我说,给我一个点后的小数位。 因此,而不是说%F,我会说%.1 F。 而这只是给我一个位置 小数点后。 好的。 让我们再试一次。 让我重新编译后运行。 现在我输入32,我得到一个 更简洁的价值。 我可以输入,现在,212,和得到一个更简洁 价值。 还有其他的事情可以做,用printf。 实际上,你可以指定数目应该有多宽。 如果你想,有填充就可以了,所以你可以用鼠标右键调整或 左对齐所有的数字或 尝试为中心的东西。 因此,实现有小动作就做什么。 但他们只是归结为格式代码, 像我们有。 因此,在这个问题的优先方面。 这是一个很无聊的表中去,通过有条不紊。 但认识到,纷纷拿出了作者的C 规则,指定运营商有更高的 优先,更多的结合力,比其他人。 因此而小学的时候,我们一般知道这是 乘法和除法,加法和减法, 然后一些其他的东西。 在编程的世界中,有一个更 更长的事情的清单。 这是不是现在值得记忆的东西。 用不了多久,你会得到驯化。 但就像小学的时候,括号一般解决 问题的优先级,超清晰的 计算机和人类一样的目的是什么。 因此,考虑这只是一个小的小抄。 但最重要的那些细节,我们不会去一段时间。 好的。 现在,让我们建立和远离这些无聊的小 数学的例子。 仍然使用相同的基本面,但启动 表达自己有点像刮。 因此,在从头开始,我们这些布尔表达式。 而在英语中,布尔表达式是什么? TRUE或FALSE。 这件事情的计算结果为true或false。 1或0。 “开”或“关”。 无论你怎么称呼它。 现在在刮,的拼图看起来像这样的。 这相结合,在底部有三个, 拼图。 一个结合 - 的东西,有空白和空白。 然后它里面的布尔表达式。 所以,你可以窝的布尔表达式,以获得更多的 复杂的布尔表达式。 例如,如果它是星期六,它是很好的 天气,然后到外面去。 什么的任意那样。 所以,你可以加入了一个布尔表达式来 真值较大,其答案是基于 较小的。 现在,在C,幸运的是,这个映射 其实很简单。 括号把事情说清楚在这里。 &&是什么意思“和”。所以,这就是 我们要转换这些块从白手起家到C. 的条件下,我们看到了从无到有,在左手 侧有,我可以将它们堆叠同样C.如果x小于 除y,然后做到这一点。 否则,如果x是大于y,那么这样做。 否则在逻辑上他们必须是平等的,所以说 他们是平等的。 所以,我们现在可以开始构建这些东西。 因此,让我们做一个实例。 让我打开了一个文件,该文件了课程网站, 我写的提前。 这就是所谓的nonswitch.c。 我们会看到为什么在短短的时刻。 因此,在这个文件 - nonswitch.c - 第一次认识到,有一大堆的 在上面的意见。 这只是解释的文件名,它是什么 ,等等。 它显然说明了如何使用布尔AND-ING - 交接两个表达式。 因此,让我们来看看这个程序是如何工作的。 我包括我的两个的文件,cs50.h和stdio.h中。 如果我向下滚动,现在的程序,它是一个小 比我们之前写的,但非常可读。 所以,我第一次打印的用户,第18行, “给我一个1和10之间的整数。”所以 这是正确的。 现在,我得到的整数。 但认识到,调用getInt - 很简单。 它只是将一个int。 这将确保,它并获得一个int,而不是一个 字符串或浮点数。 但它不会做任何形式的边界检查。 这不是要过滤的号码之间的 一定范围内。 因此,我们必须实施自己。 所以就像在刮,在那里我可以做一个结合的 两个表达式,我可以做的,在C如下。 如果n大于或等于1,和n是小于和 或等于3,我会很随意法令, 数是一个小数目。 只是为了一份声明。 否则,如果n为4和6,打印“你选择了一个中等 号“。否则,如果n为7和10之间,打印”你挑了 大的数字。“ELSE PRINT”你挑一个无效的号码。“ 因为从逻辑上讲,后面如果我们 用尽了我们的范围。 因此,认识到这一点倒不怎么写大于或 等于在上数学课。 对吗? 您通常像这样绘制,与线下。 但是,我的键盘上有没有这样的关键。 因此,在C的符号用于表示大于或 等于是两个字符,和符号为小于 或等于两个字符。 好的。 所以,如果我运行这个程序,你大概可以猜出这是什么 要做的事情。 如果我先走,使nonswitch,Enter键。 然后运行nonswitch。 给我1和10之间的一个数。 我要去给它11。 我拿起一个无效的数字。 让我试试3号。 我拿起一个小数目。 所以相当简单。 如果我想改变这个程序的行为, 做的东西有点不同呢? 让我继续前进,说这句话。 让我摆脱这一切。 如果让我说(N = 42)。 然后我要继续前进,并说打印“你选 正确的答案。“不然,我们要继续前进,并说, printf(“请你选 错误的答案。“);好了。 只是因为。 现在,有几点我们可以在这里提出。 一,我没有键入符号,你会认为这是 最合理的。 当我要检查平等,原来你不使用 等号。 您可以使用等于等号。 而原因可能是,只是凭直觉呢? 是啊。 观众:[听不清] DAVID J.马兰:正确。 已经用于分配等号。 有人真的没有想到。 所以现在,当它涉及到平等的测试中,我们必须 更加明确,并说等于平等的。 一个很常见的错误是做到这一点。 而且,如果在办公时间或下周的某个时候或在 接下来的两个星期,你做这样的事情,然后 它奋斗了10年,20分钟,试图找出 该死的错误是什么,认识到,你是其中的一个 谁犯了这个错误的人。 因此,超级容易做。 但现在的目标是抵挡这样的错误。 这可以评估,因为这是真正的意思吗? 如果n得到42。 因此,动词的人使用,口头,以表达对 分配的概念是“得到”。因此,如果n得到42。 因此,这意味着到n分配42。 现在我有一个布尔表达式中括号, 此条件下的内部,它的数值是42。 对吗? 因为如果你评估它从内到外,总 答案,现在是42。 所以,如果我问你的问题,“如果(42),”什么是 真正在说什么? 那么,布尔表达式只能是真或假。 1或0。 “开”或“关”。 因此,我们似乎在这里,有一个角落的情况下,让所有的 突然,我说:“如果(42)”。这不是一个布尔值。 因此,电脑做什么,但是,它基本上等同于 任何不为0的解释是正确的。 1。 在。 它们是等价的所有功能。 只有值为0,或关键字假的,因为我们会 最终看到的,实际上是错误的。 因此,“(42)”,实际上是真实的,因为它是非零。 因此,为了更精确地在这里,一个布尔值是真的不 的真或假,但在本 情况下,如果是0或非零。 因此,虚假或不假。 这使我们能够涵盖所有的 在括号表达式中的可能性。 因此,我们需要非常仔细,说 - (N = 42)。 很简单,因为我们需要指定测试的平等, 不分配的值。 在这里值得一提的是什么? 这些花括号实际上是没有必要的。 我一直在做,只是为了在这里挑剔挑剔。 但是,当你有一个条件,只有一行 代码的方便,程序员并不需要使用 大括号。 总之,只是缩进,出于美观的考虑, 然后再编写一行代码。 只有当你想要写的两行代码 - 例如,否则输出(“细则”)。如果你想做的事 的是,这被打破了。 您可以缩进想要的一切,但事实上,你有 输入的两行代码,而无需使用花括号 意味着这个程序将无法正常运行或可能 甚至没有正确编译。 所以现在,说实话,我认为最好的习惯是 使用大括号,你会发现,他们 超清晰是怎么回事。 另外,顺便说一句 - 特别是如果你在那些谁使用 推荐的书籍或在线资源 - 意识到有这个概念的风格 编程。 有些人喜欢把花括号 在这里上线。 有些人喜欢做可笑的事情, 我喜欢把它们放在这里。 有没有错误的答案,当涉及到 风格,但是这是错误的。 但是,有些人做到这一点。 [笑] DAVID J.马兰:所以我现在提到这一点,仅仅是因为作为 你读的书籍或网上的事情,你会得到 从不同的老师,不同的消息 不同的作者。 而刚刚意识到这一点,在功能上,他们 一般等价的,但是一致的。 因此,在这种情况下,我们将标准化的花 括号这里排队的左边。 好的。 因此,让我们继续前进,现在和运行它,看看会发生什么 这一计划。 请nonswitch。 然后运行nonswitch。 给我一个介于0和 - 所以这是不相关的 了,但我只是随意说42。 我选择了正确的答案。 现在好了,让我们借此在不同的方向。 原来,有一些其他语法 可以在程序中使用。 这里有一个新的语法,在功能上是相同的, 但只是介绍了另一种方式表达自己。 因此,这是什么所谓的“switch语句”。和 switch语句如下。 它需要在括号中的数值要 “开关”。 你想不同的表现,根据其值。 因此,这意味着开关n的值。 这是什么意思? 好了,如果n为1或2或3,继续前进,并打印出“您 挑一个大数目“,然后打破。 突破的原因是,C工作 尽快找到相匹配的情况下,它开始执行 它下面的所有的代码。 所以,如果我有,我在这里做的第27行,一行代码 被执行。 如果我在这里增加一条生产线,它就会被执行。 另一条线,它就会被执行。 该方案只停止执行下面的是什么 当我明确的适用case语句 说“分手”。所以是错误的。 右,在这种情况下,作为一个结果。 壳体4或5或6,同样地,将 打印出的信息。 在这种情况下,介质编号。 打破。 案例7,8,9,10,它会打印出“你选择了一个大 号“。突破。 再有就是名副其实的关键字被称为“默认” 这是有效像“别人”的建设。 因此,新的语法,但在智力上, 没有在所有新来的。 这就像擦除。 如果,否则的话,否则的话,代码块。 所以这是这个程序的切换版本。 但是请注意,我们这样做,是这里的数字。 让我打开了第二个版本,只是为了显示 更具体一点的东西。 所以,在这里,我们有档次。 原来,你可以使用交换机,不只是整数,但在 字符。 不是所有的数据类型,但至少在字符。 所以在这里,我们可以做这样的事情,如果C的值, 使用者输入,在第19行中,通过使用GetChar函数, 是资本或小写字母a,让我们把它解释为一个档次, 并说,他们拿起一个优异的成绩。 顺着switch语句,我们还有其他的 为“B”和“C”,以及等等的情况下。 但是,现在让我们圆了另一件事情。 再次,种飞行 一些这些实施例。 但它确实使我们可以将它们应用,现在 - 真的,只是他们现在翻译 - 为C。 所以,让我继续这样做。 我要打开一个新的文件。 我要去做包括。 然后我要诠释的主要(无效)。 让我将此文件保存为一个loop.c. 只是作为一个例子。 我要继续前进并执行以下操作。 我想写一个非常繁琐的程序。 因此,10。 让我们这样做。 9。 好的。 只要你开始做这在编程中,你 可能做错了什么。 但我们会从这里开始了。 哎呀。 这实际上是错误的。 7。 6。 5。 4。 没有什么会发生什么,当我们到达0。 3。 2。 1。 好吧。 0。 删除。 好的。 因此,返回0。 因此,这一计划显然会做什么,很 不厌其烦地说,这是要做的。 这将打印所有这些 值,由上到下。 因此,让我做循环。 然后 - 哎呦。 使环路。 我是在错误的目录。 现在让我跑环。 输入。 呜呼。 很不错的。 不错,长的节目。 所有的权利,但现在让我们做到这一点。 就像在刮,当你开始使用一个循环 建设,而不是仅仅复制和粘贴所有的 拼图,让我介绍一下这件事情。 因此,在C,有不同的循环结构, 其中一个看起来是这样的。 一个“for”循环有三样东西,用两个分号分隔。 然后,身体内部的循环,所以说 - 花括号里面的东西 - 我们可以做一些事情一遍又一遍。 所以我就在屏幕上,这是 从字面上评论。 / /在这里的意思来评论。 这是不是代码。 这仅仅是英文说明,对我来说,人的。 所以,初始化,条件和更新。 那么,让我们来看看它是如何工作的。 这让我重写程序如下。 对于 - 所以这里是我的循环 - INT I - 来了一个变量命名为“i”的 - 得到初始化为10。 因此,有我的初始化。 我想要做的这个循环中,只要“我”是大于或等于 等于0。 这个循环的每一次迭代的,我想 做我 - 。 于是,我们看到了+ +(星期一)。 - 是相反的。 它的值递减1。 这个循环里面,我希望做一些事情。 所以我要像printf说些什么。 我不想说10了,因为这显然是刚 要打印相同的值。 我想要什么,而不是打印,可能吗? 是啊。 因此,“我”。因此,%D,I。 所以我要偷到一从早期的那些想法 - 这种偷梁换柱的格式代码 - ,然后在这里,在底部,我将返回0,只 良好的措施。 但现在,我有一个更简洁的方案。 这是只有几行字,而不是一些10或11号线。 让我去我的提示下来。 翻拍循环。 重新运行循环。 和它似乎是相同的。 现在,该方案没有更有趣。 但现在我可以键入这样的事情。 我可以更改为100。 然后我就可以重新编译我的程序。 然后我就可以重新运行我的程序。 而现在“超高速今天的计算机上。 然而,有我有 - 而实际上,我的屏幕缓存不 远不止这些。 我们走吧。 因此,我们有所有100个。 但它很容易在这里犯错。 这是怎么回事,是预期的行为,如果我 不小心这样做呢? 因此,它感觉就像是无限的。 因此,让我们来看看,如果在计算机的行为。 因此,让我继续前进,使循环。 让我跑环。 因此,让我们回来,在短短的时刻。 我们将让这个运行。 因为,我们应该算什么,微创? 大概至少2个十亿,如果我们有多少位,和 我们使用的是正面的价值观。 所以,让我们跳回到这里。 除了这些类型的循环,我们有什么时,被称为 循环。所以,就像在刮,你永远 块,你不得不重复块。 同样,在C中,你有其他的方式 表达自己。 所以,你有这个概念的一个while循环,可让您 表达自己的一点点不同。 然后你有一些所谓的do-whil​​e循环, 经营略有不同。 而我们除了耻笑这些随着时间的推移。 但是,让我们来看看在这最后一个在这里。 如果我们去 - 仍在运行。 这是相当无限的。 因此,让我进入正面,并显示如何,我们实际上可以 一点点更有效地治理用户输入。 这是一个很短的程序。 在这里,我们有,在主,廉政n声明。 所以给我一个变量n。现在,我从字面上说 “做的。”然后,我有左大 括号,靠近大括号。 然后请注意,右后,它说,当n 是小于1。 所以注意到,这些线 - 19至24 - 共同组成一个do-whil​​e循环。 再次,新的语法,而不是一个新的想法。 它只是另一种方式的循环,语法。 那么,这是什么做的? 而n是小于1,执行下列操作。 那么,我该怎么办? 我要求你给我一个正整数。 然后我尝试从用户得到一个整数。 但在这里的操作顺序,因为 而条件是在这里,我要检查,是n 小于1? 因此,假设用户 - 在这样的要求后 - 类型中的值0。 这种情况是怎么回事,是真还是假? 那么,它是真实的。 因为n是0,和0小于1。 那么,这意味着什么呢? 再次这样做。 再次这样做。 再次这样做。 只有当该条件的计算结果为false。 如果我输入42。 好了没有,42是不小于1。 因此,这个循环被执行。 因此,在这一点上,该程序会说,感谢 42,在这种情况下。 既然你有这样的方式表达自己 - 我们不应该等待完成。 这将需要一些时间。 要继续下一次,也许吧。 但现在,你有能力,希望了解一个 位的怪胎幽默。 抱歉。 在计算机科学的幽默,这是不是代表 世界,但它很可爱。 [笑]让我们结束关于这一点。 我们星期一见。 [掌声]