JavaRush /Java 博客 /Random-ZH /哈佛 CS50:第一周作业(讲座 3 和 4)
Masha
第 41 级

哈佛 CS50:第一周作业(讲座 3 和 4)

已在 Random-ZH 群组中发布
哈佛 CS50:第一周作业(讲座 3 和 4)- 1朋友们,您可以从研讨会笔记中收集基本的理论信息。在那里,除了 C 基础知识之外,它还讲述了如何连接到特殊的云 IDE CS50(必须执行此操作才能运行和检查任务),并描述了基本的必要 Linux 命令和语言结构。如果讲座中提供的材料和有关 C 的注释对您来说不够,请转向其他来源。例如,本文末尾列出的那些。在主题“附加材料” 中
  • 第一周目标
  • IDE CS50
  • 命令行和工作台更新
  • 在 IDE 中工作
  • 你好ç!
  • 虫子?
  • 验证检查:check50测试
  • C 基础知识:与 Scratch 的比较
  • C 中的基本数据类型
  • 库C
  • 再次Hello C:最简单程序的语法分析
  • 更多关于 C 中 I/O 的信息
本主题的材料:
  • 验证数据输入:cs50.h 库的特殊函数
  • 任务1.智能计算用水量
  • 任务2.马里奥与我们同在!
  • 任务 3. 换零钱的时间
  • 如何验证您的代码并获得分数
  • 代码资源
  • 附加文献

验证数据输入:cs50.h 库的特殊函数

为了使本课程更加方便,我们开发了一个特殊的库CS50,它特别具有处理用户输入数据的非常有用的功能。
  • GetString()读取用户输入的字符串;

  • GetInt()读取用户输入的字符串并检查其是否包含整数;

  • GetFloat()读取用户输入的字符串并检查其是否包含浮点数;

  • GetLongLong()读取用户输入的字符串并检查其是否包含长实数。

任务1.智能计算用水量

哈佛 CS50:第一周作业(讲座 3 和 4)- 2这是合乎逻辑的:你洗澡的时间越长,这个过程中消耗的水就越多。我们来算算多少钱?即使您的淋浴间几乎没有打开,每分钟也会流出大约 6 升水。这是您随身携带饮用的 12 瓶水。通常一个人洗澡大约10分钟。总共需要120个半升的瓶子来清洗。非常多!在water.c您的~/workspace/pset1. 该程序应根据时间计算淋浴使用了多少瓶水。那是:
  1. 该程序询问用户淋浴的分钟数
  2. 用户输入一个正整数
  3. 程序显示用户使用的瓶子数量。
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
为了简单起见,这次我们将假设用户总是正确输入分钟数,即我们不检查输入的数字是否为正整数。稍后我们将学习如何写支票,但现在这已经足够了。要检查程序是否正确运行,check50,您需要在终端中输入以下行:
check50 2015.fall.pset1.water water.c
如果您想查看课程人员编写的程序如何water工作,请运行以下命令:
~cs50/pset1/water

任务2.马里奥与我们同在!

哈佛 CS50:第一周作业(讲座 3 和 4)- 3你知道世界上最著名的水管工吗?在任天堂的帮助下,这个虚构的留着小胡子、戴着红色帽子、略显肥胖的家伙已经成为几代游戏玩家的英雄。如果您不知道我们在谈论谁,这里有一个 1985 年经典游戏的链接:相信我,它仍然很好,值得一试!您还可以找到适用于智能手机或离线模拟器的经典超级马里奥版本。我们需要所有这些来进行总体开发,不幸的是,这还不是一项任务;)。而任务是这样的。在第一个马里奥关卡结束时,每个玩家都看到了这个半金字塔:mario.c在您的~/workspace/pset1. 我们的程序将绘制一个与您所看到的类似的半金字塔,但直接在控制台中绘制,没有图形:每个块将包含一个井号图标(#)。即使您还不知道如何做,请相信我:这很容易。为了使问题变得更有趣,让我们添加使用 0 到 23 之间的非负整数设置半金字塔高度的功能。图中金字塔的高度被认为处于最高位置,即等于8。如果用户输入的数字错误,需要让他再输入一次。然后生成(使用 printf 金字塔)。请注意将半金字塔的左下角与终端窗口的左边缘对齐,如下例所示。带下划线的文本是用户自己输入的内容。
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
请注意,最右边的两列高度相同。现在还不值得生成管道、云彩和马里奥本人 =)。至少对于这个任务来说。如果用户输入的数据不正确(输入的不是数字,或者输入的数字小于 1 或大于 23),程序应该要求他重新输入数据,如下例所示,其中带下划线的文本是什么用户从键盘输入。要读取输入的字符串,请使用GetInt. 它可以帮助检查不正确的输入,但并非在所有情况下都如此。
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
要编译程序,请在终端中输入以下行:
make mario
或更透明但更长的版本:
clang -o mario mario.c -lcs50
之后,运行程序执行:
./mario
如果您想检查程序是否正确运行,请运行check50
check50 2015.fall.pset1.mario mario.c
如果您想玩课程助理版本的马里奥,请输入以下行:
~cs50/pset1/mario

