Page Top

今回は… anchor.png

前回の入力を踏まえて、入力されたものによって違う挙動をさせてみたいと思います。
プログラムを分岐させるには、条件が必要です。
たとえば、「入力したものが"0"であったら」このコードを実行する、というような条件です。

D言語には、このような条件を満たすか満たさないかに関する「型」が存在します。
bool 型です。
bool 型は2つの値しかありません。 true と false です。

このbool型の値を用いて、条件式を書きます。

// hoge が 10 未満だった場合 a は true で、それ以外は false
bool a = hoge < 10;
// hoge が 10 だった場合 b は true で、それ以外は false
bool b = hoge == 10;
// hoge が 10 より大きい場合 c は true で、それ以外は false
bool c = hoge > 10;

条件式は、 hoge < 10 や hoge == 10 、 hoge > 10 というように書かれます。
注意なのは、「等しい」という意味の条件式は = ではなく、 == です。
D言語では、 = は「代入」という意味があります。

この条件式を使って、分岐のための文を書きます。
D言語の分岐のための命令文は、if文があります。

if(hoge < 10){
    // hoge が 10 未満だった場合にのみ、ここに書かれた命令文が実行される。
}
Page Top

今回のミソ anchor.png

  • 真偽の型は、 bool 型
  • bool には true と false しかない。
  • 条件式では、 < や == 、 > などの記号が使える
  • 分岐はif文を使う。
Page Top

サンプルコード anchor.png

filesample0501p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
 
 
 
 
-
!
-
-
!
|
-
|
|
|
!
|
-
!
-
-
!
!
|
-
!
!
// おまじない。
import std.stdio;
import std.conv;
import std.string;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    write("input : ");
    
    // 文字列の入力、改行文字、数値に変換して、
    // 整数型の変数 hoge に代入する。
    // こんな風にして使うこともできます。
    // イメージ的には数学の合成関数ですね。
    int hoge = to!(int)( chomp( readln() ) );
    
    // if 文で、入力が 10 未満だったときにのみメッセージを表示する
    if (hoge < 10)
    {
        // メッセージを表示する
        writeln("入力は 10 未満");
    }
    
    // おまじない
    return 0;
}
+  Tango用はこちら
filesample0501t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
 
 
 
 
-
!
-
-
!
|
-
|
|
|
!
|
-
!
-
-
!
!
|
-
!
!
// おまじない。
import tango.io.Stdout;
import tango.io.Console;
import tango.text.convert.Integer;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    Stdout("input : ").flush;
    
    // 文字列の入力、改行文字、数値に変換して、
    // 整数型の変数 hoge に代入する。
    // こんな風にして使うこともできます。
    // イメージ的には数学の合成関数ですね。
    int hoge = toInt( Cin.copyln() );
    
    // if 文で、入力が 10 未満だったときにのみメッセージを表示する
    if (hoge < 10)
    {
        // メッセージを表示する
        Stdout("入力は 10 未満").newline;
    }
    
    // おまじない
    return 0;
}
Page Top

実行結果 anchor.png

1
2
3
4
5
6
$ dmd -run sample0501p.d
input : 50
 
$ dmd -run sample0501p.d
input : 5
入力は 10 未満
Page Top

まとめ anchor.png

今回はif文による分岐でした。
ちなみに、 < や == 、 > 意外にも多くの条件式があります。
特によく使うもの(というかこれ以外を使うことは非常にまれ)としては、

  • hoge == fuga … hoge は fuga と等しい
  • hoge < fuga … hoge は fuga より小さい
  • hoge > fuga … hoge は fuga より大きい
  • hoge <= fuga … hoge は fuga 以下
  • hoge >= fuga … hoge は fuga 以上
  • hoge != fuga … hoge は fuga と等しくない
  • hoge is fuga … hoge は fuga と同一である
  • hoge !is fuga … hoge は fuga と同一でない

ですかね。
is や !is は文字列や整数ではあまり使いません。

整数で使えるものは、

  • hoge == fuga … hoge は fuga と等しい
  • hoge < fuga … hoge は fuga より小さい
  • hoge > fuga … hoge は fuga より大きい
  • hoge <= fuga … hoge は fuga 以下
  • hoge >= fuga … hoge は fuga 以上
  • hoge != fuga … hoge は fuga と等しくない

実数で使えるものは、

  • ( hoge == fuga … hoge は fuga と等しい )
  • ( hoge != fuga … hoge は fuga と等しくない )
  • hoge < fuga … hoge は fuga より小さい
  • hoge > fuga … hoge は fuga より大きい
  • hoge !<>= fuga … hoge は fuga と順序づけ不可能*1

※ == と != はあまり使わないほうがいいです。たまに思っていたことと違うことが起こりますので。*2

文字列で使えるものは

  • hoge == fuga … hoge は fuga と等しい
  • hoge != fuga … hoge は fuga と等しくない
  • ( hoge is fuga … hoge は fuga と同一である )
  • ( hoge !is fuga … hoge は fuga と同一でない )

is式は、今は使わない方が賢明かと思います。配列のインスタンスの言葉の意味が解るまで放っておきましょう。

