演習 - do と while の反復ループを作成する
- 10 分
表面的には、 do-while ステートメントと while ステートメントは、コード ブロックを反復処理してコードの実行フローを変更できる もう 1 つの 反復ステートメントです。 ただし、それぞれの動作を確認したら、各イテレーション ステートメントの微妙な違いと、それらを使用するタイミングをより適切に特定できます。
do-while ステートメントとは何ですか?
do-while ステートメントはステートメントまたはステートメント ブロックを実行しますが、指定されたブール式は true と評価されます。 その式はループの各実行後に評価されるため、do-while ループは 1 回以上実行されます。
do
{
// This code executes at least one time
} while (true);
実行フローは、中かっこ内で開始されます。 コードは少なくとも 1 回実行され、 while キーワードの横にあるブール式が評価されます。 ブール式が trueを返す場合は、コード ブロックが再度実行されます。
ブール式を trueにハードコーディングすることで、無限ループを作成しました。これは、現在書かれているようにではなく、少なくとも終わることはありません。 コード ブロック内のループから抜け出す方法が必要です。 do-whileの終了条件について少し説明します。
それでは、コーディング環境を準備し、 do-while ステートメントを実装するコード サンプルの調査を開始しましょう。
コーディング環境を準備する
このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 開発環境として Visual Studio Code を使用して、これらのアクティビティを完了することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[フォルダーを開く] ダイアログで、Windows の [デスクトップ] フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選択します。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 例えば次が挙げられます。
C:\Users\someuser\Desktop>注
サンドボックスやホスト環境ではなく、自分の PC で作業しており、この C# シリーズの他の Microsoft Learn モジュールを完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている可能性があります。 その場合は、[TestProject] フォルダーにコンソール アプリケーションを作成する次の手順をスキップできます。
ターミナル コマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、次のプロンプトを入力します。
dotnet new console -o ./CsharpProjects/TestProjectこの .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドでは、CsharpProjects および TestProject フォルダーが自動的に作成され、
.csprojファイルの名前として TestProject が使用されます。ファイルが既に存在することを示すメッセージが表示される場合は、次の手順に進みます。 既存のプロジェクト ファイルを再利用します。
エクスプローラー ビューで、 CsharpProjects フォルダーを 展開します。
TestProject フォルダーと、Program.cs という名前の C# プログラム ファイルと TestProject.csproj という名前の C# プロジェクト ファイルの 2 つのファイルが表示されます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く ] ダイアログで、 CsharpProjects フォルダーを選択し、[フォルダーの選択] を 選択します。
エクスプローラー ビューで、TestProject フォルダーを展開し、 Program.csを選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルを作成、ビルド、および実行します。
[ターミナル] パネルを閉じます。
特定の乱数が生成されたときに中断する do-while ステートメントを記述する
数値 7 を生成するまで 1 から 10 の間で乱数を生成し続けるコードを記述しましょう。 7 を取得するには 1 回のイテレーションしかかからなかったり、数十回の反復が必要になる場合があります。
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ループのコード ブロックが少なくとも 1 回実行されるということです。 反復回数が多く、反復回数が事前にわかっている可能性は低いです。また、コード ブロック内のコードが、コード ブロックを反復処理し続けるかどうかに影響を及ぼしていることに注意することも重要です。 終了条件に影響を与えるコード ブロックは、他の反復ステートメントの 1 つではなく、
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により、ループが少なくとも 1 回反復処理されます。コード ブロック内で最初に行うことは、新しいランダムな値を
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ステートメントは、少なくとも 1 回はコード ブロックを反復処理し、ブール式に基づいて反復処理を続ける場合があります。 ブール式の評価は、通常、コード ブロック内で生成または取得される値によって異なります。whileステートメントは、最初にブール式を評価し、ブール式がtrueに評価される限り、コード ブロックを反復処理し続けます。- ブール式にすぐにステップ実行する
continueキーワード。