任务 3. 换零钱的时间

哈佛 CS50:第一周作业(讲座 3 和 4)- 4在我们的纬度,我们还没有看到这种情况,但在美国,似乎有这样的玩具,如图所示:圆柱体是为不同直径(和面额)的硬币设计的,它们由弹簧机构释放,并且该装置本身可以连接到儿童收银员的腰带上。但是,如果有人向收银员支付大额账单,会发生什么情况呢?想象一下,数硬币换零钱会有多麻烦。为了最大限度地减少发行的硬币数量,您可以使用所谓的“贪婪”算法。根据美国国家标准与技术研究所 (NIST) 的定义,它们总是在解决问题的每个步骤中找到最佳解决方案,并假设最终解决方案(从所有这些步骤中获得)也将是最佳的。这是什么意思?让我们想象一下,一名收银员欠顾客 41 美分的零钱,而他的腰带上有几筒硬币,可以兑换面额为 25、10、5 和 1 美分的零钱。在“贪婪”算法的指导下,收银员会立即想要在第一步中给出最大值。此时,最优或最好的解决方案是捐出 25 便士。41-25 = 16。还剩 16 便士待支付。显然,25 便士太多了,所以还剩下 10。16-10 = 6。现在我们按照同样的原理,先出 5 便士,然后再出 1。这样,买家只会收到 4 个面额为 25、10 的硬币。 、 5 又 1 便士。事实证明,“贪婪”的分步发行货币指令不仅对于这种情况是最佳的,而且对于美国货币面额(以及欧盟)也是最佳的。也就是说,如果收银员有足够的任何面额的硬币,该算法将发挥最佳作用,即它将从所有可能的情况中发行最少数量的硬币。那么,我们需要找零的最少硬币数量是多少呢?这是我们的第三个任务。greedy.c在您的目录中创建一个文件~/workspace/pset1给定:面额为 25、10、5、1 分的硬币 该程序应该:
  1. 询问用户要给多少零钱
  2. 计算您可以执行此操作的最小硬币数量
笔记:GetFloat我们将使用CS50 库中的函数作为输入,printf使用标准 I/O 库中的函数作为输出。另外,程序必须检查输入的正确性。我们要求您使用GetFloat, 来允许用户输入以点分隔的美元和美分值。例如,如果我们欠 9.75 美元,则用户应该输入 9.75,而不是 9.75 美元或 975。您必须确保用户输入有意义的数字。假设是非负数;函数本身对 thisGetFloat没有帮助。如果用户输入错误,您需要要求他重复输入,并仅使用正确的数据运行程序。请注意浮点数固有的不准确性。例如,0.01不能直接表示为float。尝试使用格式化输出,例如小数点后 50 位,使用以下代码:
float f = 0.01;
printf("%.50f\n", f);
顺便说一句,在计算任何东西之前,将整个金额转换为美分(同时将其从 转换floatint)是合乎逻辑的,这将有助于避免很多错误和困难。为了确保我们的自动代码分析器能够正确检查您的问题,请确保您的程序输出的最后一行不包含除最小硬币数量之外的任何其他信息:后面带有 \n 字符的整数(那些研究JavaRush 很清楚我们在这里谈论的是什么 =))。下面是程序结果的示例。
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
鉴于浮点数的性质,您可以忽略零并以 0.41 的形式输入这样的数字。当然,想要检查程序是否可能完整输入错误数据的用户应该会看到类似以下内容的内容:
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
根据这些要求和您在上面看到的示例,您的代码很可能应该包含某种循环。如果在测试应用程序时发现循环不会停止,则可以使用 ctrl-c 组合中断程序的执行(有时多次)。您已经知道如何编译和运行程序。如果您想使用该实用程序检查程序是否正常工作check50,请在终端中输入以下行:
check50 2015.fall.pset1.greedy greedy.c
如果你想使用课程助理制作的程序,请编写以下命令:
~cs50/pset1/greedy

