プログラム基礎 ~繰り返しについて(C#)~

プログラム基礎

ご覧いただきありがとうございます。

繰り返しについての重要な点は以下になります。

  • for 文を使うと、繰り返し処理を行うことができる
  • while 文を使うと、繰り返し処理を行うことができる
  • do~while 文を使うと、繰り返し処理を行うことができる
  • for 文をネストできる
  • break 文を使うと、繰り返し文や switch 文のブロックを抜けることができる
  • continue 文を使うと、繰り返し処理を中断し、次の繰り返し処理を行うことができる
  • if 文と switch 文は、「いくつ条件があるのか」と「条件式」で使い分ける
  • for 文と while 文は、「繰り返し回数が決まっているかどうか」で使い分ける
  • 無限ループを意図的に利用することがある

「繰り返し」は類似した処理を何度も行う場合に利用します。

for文

for文とは

決められた回数の分だけ繰り返し処理を行うことです。

for(初期化の式; 条件; 変化式)
{
  繰り返し処理;
}

「for」の後ろの「()」内には、セミコロン区切りで 3 つの式((1)初期化、(2)条件式、(3)変化式)
を記述します。

for 文をフローチャートで表現すると以下のようになります。

■for文初期化の式
ブロック内の繰り返し処理が始まる際に、「最初に 1 回だけ実行される処理」です。
一般的には、「繰り返した回数を保存するための変数」を初期化する式を記述します。
このような変数を「ループカウンタ」と呼びます。

■for文条件式
ブロック内の処理を実行する前に評価され、この繰り返しを継続するかを判断します。
一般的には、ループカウンタの数値が、ある数値を超過するかどうかを評価する条件を記述します。
評価が「true」の場合、ブロック内の処理を 1 回分実行します。

■for文変化式
ブロック内の処理が完了した直後に、実行される処理です。
一般的には、「i++」のようにループカウンタの値を変化させる処理を記述します

実際のコードは以下になります。

// iが5未満の場合、繰り返す
for (int i = 0; i < 5; i++)
{
  Console.WriteLine("こんにちは");
}
Console.WriteLine("処理終了");

出力結果は以下になります。

こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
処理終了

このコードをフローチャートで表現すると以下のようになります。

1. ループカウンタ i を 0 で初期化する (初期化式: int i = 0)

2. ループカウンタ i が 5 未満かを判断 (条件式: i<5)

 2-1. 条件式の評価値が true の場合: 項番3 へ(ブロック内の処理を実行する)

 2-2. 条件式の評価値が false の場合: 項番5へ

3. ブロック内の処理を実行 (Console.WriteLine(“こんにちは”))

4. ループカウンタ i に 1 を加算し 項番2 へ (変化式: i++)

5. for 文ブロックの外側の処理を行う

ループカウンターの注意点

■ループカウンタの名前は自由である
ループカウンタは変数です。
そのため、識別子のルールに則した名前なら自由につけられます。

■for 文のブロック内でループカウンタを使える
変数と同じように、ループカウンタも for 文のブロック内で使えます。
しかし、ブロック外では使えません。
for 文が終了すると、以降の処理でループカウンタが使えませんので注意しましょう。

ループカウンターの応用

ループカウンタを使用することで、繰り返した回数を出力させることもできます。

実際のコードは以下になります。

// iが5未満の場合、繰り返す
for (int i = 0; i < 5; i++)
{
  Console.WriteLine($"繰り返し{(i + 1)}回目");
}
Console.WriteLine("処理終了");

出力結果は以下になります。

繰り返し1回目
繰り返し2回目
繰り返し3回目
繰り返し4回目
繰り返し5回目
処理終了

ループカウンタ i は for 文のブロック内でのみ使えるので、例のように出力したり、計算に利用することが可能です。

for文の中にfor文

for 文をネストすると、多重の繰り返し処理を記述できる。

for(初期化の式; 条件; 変化式)
{
  繰り返し処理;

  for(初期化の式; 条件; 変化式)
  {
    繰り返し処理;
  }
}

九九を表現した実際のコードは以下になります。

for (int i = 1; i < 10; i++)
{
  for (int j = 1; j < 10; j++)
  {
    Console.Write(i * j);  //改行なし出力
    Console.Write(" ");    //
改行なし出力
  }
  Console.WriteLine("");
}

出力結果は以下になります。

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

処理を細かくすると以下になります。

  1. 内側の for 文ブロックで、i と j の掛け算をし、評価値とスペースを表示
  2. 9 回繰り返して、内側の for 文が終了すると、改行を表示
  3. 外側の for 文の繰り返し 1 回分が終了(九九 1 段分の処理)
  4. 外側ループのループ変数をインクリメント
  5. 以上の流れを外側の for 文が終わるまで繰り返します。

while文

while文とは

while 文は、for 文と同じく繰り返しの構文です。

while(条件)
{
  繰り返し処理;
}

実際のコードは以下になります。

int i = 0;

// iが5未満の間、繰り返す
while (i < 5)
{
  Console.WriteLine($"{i + 1}回繰り返しました。");
  i++;
}

Console.WriteLine("繰り返し処理終了");

出力結果は以下になります。

1回繰り返しました。
2回繰り返しました。
3回繰り返しました。
4回繰り返しました。
5回繰り返しました。
繰り返し処理終了

while文の注意点

while文は意図しない無限ループを起こすことがあります。

while文の()の中の意味は、true評価の間繰り返すです。

なので、以下のようなコードだと永遠にfalseにならず、無限ループになります。

int i = 0;

// iが5未満の間、繰り返す
while (i < 5)
{
  Console.WriteLine($"{i + 1}回繰り返しました。");
}

Console.WriteLine("繰り返し処理終了");

「while文とは」内のサンプルコードと見比べると、「i++;」がないだけです。

「i++;」のこの1行がないだけで、iは永遠に0のままになるため、whileの評価はfalseになることはないため、無限ループになってしまいます。

意図しない無限ループが発生した場合、メモリ不足や OS が無限ループを検知することで、プログラムを強制終了させるので注意が必要です。

do…while文

do…while文の解説は割愛します。

do…while 文は、開発現場では利用される機会が少ないためです。。

理由として、条件式が繰り返し処理の下にあるため、ソースコードを上から順に解析していくと、どのような条件で繰り返されているのかがわかりにくいという点があります。

ようは、わかりにくいんです!!

処理の流れを変える

繰り返し処理の流れを変更したい場合は「break 文」や「continue 文」を使用します。

break文とは

break 文を使って、繰り返しを強制的に中断することができます。

実際のコードは以下になります。

Console.WriteLine("何回目で中断しますか?");

string input = Console.ReadLine();
int num = int.Parse(input);

for (int i = 1; i <= 10; i++) {

  Console.WriteLine($"{i}回繰り返しました。");

  if (i == num) 
  {
    // 変数iが変数numと等しい場合、繰り返しを中断する
    break;
  }
}
Console.WriteLine("繰り返し処理を中断しました。");

出力結果は以下になります。

何回目で中断しますか?
5 ↲
1回繰り返しました。
2回繰り返しました。
3回繰り返しました。
4回繰り返しました。
5回繰り返しました。
繰り返し処理を中断しました。

入力された値が繰り返しのループカウントの値と一致した場合、break文が実行されて、for文を強制終了します。

continue文とは

continue 文を使って、繰り返し処理を途中で中断し、次の繰り返しに移ることができます。

繰り返しブロック内のcontinue 文以降の処理がスキップされ、繰り返しブロックの条件式評価に処理が移るということです。

実際のコードは以下になります。

Console.WriteLine("何回目で中断しますか?");

string input = Console.ReadLine();
int num = int.Parse(input);

for (int i = 1; i <= 10; i++) {

  if (i == num) 
  {
    // 残りの処理を行わずに次の繰り返しに移動する
    continue;
  }
  
  Console.WriteLine($"{i}回繰り返しました。");
}

出力結果は以下になります。

何回目で中断しますか?
5 ↲
1回繰り返しました。
2回繰り返しました。
3回繰り返しました。
4回繰り返しました。
6回繰り返しました。
7回繰り返しました。
8回繰り返しました。
9回繰り返しました。
10回繰り返しました。

無限ループ

無限ループの記述方法

for 文と while 文で、わざと無限ループ方法を解説します。

for(int i = 0; true; i++)
{
  // 繰り返し処理
}
for(;;)
{
  // 繰り返し処理
}
while (true)
{
  // 繰り返し処理
}

無限ループの利用用途

用途はかなり絞られますが、〇〇が入力されるまでなど、何が入力されつかわからない時に使います。

無限ループと条件分岐、break 文を組み合わせます。

break文がないと本当に無限ループして、システムが落ちる原因になりますので注意が必要です。

実際のコードは以下になります。

while (true)
{
  Console.WriteLine("数値を入力してください");
  
  string input = Console.ReadLine();
  int num = int.Parse(input);

  if (num == 10)
  {
    Console.WriteLine("処理終了");
    break;
  }
 }

出力結果は以下になります。

10が入力されるまで、繰り返します。
数値を入力してください
1 
数値を入力してください
3 
数値を入力してください
5 
数値を入力してください
10 
処理終了

10が入力されるまで処理が終わらないという無限ループ処理になります。

繰り返し分の使い分け(for文とwhile文)

for 文と while 文のどちらでも、繰り返しを記述することは可能です。

for(初期化の式; 条件; 変化式)
{
  繰り返し処理;
}
while(条件)
{
  繰り返し処理;
}

構文の違いから、for 文はループ変数が活用できるが、while 文は別途ループ変数を用意する必
要があることがわかります。

それぞれの特徴から次のような使い分けをするとよいでしょう。

  • for 文:「繰り返し回数が決まっている」
  • while 文:「繰り返し回数が決まっていない」

for 文と while 文の使い分けは、「繰り返し回数が決まっているかどうか」を基準に分けるとわかりやすいですね。

また、do…while文については、現場で見かけることはほぼありませんでした。

会社や案件にもよりけりですが、全体的に利用をさけているんじゃないかなと思います。それもwhileの条件次第でdo…whileと同じことができるからなんです。

最後までご覧いただき、本当にありがとうございました!

コメント

タイトルとURLをコピーしました