はじめに
前回は条件分岐を行いました。今回は繰り返し処理についてです。文字通り、何度も同じような処理をさせたいときに使用します。しかし、アプリでは繰り返し処理をそのまま用いるとよくありません。なぜよくないかは実際に動かして確認してみます。
お品書き
今回やる内容です。
- 繰り返し文
- 繰り返し文の実装
- 非同期処理という解決策
1. 繰り返し文
繰り返し文は様々あります。ここではよく使われる for 文と while文 について紹介します。他にも do-while文 や foreach文 もありますが使うときに解説したいと思います。
1.1 for 文
指定した回数だけ繰り返したいときによく使われます。
for (int i = 0; i < 10; i++) { MessageBox.Show (i.ToString()); }
int i = 0; は初期化を示しています。i < 10 の部分は条件式、 i++ は更新式です。初期化は変数の初期値を用意しておくことで、ここでは 0 に設定されています。条件式は条件に合う限り { } で囲まれた部分の中を処理します。更新式は { } の中の処理が終わるたびに 1 ずつ加算されていきます。
ここで考えるのは条件式についてです。例えば1回目を通過するとき、i = 0で条件式にて比較されます。このとき、0 < 10 なので条件に当てはまります。条件に当てはまるので { } の中を処理します。処理が終わった後は更新式にて i が 1 増えます。そして再び 条件式で比較されます。このときは 1 < 10 なので条件に当てはまり、再び { } 中が処理され・・・を繰り返します。
10回目のとき、i = 10 です。10 < 10 の条件式には当てはまらないので、{ ] の中を処理せずに for 文を抜けます。このようにして繰り返されます。つまり、メッセージボックスでは 0 ~ 9 の数字が表示されることになります。わざわざ MessageBox を 10 回も書く必要がなく、楽できます。
1.2 while 文
条件式に当てはまる限り繰り返す処理です。(永遠に繰り返す事もできます)
int i = 0; while (i < 10) { MessageBox.Show (i.ToString()); i++; }
while の ( ) の中には条件式を書きます。この条件式に当てはまる限り { } で囲まれた処理を繰り返します。もし、(true) にしたらどうなるか想像つくと思います。永遠に繰り返されます(永遠ループして書類送検されr...)。
処理的には for 文と同じです。初期化された変数 i を条件式で比較して更新しています。
1.3 break と continue
break 文はある条件になったときにループから抜け出します。continue 文は条件に合うかぎり、その中の処理を行わずにスキップして、最初から処理させることができます。
int i = 0; while (i < 10) { if (i == 5) { break; } MessageBox.Show (i.ToString); i++; }
このプログラムは i が 5になったら for 文を抜け出します。つまり、メッセージで表示されるのは 0 ~ 4 までです。それ以降の数字は break で抜け出してしまうので表示されません。
for (int = 0; i < 10; i++) { if(i == 4) { continue; } MessageBox.Show (i,ToString()); }
このプログラムは i = 4 のとき、continue 以降の処理をスキップして for 文に戻ります。なので、メッセージは 4 だけ表示されません。continue にきたら処理の先頭に戻ると考えていいです。
2. 繰り返し処理の実装
ロジック部分にて繰り返し処理を実装してみます。まずは for 文で 10回メッセージを表示してみます。デザインビューに Button を1つ配置してダブルクリックし、ボタン処理メソッドを作ります。
private void Button_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < 10; i++) { MessageBox.Show(i.ToString()); } }
実行してみると 10 回メッセージが表示されます。10 の部分を他の数に変更すると、その数だけ繰り返されます。
次に while 文で無限にメッセージを表示してみます。
private void Button_Click(object sender, RoutedEventArgs e) { while (true) { MessageBox.Show("メッセージ"); } }
地獄絵図ですね。ウイルスと判断されてもいいくらいです。停止するには Visual Studio の停止マークをクリックするか、タスクマネージャーから終了させます。
そして極めつけはこれです。
private void Button_Click(object sender, RoutedEventArgs e) { int i = 0; while (true) { i++; i--; } }
int 型を宣言して足して引いてを繰り返すだけです。
3. 非同期処理という解決策
さて、繰り返し処理をした結果、アプリはどうなったでしょうか。固まったと思います。なぜならば繰り返しをしているからです。繰り返し処理でループしているとユーザの入力を受け付けないので、ユーザは不快でしかありません。なので、繰り返し部分と UI の操作とで処理を分ける必要があります。が、ここで説明するには順番的にアレなのでこの辺で終わります。(理解するには関数やデリゲード、ラムダ式などの知識が必要です。)
おわりに
繰り返し処理させることで同じような処理を簡単に記述することができます。しかし、多用すると操作性が悪くなるのでそのままアプリに使うのは好ましくありません。アルゴリズムメインのコンソールアプリならば大丈夫です。非同期処理もやりたかったのですが、順番的にすっ飛ばしすぎるのでやめました。
初心者に優しいブログでありたい。