如何验证您的代码并获得分数

  1. 选项1

    如果检查代码的正确性对您来说很重要,而不是获得最终成绩,则可以使用该命令检查并更正它。

    check50 2015.fall.pset1.name name.c

    在CS50 IDE的终端行输入?其中name是任务文件的名称。

  2. 选项2

    如果您想获得成绩(与运行 check50 基本相同,但要记住结果并用英语填写一些表格,请按照以下步骤操作:

    • 第 1 步(共 2 步)

      1. 当应用程序准备就绪后,登录 CS50 IDE。
      2. 在 CS50 IDE 的左上角的文件浏览器(而不是终端窗口)中,左键单击或右键单击 hello.c 文件(位于 pset1 目录中的文件),然后单击“下载”。您应该会发现浏览器已加载 hello.c。
      3. 对水重复上述步骤。
      4. 对 mario.c 重复上述操作。
      5. 重复贪婪。c。
      6. 在单独的选项卡或窗口中,登录CS50 提交
      7. 单击窗口左下角的提交。
      8. 在出现的窗口中的问题集 1 下,单击上传新提交。
      9. 在出现的窗口中,单击添加文件...。应该会出现一个名为“打开文件”的窗口。
      10. 导航到下载 hello.c 的位置。它通常位于“下载”文件夹中或默认分配给您下载的文件夹中。找到 hello.c 后,单击它一次以对其进行标记,然后单击“打开”。
      11. 再次单击“添加文件...”,“打开文件”窗口将再次出现。
      12. 现在以同样的方式找到文件water.c。单击它,然后单击“打开”(或“打开”)。
      13. 现在找到 mario.c。也用同样的方法点击打开。
      14. 一切与greedy.c 文件相同。
      15. 单击开始上传开始将文件上传到 CS50 服务器。
      16. 在出现的屏幕上,您将看到一个标有“未选择文件”的窗口。如果将鼠标光标移动到屏幕左侧,您将看到已下载的文件列表。单击每个以确认每个的内容。(无需单击其他按钮或图标)。如果您确定已准备好发送文件进行验证,请认为您已完成!如果您想自己再次检查代码或修复任何问题,请返回 CS50 提交并重复这些步骤。您可以根据需要多次重新发送;仅评估最近提交的内容。
  3. 第 2 步(共 2 步)(不需要进行评估,如果 =))

    现在访问https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x,您可以在其中找到特殊表格。在其中,您需要回答几个理论问题,然后单击它们下方的“提交”。

带星号的问题为必填项:
  • 好吧,应该看到这个来了!简而言之,什么是图书馆?*(简单描述一下什么是库)
  • 就几句话来说,#include <cs50.h> 当你把它写在某个程序之上时起什么作用?*(出现在某些程序顶部的 #include <cs50.h> 行的作用是什么?)
  • 您认为您在问题集 0:Scratch 上花费了大约多少小时?
  • 您认为您在问题集 1:C 上花费了大约多少小时?
  • 到目前为止,您对 CS50x 有什么看法?*(您目前对CS50的看法,请选择喜欢或不喜欢的选项)
  • 您是否通过 CS50s Facebook 群组 http://www.facebook.com/groups/cs50 向同学或工作人员寻求帮助?*(你有没有在Facebook群组中向其他学生或助理寻求帮助)
  • 您是否通过 CS50s Subreddit http://www.reddit.com/r/cs50 向同学或工作人员寻求帮助 *(您是否通过 Subreddit 向其他学生或助理寻求帮助)
  • 您是否曾通过 Twitter 使用@cs50 或#cs50 向同学或工作人员寻求帮助?*(您是否在 Twitter 上使用 @cs50 或 #cs50 向其他学生或助教寻求帮助)。
朋友们,如果您有任何疑问,请在本指南下方的评论中留言。如果您尚未达到 JavaRush 5 级以接收信息邀请,我们建议您这样做。它是免费的、有趣的而且不是很困难。

代码资源:

  1. 第三讲

    http://cdn.cs50.net/2015/fall/lectures/1/w/src1w.zip

  2. 第四讲

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f.zip

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f/

附加文献

http://cpp.com.ru/kr_cbook - C 语言作者 Brian Kernighan 和 Dennis Ritchie 撰写的经典 C 书籍的俄语版本。在狭窄的圈子里被广泛称为 K&R。然而,该翻译不是最新版本。阅读前三章。材料会比您需要的多一点,但足以解决问题。 https://computer.howstuffworks.com/c.htm是 CS50 作者推荐的资源。用英语。页 1-7、9和10。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION