[音乐播放] 大卫·马兰:所有的权利, 欢迎回到CS50。 这是两个星期的开始。 从我们的一个字 朋友们在校园 - 如果你有兴趣,可能的话,无论是 现在或将来的某个长期 甚至,一旦更舒适,教学 初中学生一点点 计算机科学的东西, 做头到该网址。 他们现在特别需要 教师,特别是如果你有 有一些接触计算机科学。 所以记得,最后一次,我们引入 有一些数据类型在C中, 您可能已经开始让你的 这些迄今的手脏 设置问题之一。 我们有一个字符。 因此,在有些技术方面, 你今天所知道的是一个char? 所以这是一个字符,但我们的 现在更精确。 字符是什么意思 或个别字符? 非数字字符 - 不一定。 事实证明,即使是数字,甚至 标点符号和字母 与此数据表示 类型称为一个char。 所以它不一定是按字母顺序排列。 是吗? 所以这是一个ASCII字符。 所以,如果你想返回到零周,当 我们有我们的志愿者字节 要么上来,握住他们的手 不是全部,他们所代表的位。 但合八为一组, 他们代表一个字节。 我们介绍了概念ASCII 在这次演讲中,这简直是一个 数字和字母之间的映射。 和ASCII用途,因为这些人 暗示,八位 来表示一个字符。 因此,如果8位 每次取两个值之一 - 零次或一次 - 这意味着有两种可能性 这个人 - 零次或一次 - 这个人,这两个 人,为这一个两个。 因此,两次共两次 两次两两三次 - 所以两个总第八。 所以这是一个总的字符数 256种可能,你可以 代表与8位。 现在,那些你们谁讲亚洲 语言可能知道,有更多的 不仅仅是在世界上的字符 AS和BS和CS和DS。 事实上,ASCII不足够 很多世界的语言。 但另一个时间。 现在,知道如果你想在C 代表一个字母,一块 标点符号,或只是一些字符 在自然界中,我们使用一个字符。 它是一个字节或8位。 一个int怎么样? 嗯,一个int是一个整数。 多少位,如果你还记得, 通常是一个整数吗? 任何人都召回? 因此,它是典型的32。 实际上,它取决于在计算机上 你使用。 但在家电,并在很多 计算机,它是32位或4个 字节 - 八倍四个。 和整数只是用于存储 数字,要么是负, 阳性,或零。 如果你只得到了32位,你 关心正数, 有人看球多少可能 整数,是一台计算机可以表示从 零,就到了吗? 因此这将是2到32,这 大约40亿。 因此,这些权力的两个将要 在计算机科学中反复出现的主题。 正如我们所看到的,他们很方便 即使是不太 容易做数学题,在一个人的头上。 所以我们会说大约40亿。 现在,很长很长 - 你可以猜测的那种。 它长于一个int。 多少位? 因此,64位或8个字节。 这只是意味着你甚至可以代表 更大的数字,更大的积极或 较大的负数。 又有怎样的浮动? 这是一个浮点 32位的值。 这仅仅是一个实数,东西 小数点。 但是,如果你的地方,而不是需要更多的 小数点后或者​​你想 一些代表一个更大的数目 分数后,你可以使用一个 双,这是64位。 但有一个有趣的 这里的外卖。 是有限的32位,所以,如果整数 64即使是有限的长期多头 位,那种引出了一个问题, 如果你真的要算 高于4亿元为int? 嗯,你只是用很长很长。 但是,如果你要算高 超过两至第64个,给予或采取? 现在,这是一个庞大的数字。 但最终,你实际上可能 关心这些类型的值, 尤其是如果你正在使用的数据库 并开始收集很多很多 和大量数据,并且分配唯一的 编号,每一块的数据。 因此,我们有一个问题。 同样,浮点运算 价值 - 花车或双打 - 如果你只得到了有限数量的 位,你总共有多少个数字 可能代表什么呢? 嗯,这是不太清楚,当你 涉及小数点。 但它肯定是有限的。 如果你有一个有限的比特数, 有限数量的人类,一个有限的 灯泡的数目,你一定可以 只能表示有限数量的 浮点值。 但究竟有多少真正的数字 是他们在世界上? 有一个无限。 所以这是样的一个问题,因为我们 不具有无限长的 我们的电脑内的内存或RAM。 所以一些具有挑战性的事情都可能发生。 所以,让我们继续前进,并尝试 这里表达。 让我去进取,不断开拓gedit的。 我要继续前进,并保存文件 被称为“floats0.c”刚需 一致的,例如,即 可在网上,如果你想。 而且我要继续前进, 它定义如下 - 我要继续前进,并说,诠释 主要无效的,因为我们经常做的。 然后在这个方案中,我要 申报自己的持股量,所以32位 变量称为F,任意。 然后我要存储在 我不知道,十分之一,所以0.1。 所以我要表达的是作为一个 除以10,这是完全 C.合法 然后在第二行,我只是 要打印出它的值。 所以,记得,我们可以使用 熟悉的printf。 我们不希望使用%i的类型为int。 我们要使用一个浮点数%F。 然后我要做的反斜杠n, 引号,逗号,F,分号。 因此,这里是我的计划。 已经有一个错误。 是否有人对他们来说,这点击 早就想点满 一个bug,我呢? 是吗? 嗯。 我忘了“#” 顶,他们的症状,如果我尝试 编译这是怎么回事, 编译器会骂我, 说未定义的象征或 东西的效果。 它不明白的东西 printf的喜欢。 所以我打算做“# “,保存该文件。 现在它在更好的形状。 但我也要去点 出一个新的细节。 除了指定的地方 %F%%s的持有人一样,你可以 有时会影响行为 这个占位符。 例如,在一个浮动的情况下 点值,如果我只想 显示一个小数位后 期间,我其实可以做0.1F。 因此,换句话说,分开f和 0.1,刚百分号 告诉printf的,你可能有一个整体 一串数字的小数点后 指向我。 但我只想看其中之一。 所以,我要继续前进并保存 这个程序,进入我的终端 窗口,我要继续前进 和类型浮法0,回车。 我看到有些神秘的线, 因为我们将开始使更多的意义 逗它除了本周和下周。 现在,我要继续前进 运行浮法零。 而且,该死的。 因此,有另一个错误 这里的一些原因。 我敢肯定,有十分之一,或 除以10,是不是0.0。 也许我只是不找 足够的位数。 所以我为什么不说两个.2看到两个 小数位,而不只是一个。 让我回到我的终端窗口 这里打了几次 看看我的历史。 不要使再次零漂浮, 然后再度上升。 现在进入。 现在,我敢肯定,这是错误的。 我可以做三和四,而我 可能会看到零。 那么,是错误吗? 除以10应为0.1。 有人要采取刺在什么 根本的问题是什么? 是吗? 他们俩都是整数。 还等什么? 因此,除以10,这是 我做算术。 我得到0.1。 嗯。 所以这的确是这个问题。 当你在一台电脑一个整数 它除以另一个整数, 计算机默认情况下,是怎么回事 假设您想要一个整数。 的问题,虽然,当然是 是0.1,不是一个整数。 这是一个实数。 还等什么计算机未通过 默认情况下,它只是扔掉 小数点后的一切。 它不向下舍入或本身。 它只是抛出了一切 小数点后。 现在是有道理的。 因为现在我们清楚 留下了零。 但是且慢。 我没有看到一个int零。 实际上,我看到0.00。 所以,我怎么调和吗? 如果除以10是零,但我 看到0.00,它从哪儿得到 转换回一个实数吗? 嗯。 没错。 所以在这里5行,当我真正 存储是0.1,然后 截断为零,里面的浮动, 实际上相当于 存储为int,但是, 的确,作为一个浮动。 此外,我再使用的printf 明确两个打印该号码 小数位,即使有 可能实际上没有任何秘密协议。 所以这种很烂,对不对? 显然,你不能做数学, 至少在这个级别的 精度,在一台计算机。 但是肯定有一个解决方案。 我们也许可以简单的解决办法是什么 做,甚至只是凭直觉在这里 解决这个问题? 是吗? 打开整数 - 是的。 即使我不太知道什么是 真的会在这里,如果它 这些都从根本上做 是整数,好,为什么不是我 10.0,使得这个 1.0,重新保存该文件。 让我去回落到 底部并重新编译。 现在让我重新运行。 还有 - 现在,我已经得到了我的十分之一 表示为0.10。 好的。 所以这是不坏。 并让我指出另一种方式 我们已经解决了这个。 实际上,让我及时回滚 当我们作为一个 前十片刻。 并让我继续前进,重新保存这个文件 作为一个不同的文件名,只是为了 有一点点的检查点。 所以这是版本之一。 现在让我继续前进, 做一个多个版本。 我们称这个版本 两个零的索引。 我要去,而不是做 - 你知道吗? 添加点零,在这种情况下工作。 但是,假设一个人的变量。 10应该是一个变量。 换句话说,假设我做不到 只是很难在最后的代码.0 此算术表达式。 好吧,我可以做一些实际的 括号中称为铸造。 我可以投一个浮点数,整数10, 我可以投,整一至 浮动,以及。 然后做数学 有效1.0除以10.0, 的结果,其中去 在f前。 所以,如果我重新编译这使花车 2,现在浮2,我得到同样的 回答,以及。 因此,这是一个相当做作的例子, 解决这个问题的 通过引进铸造。 但在一般情况下,铸造将是 一个强大的东西,特别是对于 问题设置两个在一个星期的时间,当 你要转换的一种数据类型 另一种是在一天结束时 以同样的方式来表示。 在一天结束时,每一单 迄今为止,我们已经谈到的事情是 只是整数引擎盖下。 或者,如果太低级 你,他们只是数字 引擎盖下。 再次,即使字符记得 周为零,是数字 引擎盖下。 这是说,我们之间可以转换 如果不同种类的数字 他们只是位。 我们之间可以转换数字 和字母,如果他们只是 位,反之亦然。 以这种方式和铸造是一种机制 在编程中,可以让你强行 改变一个数据类型到另一个。 不幸的是,这是不 简单,因为我可能会喜欢。 我要回去花车 如图1所示,这是更简单,更 直截了当的与 .0到每个。 而只是作为一个快速复习, 让我继续前进,重新编译 这一点,使花车2 - 对不起,这是彩车1。 现在让我们运行彩车1。 而在底部,请注意 我确实得到0.1。 所以,问题就解决了​​。 但不是现在。 现在,我会得到一点点好奇, 我要回去到我的 printf语句和 说,你知道是什么吗? 我想证实这 真的是十分之一。 我希望看到这个 ,比方说,小数点后五位。 这不是一个问题。 我改变了两到五年, 使我重新编译。 我重新运行它漂浮1。 展望相当不错的。 我的理智检查可能结束,但 我得到多一点冒险精神。 我要改变0.5至0.10。 我希望看到10位后 小数位。 而且我要继续前进,并重新编译 并重新运行漂浮1。 我有点遗憾经测试此 进一步,因为我的数学也不是那么 纠正了,它似乎。 但是,等待一分钟,也许 这只是一个偶然。 也许计算机充当 有点怪。 让我继续前进,做20个小数点 安慰自己,我知道 如何做数学。 我知道如何编程。 彩车1,重新编译,该死的。 这是真的,真的越来越 远处的标记。 那么,这是怎么回事? 直观地说,根据我们的假设 早期的数据类型的大小, 什么是必须发生在这里 引擎盖下? 是吗? 没错。 如果你要这么多的精度, 这是一个了不起的很多精密 - 20小数点后的数字。 你不可能代表 除非你有一个任意数量 任意的比特数。 但我们不这样做。 对于浮动,我们只有32位。 因此,如果32位只能在置换 的方式 - 就像我们人类,舞台 向上或向下的手 - 在有限数量的 方式中,只有数量有限 实数可以代表 这些位。 因此,计算机最终 将不得不 开始偷工减料。 计算机可以隐藏这些细节 从我们一点点的时间。 但是,如果我们开始戳的数字 并期待在越走越远 后数字的整数, 然后,我们开始看到它的 实际上接近 十分之一的想法。 所以事实证明,可悲的是,有 无限数量的数字 我们不能代表正是在 计算机,至少在一个有限的 的比特数,一个有限的 RAM的数量。 不幸的是,现在这有时 具有现实世界的后果。 如果人们不很明白这一点 或那种想当然的事实 他们的计算机只是做 他们告诉它做不 了解这些基础 代表性的细节 - 坦率地说,在有些语言 对用户隐藏的,不像在C - 一些不好的事情都可能发生。 什么,我想我们会做 是退后一步。 这是关于 八分钟的录像片。 它宣扬了几年前,它给 其实是可以去的洞察 错了,当你欣赏这些 各种细节都非常太 真实的世界。 如果我们可以把灯光调暗 了几分钟。 扬声器1:现在我们回到工程 灾害对现代奇迹。 电脑 - 我们都将接受 往往是令人沮丧的问题 ,和他们一起去。 错误,病毒,软件故障 小的价格支付 方便。 但是,在高科技和高速 军事和航天计划 应用中,最小的问题 可以放大成灾难。 1996年6月4日,科学家准备 发射无人驾驶的阿丽亚娜5型火箭。 它携带的科学卫星 正是如何建立 地球磁场的相互作用 太阳风。 火箭始建欧洲 航天局和其升空 在海岸设施 法属圭亚那。 JACK GANSSLE:在约37秒 飞行中,他们首先注意到 东西是错误的。 喷嘴旋转 一种方式,他们真的不应该。 进入飞行约40秒, 明确了车辆遇到了麻烦。 这就是当他们做了一个 决定销毁它。 范围内的安全人员, 巨大的胆量,按下按钮, 炸毁了火箭之前,它可以 成为危害公众安全。 扬声器1:这是首航 阿丽亚娜5型火箭,它的破坏 因为嵌入一个缺陷发生 在火箭的软件。 JACK GANSSLE:阿丽亚娜问题 的是,有一个数字 ,需要64位来表示。 他们想转换 一个16位的数字。 他们假设的数量从来没有 将是非常大的,最 那些在64位的位数 数量是零。 但他们错了。 扬声器1:一个软件无法 程序接受的那种 数所产生的另一个 在根目录的失败。 软件开发已经成为一个非常 昂贵的新技术。 阿丽亚娜4型火箭一直非常 成功的,那么多的软件 为它创建的也是 用于在阿丽亚娜5型火箭。 菲科伊尔:最根本的问题是 阿丽亚娜5速度更快, 更快地加速。 软件 占该。 扬声器1:破坏火箭 是一个巨大的金融灾难, 由于软件错误一分钟。 但是,这是不是第一次数据 转换问题一直困扰现代 火箭技术。 JACK GANSSLE:开始于1991年, 第一次海湾战争中,“爱国者” 导弹经历了类似 数转换的问题。 其结果是,28名美国士兵 死亡,约100人受伤 当爱国者,这是应该 以防止传入飞毛腿, 没有发射导弹。 扬声器1:当伊拉克入侵科威特和 美国发动“沙漠风暴” 1991年初,爱国者导弹 被部署到保护沙特 以色列从伊拉克飞毛腿 导弹攻击。 爱国者是美国的中程 表面空气系统制造 雷神公司。 THEODORE波斯托尔:爱国者的大小 拦截器本身大约是 20英尺长。 它重约2000磅。 它携带的弹头约 - 我认为这是大约150磅。 和弹头本身是一个 高爆 它周围的碎片。 弹头的壳体设计 像巴克肖特。 导弹进行了四个扬声器1: 容器和运输 半拖车。 菲科伊尔:爱国者反导弹 系统可以追溯到 至少有20年了。 它最初被设计为 防空导弹 击落敌方飞机。 在第一次海湾战争,那场战争时, 走过来,陆军想使用它 击落“飞毛腿”导弹,而不是飞机。 伊拉克空军没有 这么多的问题。 但陆军担心飞毛腿导弹。 因此,他们试图升级 爱国者。 扬声器1:拦截敌方导弹 在5马赫 将要足够的挑战性。 但是,当爱国者冲进 服务,陆军不​​知道的 伊拉克的修改,使他们 打飞毛腿导弹几乎是不可能的。 西奥多·波斯托尔:发生了什么事 飞毛腿 进来的是不稳定的。 他们摇晃。 这样做的原因是伊拉克人, 为了获得600公里的 300公里的远程导弹,把 出前弹头重量。 他们使弹头打火机。 所以,现在爱国者的尝试 来的飞毛腿。 而大部分时间,铺天盖地的 大部分时间里,它只是 飞毛腿飞。 扬声器1:一旦爱国者导弹系统 运营商意识到错过的爱国者 它的目标,他们引爆了爱国者 弹头,以避免可能 如果它被允许伤亡 倒在地上。 THEODORE波斯托尔:这是最 人们看到大火球在天空中 作为拦截和误解 飞毛腿弹头。 扬声器1:虽然在夜空 爱国者似乎是成功 摧毁“飞毛腿”导弹,在达兰有 关于它的可能是没有错 性能。 有爱国者的雷达系统失去 跟踪传入飞毛腿从未 由于软件缺陷而推出。 这是以色列首次发现 的时间越长系统 是,更大的时间差 成为由于时钟 嵌入式系统的计算机。 JACK GANSSLE:大约两个星期前 在达兰,以色列人的悲剧 国防部报告 该系统是失去的时间。 经过约8个小时的运行, 他们注意到,该系统是 越来越明显不准确的。 国防部回应 告诉所有的爱国者电池 不能离开系统 很长一段时间。 他们从来不说,很长一段时间。 8个小时? 10小时? 千小时? 没有人知道。 扬声器1:爱国者进驻 在宰赫兰兵营 一直有问题的内部时钟 对超过100小时的夜 2月25日。 JACK GANSSLE:跟踪时间到 的大约十分之一秒的精度。 现在,十分之一秒为 有趣的数字,因为它不能 以二进制表示完全相同,表示 它不能被精确地表示在 任何现代数字计算机。 这很难相信,但 用这个作为一个例子。 让拿多少三分之一。 三分之一也无法表达 在小数正是。 三分之一0.333 无穷。 有没有办法做到这一点 绝对精度在小数。 这也正是同样的问题 ,在爱国者发生。 系统运行的时间越长, 最坏的时间误差就成了。 扬声器1:运行100小时后, 只有时间错误 大约三分之一的第二个。 但无论在目标导弹 在5马赫,它导致 超过600米的跟踪误差。 这将是一个致命的错误 在宰赫兰的士兵。 西奥多·波斯托尔:发生了什么事是一个 飞毛腿发射早期检测 预警卫星。 他们知道,飞毛腿 在他们的大方向。 他们不知道它在哪里来。 扬声器1:现在是雷达 “爱国者”系统的组成部分 卫冕达兰定位,并保持 跟踪来袭的敌方导弹。 JACK GANSSLE:雷达 是非常聪明的。 它实际上跟踪的位置 飞毛腿,然后预测 可能会是今后一段时间 雷达发出一个脉冲。 这被称为距离门。 THEODORE波斯托尔:然后,一旦爱国者 决定有足够的时间已经过去了去 备份和检查的下一个位置 此检测对象,它可以追溯到。 因此,当它回到了错 地方,然后看到没有对象。 而它决定,没有任何对象, 这是一个虚假的检测,并 下降的轨道。 扬声器1:传入飞毛腿消失 从雷达屏幕上, 秒钟后,它抨击 走进军营。 飞毛腿杀害28是最后一个 第一次海湾战争期间发射。 可悲的是,更新后的软件到达 在宰赫兰的第二天。 软件漏洞已被固定, 关闭一章的困扰 历史的“爱国者”导弹。 爱国者实际上是一个缩写 相控阵跟踪 拦截的目标。 DAVID J MALAN:所有的权利,所以 发人深省的例子,可以肯定的。 幸运的是,这些较低水平 错误是没有的东西,我们会 通常有升值,当然 不是与我们的一些 最早的方案。 相反,大多数的错误,你会 将所遇到的逻辑性, 语法性质,据此, 代码只是不工作的权利。 而且你知道它相当快的。 但是,尤其是当我们得到的 学期结束时,它会 的可能性变得越来越 真的好好想想的设计 您的程序和底层 表示 有太多的数据。 举例来说,我们将介绍MySQL中, 这是一个受欢迎的数据库引擎 您可以使用网站 数据存储在后端。 你就得开始决定 学期结束的不仅是 沿着这些线路的类型的数据,使用 但究竟有多少位使用, 您是否想存储日期 随着时代的日期和时间,也 之类的东西你要多大的 是唯一的ID,也就是说,用户 在数据库中。 事实上,如果你有一些有 Facebook的占了相当长的一段时间, 你知道如何获得 您的用户ID - 这有时会显示在你的 除非你选择了一个配置文件的URL 绰号的URL,或者如果你已经 常用的Facebook的图形API, 公开可用的API,通过它 可以要求Facebook的原始数据 - 你可以看到你的数字ID是什么。 若干年前,Facebook的本质 不得不改变使用 使用长整型相当于 长,因为随着时间的推移,用户前来 去创建大量的账户, 假帐户,即使他们很容易 能用尽的东西就像一个4 十亿可能像一个int值。 所以这些类型的问题 在路上,以及。 所有权利,使被铸造。 这是不精确的。 一对夫妇迅速公布。 所以部分正式开始 周日,周一,周二。 你会听到在本周晚些时候通过电子邮件 为您的部分分配。 你怎么在这一点也在这里 改变你的部分,如果你 时间表现在已经改变或 舒适程度现在已经改变。 同时,P-集合一个黑客之一 本周四到期的选项 延长该期限每 规格至周五 在一个典型的方式。 实现的问题,其中包括 集规格说明 如何使用的CS50家电, 以及一些CS50具体工具 50般的风格,可以为您提供 动态与反馈 你的代码风格和质量也 检查50个,可为您提供 动态反馈到您的 代码的正确性。 请原谅,我们仍然熨烫 出几个扭结支票50。 有几个你的同学们开始 四点左右,上周五晚上,当 规范上升从那时起已经注意到 一些错误,我们正在努力 通过和道歉的人谁 经历了不必要的挫折。 该故障是我的。 但是我们会跟进CS50 讨论何时得到解决。 所以一个字的分数本身。 因此,这将是一两个星期之前, 开始得到反馈问题集 因为你还没有 教学研究员。 即使到那时,我们将开始评估 C问题之前,我们设置 回去从头如此评价 你得到更多的有关 更快速的反馈。 但在一般每教学大纲,CS50 习题集一起评估 以下四个轴 - 范围,正确性,设计和风格。 范围将是一个数字通常 0至5, 捕获多少 一块咬下。 通常情况下,你想这是五。 至少你尝试了一切。 并注意到这是一个乘数因子 所以,这样做只是部分的 问题集是不是最好的策略。 同时,更明显的是 正确性的重要性 - 仅仅是你的程序正确 尊重规范? 这是故意加权 重比其他两个轴由一个 三个因素,因为我们认识 通常你会花 更多的时间追了一些bug, 让你的代码工作,那么你 缩进它并选择 适当的变量名和 等,这是在另一端 的频谱风格。 这并不是说风格是不是 重要的,我们会传过来 讲座和部分时间。 式是指美学 你的代码。 你有选择的命名变量 很短,但有些 的描述吗? 你的代码缩进你见过 讲座和一致的方式 风格50? 最后是设计权 还有在中间。 放一个更难的设计 手指上,因为它更 主观的。 但它也许是最重要的 三个轴在教学方面的 价值随着时间的推移,这将是 教学研究员的机会 为您提供定性反馈。 事实上,在CS50,即使我们确实有 这些公式和成绩,在年底 的一天,这些都是很刻意 非常小水桶 - 点值 0和3之间 零和五​​。 我们不要尝试画很粗的线条 之间的问题集之间或 学生而是尽可能集中 我们可以定性,普通的 反馈,无论是打字或口头 您的特定的教学研究员, 你会得到相当不错知道。 但在一般情况下,这些权重 各轴。 同时,太,这是值得保持 介意你不应该假设, 五分之三是60% 因此,大致失败。 三是故意为了 中间的道路好样的。 如果你在得到三分 从本学期开始,这是 的确意味着是一个很好的 开始的地方。 如果你有三三两两,展销会, 一定工作付出一点 更多的关注,以充分利用 段和办公时间。 如果你得到四肢 五,伟大的。 不过说真的,我们希望看到的轨迹 学生之间 - 每名学生的个性化,但启动 本学期,在这里排序 两到三个范围内,但结束 这里在四到五的范围内。 这就是我们真正需要的。 同时,我们也牢记三角洲 周之间的零和周展出 12时,我做的成绩。 不要紧,我们绝对怎么样 你公平的开始,如果您的 的确轨迹 向上和坚强。 学术诚信 - 所以让我把我的 更严重的只是一瞬间的声音。 因此,这当然有区别 派遣更多的学生比其他任何 在历史上的广告板,我相信。 我们有点记不清 点如何经常发生这种情况。 而这还不是因为学生在50 任何比自己更不诚实 其他地方的同学。 但要意识到,那就是,我们都非常好 在检测这样的事情。 而这就是的优点是 计算机科学类,因为我们 可以和我们比较所有学生 问题设置成对对每 ,不仅今年 但往年。 我们有能力,像学生 类,谷歌和找到代码 像GitHub和网站上 讨论论坛。 CS50的是绝对有解决方案 P-集合漂浮在那里。 但是,如果你能找到他们, 我们可以找到他们。 而所有这一切都是非常自动化 和容易和悲伤的为我们找到。 但我想强调的是,也 课程的学术诚信政策 非常意味着是非常 相反的这种精神。 事实上,这一年中,我们改写的东西 在教学大纲,点 点点,更多的细节 在教学大纲。 但过程中的最重要的主题 真的是要合理。 我们认识到,有一个显着的 教学量 值在协作,在一定程度上 与同学,让你 两个或三个或更多 站在白板 白板,所以 说,你的想法 - 写出来的伪代码的图片, 图表马里奥应该是,如果 你先写 在伪代码。 应该采取什么贪心算法 - 应该如何表现每 问题设置一个? 等意识到行为 我们鼓励非常 沿着这些线路大部分。 在教学大纲中,你会看到一个 下一大堆子弹 合理的类别和一个不太合理 类别有助于我们帮助 您所在位置周围包裹你的心灵 我们画出这条线。 而在一般情况下,一个体面的经验法则 是,如果你正在努力解决 一些bug和您的朋友或同学 坐在你旁边, 合理的为你显示他或她 你的代码和说,哎,你能不能帮 我弄清楚发生了什么事情错在这里? 我们通常不拥抱 的相反侧。 它不是一个正确的响应为您的 朋友或同学在这里说,哦, 只要看看矿山和图 它从。 这是一种不合理。 但有别人,另一个大脑, 另一双眼睛看 您的屏幕或看看你的代码 说,你确定你想要的 这里有一个循环? 或者是你确定要 ,分号这里? 哦,该错误消息意味着这一点。 这些都是非常合理的, 鼓励的行为。 的情况下,我被影射 早期归结为当学生 深夜判断力差 决策和收发电子邮件代码 或者只是别人说, 在这里,它是在Dropbox或 谷歌搜索在深夜。 所以我会鼓励,求求你了, 如果你有那些不可避免 紧张的时刻,你撞了 对最后期限,你有没有后期 一天,因为它已经在星期五 点,发送电子邮件的过程的元首或 自己直接。 说,听着,我在我的 突破点在这里。 我们有一个谈话 和看着办吧。 诉诸于网络或其他一些不 合理的行为从来都不是 解决方案,太多你 同学这里就不再 校园里,因为那可怜的判断。 但它很容易裙子线。 这里是一个小的图片来捧场 你从书签交易,因此现在 一切都会好的。 因此,快速回顾一下,然后, 我们离开的地方。 于是在上周,还记得我们介绍 的条件下,而不是在Scratch 但在C这个时候。 有一些新的语法,但 真的没有新的想法本身。 我们有布尔表达式,我们可以 或连同两个垂直 条或连同两 &符号,他说,无论是左 和正确的必须是真实的 为这来执行。 然后我们有开关,我们看了 简单地说,但我建议是真的 只是为实现不同的语法 相同样的目标,如果你知道在 推进你的案件 将要。 我们着眼于循环。 for循环是可能是最常见的, 或至少​​一个人 通常达到本能。 即使它看起来有点神秘, 你会看到很多很多这样的例子 过不了多久,你有 已经在上周晚些时候。 While循环同样可以 达到同样的事情。 但是,如果你想要做的任何增量 或更新 变量的值,你必须 它比手动 for循环之前允许。 再有就是do-whil​​e循环, 这使我们能够做点什么 至少一次,而一些 别人是真实的。 这是特别好 程序或游戏,你想在哪里 提示用户的东西 至少一次。 然后,如果他或她不配合, 你可能会想这样做 一遍又一遍。 有了变量,同时,我们不得不线 像这样的代码,这可能 是两行。 你可以声明一个int叫 计数器,分号。 或者,你可以声明和 定义它,可以这么说。 给它一个价值在同一时间。 然后最后,我们谈到 有关功能。 这是一个很好的例子 某种意义上说,它说明 两种类型的函数。 一个是的GetString的(),再次 得到了来自用户的字符串。 但是GetString的()是一种有趣的, 到目前为止,我们已经用它, 因为我们一直用它 上的东西的左手侧的 等号。 也就是说,GetString的() 返回一个值。 当然,它返回一个字符串。 然后在左侧,我们 简单地保存该字符串里面的 叫name的变量。 这一点是不同的,在某种意义上说,从 因为printf printf的,至少在我们的 这里使用,不返回任何东西。 顺便说一句,它返回的东西。 我们只是不关心它是什么。 但它确实有什么 所谓的一个副作用。 那是什么副作用,在每 情况下,我们迄今见过吗? printf的是什么? 它打印的东西在屏幕上, 显示文字或数字或东西 在屏幕上。 认为这只是一个副作用 因为它不是真正交给 还给我。 这里面不是一个答案 一个黑盒子,然后我就可以 伸入抢。 它只是在做对自己,多 像科尔顿插入此 黑匣子的最后一周,他不知何故 奇迹般地在黑板上画 我没有实际参与。 这将是一个副作用。 但是,如果我真的必须达到回 在这里,说,哦,这里是字符串 来自用户的,会 是一个返回值。 并且到目前为止,我们只使用的功能 其他人都写了。 但实际上,我们可以做这些 自己种的东西。 所以我要进入 CS50再次电器。 让我关闭该标签, 打开了刚才。 让我继续前进, 创建一个新的文件。 而且我要继续前进, 调用这个positive.c。 所以,我想要做的事 这里正数。 所以,我要继续前进,做诠释 - 对不起 - #。 让我们不要让同一 像以前那样的错误。 诠释的主要(无效),开放式卷发 撑,封闭大括号。 现在我要做到以下几点。 我想编写一个程序, 坚持用户提供 我的一个正整数。 因此,有没有GetPositiveInt功能 在CS50库。 有只调用getInt()。 不过没关系,因为我有 我可以并处的结构 小该值约束。 我可以做这样的事情。 所以INT N - 如果你敲字,只是实现 我要回去 改变一些东西在一瞬间 - 所以整数n等于调用getInt()。 这就是要放 一个int n的内部。 让我成为一个更具描述。 让我说,像我要求的东西 你给我一个正整数。 好的。 因此,只是一点点的指令。 现在我能做些什么呢? 好吧,我已经知道我的简单 条件或分支机构,就像我 有划痕,我能说些什么 等,当n是小于或等于 零的话,我想要做的事 喜欢,那不积极。 然后,我可以做的 - OK,但我真的很想得到诠释。 所以我可以去这里,我可以种 复制和缩进。 ,然后“确定”。 因此,如果n是小于或 等于零做到这一点。 现在,如果用户 不配合? 好吧,那么我要 借用在这里。 然后我在这里 这里和这里。 因此,这显然是不 的解决方案,对不对? 因为有没有结束的迹象。 如果我想要求用户提供 我一个正整数,我可以 实际上得到的int。 然后我就可以检查这个int。 但后来我想再次检查和 再次检查,并重新进行检查。 所以,很显然,什么是更好的 建造在这里使用? 所有的权利,所以某种循环。 所以,我要摆脱 几乎所有这一切。 我想要得到这个 int类型至少一次。 所以我说的去做 - 我会回来的 而在短短的时刻 - 现在做什么呢? 我打算做INT N获取调用getInt()。 确定。 所以这是相当不错的。 现在怎么经常做 我想这样做吗? 让我把里面的printf循环 这样我就可以要求一遍又一遍, 如果需要的话。 什么我想这 while条件怎么办? 我想继续这样做 而事件是什么? 嗯。 N是小于或等于零。 的话,我们已经显着 清理这个代码。 我们借了一个非常简单的构建 - do-whil​​e循环。 我刚刚被盗重要的行 我开始复制和代码 粘贴,这是不明智的。 所以现在我要以实际粘贴 在这里,只是做一次。 现在做什么我想要做的 这个程序结束? 我就简单的说一下 喜欢,感谢 - 我会尽我为int% - 反斜杠N,逗号,然后 插头N,分号。 好的。 因此,让我们看看会发生什么现在 当我运行这个程序。 我要继续前进, 做积极的。 该死的。 有几个错误。 因此,让我向后滚动到第一。 不要通过他们的工作倒退。 通过他们的工作从上而下 免得他们级联和 有一件事是错误的。 隐式声明 函数调用getInt()。 嗯。 因此,它是不够的。 我有点犯同样的错误,但 这次有点不同。 我不仅要包括stdio.h中,但 也cs50.h,其中包括 所谓的声明int时,其 教设备,或教 C有什么调用getInt()。 因此,让我重新保存。 我要忽略其他错误 因为我希望他们 主题相关的错误 我已经固定。 因此,让我继续前进,重新编译 与作出积极,回车。 该死的。 误区三,仍然。 让我向上滚动到第一。 未使用的变量n。 我们从来没见过此之前。 而这,也同样是一个有点神秘。 这是编译器的输出。 什么,强调线 - positive.c :9:13 - 是说,它的上线九说 positive.c,在第13个字符, 13列,你犯了这个错误。 ,特别是,它告诉 我未使用的变量n。 因此,让我们来看看 - 九号线。 我在这个意义上使用n 我给它一个值。 但编译不喜欢的是 我不是看似使用它。 但是且慢,我使用它。 在第11行,我在这里使用。 但是,如果我继续向下滚动 于:11 positive.c - 因此在第11行,12字符的 编译器告诉我,使用 未声明的标识符N。 因此,未申报的手段,我有 不指定它作为一个 变量的数据类型。 但是且慢。 我确实做到了,在九号线。 所以有人在这里真的很困惑。 这是我或者编译器,因为 九号线,再次,我声明 INT N,和我分配的 调用getInt()的返回值。 然后,我使用的变量n行 11和检查,如果其值小于 大于或等于零。 但是,这显然是 坏破为什么? 再说一遍吗? 啊,我要申报前N 进入循环。 但是为什么呢? 我的意思是,我们只是提出了一点前, 声明变量,它的罚款 在一个行,然后 他们分配一定的价值。 全局变量 - 让我们回来 那只是一瞬间的想法。 你为什么要我把 它的循环之外? 它是。 没错。 所以,虽然有点违反直觉, 让我总结一下。 当你声明Ñ里面 ,do块的 - 具体的内部 那些花括号 - 该变量n有什么 所谓的范围 - 我们的评分系统在无关 当然 - 但有一个范围 限于那些大括号。 换句话说,通常如果你声明 一组内的变量 大括号,即变量只存在 那些大括号内。 所以,尽管这个逻辑单 我宣布n在九号线, 基本上消失,从范围, 从内存中消失,可以这么说, 的时候,我打了11行。 因为不幸的是,11号线, 外面那些大括号。 所以,我遗憾的是不能修复这个 回去我做了什么之前。 起初,你可能做到这一点。 但什么是你现在不 循环做? 显然,你没有得到 的INT周期性。 因此,我们可以离开调用getInt(),我们 应该离开调用getInt()里面的 循环,因为这就是我们要 一次又一次缠着用户。 但它确实足以去 上升到线,比方说6。 INT N,分号。 不要给它的值,但由于 你不需要只是还没有。 但是现在这里,请注意 - 将是一个非常容易犯的错误。 我不想影子我以前 n的声明。 我想使用n 确实存在。 所以现在10号线, 我给你N个值。 但是,六行,我宣布N。 所以我或我不能 使用它现在在第12行吗? 我行,因为它们之间卷发 括号是n现在宣布呢? 一起来这里第五行。 到这里的人在第14行。 所以,如果我现在缩小,保存此文件,请 备份和运行做出积极的,它 编译这个时候。 因此,这已经进步。 斜线。 /积极,回车。 我要求你给我 一个正整数。 负1。 负2。 负3。 为零。 一。 感谢一个 现在印。 让我试试别的, 出于好奇。 我被告知要输入一个整数。 但是,如果我,而不是键入羊肉? 所以,你现在可以看到一个不同的提示 - 试。 但无处在我的代码 我写重试。 所以,据推测,这是重试 来自提示,你会说吗? 是啊,从调用getInt()本身。 所以CS50的员工做的事情之一 适合你,至少在这些最初的几个 周,我们已经写了一些量 错误检查,以确保,如果 你叫调用getInt(),你会至少 从用户得到一个int。 你不会得到一个字符串。 你不会得到一个字符。 你不会得到的东西 否则干脆。 你会得到一个int。 现在,它可能不会是积极的。 它可能不会是负数。 解决这一问题,我们不作任何保证。 但我们会纠缠使用者重试, 重试,重试,直到他或她居然 合作。 同样,如果我做1.23, 这是不是一个int。 但是,如果我不输入,也就是说,50, 给我的价值,我想。 好的。 所以不坏。 上的任何问题,我们刚刚做了什么? 关键的外卖,是明确的,而不是 这么多的循环,这是我们见过的 即使之前,我们还没有真正 使用它,但是范围的问题,其中 变量只能只能使用 一些指定的范围内。 好吧,让我解决的建议 你所说,一个 全局变量。 顺便说一句,事实证明,另一 解决这个问题的,但 通常是一个不正确的解决方案或 设计不佳的解决方案, 什么宣告变数 所谓的一个全局变量。 现在,我有点违反我的定义 的范围,因为有 在最高层没有大括号 最底部的文件。 但含意, 是,现在第四行, n是一个全局变量。 顾名思义,这是 只是到处访问。 划痕实际上有这些。 如果你使用一个变量,您可能还记得 你不得不选择,如果它是为 这个精灵或所有精灵。 那么,所有的精灵只是更清晰 说全球。 是吗? 啊,非常好的问题。 所以记得,在第一次版本 我的代码,当我不正确 声明和定义的n行九 - 我宣布它作为一个变量 我给它一个价值 赋值运算符 - 这给了我两个错误。 其中,事实是n不使用 和两个,即在第11行 它只是没有宣布。 因此,第一个我没有 地址的时间。 它不是严格意义上的错误申报 一个变量,但不能使用它。 但其中的事情,我们已经做了 CS50设备,故意 教学,是我们已经拍成了 预期的编译器 确保你正在做的事情不只是 正确的,但真正正确的。 因为如果你声明一个变量 如n和从来没有使用它,或使用 正确的话,那么什么 它是做什么呢? 它真正没有目的。 而且它很容易随着时间的推移,如果你 不配置您自己的电脑 这样一来,只是有代码 这里一点残存,残存有。 然后,几个月后你回头看, 你像,这是为什么行 有代码吗? 如果没有很好的理由, 不利于你或你的同事 在路上有 然后绊倒。 顺便说一句,哪里是 来自? 嗯,记得我们每次编译 计划,所有这东西 正在打印。 所以,我们会回来的。 但同样,是一种实用工具, 自动编译的过程中,由 实际运行的编译器 铛。 这件事情,我们最终会看到,有 做一个特殊的调试 程序调用调试器。 这具有与优化 代码 - 未来。 STD = C99 - 这也就意味着使用1999年版 C. C'S左右甚至更长的时间比 ,但他们提出了一些不错的 变化10多年以前。 这里是相关的。 我们说做任何事情, 以前本来是一个警告 防止学生的错误 从编译。 挂壁方式,对于一个 一大堆的东西,而不是 只是涉及到的变量。 然后让我滚动 此行的末尾。 这也,我们最终会 回来。 这是很明显的名称 我编译的文件。 这回顾的文件的名称 我输出作为名称的 我的可运行程序。 这只是意味着lcs50使用CS50 库,以及任何的零和那些 工作人员写了先前编译 今年,整合 他们到我的程序。 有谁知道-LM是什么? 这是数学库,这是 就在那里,即使你 没有做任何数学。 这只是自动提供 我们做。 好吧,让我做一个其他的例子 在这里开辟一个新的文件。 让我保存这个string.c。 事实证明,作为我们谈论的数据 类型的今天,甚至还有更多 引擎盖下 比我们迄今为止见过。 因此,让我很快做一个快速的程序。 包括stdio.h中。 我来救。 而且你知道,让我不能使 一次又一次地犯同样的错误。 包括cs50.h. 让我现在继续 做诠释的主要(无效)。 现在我只想做一个程序 这 - 声明一个字符串 s和得到一个字符串 从用户。 让我做一个小小的 这里说明 - 请给我一个字符串 - 用户知道该怎么做。 这里再向下低于此, 我要做到以下几点 - INT I会变为零。 同样,计算机科学家通常 开始计数为零,但我们可以 使那一个,如果我们真的想。 现在我要做的i小于 比字符串s的长度。 所以strlen的 - S-T-R-L-E-Ñ - 再次,它的简洁,因为它更容易 打字,即使它是一个 有点神秘。 这是一个我们还没有使用的功能 但字面上 - 我返回一个数字,表示 字符串的长度 用户键入。 如果他们中键入“你好”,它会返回 五,因为有五 字母打招呼。 然后,在每一次迭代中 这个循环中,i再加加。 如此反复,即使一个标准的构建 你不太舒服或太 熟悉它。 但是,现在在此循环中的每一次迭代, 注意什么,我要做的事情。 我想去和打印 出单个字符 - 所以%C反斜杠n在一个新行。 然后,你知道我想要做什么? 无论字的用户类型 ,像你好,我想打印 H-E-L-L-O,每行一个字符。 换句话说,我希望得到的 单个字符串中的字符, 据此,到现在为止字符串 是一个字符序列。 事实证明,我可以做,支架, ,密切支架,关闭 括号,分号。 我必须做的一件事。 这是在一个名为string.h中 ,strlen的宣布。 所以,如果我想使用该功能, 我需要告诉编译器, 希望使用它。 现在让我继续前进,使 字符串调用的程序。 点,斜线,字符串。 请给我一个字符串。 我会继续前进,键入它。 你好,在全部大写,回车。 现在发现我已经印 后一个字符。 因此,新的细节在这里是一个字符串, 在一天结束时,可 其个别方式访问 字符引入广场 支架符号。 那是因为一个字符串下方 引擎盖的确是一个序列 字符。 但什么是整齐的是 在您的计算机的RAM - 的Mac,PC,不管它是什么 - 他们 从字面上回背靠背 - H-E-L-L-O - 个人,相邻 在内存中的字节。 所以,如果你想获得等在第八届 字节,它在这个循环中,将很 零支架,支架,支架两个, 三支架,支架四 - 零索引,直到五 - 将打印出H-E-L-L-ø 在自己的行。 现在,作为一个传情,让我告诉你 各种各样的事情,你会最终 能够理解,至少 与一些密切寻找。 为一体,包括在今天的 的例子,如果你愿意,实际上是 第一越狱 为iPhone。 越狱是指破解手机 所以实际上,你可以用它在一个 不同的运营商或安装 自己的软件。 你会发现这看起来完全 神秘,最有可能的。 但是看看这个。 iPhone显然破获 一个for循环,如果条件,其他 条件下,一组函数 我们从来没见过的。 再次,你不会在 乍一看可能 明白这是怎么工作的。 但是我们采取的一切 授予在我们的现代生活 实际上趋于减少,甚至一些 这些基本面,我们已经 看着。 让我继续前进,打开一个 其他程序,holloway.c。 ,也因此,这是你 真的不应该知道。 甚至没有工作人员或者我可以 大概弄清楚了这一点,通过观察 ,因为这是别人的代码 提交什么 历史上被称为一个模糊处理C 比赛,在那里你写一个程序 编译和运行,但这么该死的 神秘的无人能明白什么 它这样做,直到 他们实际上运行它。 因此,我们确实,如果你看一下 代码中,我看到一个开关。 我看到主。 我看到这些方括号暗示 某种类型的一个数组。 有谁不想去猜测什么 实际上这个程序 如果我跑霍洛威? 是。 确定。 干得好。 因此,只有工作人员和我想不通 出这些东西做什么。 最后,让我继续 并开拓其他程序。 这一次 - 再次,我们就会使源代码 可在网上 - 这就是 样靓来看待。 他们所做的一切被击中 空格键颇有几分。 但是,这是真正的代码。 所以,如果你认为那是相当,如果我们 实际运行此提示, 最终你将看到我们如何 可能做这样的事情。 因此,我们将离开你,说明 看到你在周三。 [音乐播放] 扬声器2:在接下来的CS50, TFS上演一场兵变。 扬声器3:在那里,他是。 抓住他! [音乐播放]