はじめMath! Javaでコンピュータ数学

第16回論理の数学の基本[後編]

今回はgihyo.jp/dev/serial/01/java-calculation/0015">前回学んだ論理記号・論理演算子を使って確認を行います。先ずは真理値表を書くことで、記号の意味をきちんと理解したかを確かめます。その後に、論理演算子を用いた小さなプログラムを作成してみます。最後にもし、論理演算子を用いないでプログラムを書いたらどうなるか試してみます。

問題:以下の論理式について、それぞれ真理値表を作成しましょう。

(1)A+Bの真理値表を完成してください。

表16.1 問題:論理和の真理値表
ABA+B
00 
01 
10 
11 

(2)Āの真理値表を完成してください。

表16.2 問題:否定の真理値表
AĀ
0 
1 

(3)A⊕Bの真理値表を完成してください。

表16.3 問題:排他的論理和の真理値表
ABA⊕B
00 
01 
10 
11 

(4)問題(1⁠⁠~⁠3)の演算の真理値表を出力するプログラムを作りましょう。

(5)論理演算子を用いずに、if文を使って論理和を記述してみましょう。

「条件A(boolean型変数a)と条件B(boolean型変数b)のどちらか一方でも真ならば、someProcedureメソッドを呼ぶ」というコードを、論理演算子を用いずに書いてみてください。条件A,Bともに真の場合は、一度だけsomeProcedureがコールされるようにしてください。

仮に論理演算子を使えるならば、次のようにシンプルに書けることでしょう。

if (a || b){someProcedure();}

さて、これを論理和の演算子( || ⁠⁠ を用いず書いてみてください。

解説

(1)(3)の真理値表を完成してください。

スペースの節約のために、全ての場合をひとつの真理値表にまとめて示します。

表16.4 解答:各種論理記号の演算結果の真理値表
ABA+BĀA⊕B
00010
01111
10101
11100

(4)問題(1)(3)の演算の真理値表を出力するプログラムを作りましょう。

今回の問題の解決策として、次のようなコードを提案します。

リスト6.1 TestBoolean.java
01: //filename : TestBoolean.java
02: class TestBoolean {
03:   public static void main(String[] args) {
04:     boolean a = false;
05:     boolean b = false;
06:     for( int i = 0; i07:       if (i==0){a = false;} else { a = true;}
08:       for( int j = 0; j09:         if (j==0){b = false;} else { b = true;}
10:           //
11:           System.out.println("* a : " + a + ", b : " + b);
12:           System.out.println(" a Or b : "+ (a | b) );
13:           System.out.println(" Not a : "+ (!a) );
14:           System.out.println(" a XOr b : "+ (a ^ b) );
15:           //
16:       }
17:     }
18:   } // end of main
19: } // end of class

次にプログラムの実行結果を示します。このプログラムは解答の一例に過ぎません。もっとエレガントなプログラムを作ってみてはどうでしょうか。出力結果に凝るのも良いでしょう。

リスト6.1 TestBoolean.javaの実行結果
* a : false, b : false
   a Or b : false
   Not a : true
   a XOr b : false
* a : false, b : true
   a Or b : true
   Not a : true
   a XOr b : true
* a : true, b : false
   a Or b : true
   Not a : false
   a XOr b : true
* a : true, b : true
   a Or b : true
   Not a : false
   a XOr b : false

(5)論理演算子を用いずに、if文を使って論理和を記述してみましょう。

先ずは正解例を示します。

if (a) {
   someProcedure();
} else if (b) {
   someProcedure();
}

もし、次のようなコードだったら、someProcedureメソッドが二回呼ばれてしまう場合が生じるでしょうね。

if (a) {
   someProcedure();
}
if (b) {
   someProcedure();
}

行き当たりばったりにプログラムを作成していると、あとでこのような「誤った論理」にしてしまっていることがあるものです。コードを書くことと、論理構造を整理することは、常に並行して行うと良いでしょう。そして、論理演算子を用いてコンパクトにコードをまとめられるようなら、積極的にそうしましょう。

さて、この問題はショートカット論理和を用いましたから簡単だったのですが、もし、ショートカット論理和ではなく、論理和を使った問題だったらどうでしょう。これはちょっと難しくなりますよ。お時間があれば考えてみてはどうでしょうか。

おすすめ記事

記事・ニュース一覧