ここではC#のfor文とwhile文について理解しましょう。これはプログラムの基本構造で説明した反復にあたる処理です。
なお、プログラムの基本構造が分からない人は先に次の記事を読んでください。
プログラムの基本構造とは何でしょうか? これは特定のプログラミング言語に限らず、どの言語にも応用できる話です。内容は非常にシンプルで難しくありません。今後の助けになるので、ぜひ理解してください。 3つの基本構造 先に名前を出すと順次、選択、反復です。この3つの構造を使えば、どんなプログラムでも作れると言われてます。では、この3つは何を意味するのでしょうか。順番に解説していきます。 順次 (sequence) 最もシンプルな構造で、処理が上から下に進むことを...
for statement (ステートメント)
いわゆる繰り返し処理でfor文と呼びます。これは条件式を満たす限り、同じ処理を永遠と繰り返す構文です。
ポイントは次の3つです。
- 初期化で変数を宣言する
- 条件式に繰り返し条件を記述する
- 反復式で変数をインクリメントする
そして、10回繰り返す処理のサンプルコードがこれです。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i); // 繰り返し回数を表示
}
}
}
}
プログラムの世界では0開始のindexが基本って話を覚えてるかな。
最初は違和感があると思うけど、0開始から10回繰り返す場合はi < 10って感じに書くよ。
1開始でi <= 10が駄目な理由は何ですか?
駄目ではないけど配列の処理が書きづらいかな。配列の全要素にアクセスする処理は0開始のほうが書きやすいからね。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int[] array = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
for (int i = 0; i < array.Length; i++) // 配列の長さだけループ
{
Console.WriteLine(array[i]); // 0から順番に要素アクセス
}
}
}
}
次に進む前に少しfor文を深掘りしましょう。
for文において次の部分は非常に大切です。
for (初期化; 条件式; 反復式)
これは各タイミングで処理される内容を示してます。
- 初期化はループの開始前に呼ばれる処理
- 条件式はループごとの開始前に呼ばれる処理
- 反復式は1回のループが終了する度に呼ばれる処理
条件式はbool値になる値しか記述できませんが、他の2箇所は,(カンマ)で区切ることで処理を記述できます。
処理を含めて書いたのが次のサンプルコードです。めちゃくちゃ見づらいので単なる例として考えてください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int i, j;
for (i = 0, j = 10, Console.WriteLine($"初期化: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"反復式: i={i}, j={j}"))
{
Console.WriteLine($"繰り返し: i={i}, j={j}");
}
}
}
}
ここで覚えて欲しいのは処理を記述できるってことです。一緒に初期化したい変数とか増減させたい値が稀にあります。
ただし、色々制約があるのか複雑なこと書くとビルドエラーになるので、その時は普通に書きましょう。
while statement (ステートメント)
記述が違うだけでfor文と同じく反復です。こちらも構文とサンプルコードを見てみましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int i = 0; // 初期化
while (i < 10) // 条件式
{
Console.WriteLine(i);
i++; // カウントアップ
}
}
}
}
予め用意した変数を使う場合やカウントアップのタイミングを制御したい場合に使います。
また、for文と違って自分でカウントアップする必要があります。
do while statement (ステートメント)
仕組みはwhile文と同じですが、処理した後に条件判定が行われます。
つまりは最低でも1回は処理が実行されます。構文とサンプルコードがこちら。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int i = 0; // 初期化
do
{
Console.WriteLine(i);
i++; // カウントアップ
}
while (i < 0); // 条件式
}
}
}
このように条件に関係なく実行したい処理がある場合に使います。
また、whileの行に;(セミコロン)が必要なので気をつけてください。
break statement (ステートメント)
これはループ処理を強制的に抜けたい場合に利用します。
具体例を見たほうが早いので、次のサンプルコードを実行してください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break; // 強制的にループを抜ける
}
Console.WriteLine(i); // 繰り返し回数を表示
}
}
}
}
先程の例ではiが5になったらループを抜けました。このように途中でループを抜けたい場合に利用します。
実例なら本当は100回繰り返す必要があるけど、ある時点でエラーを検知したから処理を止めるとかですかね。
continue statement (ステートメント)
こちらはループの途中を飛ばしたい場合に利用します。
これも具体例を見たほうが早いので、次のサンプルコードを実行してください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0) // 2で割った余りが0。つまり偶数の判定
{
continue; // 現在のループを中止して次のループに移動する
}
// 奇数だけがここに辿り着く
Console.WriteLine(i); // 繰り返し回数を表示
}
}
}
}
continueって単語難しくないですか? 僕IDE無いと書けないんです。
英語力なさすぎ! これが万能IDEの弊害だよ。
多重ループ
ループの中にループを書くことを多重ループと呼びます。
ここでは多次元配列を表示するサンプルコードを使って動作を確認しましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int[,] array = new int[,]
{
{ 0, 1, 2, 3, 4},
{ 1, 3, 5, 7, 9},
{ 0, 2, 4, 6, 8},
};
for (int i = 0; i < array.GetLength(0); i++) // 1次元目のループ
{
for (int j = 0; j < array.GetLength(1); j++) // 2次元目のループ
{
Console.WriteLine($"[{i},{j}]={array[i, j]}"); // 要素の表示
}
}
}
}
}
ループの順番を分かりやすくするためにindexを表示する記述をしてます。
多重ループではこの処理順が大切なので、しっかり理解しましょう。
上位の1回分のループに対して下位の全ループが実行されるんだね。
あとがき
ループ用の変数に i,j,k. . . を利用するのは慣習です。用途不明な変数名は悪とされますが、こういった慣習は許容されてます。
寧ろここにcountとか書くと無法者扱いされてボコボコにされるので気をつけてください。
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント