[音乐播放] ANDI彭:这是CS50,以及 欢迎第两个星期 这实际上是当周 我们的两个分类 - 实际上, 第一个星期,我们已经有一节。 举手,你们有多少人所有 来到超节最后一周? OK,没关系。 没关系。 你们有多少人观看 上周超一节? 好。 而你们做精 在问题设置一个? 所以我打算把它,我们有 一群很聪明的孩子 在这个类的东西将被罚款。 好。 所以first-- 首先,我们只是简单地 去了今天的议程。 我们将讨论过程中的物流。 很多人可能 有关于问题 在这个过程中运行的东西怎么样。 我们将回答这些问题。 我们将简要地 过去的情况下,循环 任何你们错过了超级部分。 我们将谈论ASCII映射。 我们将谈论阵列, 功能,命令行参数。 最后,什么你们大概都 真的想在这里学习, 是你的pset2。 我们将有一些很好的技巧 和提示如何做到这一点。 好。 此外,第二,我们有 大量的糖果在这里。 任何人谁喜欢糖果, 刚来到这儿。 抓住一些。 我有一大堆。 我们有一吨在办公室。 我真的不希望 整天吃糖果。 你们应该吃所有的糖果, 因为我把它在这里为你们。 刚吃糖果。 未来将有糖果的每一个部分。 因此,首先,我是谁? 我的名字叫安迪鹏。 我CS50头TA在耶鲁。 而且除了 这一点,我也将be-- 如果有人将like--跑步 哥们,你的肩膀上哭了起来。 如果您PSET的,由于前一天晚上, 你不知道这是怎么回事, 打我。 我们会同情在一起,等等。 只知道我在这里作为一个 资源为你的前线 在帮助你们找出如何 解决CS50及以后的问题。 我的邮箱是andi.peng@yale.edu。 我还将派出一个人 我在里面的电话号码发送电子邮件 所以不是每个人都对 网上能看到我的电话号码。 随时打电话给我在任何时候。 说真的,我的电话是 通常连接到我的手。 我可能不响应 在几分钟内。 我可能不是一两个小时内做出回应。 但我可以向你保证,如果 你给我发电子邮件,如果你打电话给我, 给我发短信,我会在24小时内做出回应。 通常情况下,我才回应 即,因为我明白 每个人都得到了一些问题, 你希望你的答案 要很快回答。 但是,如果你打电话 我前30分钟 这一块是由于周四 night--是这样,安迪,帮我, 我还没有started--我可以给 你的肩膀哭泣。 但是,它可能是时间去思考 如何下一次到不行。 好。 哎呀。 我怎么回去? 在那里,我们走了。 所以在这个过程中,我们有一个 吨为大家的支持。 除了刚 这里的部分​​,这你 每周弄花90 妙钟和我在一起, 我们也有办公时间。 怎么你们许多已经 去过办公时间寻求帮助? 太好了。 这的确是很好看,因为我们 有超过45的TA和CA的工作人员 训练这个课程,在这里 帮助你与你的pset家伙。 周一他们在青色举行 课堂在17个山家在这里 在耶鲁大学。 周二和周四, 他们在下议院举行。 8:00至11:00几乎每一个工作日。 进来,进来了。 如果有任何问题,没有problem-- 刚进来吧, 然后我们会帮你出这一点。 其次,除了在办公时间 而部分,我们也有短裤。 有没有人见过一对夫妇的 在视频短裤或演练 在网站上? 好。 所以他们非常,非常有帮助。 我们可爱的哈佛生产 团队那边那所学校 北上,他们拍摄并制作 这些令人难以置信的演练视频。 他们会带你通过一步一步 如何去解决问题。 通常情况下,如果你感到困惑 一个简单的概念,一个单一的概念, 来看看,因为我们可能有 某处在我们的网站上有一个短。 它通常是一个很好的资源 看,当你第一次的 失去了对如何处理的问题。 第三,我们也有 study50和reference50。 因此,在研究50 网站仅仅是一个链接。 这是,我认为,study.cs50.net 或类似的东西。 它只是谷歌。 我们有很多准备的幻灯片。 我们有很多的短裤和 walkthroughs--东西全部编译 非常漂亮和整洁为你们所有 浏览,看到任何概念 你感到困惑。 它很可能被覆盖 那边study50。 Reference50--相似。 我们有很多的各种注意事项 随时可供您使用。 最后,我们有什么 所谓的CS50讨论, 其中一个论坛,如果前一天晚上 你做你的问题,比如, 您有任何问题。 登录到CS50讨论。 发表您的问题。 然后一个hundreds--的 也许,thousands--同行 网上采取这一类将登录。 也许有人可以得到 一个TA可以在你的答案。 它本质上只是一个 在线论坛,我们都可以 用它来讨论我们的问题。 这很酷。 好。 所以,问题的设置。 我们有关的权利的 厚厚的习题集两种。 我们很多人已经 通过问题挣扎设置之一。 我们已经知道,也许等待 在昨晚做你的PSET 是不是做CS50最聪明的事。 技巧和基本的提示 成功读出完整的型号规格。 你们有多少人已经 读取规格为PSET 2? 好。 这是一个坚实的量。 我知道你们可能已经认识到 现在的规格是很长的。 他们是真的,真的很长。 这真的很难读每一行 那认真一字一句。 你想只是走马观花的地方 它告诉你做什么。 我可以向你保证,不这样做。 如果你这样做,你可能 要错过的地方 它会告诉你 如何启动的问题 或者它会告诉你什么名字 您的问题,或者它会告诉你, 这可能是最好的办法 开始做你的问题。 然后你会被丢失。 当您尝试读取你的 SPEC一半, 很多重要 information--在你不 要能够真正地访问。 因此,阅读完整的型号规格。 尝试阅读全规格 你来段之前, 因为那时,当我们 说说处理器集, 我们都可以有一个想法 对正在发生的事情。 其次,这是一个概念 我会喜欢引用 很多整个课程学期。 但本质上,迎接我们半途而废,对不对? 我,作为你的TA和贾森当然 经理和Scaz作为你的教授 大卫为你的教授和所有的 其他可爱的助教在这个过程中, 在此course--助手 我们将尽我们所能 以确保您的设置 多达在这个过程中取得成功。 我们将举行部分。 我们将举行办公时间。 我们会回答你的电话 电话,回答你的电子邮件, 尽我们所能,使 确保你的问题的回答。 但是,帮助我们了。 与我们见面一半。 如果你来到办公时间 不必去节,不 在看到讲座,无 知道是怎么回事,像,帮助我。 我要像,很好,我很抱歉。 这可能是一次借 那肩膀哭泣, 因为我不知道 我能做些什么来帮助你 如果你不尝试,至少帮助 自己在一开始一点点。 与我们见面一半。 你知道吗,请进来 准备回答,并得到 准备从事材料。 这使事情变得这么多 方便大家参与。 是啊,这几乎是它。 评级。 因此,在教学大纲,这是很 深入的关于我们如何档次。 但实际上,故障 在这个成绩的50% 将pset时,这 是可爱的,因为这是 在那里你花了广阔 大部分的课程时间。 测验40%,你的 项目最终将有10%。 将有两个测验贯穿 本学期的课程。 我认为,时间和日期 同时上市的教学大纲。 的方式,我们将 被分级您的pset 就是我们有本质4 我们分配给每个等级的值。 我们有一个范围值, 正确性,设计和风格。 所以你看,这是一种我们 计算公式的pset。 三,我们给予最 重量的正确性, 因为很明显你的教练 应该测试的情况下, 我们希望它来测试。 你们都有 check50在您的处置。 这是一个非常有用的功能 ,你们都可以 你的代码上传到我们的服务器, 在这里,我们将帮你了解一下。 你见过那些 frowny脸,笑脸。 他们是真的,真的很有帮助。 请不要在 学生是喜欢尝试 硬编码在所有的答案。 我肯定看到了PSET哪里 有人看到check50的所有值 他们只是硬编码in--如果 这个数字,打印出这个数字。 如果这个数字,打印出号。 不要那样做。 尽管在技术上 check50是正确的, 你的解决方式 问题是不正确的。 因此,只要使用check50谨慎。 但也确保您 了解它是如何运作的, 程序是否正常 除了check50, 由于我们无法测试每 check50可能的情况下。 我们将测试他们中的一些。 设计本质上是怎么 精心设计的是你的代码? 如果你是复制粘贴多个 行的代码很多很多次。 也许你还没有经历 在代码中最好的设计。 也许是时候添加这个循环。 从本质上讲,在这里它只是所有 关于尝试做你的代码, 试图尽可能高效编写代码 尽可能让你的程序运行 尽可能快。 最后,我们有风情。 因此,风格是怎样的 随心所欲,主观的词。 我知道,我们正式拥有 风格50指南CS50, 它会告诉你,哦,你, 应该有一个空间在这里。 你应该用什么样的格式 你的代码这种方式。 你应该事物命名这种方式。 我真的不关心,本身,怎么 您选择的风格你的代码, 就像只要你保持一致。 例如,如果你喜欢 四位后留下的空间 四位循环之前, 只是做每一次。 那种不这样做。 不这样做,其他时间。 如果你想保持卷发 括号空间一定的方式, 只是一直这样做的。 那种不要做它的地方 这里地方不存在。 当我们分级, 真的很难 如果我不知道如何 你格式化你的代码, 事情是古怪和不合时宜。 如果你只是保持一致,这是 对我来说更容易为大 要能看懂你的代码。 这是你作为一个学生更容易 要能看穿你的代码 看看有什么错 它削减为什么有问题。 风格是最简单的事情之一 你们能做得到充分的分数。 从本质上讲,如果你只关心,如果 你付出五分钟关注 你的代码每个星期,你应该 要获得完整的造型加分。 最后,我们有什么所谓 范围乘数。 Scope--我知道这是一个很大 字,尤其是在这个类。 但是范围,所有的手段 是你正在尝试 pset时尽你的能力。 如果你把三出 你的四个问题 甚至不尝试 最后一个,你可能 要输的范围几点。 即使你刚开始的问题, 尽你所能地穿行了。 即使不工作,把它在, 因为显示和演示 我们说你想,那 你尝试的问题集 尽你的能力。 然后我们可以给你 全点的范围。 适用范围也是我们非常重要的 说说最低PSET得分下降。 因此,在的过程 学期,你们有九pset中。 我们实际上将下降 得分最低的掉那些九, 但前提是你有充分的范围点。 因此,如果你在一个不完整的PSET转, 不幸的是,我们不能删除的, 因为你的范围 点没有完成。 所以,即使你有可怕的一周 在这里你死,你生病了 或者你的狗死掉,你的猫死了, 而你超负荷作业, 只是试图处理器集。 它做尽你的能力。 如果它不工作,也没关系。 只要把它研究。 至少我们可以给 你点的努力。 一种努力,在这个类。 至少有最低分数下降的努力。 所以呀。 这几乎是它。 有没有人有问题,所以 远的我们在课堂上怎么样档次? 或任何这些? 任何这些所以far-- 段,办公时间? 酷。 好。 因此,这是一个主题,没有 人真的喜欢谈论。 我真的不喜欢谈论它。 你们真的不希望 听到我谈论它。 但不幸的是,我们都 要谈论它。 大卫花了20分钟 演讲谈论它。 那就是主体 学术诚信。 所以,我们都在这里可能已经写 一篇文章的某个时候在我们耶鲁上学。 我们可能已经得到了谈话,我们已经 被告知不要抄袭我们的作文, 因为这项工作是不是我们的。 在计算机科学中,我们有 同一种概念。 您提交的所有工作, 你写的所有代码 应该是你写的代码。 不应该说你已经码 从别的地方复制。 不应该代码 你一派,一屁股在 你真的不知道,如果它的工作原理。 有种你有感 它在做什么,但不是真的。 如有疑问,本质上, 它仅仅是合理的。 在我们的教学大纲,我们有 事情的完整列表 我们认为是合理的 对不合理的。 例如,合理 是你和你的朋友 在讨论什么是最好的方式去 大约在逻辑上解决问题。 这是相当合理的。 什么是不合理的,如果你 人聚在一起,键入相同的代码, ,并获得了相同的代码。 这不是合理的。 同样的事情,那种短文。 如果你想讨论 与您的朋友,哎, 这就是我想写。 这些是我想要的步骤 需要写下来,太棒了。 那好极了。 请互相协作。 如果你们开始 写同样的事情, 把在同一篇文章,那是不太确定。 因此,有疑问的时候,就不要去做。 在这里,我们在CS50,我们有脚本 该运行自动化测试 不仅是你的代码的正确性, 而且你的代码的唯一性。 所以,请不要把我们的位置 具有参考您的案件EXCOMM。 请只是为了大家,我们只 使这是一个奇妙的经历。 每个人都学会更好, 大家都快乐, 我们都设置为 在这个过程中取得成功。 东西是很 独特的关于这个类 我认为每个人都应该真 要注意的是,我们有 什么叫做后悔 在我们的教学大纲条款。 所以基本上,在72小时内,如果 你相信你已经做了一些 你真的不知道是 相应的,请来找我们。 我们向你们保证,72小时内 我们将处理的情况下自己 不参照更高 当局在管理。 所以,如果你来找我,说: 岸堤,哎,我真的很抱歉, 但我认为有一对夫妇线在我的 代码昨晚那种我GOOGLE了, 下车栈 溢出,复制和粘贴, 而我真的,真的很抱歉 这件事,让我知道。 请不要让它溃烂 而只是希望我抓住它。 我们将抓住它。 只是到我这里来。 让我知道,在72小时内。 我们会找出一个解决方案。 我们承诺,我们将不参考 大学当局本质。 所以这是在你最感兴趣 只是说实话大家一起 涉及的过程。 好。 好。 所以,现在,快速前 我继续前进,没有任何人 有关于物流问题 如何课程,我们要去跑, 如何节会 运行,所有的是什么? 好。 是啊。 听众:[听不清]? ANDI彭:是的。 那么quizzes--你们有多少人是 在周一/周三部分? 有多少人都在 周二/周四? 好了,就在这里了坚实的分裂。 让我们运行方式 它在耶鲁是我们 将有两个独立的 quizzes--一个用于每个section--那 上课时将采取。 我认为这是十月十月底, 这样的事情,一个星期 的测验。 是啊,所以才来上课。 在周一或周三, 你会参加测验。 在那个星期二或星期四 你会采取不同的测验。 但是,同样的材料将被覆盖。 是啊。 好问题。 是啊。 听众:我们在哪里 去检查我们的成绩? ANDI彭:是的。 因此,我将派出一个 电子邮件无论每个星期 当测验是graded--或者, 对不起,当pset中分级。 Pset中通常转向 在中午或周五。 所以,我承诺,我会 试图让他们回到你身边 由上周五的中午。 每当我一年级pset的,我会送 出上档次书的通知 告诉你你的分数 可在线观看。 所以,正确的这一周,之后我 完成分级上周的pset时, 你们会得到一封电子邮件 通知告诉你, 嘿,这是你 去查看你的成绩。 你可以看到每一个 你的成绩击穿。 你可以看到评论。 噢,快的事也。 在伟大的注释部分 本书是我可能会 花我的大部分时间分级。 所以一件事是 真正重要的当 你们正在查看 你的成绩在你的pset 不仅找 在物理得分 而且服用时间 真正读懂我的意见。 通常情况下,给你的反馈 关于你如何解决问题。 如果你需要做的 东西好一点, 建设性的批评通常是 在这些意见节最好的说明。 所以,请,请,我要去 花时间写评论。 请,我真的很感激它 如果你们会读这些意见。 好。 酷。 好吧。 因此,我们将开始讨论 和公正的审查快速 一些从该材料的 零只所以我们一周 正确的页面上 开始这个星期的问题。 因此,while循环是 三种类型的循环的 前面我们在这个课堂上讨论。 while循环本质 被写在语法 其中,而在一定条件下, 这样做反复,对不对? 想想它在这个图形在这里。 你会开始在 某一点在你的代码。 你要进入循环条件 if--我不知道 - x小于1。 如果是真的,你要 执行循环体。 而你要继续做 一遍,再次再次 过去,over--这就是为什么它是一个 loop--直到你的条件变为 假的。 因此以这种方式,一个循环的同时 是比较简单的方法之一 写任何形式的条件 需要重复一遍又一遍又一遍。 只是要小心,每当 你写的任何种类的循环 你有一个退出条件为 还有一个更新不管它 为使您的循环不只是 遍地跑无限。 在任何情况下,你会 想要确保 您正在改变的某些方面 代码或在循环结束 只是为了确保你有办法 迈向的条件 要见面结束。 这是否有意义给大家? 我们只是不希望 陷入这种螺旋式的地方 我们走了一圈又一圈,并 有没有办法来打破循环。 而且每次循环本质 具有这样做的一种方式。 好。 其次,你们中许多人 在马里奥的pset 可能不得不使用 这种类型的循环。 它被称为do while循环。 首先,谁能告诉我 什么做的区别 while循环和while循环? 是啊。 听众:while循环的做 运行在第一个[听不清]。 ANDI彭:是的,没错。 因此,一个do while循环总是做什么 是做在里面,括号内 那里确实是条件 检查the--对不起之前, 这是否代码之前 检查的条件。 这是特别相关我们 在这里这个类,因为大多数时候 我们将要提示 用户对某种类型的输入。 然后,视 输入他们给我们, 那么我们可以计算,呵呵, 我们需要再次提示呢? 因此,在马里奥,如果用户给你 一负高度,例如, 你要第一个提示 做任何在里面。 然后,你要检查的同时。 要知道,为负1, 是一个正数? 如果不是的话,我会去 背部和重复做,重复 重复,重复,直到他们 最后给你一个数字,你喜欢, 我们都可以运用在我们的代码。 这对于非常重要的 基本上任何用户输入。 我可以在任何保证你 一次在PSET哪里 我们要求您输入 任何类型的代码,我们 可能要给你 测试案例中,我们 想给你的东西不好那 要尝试打破你的代码。 如果我们试图要求你输入一个 整数,我们可能只给你一个字符串 看看你会如何处理。 如果我们要求您使用的时代, 我们可以给你一个负数 就看你会如何处理。 只要确保你们正在测试 案件中,你没有得到最好的 输入,让我们只说。 而一个do while循环 通常情况下是最好的 的方式来设计你的代码,以便 它符合该范围。 好。 好。 因此,这可能是最 复杂的环出三个 我们已经看到了这么远。 它看起来很吓人在第一。 但我向你保证,一旦你们 了解如何使用一个for循环的窍门, 这是最有用的事情之一, 在您的阿森纳最有用的工具 为推动这一类。 因此,例如,在刮, 我们有一个非常简单的块 只是说重复这个特定 短语一定的次数。 顺便说一下,SAJ-- 这是Scaz安迪杰森。 我们常常签署我们的邮件SAJ。 如果说SAJ,不要混淆。 这只是我们。 因此,在刮,我们能够有 一个块表示,重复我爱SAJ! 的10倍。 很简单。 背后的逻辑是一个 非常,非常简单吧? 我想先通过第一 时间和看到的是,第二次 并看到,第三次,依此类推 并依此类推,直到你打10。 而这样,我们将表示​​在 代码只是通过for循环的简单。 因此,对,你要申报 这里对您的变量,在这种情况下, 用int。 我们将其命名为我。 我们将其初始化为0。 和制动版本是 将是i小于10。 并且更新将是我++。 而内环路,这是怎么回事 直到最后它来执行 击中condition--的端部,其中 情况下,这将打破循环。 应该有东西,你 所有类型的球员已经见过 而不得不做你的问题集之一。 有没有人有任何问题 关于for循环的权利吗? 好。 太好了。 好。 因此,对于那些你们谁 读处理器集规格本周 知道我们将不得不雇用 一些所谓的ASCII和ASCII表。 大卫在演讲走过去简单 计算机如何essentially--一切 被编码在计算机中 二元,在零和一。 而这台计算机能的方式 以存储除了不同的值 以零和的是通过映射 这些数字代表其他数字 或基本上其他字符。 所以在这种情况下,一个 ASCII table--它所做的一切 是图个字符,或字符,为数字。 因此,在源代码文件 您computer--它认为, 哎,一堆零和一, 零和一,零和一。 这就是存储在 您的计算机的实际内存。 但是,当我们人类要 与电脑进行通讯, 我们want--说,例如, 如果我想的大写字母A, 我将需要一些方法 告诉电脑,哦, 当我输入大写字母A,我的意思是 这表示二进制。 所以我们这样做的方式是抛出了一个 随心所欲的东西称为ASCII表, 我们,作为人,作为 程序员,前一段时间, 我们随意决定我们 将要分配这些号码 值这些字符。 所以你们可以google一下网上。 我觉得有一个在你一个链接 pset--只是一个ASCII映射表,ASCII 表。 它只是转换二进制 号码转换成字符。 而且这将是非常 针对您的问题集有用 每当你想 算什么,或者你 要显示一定的 字符或整数 或操纵某些字符。 这将是非常 重要的是你的所有 知道如何定位的ASCII表。 因此,例如,在大写字母A 由数字65表示。 而小写 用97来表示。 因此,重要的是要知道, 两个值之间的差异 是32。 通常情况下,如果你需要从转换 一个到另一个,不同的是32。 如果你是那种不用担心 迷糊这个在第一。 我们一起去了我们如何 在实际的代码中使用此。 好。 因此,对于那些你与笔记本电脑了, 随意拉一个ASCII表, 因为这些大概会 需要你们引用 什么字符。 好。 因此,了解某些 字符映射到特定的号码, 如果我只是跑第一 那行代码 - 在printf的一个, 小写,减 大写字母A.有谁 有这将是一个猜测 打印出来的画面,现在呢? 所以首先,有哪些呢 小写代表什么? 什么号码是 编码在ASCII表。 对不起? 听众:97? ANDI彭:97,伟大的。 什么是大写字母A? 听众:65。 ANDI彭:那么,什么是97减65? 听众:32。 ANDI彭:OK。 那么,你们认为是要 发生时,我输入了代码行 进入我的电脑? 听众:[听不清]。 ANDI彭:对不起,说出来。 别担心。 这是一个非常安全的 环境,减去相机。 我们都将用于:无后顾之忧。 只是我们都去假装 它只是我们心寒在这个房间里。 别担心。 毫无疑问是太愚蠢了。 没有答案是愚蠢的答案。 我可能会犯错误 在我的教学过程。 说真的,伙计们,只是脱口而出出来。 要充满自信,你知道吗? 所以,那是什么? 谁说,去年的答案吗? 好。 喊了很好的和明确的。 听众:32? ANDI彭:32。 OK,让我们运行此代码, 看看这是什么情况。 好。 所以当你们可以种 看,典型的符号我已经 设在这里的,我们将如何使用 在我们的电脑任何类型的程序。 我们有我们的主要功能 在我们的主要功能。 我只是去复制和 粘贴此行代码。 你什么时候你们也要小心 正在复制和粘贴代码。 有时候,某些运营商 不贴了正常。 在这种情况下,减 符号实际上是一个破折号。 这样一来,电脑并没有把它捡起来。 因此,我不得不回去 身体重新输入。 只是要小心 你们正在做的。 好。 我们要在这里运行此。 所以,我们要cd到我们的第2节。 我叫这个节目asciimath。 所以请记住,当我们运行任何 程序中,我们要先编译 通过我们的化妆运行它。 然后我们要实际运行 该方案通过做点斜线。 所以,我们要./asciimath。 对了,我们走吧。 我们看到32。 做得好。 你应该得到一块糖。 糖果给你。 抱歉。 好吧。 好。 所以,我们可以回到我们的例子在这里。 啊哈,没有。 AAH。 好。 我只是要保持这样的。 好。 好。 所以当你们可以看到,我们能做到 很多非常有趣的事情, 很多非常酷的事情,很多的 涉及到非常复杂的事情 ASCII字符和数字。 一旦你到五号线, 这是一个很多跟随。 我们不会去 通过部分。 随意,如果可以的话, 原因,它在纸上 第一次什么应该发生时, 你输入这样的字符串值。 例如,在最后一行,我们有 z--表示某种number-- A--这也代表了 某些number--加1模数26 再加上小写。 如果你们继续阅读 通过这些,你 可以看到一个模式来在 我们是如何操作的代码。 我强烈,强烈建议 毕竟你节 球员前进和投入 这些都在你的电脑 看看是什么样的 数字现身 并通过这些原因是推理 发生的事情,因为你的pset 这将是非常重要的 让你了解 为什么某些事情正在发生。 所有这些幻灯片将在网上。 所以不愁努力 身体上复制下来的笔记。 一切都在网上。 本节本身会上网。 我的所有的源代码, 我正在将是网上。 是啊。 你还有问题吗? 听众:什么是模数? ANDI彭:OK。 所以模是一个操作员,那将 是你的球员的pset中非常重要的 这里。 这样的方式,操作人员 C语言和编程工作 是,你有什么所谓的 师符号和模量的象征, 这就像百分号。 因此,在C,当你做一个整数 除以整数带斜线, C具有一种倾向,要削减 关闭所有的小数点, 因为一个整数希望 转换成整数。 它不会想成为一个双 一堆小数所有之后的。 所以,如果我做的3除以2,这是怎么回事 切断0.5和只给你1。 所以这是一件值得 非常小心,当你的 做任何形式的数学编程, 是这些数字你 未必是数字 你所想, 这就是为什么在舍入你的 最后PSET是非常重要的。 模给你的剩余部分。 因此,举例来说,如果我做了3 模2--所以3百分号2-- 它会给你的那剩下的人。 所以3除以2为1.5。 这是1剩下的1。 它会给你1,这 是那剩下的人。 所以,当你们正在 通过ASCII表, 模将最终被 东西是非常重要的, 我们将讨论以后。 好。 所以东西是漂亮, 漂亮的新独辟蹊径 我们已经在本周讨论的 什么数组的概念。 所以阵列是第一 数据结构的类型 我们要去 遇到此类。 所有的数据结构是 某种随意性, 从字面上的东西状结构 我们作为程序员创建的, 我们已经把我们的代码, 可以包含其他的代码段。 所以在这个意义上说,一个array-- 认为它是一个文件柜, 在那里,如果你打开​​不同的 文件柜货架, 您可以访问不同的事情。 在内存中,数组只是做 同样的事情在您的计算机上。 你可以有不同的blocks--我们 称他们indices--数组。 这就像一个块, 的存储器的架子 我们已经在创建了 计算机,你可以输入 在不同的空间中某些事情。 因此,一个数组,你 总是要specify-- 您必须指定在声明 阵列中的下面的格式。 你会第一 指定数据类型 要创建阵列。 如果我想要一个整数数组, 我打算把INT就在这里。 如果我想要一个字符串数组, 我打算把字符串出现, 阵列的名称,然后 你将有方括号。 而在方括号,你 将有你的数组的大小。 东西是真正重要的 记住,当创建阵列是 如此,一旦你创建一个 阵列,该尺寸不能改变。 所以,如果你知道现在 你有大小为10的数组, 你知道,我将有10个小区 内或10这个数组中的索引, 它永远不会 扩大或减少 不管是什么,这有 空间目前只有10个街区 分配你的内存,可以存储 最多10个任何事情,你已经把。 因此以这种方式,阵列数据类型, 的数据结构是数组 从其他一些人,我们将非常不同 在此过程中稍后覆盖。 是啊。 例如,如果你想 创建大小为3的数组 的integer--包含变量 哦,不好意思,temperature-- 和温度, 当然,是整数。 因此,我们将产生int,它是 是我们要存储的数据类型。 我们将调用这个温度 为求命名的命名 东西,大家都明白。 而我们将有方括号。 我们希望三个数字。 因此,我们打算把 三是内部的。 东西是真的 重要的是要记住 是阵列零索引。 所有这一切意味着你 开始为0的索引, 你通过跑起来 减1的阵列的大小。 因此,对于这里的例子,我们 有大小3的数组。 这将能 持有三个值。 但数字themselves--的 号,阵列,该索引, 数组,从0到2。 所以,球员,真的,真的很小心 你要通过你的问题集 和创建任何类型的数组, 因为很多它的时代 真的,真的很容易忘记这一点。 我居然没有索引 3,我现在只是 具有2的索引。 如果你尝试 访问第三索引, 这将是怎样的 所谓空终止。 它不会实际 存在阵列中。 并且计算机 不会喜欢的。 所以要小心,只要 您正在访问的事情只是 确保你记住 该数组是零索引。 好。 所以第一实施例仅仅是 创建阵列的一种方式。 第二个例子,我有 下面就是一个独立的方式 创造了什么是相同的数据 我们刚刚输入的结构。 因此,而不是实际运行 通过并把在0温度 等于什么,温度1 等于什么,温度2等于 不管,我其实只是 在一行中直接创建这一切 成温方括号等于。 并注意在这种情况下,你不需要 到指定的数组有多大, 因为电脑的打算 经过,看到有 在这些大括号三个要素。 而且它会知道,OK, 我需要的大小为3的数组。 你不会需要 输入它下面的方式。 而且,是的,这种方式。 有没有人有问题 关于我们如何数组 或如何阵列结构的工作原理? 是啊。 听众:[听不清]? ANDI彭:是的,没错。 所以,如果你要声明和初始化 阵列以下的方法, 这是第二次的方式, 你可以离开的。 而且电脑 自动知道它 需要指望有多少元素 在这些大括号,分离 用逗号。 所以在这里,他们看到65,87,30。 因此,计算机就知道,哦, 有三个整数。 我知道要创建一个数组名 温度在其三大要素。 好问题。 是啊。 听众:是不是有可能创建 与不同类型的数据阵列 可能被输入到什么? 例如,对于整数[听不清]? ANDI彭:为施行 这个类的,不,现在。 当你创建一个数据 结构是怎样的一个数组, 你告诉 计算机,嘿嘿,我需要你 分配这么多 记忆在我的硬盘驱动器, 每个小区是一个 一定数目的位。 还记得我们在上周得知 零的不同的数据 类型有不同的大小? 因此,例如,一个字符串 是一个不同的量 空间不是一个字符,这 是不同量的空间 从一个整数。 所以,如果你没有指定你 混搭是什么类型的变量 你有电脑的 将是很迷茫。 而且它不会知道 多少内存给你。 所以为便于右 现在,计算机只能 识别一种类型的数组。 好问题。 好。 所以很自然的 我们的第二个问题 是,好了,现在我们已经创建了一个 阵列,我们已经把所有的这些东西 阵列中的情况是怎样的 要能够访问它? 因此,典型结构是我们始终 访问数组是我们可爱的for循环。 我答应你们,我们会 看到很多这样的家伙在这里。 从本质上讲,任何时候你想 输入值到一个数组 或者你想访问他们来说, 这样做的最好的方法是一个for循环, 因为在一个for循环,你 知道你有多少次 会希望通过阵列来运行, 因为你有一个停止的版本,对不对? 而每一次运行 通过,你可以访问 不同的元件的阵列构成。 而且,这是一个原因,通常 我们在0值开始我们的for循环, 因为当你访问阵列, 您可以访问零指标。 因此它平行非常漂亮。 你们可能想 写INT I等于1。 i小于或等于3。 但它不会是相当正常工作 还有在这里,因为你只 具有0,1和2的元件。 所以如果你开始 您我在元件1,2,和3中, 你会最终运行 你的数组的边界, 坏的事情将要发生。 所以,我希望你们看到SEGUE 为什么在前面的类 我们教你们如何运行和 格式化的循环,我们的方式。 这是因为,现在我们已经 过渡到阵列, 你可以看到为什么0贷出 本身非常漂亮来访问。 所以我们这样做的方式是that--我 刚刚打印出来这里是为了 打印出来。 但是,我有我的占位符,逗号。 与实际访问 部分正在发生。 所述阵列的名称 被称为温度。 所以它的温度和 该阵列的第i个元素。 所以for循环贯穿, 它会从0开始。 这将打印出 此数组的第0个指标。 然后它会打印 出的第一个元素。 然后它会打印 出第二个。 然后,我们要打破。 是每个人都清楚 怎么说是怎么回事? 太好了。 好吧。 所以在这里我们有办法 他说,如果我们不想要 硬编码in--我为程序员。 我不想实际的物理 摆在每一个单独的元素 此阵。 如果我想,而不是 有用户输入的值, 什么是做到这一点的最好方法是什么? 那么,在这里我已经创建 这个可爱的功能, 我在其中可以声明数组。 因此,廉政scores--我们 只是说我们要 即持有的所有18年级的数组 对这里的学生在本节。 我认为我们已经有了一个位 超过18个孩子的今天。 但如的缘故, 让我们只是假设,我们有18。 我想创建一个数组名得分与 int类型,因为得分,当然, 是数字。 而我将不得不 在方括号18, 有多少学生,因为这是我 希望能够存储的分数。 而这样,我想填充 该阵列是我最好 通过运行for循环中, 当然,0是我的第0指数。 然后用18是我的 停版,因为有 数组中的18个元素。 然后,我会做的printf,输入 得分student--亚达内容十分重要。 谁能告诉我为什么在这里,我 打印I加1,而不是我? 这是怎样的一个把戏 问题,不是真的。 它并没有实际的物理 影响代码的运行。 是啊。 听众:[听不清] 0? ANDI彭:是的,没错。 这是一个有点尴尬地说,哎, 你是第0个学生在这个类。 这是一个有点怪。 所以我们作为人类,真的不喜欢 想想计算机如何想的。 因此,即使在 计算机,它的存储值 在第0索引,当 我们是人类,我们真的不 喜欢把自己看作为零。 所以,当我刚打印, 我要打印,并添加 1只是为了清楚起见。 所以,当我打印,我将是 能够通过18打印学生1。 它实际上并不影响 代码的运行 以任何方式,我的方式进行打印。 但要小心,当你 实际访问的阵列。 当你看到我得分, 注意这里我其实 访问第0指数 不是1加0--或1加1, 在这种情况下,指数所以 这实际上是明确的。 是每个人都种确定对 这是如何通过运行 并与各项指标我 把一个值到阵列 并创建具有18个数字的数组 该用户将要输入? 好。 酷。 好。 现在,我们进入的东西,是很 有关这片设置为好。 我知道在讲座中,David-- 对不起,你有问题吗? 听众:您可以放大吗? ANDI彭:是啊,所以我尝试。 但我不知道。 出于某种原因,这 版本的PowerPoint 是真的不工作 很好地与所述显示。 因此,我们只是要 要保持这样。 这些都将在网上上传。 对不起大家。 是啊。 好。 因此,我们也可以有字符串。 所以,如果你们确实notice--我 知道罗布走到这在演讲 他did--字符串实际上是 字符的只是阵列, 如果你仔细想想,对吧? 字符串是一个名称或 句子或单词,对不对? 如果我要创建一个名为字符串 Andi--只是我的名字,A-N-D-我。 你认为那是只有一个变量。 但实际上,它的分解 成字符的只是一个数组。 因此它有足够的字符 一个存储在数组中的值。 它有n个存储于一个字符 第二索引等等,等等。 因此,在这样的方式,我们 居然有这样的 结构的设置 把我们的字符串。 所以在这里,如果我输入 词“吃” - 这样的字符串字是 得到的字符串。 如果我要输入单词“吃”了 在物理的方式,我的电脑 是存储该字符串在我的记忆中。 如果我想通过运行 和打印的out--所以到我 等于零,请记住,在讲座中,我们 涵盖的东西,就是所谓的strlen, 或字符串的长度。 因为我不实际 知道数组有多大 无论用户的inputting--的 比如,我输入 字“吃,”我知道 这三个字符长,对不对? 所以,我可以把在三有 一切都会好起来的。 但是,如果用户输入的东西 这是一个不同值的数量, 你将不能够真正 知道,当你的程序代码。 让我们处理测试用例的方法 这样的是,我们有一些 所谓strlen的,这仅仅是一个函数 告诉你一个字符串有多长。 所以strlen的字。 我的话是吃的。 n等于字strlen的。 有谁能告诉我这是什么 值实际上是正确的呢? 这是什么ñ代表权 现在,在这个例子中,如果我有吃的吗? 听众:3。 ANDI彭:3,正好。 因此,我们必须对于int i等于 零,n等于3,本质上。 并且i要运行 直到它的不足3I ++。 而这将基本上去 通过做同样的事情。 这将打印出 每个值,并给您 E-A-T。它只是表示一个 写它的不同的方式。 这将是非常有益的。 是啊。 听众:什么是推杆的好处 在n等于里面那个strlen的字 循环[听不清]? ANDI彭:是的。 所以,如果我是用于:说,例如, 如果我这样做,然后 do-- oop--的是,在我的代码,它会 实际上是在做喜欢同样的事情。 然而,这样,大卫解释 它讲座期间,如果有的话你们 请记住,是,由于 人类,作为程序员, 我们真正尝试编写我们 代码,使我们的电脑有 工作尽可能小,所以 我们的代码是非常有效的。 所以,如果我有,有,有什么 会发生在我的for循环 是,我想首先声明一个 变量命名的我将是0。 我要检查一下,哦, 什么是字的strlen的? 哦,strlen的是3。 那么,我不到三? 是的。 我要去运行。 然后将第二次回周围 循环,我要增加我。 我将是1。 而我是要检查,哦, 但什么是字的strlen的? 哦,这三种。 而确实,似乎有种浪费, 每次通过循环运行时, 要检查的功能, 即使字的strlen 实际上从未改变? 因此,它是额外功率的计算机。 当你开始谈论的东西 这是数十亿 与数十亿的地方 长,想象一下你的电脑 不必实际经历和 检查所有的,每一个时间。 这就是为什么,使刚 为求效率, 我们往往只做到这一点, 因为这样一来,我们只 调用函数 一旦在开始的时候, 并且,每一次它 经过这回事 存储值3 在那里,你不 必须不断地检查每一个时间。 是啊。 听众:对不起。 只是[听不清]。 你可以做诠释n等于strlen的放 上面的for循环的外 呢? ANDI彭:是的。 你可以做到这一点,绝对。 我们有它在这里的原因是 因为for循环工作方式 的是,它被称为 在这个意义上局部变量 这一切你 创建的内部进行循环 只存在内部循环。 所以变量i仅 存在于这些括号内。 n个而这里的变量也 只存在于那些括号。 所以,如果你使用的strlen的 词多次向下跌破, 绝对做到这一点的最好办法 将宣布它的顶部 所以你不必做一次。 是啊。 听众:你为什么有 百分比后,新生产线 看,如果你想要把所有 字母旁边分开? ANDI彭:哦,我想 全部打印出来,每行。 不要紧 是的,这是一个格式。 这是一个很好的问题,但。 是啊,如果我想打印 这一切只有一行, 我也不会在冲刺。 好。 每个人都好? 好。 酷。 所以,我想我已经谈得够多。 你们轮到通过运行 代码,并告诉我什么是错在这里。 哪里的错误? 因此,大家可以看到,我已宣布 字符串类型命名为类新的数组。 而且我已经输入的山姆, 杰斯和金进去。 而我试图打印出 该阵列中的所有元素。 谁能告诉我为什么这个 是要给我的问题? 我给你们10 秒去想这个。 好。 是吗? 听众:是左侧中心 等于3或[听不清]? ANDI彭:对。 那么有多少次是这其实 通过这个循环运行? 听众:四。 ANDI鹏:没错。 这将通过四次。 这将贯穿 于0,1,2,和3中, 因为他们的元素是我 小于或等于3。 它不会停止时,它的2。 这将继续 走,直到它击中3。 正如我们所知,有只有三 在我们实际的数组元素。 如果我们试图访问的第四个 元件或3的索引, 你会打的地方 内存中不存在。 这就是所谓的空终止。 没有什么是去那里。 您的计算机不会 很高兴和你在一起。 是啊。 有没有人有问题 为什么这是怎么回事? 这是一个公共区域,以避免。 是啊。 听众:难道不是第一次 滑动也有2一串? ANDI彭:没有。 所以基本上,当 你正在做一个数组, 该支架右 那里,number--所有 它告诉你是怎么 许多元素我有。 它实际上没有告诉 我什么指标。 因此,在这种情况下,我知道我要 与三地书写, 有三个物理地方 持有任何我想要持有。 所以这就是为什么数字三是存在的。 但是,如果我想 实际访问它, 如果我想说的话,printf的 类托架号码,然后 你要真正把 有物理索引。 是啊,好问题。 听众:所以是物理 指数应该是[听不清]? ANDI彭:我很抱歉。 你能说了一下? 听众:所以是物理指标 [听不清]每个盒子? [听不清]? ANDI彭:是的。 所以,我要回到这里。 想到这里的。 我们有大小3的阵列。 有三个地方,比如, 物理占位符在这里。 但它们命名为0,1和2。 所以,如果我想访问他们, 我访问它们的方式 是的printf什么的,我想在这里。 你将不得不打印 从它的名字, 因为这样的计算机 知道,哦,我需要看看 这个数组的第0个指标。 是啊。 但它的大小不发生变化。 的大小是3,而不管 你如何标记他们。 好。 每个人都好? 听众:所以每次我[听不清]? ANDI彭:OK。 因此,在这种情况下,我们真的不 进入它现在在课程。 但是要知道,像我一个string-- 前面说过,一个字符串,本质上是 字符数组。 所以,如果我创建一个数组 字符串类型的,我 有数组的数组 字符,对不对? 因此,在这种情况下,因为我 有一个字符串数组, 如果你输入一个很长的话, 仍然只占用一个空格, 因为这是一个字符串。 但是,如果你想 该阵列的字符, 那么这是占用了很多 字符比任何换言之 是。 没有真正的,现在重要的。 但是,这只是一般 它是如何工作的。 好。 因此,这是我就让你做 很多在这学期的课程。 我需要休息,我的声音。 你们需要激励自己。 很多人可能 要睡现在。 我输入随机问题 在这里,我们为一类,或者你 与伴侣在你身边会 花几分钟时间讨论 关于我们如何去解决 或创建一个程序,如这一点。 所以,现在,我们要 创建program-- 我们要叫它 upper.c--可以转换 小写的字到上流 string--大写,对不起。 词串,对不起,是同义的。 我要改变他们 意味着同样的事情。 是啊。 就拿一两分钟。 它并不必须是 用任何语言。 就在伪代码或 逻辑上我们怎么会连 去这样做这样一个问题。 是啊。 [副会话] 我还注意到,你们can-- 我看到那种已经计划。 我想我的缺乏 演示模式是一个问题。 但没关系。 [副会话] 是的,请,伙计们。 来拿糖果。 来拿糖果。 听众:是的! [副会话] ANDI彭:另外,是啊, 我就开始扔糖果 在人谁不回答问题。 所以,你都应该回答的问题。 或者,我想,人谁 不回答问题。 是的,周围的其他方法。 [副会话] 听众:[听不清] ANDI彭:是的。 是啊。 [副会话] 好吧,伙计们。 就拿一样,10多秒。 [副会话] OK,伙计们。 因此,我们开始尝试之前, 实际的物理写代码, 一个好习惯培养的是, 我们希望第一种原因 从逻辑上我们将如何做到这一点。 你要确保, 在你身体 开始尝试编写 在马里奥,你做 确保你有你的伪代码。 这是带你通过 你需要创建这样 即,物理当你 后来编写程序, 你能够更好地捕捉错误 在你的代码之类的东西。 所以,我们要刚开始 by--在英语中,伪代码, 没有人想给 我一个通用的解释 我们如何会去这样做呢? 是啊。 听众:[听不清]。 ANDI彭:当然,没有后顾之忧。 听众:你可以问它还是问 有人拿到字符串1--是啊,串, 接着 - ANDI彭:是的,所以这是一个良好的开端。 我将开始打字,对不起,因为你说话。 So-- 听众:--the小写 数字是更高的,对不对? 还是小写字母 有高的数字? ANDI鹏:没错。 听众:那么接下来我们减去 32从什么[听不清]。 ANDI彭:太好了。 所以,我们种得一般意义 如何工作这个问题。 知道那种我们学到 物理方式串 被存储在存储器, 你是什​​么已经 知道你要大概 要在你的代码编写 以移动通过字符串? 顾客:循环。 ANDI彭:一种循环,没错。 太好了。 所以,我们种有一个通用的 伪代码写下来 那种是给 你注意到你如何 会动一下解决问题。 现在,你有这个,你 可以参考它以后 当你试图对 实际上编写代码。 所以,我们实际上可以去这里。 而且我有一个调用的函数upper.c-- 那里is--只是一个空白模板 现在,你们要 帮我找出如何写 这行代码 - 不是代码行。 这将是多行代码。 当启动任何形式 空白PSET的,什么是 我需要的第一件事 记得吗? 听众:[听不清]。 ANDI彭:大是的。 包括。 stdio.h中。 通常情况下,这是一个 最易犯的错误 将当他们 写作,是,他们将 忘了包括 他们需要的重要的图书馆。 所以,如果是上班时间,你就会说: 我不知道为什么我的代码不能正常工作。 你能告诉我,为什么它不工作? 我们会说你#包括? 你应该#包含它。 好。 因此,我们已经得到了标准I / O位置。 这是唯一的图书馆 我们要在这里需要什么? 还有什么是我们该怎么办? 抱歉。 刚才有人尖叫出来? 听众:[听不清]。 ANDI彭:你去那里。 好。 以及如何着手开始任何形式 的功能,任何类型的主要功能的 在我们的计划? 诠释为主。 好。 我怎么把里面吗? 什么是你想要做的第一件事情? 如果我们想获得一个 来自用户的字符串, 什么是我们将会有 做这一行头? 对不起,你们只是觉得 自由发言和响亮。 刚喊出来什么的。 听众:询问用户? ANDI彭:我们怎么做呢? Ask--我是要输入“询问用户”? 听众:printf的。 ANDI彭:OK。 PRINTF。 我想要什么的printf? 听众:在什么类型。 ANDI彭:这样呢? 伙计们,假装我是一台电脑。 物理告诉我的每一步 我需要在这里输入? 难道我做错了什么? 我应该已经输入的东西吗? 听众:你需要引号。 ANDI彭:我需要报价? 好。 好。 听众:然后,新的生产线。 分号。 ANDI彭:分号? 好。 好。 听众:也许指定 你想在小写? ANDI彭:太好了。 你们笑我 忘了把一个分号。 我在某处向你保证 在这个类的过程中, 你会忘了把 分号,和它 将带你三个小时图 为什么你的代码不能正常工作。 这是发生在我们所有人。 它可能会发生在你身上。 获取使用分号的好习惯。 好。 听众:你想 做的反斜线? ANDI彭:当然。 你想要做的反斜线? 听众:是的。 ANDI彭:太好了。 好。 我该怎么办? 听众:获取字符串。 ANDI彭:获取字符串。 所以,我该怎么输入? 有人? 听众:的String。 ANDI彭:的String。 听众:GetString的。 ANDI鹏:一个人, 你能告诉我在哪里 此功能的GetString是哪里来的? 听众:STRING.H。 ANDI彭:STRING.H? 你认为这是从string.h中? 听众:[听不清]。 ANDI彭:你去那里。 这是一个从CS50.h. 如果你总是困惑于其中 库文件或头文件, 谷歌从字面上STRING.H, 我会告诉你 什么是所有的功能 这是string.h中。 好。 所以,现在,我已经创建了一个字符串 而我已经提示用户输入它, 我存储在一个变量 命名为S,我该怎么现在需要做的? 听众:检查,如果是小写。 ANDI彭:对不起? 听众:检查,如果是小写。 ANDI鹏:好吧,让我们做到这一点。 我怎么做? 实际上,为的宗旨 眼下之类的, 我们只是要 假设一切 我们投入已经是小写。 如果你想检查一下,你会 只需添加一个条件语句 该检查,该贯穿 每一个数组元素 并检查它是否 一定值之间。 我忘了是什么数 小写的值都是。 你可以看看它的ASCII表。 但是,是的,这是一个非常好的点。 但是现在,我们只是要 假设所有的字符串,我们输入 是小写。 好。 所以,我怎么会去 这个问题下一个? 顾客:循环。 ANDI彭:For循环? 好。 告诉我什么类型。 顾客:INT I等于0。 ANDI彭:OK。 听众:呵呵,其实,那你 做一个逗号,做N等于strlen的。 ANDI彭:那么重要的事 我认为她在这里发现 是,我们没得说INT n向第一次,我们这样做。 要知道,在一个为 当你声明循环, 你其实并不需要的INT 第二次你做一个变量。 你可以说ñstrlen的。 第:受众。 ANDI彭:秒。 好。 听众:然后一个分号。 ANDI彭:当然。 听众:然后[听不清] n的。 然后我++。 ANDI彭:太好了。 好吧。 我们想要什么内 本作目前循环? 请记住,如果我们要贯穿 一个串并通过阵列上运行, 我们要检查的东西在里面。 什么是我们将需要? 这是一种棘手的部分现在。 任何人都有一个猜测? 好。 因此,首先,我们怎么连上网? 我们怎么连第一次检查或 访问数组中的元素? 我们该怎么做呢? 什么是我们用来做记号? 这是什么阵的名字叫什么? 这就是所谓的S,对吧? 请记住,任何字符串始终是一个数组。 所以小号支架我,对吧? 因为,它是当前值 或索引值,我们正在检查。 而且我们要设置相同 用于:我们希望有一个小写的价值,对不对? 我们希望把这一lower-- 对不起,我们希望有一个大写字母。 我们想将小写 值转换为大写。 所以like--我很抱歉, 你叫什么? 听众:海蒂。 ANDI彭:对不起? 听众:海蒂。 ANDI彭:海蒂。 就像海蒂说, 最初,我们可能 将需要the--我们 可能将不得不减去 32无论从任何charc也就是说,对吧? 因为在ASCII 表,所不同的 小写字母之间 和大写字母为32。 所以,当我们这样做,我们可能 将要减去32,对不对? 所以,我们要做的I。 大家是否明白我为什么这样做? 因为现在,在我们的数组, 我们正在检查第0个指标,对不对? 和在的第0索引 字符串,这是第一个字符。 而这个角色,我们要去 假设它是小写。 如果我们要使它大写,我们 必须减去32从它的价值, 因为在我们的ASCII 表,这就是我们如何把它 到下一个相应的 值,这使得它大写。 大家是否明白了吗? 是啊。 听众:你能不能 做一个小写minus-- ANDI彭:是啊,所以这是 居然真的不错。 我会回来的 问题,我们这样做之后。 是啊。 然后,如果我想 看看这是怎么回事, 我可能会 要打印,对吧? 有人告诉我是什么 我想在这里打印。 听众:printf的百分比 Ç反斜杠[听不清]。 这是[听不清]的I值。 ANDI彭:■我,对不起? 听众:[听不清]。 ANDI彭:我不知道。 你怎么看? 听众:嗯,我wouldn't-- 我想我不会bring-- 我把它拿出来 在里面,因为[听不清]。 ANDI彭:哦,你会做吗? 听众:是的。 ANDI彭:让我们离开的方式 是的,为什么我稍后会解释。 请记住,即使你 有一个占位符, 你想要把括号它。 好吧。 因此,这应该在这里是一个坚实的功能。 让我们来运行它,看看它是否编译。 制作上。 嗯,哦。 这看起来并不太好。 这究竟是为什么? 对于任何错误,你想要去的 背部,并开始与第一位的, 因为通常是一个错误的原因 大量的后其他错误。 在这里,我们看到upper.c:18:25,它告诉 我这个计划命名为upper.c, 在第18行,错误隐式声明 函数库strlen的类型 unassigned--胡说,我不知道 在那之后发生了什么事情。 所有它告诉我现在是 这东西是怎么回事strlen的。 和计算机的困惑,因为 这就像,我不知道是什么strlen的是? 什么是可能 告诉你,你错过? 听众:你错过了[听不清]。 ANDI彭:你说得对。 没错。 因此,这是它的 重要的是要确保 您在使用每个功能的 码为具有正确的标题 文件的库,要不然 你会得到很多的错误 和你的代码是不会 要知道这是怎么回事。 因此,我们要在这里包括string.h中。 现在,当我们尝试编译上。 编译正常。 让我们来运行这个程序。 因此,输入一些小写。 你们有什么要键入? 喊出来的东西。 好吧,查理只是走了进来。 我们键入查理的名字。 查理小写。 并希望,有希望,这是 要喊出来,并吐出 查理大写。 好极了! 大家都知道如何 我去着手解决呢? 的方式,我可以 操作使用整数 解决的东西, 我想在字符串, 因为字符和整数能 以同样的方式,因为进行引用 ASCII码的映射。 所以回到你的问题,如果我 希望把32个位置,而不是 大写字母A减去小写一个活脱脱 即,将工作同样为好, 因为这只是简单的 这两个值之间的差异。 如果我想使这个again--查理。 不好了。 我想我们走错了路,是吗? 听众:[听不清]小写。 ANDI彭:你去那里。 是的。 进出吐查理。 所以,要小心 你减去值 要记住哪一个是 比其它更大。 例如,在这里我忘了 这小写实际上是 大于大写字母A.所以,当我 试图减去它们的其他方式 的时候,我得到了负32。 而我的电脑很喜欢, 我不知道那是什么。 这可能只是一些随意 值不是很好。 所以请确保你 减去在正确的长度 找到你想要的字符。 好。 有没有人困惑于我们如何 走遍写这个功能呢? 好。 所以实际上,功能已经 存在于库调用文件ctype.h。 图书馆的所谓文件ctype.h。 这个功能其实是 你已经写。 这就是所谓的要高。 所以,为便于 这PSET,你会 找到你真的要使用 包含了很多功能 内CTYPE的库。 要上,为了降低,是上,是 lower--这些都是功能 你将能够非常使用, 很快在自己的代码, 不正是这样做。 我们写了如何转换 一个字符串为大写。 但其实这是代码 是别人写 并且您可以访问 经由不同的功能。 是吗? 听众:所以你刚才复制的在那里 而做到这一点的每一个字母? ANDI彭:是的,因为我不知道 关心的一个的值。 我只是关心的差异 他们之间是32,对吧? 小写之间的差 b和大写B也32。 和c之间的差 和大写C是永远32。 我只需要关心 两者之间的差异, 因为所有的字母 遵循相同的模式,对不对? 如果我有差异 它们中的一个之间, 我知道有什么区别 所有的人之间。 好问题。 是啊。 每个人都好? 好。 空中接力。 好。 因此,另一种概念,是 会是你非常有用 继续发展 你的代码是这样的想法 对创建函数或抽象。 所以,现在,我们都采取了代数。 在代数中,你被教导,有 这个奇妙的东西叫做功能 机,在那里,如果你 输入某种类型数量, 它贯穿这个美妙的功能 进出弹出不同的输出,对不对? 在代码中,同样的事情发生 在任何类型的功能。 所以我可以物理 写在我的我的代码的身体 实际上做了主要发言 任何代码的身体在做什么。 但是,这以外,我还可以 写了许多不同的功能 是做许多不同的事情。 例如,我们已把 开始使用其中的一些。 Printf--这是一个 功能别人 已经写了 我们可以在代码中调用。 到upper--在这种情况下, upper--是另一个函数 我们已经写了我们 可以在我们的代码中调用。 所以我想,为什么 我们甚至有功能呢? 为什么我们不只是放下它 所有在相同的代码行? 这很容易让每一个人。 好了,背后的理由 是,第一个组织的全部。 这真是烦人会 通过别人的代码 和一个功能如printf。 如果你们真正知道什么是 函数printf entailed写, 它的一样,1000行代码。 如果每次我需要时间 对printf的东西, 我不得不写1000行代码, 这将是非常恼人的阅读, 对? 这就是为什么我们刚刚 创建这个抽象函数 我们已经有人 别人写了别的地方。 而每一次,我们需要使用它的 我们的代码,我们只是说printf的。 并且,能够使用该功能 别人已经写在我们的代码。 这使得它更容易 组织上读取的代码。 其次,它的简化。 它简化了我们有以下步骤: 拿地解决我们的问题。 PRINTF,如printf函数, 喜欢上的功能 是所有的东西,使我们能够 简化了我们的代码下来,以便更容易。 而最后一件事是可重用性。 因此,事实上,我们有 一个函数调用的printf 我们可以调用许多不同的 倍,并允许它可重复使用。 如果我写的printf, 我只有一次它写。 它存在仅在该一个位置。 如果我想再做一次,我会 要复制并粘贴了这一切 进入代码我的第二个行。 这就是为什么如果我们创建了一个功能 存在我们的主要之外, 我们只能呼吁 它并重复使用它时, 我们需要这样它是一个更容易 我们作为程序来写。 所以这样,我们实际上写 一个功能很相似,对不对? 这是一种第一 比如在我们将 看到一个风格的函数取 不同于我们INT主要无效。 在这种情况下,如果我想 写一个名为Q函数,对不对? 而这里的int值 在所有的告诉我, 我该怎么想这个 函数返回我吗? 如果我想立方体的​​整数, 我将要输入。 这些是参数。 我要输入一个int类型的值。 而我要回报 整型另一种类型的值。 而在这里,你 可以看到,所有的我做 在多维数据不管我输入 作为输出,并返回它。 因此,所有这个函数是 需要某种形式的整数。 它相乘本身两次 这样它立方体中的效果。 然后返回 无论是输出。 因此,在这种情况下,它的两行 我们必须编写额外的代码。 但是,如果我们想叫 在此多次, 这是一个更容易输入,一个 线对这里的立方体比 要经过多次。 这样的方式,基本上任何 格式化为任何类型的功能 会存在就是喜欢这里。 因此,我们有函数名。 在这种情况下,它被称为立方体。 我们将其命名为立方体,因为 很容易记住。 你可以将其命名为正方形, 它其实是可以立方。 无所谓。 只要你是一个名字 分配你的函数。 在这里这项权利,INT,是 类型你需要的参数。 那么,这功能 需要以操作? 那么,它需要一个输入。 我把它命名为输入。 任何你想要的,你可以将其命名为。 但我需要的东西int类型。 这将实际执行 无论是在这里里面, 功能的主体。 然后返回类型 就在这里,这int-- 所有它告诉我的是 这个功能是 要回到我的int。 因此,要采取一个int,和 它会还给你一个int。 每个人都明白是怎么 这种格式的作品? 酷。 好。 所以不要担心,如果这似乎 现在有点抽象的权利。 这是我们要谈谈。 我们将深入更深 后来在使用过程中。 的方式,任何类型的更高级别的 这些东西的工作抽象 的是,在存储器中,在 您的电脑,一切 存储在该类型 栈的,我会说。 所以在那里在顶部。 我不知道,如果你 你们可以看到,很好。 我会尝试进行放大。 此处在顶部,我们 有物理文 什么样的电脑是interpreting-- 所有的零和那些 我们的电脑中存在。 然后,我们已经初始化 数据和未初始化的数据, 我们所说的全局变量。 所以存在变数 所有程序 并在您的整个, 从本质上讲,代码。 不,如果你们有隐忧 那种对这个不清楚。 它并不真正的问题现在。 然后我们有什么 所谓在栈堆。 想想一摞字面上 就像一摞东西, 一叠不同 事情被推向顶部 彼此存储的各种的 你的代码中的变量和语法。 然后在此间举行的最底层, 我们的环境变量 你是在执行什么 只是你的小行代码。 而我们只是要放大 在实际栈的一部分。 所以在这里,如果我们放大 在栈只是这个领域, 这是什么样子。 这实际上是非常重要的 当你们谈论的功能, 因为公告称, 计算机中的内存 正存储变量 和功能 及两者的参数的 功能与您的主要变数 在不同的地方。 所以,现在,主要是 实际功能 您正在执行的代码。 你在这儿储存它的参数 这里存放局部变量。 局部变量只是意味着任何变量 存在仅在该功能。 而在它的上面,你有这样的 单独的函数调用的立方体。 你有这就是参数 以及那些当地人。 其原因可以 在这里看到的是什么 发生在多维数据集需要在 从你的主函数值 是,实际上它复制了过来。 所以,如果我想立方 2,并返回8,即2 实际输入 作为一个参数,它是 复制,让你有它存在的 在内存中的两个不同的地方。 而且你必须要非常小心 在回忆这其中的一个 你实际操作。 和发生了什么事的例子 这将是非常,非常糟糕 存在这里。 所以在这里,我有,从理论上讲, 一个程序就在这里,一个主要功能 那我声明了一个int x等于1。 我声明了另外一个INT y等于2。 然后我运行它 通过这个功能 称为交换,在那里我认为 它交换的两个值。 然后我要去 把它们打印出来,对不对? 这就是我想这个程序做。 因此,让我们下来看一看。 所以,如果我真的写不同 功能,你可以看到, 我们在这里有我们的主要功能。 然后,我们有我们的 第二个功能在这里。 空掉。 虚空只是意味着它的 不会返回任何东西。 该函数名 称为交换,它的 要进两个变量,INT A和 诠释B,从你的[听不清]功能。 所以基本上在这里,我们 通过x和y成此功能。 如果我们要 创建this--所以我们要 创建一个临时的价值,对不对? 我们将其赋值给一个。 然后将要现在等于湾 而B是要回来 那里的温度值, 其是,因为当 要交换的东西, 你不能只是喜欢交换他们。 你必须保持一个出来 在这里,以便它记住 那是什么,因为一旦 你换一个,你忘了 这是什么原值是吧? 因此从理论上讲,这个方案 应该工作,对不对? 如果我想交换 二,他们应该掉。 因此,让我们运行它,看看它是否工作。 所以当你们可以看到,X 曾经是1和y曾经2。 如果我把它打印出来, x是仍然1和y为2。 嗯,这个方案似乎并不被 工作,我希望它的工作方式。 有没有人想采取射击在 猜测为什么这是怎么回事? 它做的方式 不同的事情 存储在存储器不同的地方。 好。 所以你们不必担心 太多关于这个现在。 但是要知道,立方体的地方 变量是a和b, 因为在这里我们的功能, 我们已经声明a和b 如存在的变量 在立方体,该功能。 但正如你所看到的,参数 它采取的是被存放在这里。 但是,我们并没有真正 返回任何东西。 我们并没有实际上改变x和y。 我们只是改变a和b。 我们抄袭了x和y成 所谓a和b。 但是,我们从来没有真正 操纵x和y自己。 是你们看到的 怎么说是怎么回事? 是,我们已经简单地复制它 结束了,但我们还没有真正保持 轨道,其中他们是在存储器。 所以,现在的电脑 期待哦,我已经 通过运行这个东西 这个可爱的功能。 但x和y是仍然x和y。 什么也没有发生 它们,因为这样的事实 这些参数 和局部变量 被存储在一个不同的 放置在存储器中。 而这是一个较高级别的 概念,我们将 在启动过程中看到以后。 但是,仅仅知道这是 可能发生的一个问题 而且我们会想出办法如何 在使用过程中处理这个以后。 好。 好吧。 所以,最后的概念,我们是 真的要覆盖 那将是有益的 本周处理器集 被所谓的 命令行参数。 所以抢在他的演讲经历 那种简单地对如何将这些工作。 从本质上讲知道 你写的时候 就像一个主要功能,当我们 前过去写功能, 我们有INT主要无效。 其原因,我们有空隙存在 是因为我们的方案没有 需要输入值运行,对吧? 当我跑马里奥,我也没必要 实际上只需键入一些 当我跑马里奥。 我可以提示用户以后。 但是,这不会总是这种情况。 例如,在本 本周的习题集, 你要问的是,在 除了运行您的程序, 你会想要输入 直某些事情,你 运行程序。 所以我们这样做的方式被称为 一个命令行参数,这 就像是一个说法 你可以直接输入 因为你想运行您的程序。 因此,符号对于这一点, 这是相当复杂的前瞻性, 但它真的不是那么 难。因此,INT main-- 这只是你的主要功能。 进入ARGC逗号字符串argv的括号内。 因此,所有这是说的是,这 INT argc--所有这一切告诉你 的是,这些是数 参数的计算机应该期望。 所以一件事是真的 重要的是要保持跟踪 是你的程序的物理名称 计为这些参数之一。 所以,如果我想有我的计划 运行加上一个额外的命令行 的说法,我其实 将有两种。 ARGC实际发生是两个。 然后串的argv bracket--一切是干什么的, 它给了我一个 字符串数组是 将只显示和存储什么 所有这些命令行参数。 因此,举例来说,如果我想有这样的 程序,./copy INFILE OUTFILE,对不对? 这只是一个典型的Linux命令。 究竟是ARGC? 多少个命令行参数 有没有真正在这? 所有这一切确实是做的一个副本 一个文件的名称的infile的 它拷贝到 另一个文件,对不对? 这是这一切都在做什么。 正如你所看到的,我做的在一行 而不实际需要的程序。 什么是我们在这种情况下ARGC? 多少个参数我们有吗? 听众:三? ANDI彭:我们有三个,正好。 所以这是非常直观的 只是觉得它只是 在INFILE和OUTFILE。 但是要知道,的物理名称 计划你运行计为一个。 所以在这种情况下,的argc实际上是三种。 怎么样,是什么argv的0? 请记住,所有的 命令行参数 存储在一个字符串数组。 所以,如果我尝试访问它,有什么 将argv的支架0给我? 听众:[听不清]。 ANDI鹏:没错。 它会给我点 斜线副本,因为这是 第0元件,所述 我的数组的第一个元素。 那么argv的1? 听众:INFILE。 ANDI彭:INFILE,没错。 怎么样的argv 2? 听众:OUTFILE。 ANDI彭:OUTFILE。 现在,这是一个有点棘手。 你们有什么想的argv 3将是给我 如果我试图打印出来? 听众:[听不清]? ANDI彭:你有一只手吗? 是啊。 听众:一个选择。 ANDI鹏:没错。 所以请记住讲座中,我们 有在比赛的东西到底 所谓空终结者? 我们将进入这也 进一步在上课。 但是要知道,在符号, 顺便你的电脑 知道它的结束 阵列的是,它 把一种叫做空 终止或破折号为零。 所以,如果您尝试访问ARGV 3, 你会打这个破折号0。 这更是一个很难回答的问题。 那么argv的4? 因此,这是过去的空终结, 过去我们的数组的边界。 你认为是要 发生在我们试图做到这一点? 听众:[听不清]? ANDI彭:对不起? 都说有点响? 听众:[听不清]。 ANDI彭:是的。 也就是说的名称 区域中,您将最有可能得到的。 但是要知道,argv的4-- 它允许您访问 在您的计算机的地方 记忆,你真的 不应该是感动,因为 现在你知道什么是argv的是。 你知道它的大小为3的数组 有网点拷贝,INFILE和OUTFILE。 如果你尝试至今点到为止 你是过去的空结束, 你的计算机有可能 argv中4存放的东西。 而你真的不应该 允许访问到argv的4, 因为你有一个文件 橱柜,你只能是 允许访问这三个货架。 但是,如果你试图达到的方式超越 在那里你被允许的架子, 你要开始​​搞乱 在计算机的内存中其他的东西。 这将是非常糟糕。 所以只要知道这一点。 要非常小心,你 不只是随机启动 在数组访问元素 是不是你想要的创建。 是的。 好。 所以,我们要做的另一 这里终端的例子。 好。 所以罗布迅速讲座 前些天去 通过这个例子,在那里,他 有INT主要INT ARGC字符串的argv 括号,这是告诉我,我 将有命令行参数。 他,如果ARGC等于 等于2--记得, 等于等于装置的比较。 如果它等于2,那么我 要打印你好, 无论第一 数组的元素是。 否则打印的hello world。 这是什么打算 发生本质? 可有人只是解释 英语这是什么程序在做什么? 是啊。 听众:如果有人键入命令 并表示,他们的名字和姓氏, 它不只是打印 第一个说,你好, 无论你的第一个名字是。 ANDI彭:好吧,让我们来运行它。 因此,举例来说,如果我做 这个文件让你好你好用于: 用于:你有什么要我输入? 听众:姓氏和名字。 ANDI彭:姓氏和名字? 空间? 听众:是的。 ANDI彭:谁能告诉 我现在,什么是ARGC? 只是在那里? 哎呀,对不起。 让我回去。 多少个命令行参数 are--你们真的不能看。 但我会尝试进行放大。 我尝试着。 是啊,有三个,对吗? 这点斜线你好, 这是安迪,这是鹏。 那么,你们认为这 程序将被打印出来? 呵呵。 噢对不起。 错误的名称。 它打印出来,你好世界。 有谁不想解释 为什么会是怎么回事? 是吗? 听众:[听不清]。 ANDI鹏:没错。 所以在这里,是有条件的 是,如果的argc等于等于2。 因此只有在的情况下有 两个命令行参数。 然后我会打印, 你好,不管它是什么。 但其他人,我要 仅打印,你好世界。 因此,没有人想要 给我一个例子 如何我将能够实际 得到它打印的argv 1的价值? 什么我都必须输入吗? 只有一件事,对不对? 因为点招呼已经 数作为第一个参数。 我只有一个。 因此,点你好,如果我只是做安迪。 你好,安迪。 大家是否明白 为什么会是怎么回事? 是啊。 听众:所以之间的空间 命令line--是[听不清]? ANDI彭:没有。 因此,在一个命令行的空间 的说法,X,告诉你的电脑 这是一个新的字符串的开始。 因此字符串的argv这里 - 它的商店 所有的命令行参数 在字符串。 因此在命令行中的空间 argument--所有这些都告诉你, 这是在一个字符串的末尾 它的时间移动到另一个。 是啊。 这是非常重要的 您PSET,因为你 将要测试这些。 因此,没有人有 在这个问题吗? 嗯不错。 是吗? 听众:所以你会原因 把整型参数计算的,而不是 的[听不清]会当你想 键入其他信息 [听不清]? ANDI彭:是的,没错。 有些程序会要求你 输入命令行参数 它传递中并使用该。 是啊。 听众:那么,如果[听不清]? ANDI彭:嗯,我有什么 然后改变我的计划? 听众:刚才3。 ANDI彭:这是为什么呢 发生的事情,你觉得呢? 听众:因为[听不清]。 听众:你得 将其更改为2 [听不清]。 听众:1和2。 ANDI彭:1和2,完全吻合。 因此,在这种情况下,你可能 想要有两个printf的statements-- 一个印刷的argv 1 在一个印刷的argv 2。 这里。 其实我可以做真正的快。 你去那里。 呵呵。 不太你想要的。 但是,如果你们更动 格式化,它就会出来。 是啊。 酷。 我知道我们有点短准时。 但我只是要迅速花 几分钟经历helpful-- 听众:你有两分钟。 ANDI彭:我有两分钟? 谢谢。 一些快速PSET技巧。 因此,对于这个pset的,我强烈建议, 就像我说的,每个人都读了规范。 你会被写入三种programs-- 1 所谓initials.c,一个叫caesar.c, 一个叫vigenere.c。 一些重要的提示, 你们真的想 保持mind--所以 有这个功能 所谓atoi--我想说,一个三河。 目前还不清楚是否这就是 其实你怎么说。 但是,所有它做,它的输入。 它转换成一个字符串为int。 因此,一个代表ASCII到我的整数。 它只是将ASCII 值整数值。 所以请记住ARGV,数组,其存储 所有的命令行arguments-- 这其中所有的存储为字符串。 所以,如果你想成为能够 具有其中的一个成为一个整数, 你将有 在这里使用这个值。 模,就像我们盖 今天早些时候类, 让你拥有 其余的不管你有。 因此,如果我们真的,真的 大量的凯撒, 如果我们有结束 中的Vigenere的字符串? 你如何将能够 吃出环绕? 如果我打Z和我想 它返回一个, 我应该如何获得 那环绕? 可能需要使用 模在那里的地方。 其次,四处浏览 您的图书馆。文件ctype.h。 这是一个新的图书馆,我们有。 你会发现很多非常,非常 有用functions-- isupper,islower判断, TOUPPER,tolower的,因而isalpha,等等。 所有的功能,这将是非常有用的 当你试图弄清楚, 这种性格小写字母? 如何转换这种 字符串大写? 所有这些都将是非常, 非常有帮助您PSET。 好。 今晚是8:00上班时间到 明天在TEAL教室11:00 以及周三和周四晚上。 办公时间是公共资源。 强烈建议你们 所有马上开始, 因为你不希望是, 孩子谁周四晚有问题 提交您的PSET并 就像,我不知道该怎么办。 我开始,我完了,我提交。 试着给自己一些空间, 因为在代码中的问题总是会发生。 你要确保 你给自己 了大量的时间,以便能够 完成pset中。 酷。 我会在这里流连。 听众:这是网上了吗? ANDI彭:我不知道这是否是 在线已经,但它会。 我会在这里流连,如果任何人 有任何问题了。 感谢你的到来。