【C#】繰り返し文

目次

概要

プログラミングは実は同じような処理を行っていることが多い。
僕らも似たようなことはないだろうか。計算を解く時、ひたすら答えを書いていく。漢字をひたすら書く。使った金額とその内容を記入していくなど。

実は、これらはfor文を使うと少ないプログラムで実行できる。
こうしておけば、「ちょっとここを変えたいな」と思う時、ひとつひとつ修正せず、その少ないプログラムを修正するだけでまとめて修正を行える。

ソースコード

String[] elements = {"頭部", "首", "前脚", "腹部", "背中", "翼", "後脚"};

// 一般的な繰り返し文
for(int index = 0;index < 10;index++) {
    Console.WriteLine(index);
}

// 配列を使った繰り返し文
foreach(String element in elements) {
    Console.WriteLine(element);
}

// 一定条件の間、繰り返す
int hp = 1000;
while (hp > 0) {
    int damage = 90;
    hp -= damage;
    Console.WriteLine(damage + "ダメージ");
    Console.WriteLine("HP:" + hp);
}
Console.WriteLine("ついに倒れた");

実行結果

0
1
2
3
4
5
6
7
8
9
頭部
首
前脚
腹部
背中
翼
後脚
90ダメージ
HP:910
90ダメージ
HP:820
90ダメージ
HP:730
90ダメージ
HP:640
90ダメージ
HP:550
90ダメージ
HP:460
90ダメージ
HP:370
90ダメージ
HP:280
90ダメージ
HP:190
90ダメージ
HP:100
90ダメージ
HP:10
90ダメージ
HP:-80
ついに倒れた

詳細

一般的な繰り返し文(for文)

for文の最も基礎的な形。基本的な書き方は以下の通り

for(/* 最初に行われる処理 */ ; /* 条件式 */ ; /* for文内の処理が終わった時に行う処理 */ ) {
    /* 条件式が満たされている時に行われる処理 */
}

上記の例では以下のようになっている。

for(int index = 0;index < 10;index++) {
    Console.WriteLine(index);
}
項目内容
最初に行われる処理int index = 0
条件式index < 10
for文内の処理が終わった時に行う処理index++
条件式が満たされている時に行われる処理Console.WriteLine(index);

つまり、以下のような処理で行われる

  1. int index = 0の処理を行う
  2. index < 10が満たされているがどうかを確認する
    • 満たされているなら「Console.WriteLine(index);」の処理を行う
    • 満たされていないならfor文の括弧の終わりの部分「}」まで処理を飛ばす
  3. index++(indexに1を足す)の処理を行なって2に戻る

今回の場合、indexが0から始まって、indexが9になるまで繰り返し処理を行うため、結果的に「10回処理を繰り返す」という繰り返し処理を行なっている。

この形式のfor文は指定した回数だけ処理を行いたい時に使われる

配列を使った繰り返し文(foreach文)

配列の要素数分繰り返す時はこちらのforeach文を使うのが一般的。

foreach(/* 配列の型 */ /* 配列から取り出した要素 */ in /* 配列名 */) {
    /* 配列から要素を取り出せた時に行う処理 */
}

上記の例では以下のようになっている。

foreach(String element in elements) {
    Console.WriteLine(element);
}
項目内容
配列の型String
配列から取り出した要素element
配列名elements
配列から要素を取り出せた時に行う処理Console.WriteLine(element);

まず、このforeach文、配列の要素を0番から順番に要素を取り出すという特徴をもっている。
そのため、処理の流れは以下のようになっている。

  1. 配列「elements」の0番目の要素を「element」に格納する
  2. 0番目の要素を格納したら「Console.WriteLine(element);」の処理を行う
  3. この処理を配列のすべての要素を取り出すまで繰り返す

この処理は取り出すものがあらかじめ決まってるものに対して使う。
何かを作る時はこのforeach文が最も使われるだろう。
例えば以下のような時に使われる。

実例

モンハンまとめ速報【モンハンライズサンブレイク攻略】様より(http://mhw.2chblog.jp/archives/24812330.html)

画像はあの有名なゲーム、モンハンから頂戴した。
アイテムポーチの中身は19個とすでに決まっていて、そのアイテムの所持数すべてを表示したいなら、foreach文で「アイテムポーチの中身すべてを取り出して、それぞれの所持数を表示する」という書き方ができる。

一定条件の間、繰り返す

他に繰り返し文はwhile文がある。
これは指定した条件を満たしている間はずっと繰り返し処理を行うもの。

while (/* 条件式 */) {
    /* 条件式を満たしている時に行われる処理 */
}

上記の例では以下のようになっている。

int hp = 1000;
while (hp > 0) {
    int damage = 90;
    hp -= damage;
    Console.WriteLine(damage + "ダメージ");
    Console.WriteLine("HP:" + hp);
}
項目内容
条件式hp > 0
条件式を満たしている時に行われる処理int damage = 90;
hp -= damage;
Console.WriteLine(damage + “ダメージ”);
Console.WriteLine(“HP:” + hp);

今までのfor文に比べて書くべき内容が少ない。
しかし、この書き方は最近では使われる傾向が少ない。
理由は「条件式を満たしている時に行われる処理」で条件式に関する変数を一切変更しなかった場合、無限ループに陥るため。

今回の場合、hpの値を減らす処理をうっかり書き忘れたら無限ループに突入する。
逆を言えば、無限ループをさせたい時は使われるが、今の時代それを書く事はほとんどないだろう。

練習問題

foreach文を使ってelementsの脚部分だけを表示するようにしてみよう。(条件分岐が必要)

String[] elements = {"頭部", "首", "前脚", "腹部", "背中", "翼", "後脚"};
foreach(String element in elements) {
    Console.WriteLine(element);
}

参考ページ

  • 「」
  • 「」