实验 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,我们将使用一个基于云的版本,该版本已经预装了您所需的一切。
- 使用您的 GitHub 帐户登录 cs50.dev,并按照屏幕上的说明设置您自己的 Visual Studio Code codespace。 当 codespace 加载完毕后,您应该看到默认情况下,VS Code 分为三个区域。 VS Code 的顶部是您的文本编辑器,您将在其中编写所有程序。 底部是一个终端窗口,这是一个命令行界面,允许您浏览 codespace 的文件和目录(也就是文件夹)、编译代码和运行程序。 左侧是您的文件资源管理器,您也可以用它来浏览 codespace 的文件和目录。
- codespace 加载完成后,关闭任何默认打开的 Welcome 标签页
- 使用您的 GitHub 帐户登录 submit.cs50.io,然后单击 Authorize cs50 以激活
check50
。 - 在 codespace 的终端窗口中运行
update50
以确保您的 codespace 是最新的,如果出现提示,请单击 Rebuild now。
完成后,首先单击终端窗口内部,然后单独执行 cd
。 您会发现提示符类似于以下内容。
单击该终端窗口内部,然后键入
然后按 Enter 键,以便在您的 codespace 中创建一个名为 population
的文件夹。 注意不要忽略 mkdir
和 population
之间的空格,以及任何其他字符!
从现在开始,执行命令意味着在终端窗口中输入命令,然后按 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