次は、if文で分岐したとき「以外」の場合の処理の仕方です。
お次へどうぞ~

Page Top

#02 - else文 anchor.png

Page Top

今回は… anchor.png

前回の if文で条件を満たさなかった場合にのみ実行したいコードがあったとします。
たとえば、10未満で「10未満です」と表示して、それ以外では「10以上です」と表示する場合を考えてください。
このような場合は、else文を書くと簡単に実現できます。

if(hoge &lt; 10)
{
    writefln("10未満です");
}
else
{
    writefln("10以上です");
}
Page Top

今回のミソ anchor.png

  • if文で捕らえられなかった「それ以外」の場合は、else文を使う
Page Top

サンプルコード anchor.png

filesample0502p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
 
 
 
 
-
!
-
-
!
|
-
!
|
-
!
-
-
!
!
|
-
-
!
!
|
-
!
!
// おまじない。
import std.stdio;
import std.conv;
import std.string;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    write("input : ");
    
    // 変数 hoge に、数値を入力
    int hoge = to!(int)( chomp( readln() ) );
    
    // if 文で、入力が 10 未満だったときにのみメッセージを表示する
    if(hoge < 10)
    {
        // メッセージを表示する
        writeln("入力は 10 未満");
    }
    else
    {
        // メッセージを表示する
        writeln("入力は 10 以上");
    }
    
    // おまじない
    return 0;
}
+  Tango用はこちら
filesample0502t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
 
 
 
 
-
!
-
-
!
|
-
!
|
-
!
-
-
!
!
|
-
-
!
!
|
-
!
!
// おまじない。
import tango.io.Stdout;
import tango.io.Console;
import tango.text.convert.Integer;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    Stdout("input : ").flush;
    
    // 変数 hoge に、数値を入力
    int hoge = toInt( Cin.copyln() );
    
    // if 文で、入力が 10 未満だったときにのみメッセージを表示する
    if(hoge < 10)
    {
        // メッセージを表示する
        Stdout("入力は 10 未満").newline;
    }
    else
    {
        // メッセージを表示する
        Stdout("入力は 10 以上").newline;
    }
    
    // おまじない
    return 0;
}
Page Top

実行結果 anchor.png

1
2
3
4
5
6
7
$ dmd -run sample0502p.d
input : 50
入力は 10 以上
 
$ dmd -run sample0502p.d
input : 5
入力は 10 未満
Page Top

まとめ anchor.png

今回は、if文で捕らえられなかった場合の処理方法、else文をやりました。
これで、プログラムを2つに分岐させることができるようになりました。
if文だけでは、「実行する」「実行しない」の2択でしたが、else文を使うことによって「実行する」「実行しない場合にほかの事をする」「何もしない」の3択になりました。
余談ですが、私の大学では単位制と名乗っておきながら、ある授業を「履修する」「履修しない」という2択しかなかったので、「ほかの授業を履修する」というelse if的な選択肢がほしかったです…

次回は、さらにたくさんの処理に分岐させたい場合の文法をやります。
お次へどうぞ~

Page Top

#03 - else+if anchor.png

Page Top

今回は… anchor.png

前回までのif文やelse文を使用することによって「実行する場合」「実行しない代わりにほかの事を実行する」「何もしない」の3つに分岐できるようになりましたが、それ以上に「この場合Aを実行する場合」「この場合Bを実行する」「この場合Cを実行する」…「何もしない」というように、たくさん分岐させたい場合はどのようにしたらよいかを考えます。
とりあえず前回までのもので頑張って書いてみるとすると、

if (hoge == 1)
{
    writeln("hoge == 1");
}
else
{
    if (hoge == 2)
    {
        writeln("hoge == 2");
    }
    else
    {
        if (hoge == 3)
        {
            writeln("hoge == 3");
        }
        else
        {
            /+ ...以下略... +/
        }
    }
}

というように非常に長ったらしいものになってしまいます。
そこで、 if と else を同時に使うというようなことをします。
下のように書くとスマートですね。

if (hoge == 1)
{
    writeln("hoge == 1");
}
else if (hoge == 2)
{
    writeln("hoge == 2");
}
else if (hoge == 3)
{
    writeln("hoge == 3");
}
/+ ...以下略... +/
Page Top

今回のミソ anchor.png

  • たくさん分岐させたい場合は else if を使う
Page Top

サンプルコード anchor.png

