Skip to main content

实验 1:人口增长 - CS50x 2023

确定人口达到特定规模所需的时间。

$ ./population
Start size: 100
End size: 200
Years: 9

背景

假设我们有 n 只羊驼。 每年,有 n / 3 只新羊驼出生,n / 4 只羊驼死亡。

例如,如果我们从 n = 1200 只羊驼开始,那么在第一年,将有 1200 / 3 = 400 只新羊驼出生,1200 / 4 = 300 只羊驼死亡。 在那一年结束时,我们将有 1200 + 400 - 300 = 1300 只羊驼。

再举一个例子,如果我们从 n = 1000 只羊驼开始,那么在年底,我们将有 1000 / 3 = 333.33 只新羊驼。 但是,我们不能有羊驼的小数部分,因此我们将截断小数部分以获得 333 只新出生的羊驼。 1000 / 4 = 250 只羊驼将会死亡,因此最终我们将在年底拥有总共 1000 + 333 - 250 = 1083 只羊驼。

开始

回想一下,Visual Studio Code(也就是 VS Code)是一个流行的“集成开发环境”(IDE),您可以用它来编写代码。 为了避免您自行下载、安装和配置 VS Code,我们将使用一个基于云的版本,该版本已经预装了您所需的一切。

  1. 使用您的 GitHub 帐户登录 cs50.dev,并按照屏幕上的说明设置您自己的 Visual Studio Code codespace。 当 codespace 加载完毕后,您应该看到默认情况下,VS Code 分为三个区域。 VS Code 的顶部是您的文本编辑器,您将在其中编写所有程序。 底部是一个终端窗口,这是一个命令行界面,允许您浏览 codespace 的文件和目录(也就是文件夹)、编译代码和运行程序。 左侧是您的文件资源管理器,您也可以用它来浏览 codespace 的文件和目录。
  2. codespace 加载完成后,关闭任何默认打开的 Welcome 标签页
  3. 使用您的 GitHub 帐户登录 submit.cs50.io,然后单击 Authorize cs50 以激活 check50
  4. 在 codespace 的终端窗口中运行 update50 以确保您的 codespace 是最新的,如果出现提示,请单击 Rebuild now

完成后,首先单击终端窗口内部,然后单独执行 cd。 您会发现提示符类似于以下内容。

单击该终端窗口内部,然后键入

然后按 Enter 键,以便在您的 codespace 中创建一个名为 population 的文件夹。 注意不要忽略 mkdirpopulation 之间的空格,以及任何其他字符!

从现在开始,执行命令意味着在终端窗口中输入命令,然后按 Enter 键。 命令区分大小写,请注意大小写。

现在执行

将自己移动到(即打开)该文件夹。 您的提示现在应类似于以下内容。

单击该终端窗口内部,然后键入

wget https://cdn.cs50.net/2022/fall/labs/1/population.c

然后按 Enter 键,以便在您的 codespace 中下载一个名为 population.c 的模板文件。 注意不要忽略 wget 和以下 URL 之间的空格,或任何其他字符! 如果一切顺利,您应该运行

并看到一个名为 population.c 的文件。 执行 code population.c 应该会打开该文件,您可以在其中编写此实验的代码。 如果没有,请回顾您的步骤,看看您是否可以确定您哪里出错了!

实现细节

完成 population.c 的编写,使其能够计算人口从起始规模增长到结束规模所需的年数。

  • 您的程序应首先提示用户输入起始人口规模。
    • 如果用户输入的数字小于 9(允许的最小人口规模),则应重新提示用户输入起始人口规模,直到他们输入一个大于或等于 9 的数字。(如果我们从少于 9 只羊驼开始,羊驼的数量将很快停滞不前!)
  • 然后,您的程序应提示用户输入结束人口规模。
    • 如果用户输入的数字小于起始人口规模,则应重新提示用户输入结束人口规模,直到他们输入一个大于或等于起始人口规模的数字。(毕竟,我们希望羊驼的数量增长!)
  • 然后,您的程序应计算人口增长到至少目标规模所需的年数 (整数)。
  • 最后,您的程序应将羊驼数量达到目标规模所需的年数打印到终端,格式为 Years: n,其中 n 代表年数。

步骤详解

提示

  • 如果需要在满足特定条件前,反复提示用户输入某个变量的值,可以考虑使用 do ... while 循环。例如,回顾一下课程中用于重复提示用户输入正整数的以下代码:

      int n;
    do
    {
    n = get_int("Positive Integer: ");
    }
    while (n < 1);

    怎样修改这段代码,才能确保起始值不小于 9,且结束值不小于起始值?

  • 声明新变量时,务必指定其数据类型、变量名,以及(可选的)初始值。

    • 例如,可以创建一个变量来记录经过的年数。
  • 要计算人口增长到目标规模所需的年数,可以使用循环来实现。在循环中,根据背景介绍中的公式更新人口数量,并累加经过的年数。

  • 要在终端输出整数 n,可以参考以下代码:

      printf("The number is %i\n", n);

    用于将变量 n 的值填充到 %i 占位符的位置。

如何测试你的代码

你的程序运行结果应该与以下示例类似。

$ ./population
Start size: 1200
End size: 1300
Years: 1

$ ./population
Start size: -5
Start size: 3
Start size: 9
End size: 5
End size: 18
Years: 8

$ ./population
Start size: 20
End size: 1
End size: 10
End size: 100
Years: 20

$ ./population
Start size: 100
End size: 1000000
Years: 115

如果遇到困难?

运行以下命令,使用 check50 检查代码的正确性。同时,请务必自行编译并测试代码!

check50 cs50/labs/2023/x/population

运行以下命令,使用 style50 检查代码风格。

如何提交

在终端中运行以下命令来提交你的作业。

submit50 cs50/labs/2023/x/population