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

第28回 論理のプログラミング演習

この記事を読むのに必要な時間:およそ 1.5 分

これまで十数回にわたって論理の数学を学習しました。今回はその総まとめとして,ひとつの命題を論理式にまとめ,プログラムに組み込んで実行させる演習をしましょう。ただ実行させるだけではつまらないので,論理式を整理する前後で,実行速度がどのくらい異なるのかテストしてみましょう。実行速度の改善・高速化は,プログラマにとって自分の腕を試す・磨くためのよいテーマです。およそ職人と呼ばれる職業では,その腕を競うコンテストがあるものです。入門者として学習中の読者の皆さんは,現在の自分を試合相手と思い,プログラムの改善に取り組みましょう。今までよりも効率よく・速く正確に動くプログラムを作り出せたら,それはこれまでの自分に勝利したのです。勝利の行進を始めましょう。

図28.1 毎日が自分相手のコンテスト

図28.1 毎日が自分相手のコンテスト

問題:3者の多数決をとるプログラムを作りましょう。

この課題は,具体的には「三つのスイッチのうち,二つ以上オンになったらランプを点灯する仕組みをつくりなさい。」という場合が考えられます。完成した論理式を電気回路で組み立て設置すると面白いのですが,今はプログラミングの学習。Java言語で書き表してみましょう。

図28.2 ランプ点灯多数決処理

図28.2 ランプ点灯多数決処理

問題解決の手順を示しますのです(1)(5)に従って取り組んでみて下さい。

(1)「3つの論理値A,B,Cのうち,2つ以上が真なら全体の値Zが真になる」という命題の真理値表を作りましょう。

(2)真理値表を元に論理式を作りましょう。

(3)(2)で作った論理式をもとに,ひとつめのプログラムを作りましょう。入力となる論理値は,ソースコード中で設定してください。

(4)(2)の論理式を,カルノー図を利用して簡略化しましょう。簡略化した論理式をコードにしましょう。

(5)論理式が簡略化前と後でどれだけ実行時間に差がでるか,計測するコードを書き加えましょう。

実行時間の計測には,次の命令を用いるとよいでしょう。システムから現在の時刻をミリ秒単位で得ることができます。処理の実行直前に時刻を取得しておき,終了直後の値と差をとればよいのです。

long time = System.currentTimeMillis();

一度だけの論理式実行では大きな実行時間の差となって表れませんから,今回は100万回繰り返し実行するのに要する時間を計測してみましょう。

解説

(1)「3つの論理値A,B,Cのうち,2つ以上が真なら全体の値Zが真になる」という命題の真理値表を作りましょう。

題意の真理値表を以下に示します。Zが真をとる場合が全体の半分であることがわかります。

ABCZ
FFFF
FFTF
FTFF
FTTT
TFFF
TFTT
TTFT
TTTT

(2)真理値表を元に論理式を作りましょう。

真理値表を元にたてた論理式を以下に示します。

(3)(2)で作った論理式をもとに,プログラムを作りましょう。入力となる論理値は,ソースコード中で設定してください。

取り組み(2)でたてた論理式を試すプログラムの例を以下に示します。

1: //filename : Tasuuketu.java
2: class Tasuuketu {
3: 
4:   public static void main(String[] args) {
5:     boolean a,b,c,z;
6:     a = true; b = false; c = false;
7:     System.out.println("z("+a+","+b+","+c+") = " + z(a,b,c));
8:     a = true; b = true; c = false;
9:     System.out.println("z("+a+","+b+","+c+") = " + z(a,b,c));
10:   }// end of main
11: 
12:   static boolean z(boolean a, boolean b, boolean c) {
13:     return (!a&&b&&c)||(a&&!b&&c)||(a&&b&&!c)||(a&&b&&c);
14:   }//end of function
15: 
16: }// end of class

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入