练习 - 创建 do 和 while 迭代循环
- 10 分钟
表面上看,do-while
和 while
语句是可用于循环访问代码块,从而更改代码执行流的另一种迭代语句。 但在研究了每种迭代语句的运行原理后,就能更好地了解各迭代语句之间的细微差别以及应在何时使用它们。
什么是 do-while 语句?
当指定布尔表达式的计算结果为 true 时,do-while
语句执行语句或语句块。 由于该表达式在每次执行循环之后计算,因此 do-while 循环将执行一次或多次。
do
{
// This code executes at least one time
} while (true);
执行流在大括号内开始。 代码至少执行一次,然后计算 while
关键字旁边的布尔表达式。 如果布尔表达式返回 true
,则再次执行代码块。
通过将布尔表达式硬编码为 true
,我们创建了一个无限循环,该循环将永不结束,至少在当前编写后不会。 我们需要一种方法来跳出代码块内部的循环。 我们稍后会讨论 do-while
的退出条件。
接下来准备编码环境,并开始了解实现 do-while
语句的代码示例。
准备编码环境
本模块包括指导你完成生成和运行演示代码的过程的动手活动。 建议使用 Visual Studio Code 作为开发环境来完成这些活动。 使用 Visual Studio Code 来完成这些活动将帮助你在供全球专业人员使用的开发人员环境中更舒适地编写和运行代码。
打开 Visual Studio Code。
可以使用 Windows“开始”菜单(或等效资源 [对于其他 OS])打开 Visual Studio Code。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在“打开文件夹”对话框中,导航到 Windows“桌面”文件夹。
如果使用了其他文件夹位置来保存代码项目,可以改用该文件夹位置。 对于此训练,重要的是要有一个容易找到和记住的位置。
在“打开文件夹”对话框中,选择“选择文件夹”。
如果看到一个询问是否信任作者的安全对话框,请选择“是”。
在 Visual Studio Code 的“终端”菜单上,选择“新终端”。
请注意,“终端”面板中的命令提示符显示当前文件夹的文件夹路径。 例如:
C:\Users\someuser\Desktop>
注意
如果你在自己的电脑上工作,而不是在沙盒或托管环境中工作,并且你已经完成此 C# 系列中的其他 Microsoft Learn 模块,那么你可能已经为代码示例创建了一个项目文件夹。 如果是这种情况,可以跳过下一步,该步骤用于在 TestProject 文件夹中创建控制台应用。
在终端命令提示符下,若要在指定文件夹中创建新的控制台应用程序,请输入以下提示:
dotnet new console -o ./CsharpProjects/TestProject
此 .NET CLI 命令使用 .NET 程序模板在指定文件夹位置创建新的 C# 控制台应用程序项目。 该命令会自动创建 CsharpProjects 和 TestProject 文件夹,并使用 TestProject 作为
.csproj
文件的名称。如果显示一条消息,告知文件已存在,请继续执行后续步骤。 你将重复使用现有的项目文件。
在 EXPLORER 视图中,展开 CsharpProjects 文件夹。
应会看到 TestProject 文件夹和两个文件:一个名为Program.cs的 C# 程序文件和一个名为 TestProject.csproj 的 C# 项目文件。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在 “打开文件夹 ”对话框中,选择 CsharpProjects 文件夹,然后选择“ 选择文件夹”。
在 EXPLORER 视图中,展开 TestProject 文件夹,然后选择 Program.cs。
删除现有代码行。
在本模块中,你将使用此 C# 控制台项目来创建、生成和运行代码示例。
关闭“终端”面板。
编写一个 do-while 语句,在生成一个特定随机数时中断
我们来编写这样的代码:不断生成 1 到 10 之间的随机数,直到生成数字 7。 生成数字 7 可能只需要一次迭代,也可能需要数十次迭代。
确保已打开 Visual Studio Code,并且“编辑器”面板中显示了 Program.cs。
注意
Program.cs 应为空。 如果不是,请选择并删除所有代码行。
在 Visual Studio Code 编辑器中键入以下代码。
Random random = new Random(); int current = 0; do { current = random.Next(1, 11); Console.WriteLine(current); } while (current != 7);
在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在生成或运行代码之前,必须保存 Program.cs 文件。
在“资源管理器”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。
终端面板将打开。 终端面板应包含一个命令提示符,显示“终端”已打开并转到 TestProject 文件夹位置。
在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。
注意
如果看到一条指示“找不到要运行的项目”的消息,请确保终端命令提示符显示预期的 TestProject 文件夹位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>
查看输出。
由于生成的数字是随机的,因此结果会有所不同。 但是,值
7
将是要输出的最后一个数字,因为当生成 7 时布尔表达式的计算结果为false
,并且执行流将退出代码块。2 5 8 2 7
花点时间查看你的代码。
第一个任务的学习要点是
do-while
循环的代码块将至少执行一次。 它可能会进行很多次循环访问,而且我们不太可能提前知道要进行多少次迭代。请注意,代码块中的代码会影响是否继续循环访问代码块。 影响退出条件的代码块是选择
do-while
或while
语句而不是其他迭代语句之一的主要原因。foreach
和for
都需要代码块外部的因素来确定代码块迭代次数。
编写一个 while 语句,该语句只在随机数大于某个值时进行循环访问
现在,让我们看一下 while
语句。
使用 Visual Studio Code 编辑器更新代码,如下所示:
Random random = new Random(); int current = random.Next(1, 11); /* do { current = random.Next(1, 11); Console.WriteLine(current); } while (current != 7); */ while (current >= 3) { Console.WriteLine(current); current = random.Next(1, 11); } Console.WriteLine($"Last number: {current}");
注意
在本例中,我们将
while
关键字和布尔表达式放在代码块前面。 这种做法会改变代码的含义,并且充当“门户”,仅在布尔表达式的计算结果为 true 时才允许执行流进入。保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run
以运行代码。查看列出的输出值。
由于数字是随机的,因此代码将生成不同的序列。
9 7 5 Last number: 1
花点时间查看你的代码。
在顶部代码中,我们使用
random
来初始化名为int
的current
变量。 下一个活动代码行是我们的while
语句。while
语句将基于布尔表达式(current >= 3)
进行循环访问。 虽然我们不知道会向current
赋什么值,但其可能会影响while
循环:- 如果
current
初始化为大于或等于3
的值,则布尔表达式将返回true
,执行流将进入代码块。 在代码块内,首先将current
的值写入控制台。 接下来,仍然是在代码块内,使用新的随机值更新current
的值。 此时,控件将返回到计算布尔表达式的while
语句的顶部。 此过程一直持续到布尔表达式返回false
且执行流从代码块中断为止。 - 如果
current
(在代码顶部)初始化为小于3
的值,则布尔表达式将返回false
,并且不会执行代码块。
最后一行代码会将
current
的值写入控制台。 无论是否执行迭代代码块,此代码都会运行,这样我们就可将current
的最终值写入控制台。- 如果
使用 continue 语句直接跳到布尔表达式
在某些情况下,我们想要不运行代码块中剩余代码,并继续进行下一次迭代。 可以使用 continue
语句来执行此操作。
使用 Visual Studio Code 编辑器更新代码,如下所示:
Random random = new Random(); int current = random.Next(1, 11); do { current = random.Next(1, 11); if (current >= 8) continue; Console.WriteLine(current); } while (current != 7); /* while (current >= 3) { Console.WriteLine(current); current = random.Next(1, 11); } Console.WriteLine($"Last number: {current}"); */
花点时间查看你的代码。
请注意,我们已切换回
do-while
。do-while
可确保循环至少进行一次循环访问。在代码块内,首先向
current
赋新的随机值。 接下来,我们检查current
是否大于或等于8
。 如果此表达式返回true
,则continue
关键字会将控件转移到代码块的末尾,并且while
将计算(current != 7)
。 所以,只要current
的值不等于7
,循环就会继续循环访问。此练习步骤的重点是包含
continue
关键字的代码行:if (current >= 8) continue;
由于将
current
的值写入控制台的代码位于if (current >= 8) continue;
之后,因此我们的代码可确保不会将大于或等于current
的8
值写入输出窗口。我们来试一试。
保存代码文件,然后使用 Visual Studio Code 运行代码。
在终端命令提示符处输入
dotnet run
以运行代码。查看列出的输出值。
5 1 6 7
你可能会看到不同于以下所示的结果。 但在代码遇到值
8
才结束之前,输出窗口中将不会显示任何等于或大于7
的值。请考虑
continue
和break
语句之间的差异。正如你在最后一步中所看到的,
continue
语句会将执行转移到当前迭代的末尾。 此行为不同于我们在break
语句中看到的行为。break
语句会终止迭代(或switch
)并将控件转移到终止语句之后的语句。 如果终止语句后没有语句,则控件将转移到文件或方法的末尾。
概括
从此单元中应归纳出以下几个重要的观点:
-
do-while
语句至少循环访问一次代码块,并且可能会根据布尔表达式继续循环访问。 布尔表达式的计算结果通常取决于在代码块内生成或检索到的某个值。 -
while
语句首先计算布尔表达式,只要布尔表达式的计算结果为true
,就会继续循环访问代码块。 -
continue
关键字会立即跳到布尔表达式。