filesample0503p.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
 
 
 
 
-
!
-
-
!
|
-
!
|
-
!
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
!
!
// おまじない。
import std.stdio;
import std.conv;
import std.string;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    write("input : ");
    
    // 変数 hoge に、数値を入力
    int hoge = to!(int)( chomp( readln() ) );
    
    //if文 elseif文else文それぞれを使って処理を分岐させる
    if (hoge == 0)
    {
        // 入力が0のときのメッセージ
        writeln("hoge == 0");
    }
    else if (hoge == 1)
    {
        // 入力が1のときのメッセージ
        writeln("hoge == 1");
    }
    else if (hoge == 2)
    {
        // 入力が2のときのメッセージ
        writeln("hoge == 2");
    }
    else if (hoge == 3)
    {
        // 入力が3のときのメッセージ
        writeln("hoge == 3");
    }
    else if (hoge < 10)
    {
        // 入力が上で引っかからず、10未満のときのメッセージ
        writeln("hoge < 10");
    }
    else if (hoge == 10)
    {
        // 入力が10のときのメッセージ
        writeln("hoge == 10");
    }
    else
    {
        // 入力が10より大きいときのメッセージ
        writeln("hoge > 10");
    }
    
    // おまじない
    return 0;
}
+  Tango用はこちら
filesample0503t.d
Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
 
 
 
 
-
!
-
-
!
|
-
!
|
-
!
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
-
!
!
|
-
!
!
// おまじない。
import tango.io.Stdout;
import tango.io.Console;
import tango.text.convert.Integer;
 
// おまじない
int main(char[][] args)
{
    // 入力を求める旨の内容を書き出す。
    Stdout("input : ").flush;
    
    // 変数 hoge に、数値を入力
    int hoge = toInt( Cin.copyln() );
    
    //if文 elseif文else文それぞれを使って処理を分岐させる
    if (hoge == 0)
    {
        // 入力が0のときのメッセージ
        Stdout("hoge == 0").newline;
    }
    else if (hoge == 1)
    {
        // 入力が1のときのメッセージ
        Stdout("hoge == 1").newline;
    }
    else if (hoge == 2)
    {
        // 入力が2のときのメッセージ
        Stdout("hoge == 2").newline;
    }
    else if (hoge == 3)
    {
        // 入力が3のときのメッセージ
        Stdout("hoge == 3").newline;
    }
    else if (hoge < 10)
    {
        // 入力が上で引っかからず、10未満のときのメッセージ
        Stdout("hoge < 10").newline;
    }
    else if (hoge == 10)
    {
        // 入力が10のときのメッセージ
        Stdout("hoge == 10").newline;
    }
    else
    {
        // 入力が10より大きいときのメッセージ
        Stdout("hoge > 10").newline;
    }
    
    // おまじない
    return 0;
}
Page Top

実行結果 anchor.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ dmd -run sample0503p.d
input : 0
hoge == 0
 
$ dmd -run sample0503p.d
input : 1
hoge == 1
 
$ dmd -run sample0503p.d
input : 2
hoge == 2
 
$ dmd -run sample0503p.d
input : 3
hoge == 3
 
$ dmd -run sample0503p.d
input : 4
hoge < 10
 
$ dmd -run sample0503p.d
input : 5
hoge < 10
 
$ dmd -run sample0503p.d
input : 6
hoge < 10
 
$ dmd -run sample0503p.d
input : 7
hoge < 10
 
$ dmd -run sample0503p.d
input : 8
hoge < 10
 
$ dmd -run sample0503p.d
input : 9
hoge < 10
 
$ dmd -run sample0503p.d
input : 10
hoge == 10
 
$ dmd -run sample0503p.d
input : 11
hoge > 10
 
$ dmd -run sample0503p.d
input : 12
hoge > 10
 
$ dmd -run sample0503p.d
input : 13
hoge > 10
Page Top

まとめ anchor.png

今回でさまざまな分岐を行えるようになりました。
分岐に関してはこれだけ知っておけばプログラムを書く分には問題ありません。
読む分には、swtch文などもありますが…
それはまた別のお話です。

Page Top

#summary - まとめ anchor.png

Page Top

第01章のミソ anchor.png

  • 真偽の型は、 bool 型
  • bool には true と false しかない。
  • 条件式では、 < や == 、 > などの記号が使える
  • 分岐はif文を使う。
  • if文で捕らえられなかった「それ以外」の場合は、else文を使う
  • たくさん分岐させたい場合は else if を使う
Page Top

宿題 anchor.png

4章のものよりマシな電卓を作りましょう

1
2
3
4
input number : 10.5
input operator : -
input number : 4.3
10.5 - 4.3 = 6.2
1
2
3
4
input number : 4.6
input operator : /
input number : 2.3
4.6 / 2.3 = 2
1
2
3
4
input number : 5.6
input operator : /
input number : 0
0 で割ってはいけない
Page Top

コメント anchor.png

さてさて、できましたかな~?
今回の宿題はかなり難しいかも。

と、いうことで、分岐がわかったら、次は繰り返しです。
分岐と繰り返しがプログラミングの基本のもっとも重要なところだと思います。

そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~


Page Top

投票とコメント anchor.png

Choices Vote
大変参考になった3  
参考になった1  
あまり参考にならなかった0  
まったく参考にならなかった0  

No comment. コメント​/Articles​/D言語入門講座​/第05章 - 分岐Edit

Name:

*1 片方が NaN (Not a Number)の場合に真
*2 何でそうなるかは考えてみるといいです。ヒント:誤差

Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 2248, today: 1, yesterday: 0
Princeps date: 2009-04-20 (Mon) 22:30:46
Last-modified: 2009-04-20 (Mon) 22:30:46 (JST) (4658d) by ゲスト
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu