Sponsored Link
 
>>  Main > Programing > Primary > 0006

D言語入門 第06章 - 繰り返し

#01 - while文

今回は…

今回は… 今回は、繰り返しに多様な動作をおこなうような構文を説明します。 これには、2つの構文が利用できます。 for文とwhile文です。 どちらかというとfor文のほうが多く利用されますが、今回はより単純な構造になっているwhile文を使って繰り返しの動作をしていきます。

今回のミソ

  • 繰り返しを行うには、forとwhileの二つのパターンがある。
  • while(条件式){ /+処理+/ } の構文。
  • 「条件式」がtrueのときだけ「処理」を実行する。
  • 「条件式」がfalseになるか、whileの中でbreakをするまで繰り返し動作を行う。
  • whileの中でcontinueを使用すると処理を切り上げて次の繰り返しに移行する。
  • ++ という演算子によって、「1増やす」という表現が可能。

サンプルコード

// おまじない。
import std.stdio;
import std.conv;
import std.string;

// おまじない
int main(char[][] args)
{
    
    // 整数型の変数aを定義。初期値は0
    int a = 0;
    
    // 整数型の変数aの中身が、0以外である限りずっと俺のターン
    while (a!=1)
    {
        
        // 数値の入力を促す表示
        writef("input number :");
        
        // 文字列を入力して、文字列型の変数bに代入する。
        char[] b = chomp( readln() ).dup;
        
        // もし入力した文字列の中身が "1" だったら、
        if ( b == "1" )
        {
            
            // 変数aを1に変更する。
            a = 1;
        }
    }
    
    // 1が入力され、変数aが1になると、ループを抜けてここにたどり着く。
    writefln("inputed 1");
    
    
    // 次の while(1) と書くループは、
    // ループを続ける条件が常に真になるので、
    // 明示的にループを抜ける指定をしてやる必要があります。
    // 例では、入力に 0 以下の数値を入力することでループを抜けます。
    
    // ずっと俺のターン!
    writefln("ずっと俺のターン!");
    
    // ループ開始
    while (1)
    {
        
        // ドロー!モンスターカード!!
        writefln("ドロー!モンスターカード!!");
        
        // 数値の入力を求める表示
        writef("Haga's life is ... ");
        
        // 文字列を入力し、整数型の変数 hagalife に
        // toIntを使って変換して代入する
        int hagalife = toInt( chomp( readln() ) );
        
        if (hagalife <= 0)
// もうやめてー!
        {             
            // ドロー!モンスターカード!!
            writefln("もうやめてー! 遊戯ィー!!");
            
            // ループを抜けます。
            break;
        }
    }
    
    // HA☆NA☆SE!!
    writefln("HA☆NA☆SE!!");
    
    // 次の例では、10回繰り返したらループを抜けます。
    // "continue" と入力するとカウントが増えません。
    
    // 整数型の変数cを初期値0で定義
    int c = 0;
    
    // 変数cが10以下である場合、繰り返します。
    // この変数cは、ループの処理の一番最後で1ずつ増えていきます。
    while (c < 10)
    {
        
        // カウントを表示
        writefln("%d 回目の処理", c);
        
        // 入力を促すメッセージの表示
        writef("input : ");
        
        // 文字列を入力して、文字列型の変数dに代入する。
        char[] d = chomp( readln() ).dup;
        
        // 入力したものが "continue" だった場合、
        // c++としてカウントを増やす場所まで行くことなく
        // 次の繰り返しに移ります。
        if (d == "continue")
        {
            
            // 以降のループ処理を取りやめて、次の処理に移ります。
            continue;
        }
        
        // ++演算子によって、何回ループしているかを示す
        // カウントを表す変数 c の値を1つ増やします。
        c++;
    }
    
    // 終わりです
    writefln("end.");
    
    // おまじない
    return 0;
}

実行結果

input number :7
input number :5
input number :60
input number :1
inputed 1
ずっと俺のターン!
ドロー!モンスターカード!!
Haga's life is ... 2200
ドロー!モンスターカード!!
Haga's life is ... 700
ドロー!モンスターカード!!
Haga's life is ... -800
もうやめてー! 遊戯ィー!!
HA☆NA☆SE!!
0 回目の処理
input : a
1 回目の処理
input : b
2 回目の処理
input : abcde
3 回目の処理
input : continue
3 回目の処理
input : continue
3 回目の処理
input : efghi
4 回目の処理
input : continue
4 回目の処理
input : aaa
5 回目の処理
input : bbb
6 回目の処理
input : ccc
7 回目の処理
input : continue
7 回目の処理
input : 111
8 回目の処理
input : 222
9 回目の処理
input : 333
end.

まとめ

………長いですね。
今回は繰返しを3回ほど使ってみました。
一回目のループでは、1を入力するまで抜けることができません。
1を入力すると、ループから抜けて inputed 1 と表示し、次のループへ行きます。
次のループでは、処理の中で break を使うことで、入力が 0 以下の場合にこのループを抜けるようにしてあります。
最後のループでは、 continue を使って、continueと入力した場合には、カウントする前に次のループ処理に飛ばしています。
回数が増えていないのがわかりますね。

