プログラム初心者のためのC#入門 #5 ループ処理

# #5 ループ処理
ループ処理は同じような処理を繰り返して実行する際に用いられます．
foreach文はコレクションというものを知らなければ理解しづらいと思うので，次回の**配列**でももう一回説明します．

## for文

```
for(初期化式; 条件式; 更新式)
{
    ※ 繰り返したい処理
}
```

初期化式のところには初めに一度だけ実行する式で，大抵は繰り返し変数という変数を定義・初期化するために用いられます．条件式は※の処理を実行する前に毎回判定され，条件式がtrueの間※の処理が繰り返されます．更新式は※の処理の後に毎回実行される処理です．
次に具体例を見てみましょう．

```LoopSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoopSample
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(i + ". Hello, world!");
            }
        }
    }
}
```
```:出力結果
0. Hello, world!
1. Hello, world!
2. Hello, world!
3. Hello, world!
4. Hello, world!
```

##while文
```
while (条件式)
{
    ※ 繰り返したい処理
}
```

while文は条件式がtrueの間※の処理を繰り返すものです．for文とは違い，初期化式をwhile文の前に，更新式をwhile文の中に書く必要があります．

```LoopSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoopSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            while (i < 5)
            {
                Console.WriteLine(i + ". Hello, world!");
                i++;
            }
        }
    }
}
```
```:出力結果
0. Hello, world!
1. Hello, world!
2. Hello, world!
3. Hello, world!
4. Hello, world!
```

##do-while文

```
do
{
    ※ 繰り返したい処理
} while (条件式);
```

for文，while文は初めから条件式が`false`なら1度も※の処理を実行しませんが，do-while文は初めから条件式が`false`でも1度は※の処理を実行してくれるというものです．

```LoopSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoopSample
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 5;
            do
            {
                Console.WriteLine(i + ". Hello, world!");
                i++;
            } while (i < 5);
        }
    }
}
```
```:出力結果
5. Hello, world!
```

##foreach文
```
foreach (型 変数名 in コレクション)
{
    ※ 繰り返したい処理
}
```

foreach文は，いくつものデータをまとめて扱う**コレクション**を用いる際に非常に有用なループ処理です．コレクションの要素を順に変数に代入して※の処理で使えるようにしてくれるというものです．今はコレクションというものが想像しにくいと思うので，次の配列の回でもっと詳しく解説します．

```LoopSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoopSample
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (int i in Enumerable.Range(0, 5))
            {
                Console.WriteLine(i + ". Hello, world!");
            }
        }
    }
}
```
```:出力結果
0. Hello, world!
1. Hello, world!
2. Hello, world!
3. Hello, world!
4. Hello, world!
```

##break文
break文は一番内側のループ処理を強制的に抜ける文です．

```csharp
for (int i = 0; true; i++)
{
    if (i == 5) break;
    Console.WriteLine(i + ". Hello, world!");
}
```
```:出力結果
0. Hello, world!
1. Hello, world!
2. Hello, world!
3. Hello, world!
4. Hello, world!
```

このfor文は条件式に`true`が入っているので，ずっと`Hello, world!`と出力し続ける無限ループのコードになってしまいます．しかし，if文によってもし`i`が`5`のときはbreak文を実行するようになっているので，6回目の`Hello, world!`は出力されずに処理が終わります．

##continue文
continue文はループ処理のcontinue文以降の処理をスキップするものです．

```csharp
for (int i = 0; i < 5; i++)
{
    if (i == 2) continue;
    Console.WriteLine(i + ". Hello, world!");
}
```
```:出力結果
0. Hello, world!
1. Hello, world!
3. Hello, world!
4. Hello, world!
```

continue文がなければ，このfor文は5回だけ`Hello, world!`と出力されるものになります．しかし，またしてもif文によってもし`i`が`2`のときはcontinue文を実行するようになっているので，3回目の`Hello, world!`は出力されずに処理が中断されますが，4回目の処理から再開されます．

次回は[配列](https://qiita.com/17t7037t/items/d1a6987bc76dbc719016#6-%E9%85%8D%E5%88%97)について説明します．

##練習問題
100から1までカウントダウンして画面に出力するコードを書いてください．ただし，6の倍数はカウントせずに飛ばしてください．

<details><summary>解答例</summary><div>
`i`を100で初期化したりデクリメントしたりしてfor文を回していくパターンです．

```LoopSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoopSample
{
    class Program
    {
        static void Main(string[] args)
        {
            for(int i = 100; i > 0; i--)
            {
                if (i % 6 == 0) continue;
                Console.WriteLine(i);
            }
        }
    }
}
```

</div></details>