というわけで、今回は while 文の使い方でした。
次回は、繰り返しの文で、よくあるパターンなのですが、while文を使って、
int i=0;
while(i < 10){
    /+ ... 処理 ... +/
    i++;
}
といった感じにして、ある処理を10回行う場合など、繰返しをこのような使い方をする場合に非常に有効な方法「for文」を紹介したいと思います。

#02 - for文

今回は…

前回の最後にお話しした通り、今回はfor文を紹介します。
まず、前回のwhile文で、次のようなコードを書くことを考えてください。
// 10回のhello, world を表示します。
int i = 0;
while(i < 10)
{
    writefln("hello, world");
    i++;
}
このような書き方をすることはプログラムを書く上では使うことが割と多いのです。
特に、「何回繰り返す」とか「最初から最後まで繰り返す」とかいうニュアンスの操作をしたいときには、だいたい上記のようなプログラムを書くことになるかと思います。
というわけで、
int i = 0;
とか、
i++;
とかを、もっと簡単に書くことができたらいいのにな、と思うこともあるわけです。
…個人的にはなんか上のコードを見ていたら若干自信なくなってきたけど。
とにかく、ループに関することは、まとめて記述できたほうがいいですね。
ループに必要なのは、
  • 初期条件
  • 終了条件
  • 変化
です。
というわけで、この3つの事柄をいっぺんに記述する方法がfor文です
プログラムでは、while文をつかうよりも、for文を使うことのほうが圧倒的に多いと思います。
覚えなくてもwhile文で何とかなるといえば何とかなりますが、こっちの方が楽な場合が多いのでぜひ覚えましょう。

今回のミソ

  • for(初期条件;終了条件;変化){ /+処理+/ }

サンプルコード

// おまじない。
import std.stdio;
import std.conv;
import std.string;

// おまじない
int main(char[][] args)
{
    
    // for文の処理のスタートを表す表示
    writefln("start for");
    
    // for文開始。
    // int型の変数iを、初期値0から、
    // i++によって1ずつ変数iの値を増やしながらループして
    // 変数iが10を超えた時点でループを抜けます。
    for (int i=0; i<10; i++)
    {
        
        // 何回目の処理かを表示する
        writefln("%d 回目の実行", i);
    }
    
    // for文の処理の終了を表す表示
    writefln("end for");
    
    // 上のfor文を使った表現は、以下の表現と同じ結果を出します。
    // 以下はwhile文を使って表現する方法です。
    writefln("start while");
    
    // int型の変数iを、初期値0から開始して
    int i = 0;
    
    // 変数iが10を超えた時点でループを抜けます。
    while (i < 10)
    {
        
        // 何回目の処理かを表示する
        writefln("%d 回目の実行", i);
        
        // i++によって1ずつ変数iの値を増やしながらループ
        i++;
    }
    
    // while文の処理の終了を表す表示
    writefln("end while");
    
    // おまじない
    return 0;
}

実行結果

start for
0 回目の実行
1 回目の実行
2 回目の実行
3 回目の実行
4 回目の実行
5 回目の実行
6 回目の実行
7 回目の実行
8 回目の実行
9 回目の実行
end for
start while
0 回目の実行
1 回目の実行
2 回目の実行
3 回目の実行
4 回目の実行
5 回目の実行
6 回目の実行
7 回目の実行
8 回目の実行
9 回目の実行
end while

まとめ

ということで、今回はfor文を紹介しました。
この繰り返しという処理は、特に、8章で紹介する「配列」においてとても役に立つことがわかるかと思います。

#summary - まとめ

第06章のミソ

  • 繰り返しを行うには、forとwhileの二つのパターンがある。
  • while(条件式){ /+処理+/ } の構文。
  • 「条件式」がtrueのときだけ「処理」を実行する。
  • 「条件式」がfalseになるか、whileの中でbreakをするまで繰り返し動作を行う。
  • whileの中でcontinueを使用すると処理を切り上げて次の繰り返しに移行する。
  • ++ という演算子によって、「1増やす」という表現が可能。
  • for(初期条件;終了条件;変化){ /+処理+/ }

宿題

5章の電卓を、何回も繰り返しが行えるようにして、y(yes)かn(no)を選択し、nの入力で終了させられるようにしましょう。
yとn以外であれば何回でも問いただしましょう。
input number : 10.5
input operator : -
input number : 4.3
10.5 - 4.3 = 6.2

continue? [y/n] : y

input number : 4.6
input operator : /
input number : 2.3
4.6 / 2.3 = 2

continue? [y/n] : x
continue? [y/n] : z
continue? [y/n] : y

input number : 5.6
input operator : /
input number : 0
0 で割ってはいけない

continue? [y/n] : n

exit

コメント

今回の宿題も難しいと思います。
前回の宿題が完成していない場合は、計算の部分を文字の表示だけにとどめるなどでもいいと思います。
また、今章の繰り返しまでの内容で、たいていのことができるようになりました。
次章以降は、「(コードを書く、あるいは読む人間に対して)より簡単に、より分かりやすく」するための方法です。
次章では、処理をひとまとめにする、関数を紹介します。
そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~

ページトップ / 目次 / 次へ
Copyright©SHOO All rights reserved. / LastModified : 2007/12/12(水)[06:00:37]