プログラミング2
課題7

INDEX
課題詳細
感想
参考文献など

課題詳細

Report#7
  1. 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
  2. 例外処理について、考察せよ。
  3. 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
  4. 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
  5. 「電卓」プログラム。中身は自分の思うように。

INDEXへ戻ります?


課題1 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。

作成したソース(改良版)
import java.awt.*;        
import java.awt.event.*;  
/*GUI関係のパッケージをインポート*/

public class GUIaa extends Frame {
    Button b0 = new Button("さあDOTCH?");
    Label x0 = new Label("適当な数字を入力!あーんどボタンPUSH!!");
    Label x1 = new Label();
    TextField t0 = new TextField();
    
    public GUIaa() {
        setLayout(null);
        add(t0);
        t0.setBounds(10,40,90,30);
        add(b0);
        b0.setBounds(110,40,100,30);
        add(x0);
        x0.setBounds(10,80,200,30);
        add(x1);
        x1.setBounds(10,20,200,30);
        /*上で生成したオブジェクト群の場所を定義。
          (x座標, y座標, 横幅, 縦幅)*/
        /*setLayout(null);が無かったら、
          上のオブジェクト群の場所が自動的に設定される。*/

        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    int i = (new Integer(t0.getText())).intValue();
                    t0.setText("");
                    if(i % 2.0 == 0) {
                        x1.setText(i + " は偶数です!!");
                    }
                    else {
                        x1.setText(i + " は奇数です!!");
                    }
                }
            });
    }

    public static void main(String args[]) {
        Frame win = new GUIaa();
        win.setSize(300,100);
        /*表示するウィンドウの大きさを指定。*/
        win.setVisible(true);
        /*ウィンドウをディスプレイに表示するために必要。*/
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}
出力結果 ※画像クリックすると大きくなります。
考察
  1. GUIについて
    1. Graphical User Interface(グラフィカル・ユーザー・インターフェース:通称GUI)
      グラフィックス入出力機能を用いることのできるインターフェースである。
    2. ソースを書く際、ウィンドウに出力するためのクラスをクラスはFrameクラスであるが、もうすでにインポートされているので、インスタンスを定義したりしなくてもよい。
      ただし、Frameクラスを継承したクラスを定義する必要がある。
  2. ソースに出てくるオブジェクトについて
    1. Button b0 = new Button("さあDOTCH?");
      画面に出力されるものの内、唯一のボタン。このボタンを押すと、イベントが生成される。イベントについては、後で考察する。
    2. Label x0 = new Label("適当な〜PUSH!!");
      画面に出力されるものの内、一番下にある文字列。サンプルプログラムでは、この文字列に直接イベント処理後の文字列が返されるが改良した際に常に表示されるように作った。
    3. Label x1 = new Label();
      イベント処理後に返される値(文字列など)を引き継ぐオブジェクト。処理後の画面上に表示される。
    4. TextField t0 = new TextField();
      判定する数字を入力するウィンドウを表示するオブジェクト。
  3. public GUIaa(){}について
    1. 前述に生成されたオブジェクトをadd();メソッドを用いて定義。
    2. オブジェクト名.setBounds(x,y,a,b);
      x:ウィンドウ左上を原点とした x 座標の位置
      y:ウィンドウ左上を原点とした y 座標の位置
      a:対象のオブジェクトの横幅
      b:対象のオブジェクトの縦幅
    3. setLayout(null);が無かったらウィンドウに自動的にオブジェクトが配置される。
  4. ボタンが押されたときの処理(イベント処理)について
    1. 実際ボタンが押された時には、actionPerformed()メソッドを、ウィンドウを閉じた時にはwindowClosing()メソッドを呼び出すので、それぞれのメソッドを定義すれば、イベント処理の方法を指定することができる。
    2. このようなメソッドを持つオブジェクト(ここで言うと、b0オブジェクトにあたる)をアダプタオブジェクトといい、このアダプタオブジェクトを含むクラスを、アダプタクラスと呼ぶ。
    3. ボタンが押された時に生成されるイベントを処理するために必要なアダプタオブジェクトの定義例
      オブジェクト名.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
      	   指定したい処理の方法
      	}
      });
    4. ウィンドウを閉じた時に生成されるイベントを処理するために必要なアダプタオブジェクトの定義例
      win.addWindowListener(new ActionListener() {
          public void windowClosing(WindowEvent evt) {
      	  ウィンドウを閉じる時にしたい処理の方法
      	}
      });
  5. この偶数奇数判定プログラムでは、まずTextFieldオブジェクトt0に入力された数字をt0.getText()を用いて、int 型の変数 i に格納。
    i を 2 で割って余りが 0 ならばt1.setTextに(i + "は偶数です!!");を、余りが 1 ならば(i + "は奇数です!!");を返し、ウィンドウに表示する。

INDEXへ戻ります?


課題2 例外処理について、考察せよ。

例外処理とは?
  1. プログラムの実行中に発生した問題を通知するために、実行時に生成されるオブジェクトを例外と呼び、この例外オブジェクトを処理することを一般的に例外処理という。
  2. 例外処理の記述例を示す。
    try {
    例外が起こりうるソースの記述
    }
    
    catch (catchステートメント 受け取る変数名) {
    例外処理の方法を示すメソッドなど
    }
     ・


    ・ catch (catchステートメント 受け取る変数名) { 例外処理の方法を示すメソッドなど } finally { 共通の処理 }
    1. tryブロックで、例外が生成された場合、例外が投げられる。
    2. ↑の場合、catchブロックの先頭にあるcatchステートメントがこの例外を引数として受け取る。
    3. tryブロック及びcatchブロックでの例外処理が終了した場合、最後にfinallyブロックが実行される。
    4. tryブロックがある限り、catchブロックかfinallyブロックはどちらかが必ず最低でも1つは無ければならない。
  3. 以上の店をふまえて課題1のGUIaaプログラムに変更をくわえてみた。
    import java.awt.*;        
    import java.awt.event.*;  
    /*GUI関係のパッケージをインポート*/
    
    public class GUIaa1 extends Frame {
        Button b0 = new Button("さあDOTCH");
        Label x0 = new Label("適当な数字を入力!あーんどボタンPUSH!!");
        Label x1 = new Label();
        TextField t0 = new TextField();
        
        public GUIaa1() {
            setLayout(null);
            add(t0);
            t0.setBounds(10,40,90,30);
            add(b0);
            b0.setBounds(110,40,100,30);
            add(x0);
            x0.setBounds(10,80,200,30);
            add(x1);
            x1.setBounds(10,20,200,30);
            /*上で生成したオブジェクト群の場所を定義。
              (x座標, y座標, 横幅, 縦幅)。
              setLayout(null);が無かったら、
              上のオブジェクト群の場所が自動的に設定される。*/
    
            b0.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        try {
                            int i = (new Integer(t0.getText())).intValue();
                            if(i % 2 == 0) {
                                x1.setText(i + " は偶数です!!");
                            }
                            else {
                                x1.setText(i + " は奇数です!!");
                            }
                        }
                        
                        catch (NumberFormatException ex) {
                            x1.setText("数字入力しろや(゚Д゚ )ゴルァ!!");
                        }
                    }
                });
        }
        
        public static void main(String args[]) {
            Frame win = new GUIaa();
            win.setSize(300,100);
            /*表示するウィンドウの大きさを指定。*/
            win.setVisible(true);
            /*ウィンドウをディスプレイに表示するために必要。*/
            win.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent evt) {
                        System.exit(0);
                    }
                });
        }
    }
    変更前(※画像クリックででかくなります。)
    変更後(※画像クリックででかくなります。)

INDEXへ戻ります?


課題3 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。

作成したソース
import java.awt.*;
import java.awt.event.*;

public class GUI1b extends Frame {

    String a,b,c,e,f,g,i,j,k,l,n;
    String d = "ちゃんと";
    String m = "選択しろや";
    String h = "(#゚Д゚)ゴルァ!!";
    int re,gr,wh;
    Color co_re = new Color(200,0,0);
    Color co_gr = new Color(0,200,0);
    Color co_wh = new Color(250,250,250);
    Label t0 = new Label("日本語→英語にします。");
    Label t1 = new Label("↓↓↓");
    Checkbox o0 = new Checkbox("Red?");
    Checkbox o1 = new Checkbox("Green?");
    Choice c0 = new Choice();
    Choice c1 = new Choice();
    Choice c2 = new Choice();
    Button b0 = new Button("GO!!");
    TextField f0 = new TextField();
    List l0 = new List();
    public GUI1b() {
        setLayout(null);
        add (t0); t0.setBounds(10,40,60,30);

        add (o0); o0.setBounds(180,35,60,30);
        o0.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    re = evt.getStateChange();
                    if ( re == 1) { t0.setBackground(co_re); }
                    else { t0.setBackground(co_wh); }
                }
            });

        add (o1); o1.setBounds(250,35,80,30);
        o1.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    gr = evt.getStateChange();
                    if ( gr == 1 ) { t0.setBackground(co_gr); }
                    else { t0.setBackground(co_wh); }
                }
            });

        add (c0); c0.setBounds(10,70,100,30);
        c0.add("私は"); a = "私は";
        c0.add("彼は"); b = "彼は";
        c0.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    c = c0.getSelectedItem();
                    if ( c == a ) { d = "I "; }
                    else if ( c == b ) { d = "He "; }
                }
            });

        add (c1); c1.setBounds(120,70,100,30);
        c1.add("あなたが"); e = "あなたが";
        c1.add("Javaが"); f = "Javaが";
        c1.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    g = c1.getSelectedItem();
                    if ( g == e ) { h = "you."; }
                        else if ( g == f ) { h = "Java."; }
                }
            });
    
        add (c2); c2.setBounds(230,70,100,30);
        c2.add("嫌いです。"); i = "嫌いです。";
        c2.add("好きです。"); j = "好きです。";
        c2.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    k = c2.getSelectedItem();
                    if ( k == i ) { m = "hate "; }
                    else if ( k == j ) { m = "love "; }
                }
            });

        add (b0); b0.setBounds(130,140,100,30);
        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    n = d + m + h;
                    f0.setText(n);
                }
            });

        add (t1); t1.setBounds(160,180,60,50);

        add (f0); f0.setBounds(10,200,330,70);

        add (l0); l0.setBounds(270,300,60,40);
        l0.add("も"); l0.add("う"); l0.add("馬太"); l0.add("目");
        l0.add("ぽ"); l0.add("〜"); l0.add("(´Д⊂");
    }
    
    public static void main(String args[]) {
        Frame win = new GUI1b();
        win.setSize(350,350);
        win.setVisible(true);
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}
実行結果はこちら。
考察
このオリジナルプログラムはChoiceによって選ばれた項目に対応した文章を表示するというものです。
まずChoiceによって選ばれた選択肢によって"私は"なら"I "を。とうい風に対応した文字をボタンを押したときに出力するようにした。

INDEXへ戻ります?


課題4 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。

作成したソース
import java.awt.*;
import java.awt.event.*;

public class Temp extends Frame {

    int a;
    String k,l,m,n,o;
    TextField t0 = new TextField();
    Label l0 = new Label("調べたい温度を入力....");
    TextField t1 = new TextField();
    Label l1 = new Label("変換結果.....");
    Choice c0 = new Choice();
    Button b0 = new Button("変換します。");

    public Temp() {
        setLayout(null);
        add (t0); t0.setBounds(10,30,200,40);

        add (l0); l0.setBounds(10,80,80,50);
    
        add (c0); c0.setBounds(120,100,150,40);
        c0.add("摂氏 → 華氏"); k = "摂氏 → 華氏";
        c0.add("華氏 → 摂氏"); l = "華氏 → 摂氏";
        c0.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    m = c0.getSelectedItem();
                    if ( m == k ) { a = 1; }
                    else if ( m == l ) { a = 0; }
                }
            });

        add (b0); b0.setBounds(120,150,150,40);
        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    if ( a == 1 ) {
                        try {
                            int b = (new Integer(t0.getText())).intValue();
                            double c = (b*1.8+32);
                            t1.setText("" + c );
                        }catch(Exception ex) {
                            t1.setText("問題発生。\n考えられる問題。\n1.数字を入力していない。\n2.摂氏 → 華氏のボタンを選択していない。");
                        }
                    }
                    else if ( a == 0 ) {
                        try {
                            int b = (new Integer(t0.getText())).intValue();
                            double c = (b-32)/1.8;
                            t1.setText(""+ c );
                        }catch(Exception ex) {
                            t1.setText("問題発生。\n考えられる問題。\n1.数字を入力していない。\n2.摂氏 → 華氏のボタンを選択していない。");
                        }
                    }
                }
            });

        add (l1); l1.setBounds(180,200,80,40);

        add (t1); t1.setBounds(180,230,200,40);
    }

    public static void main(String args[]) {
        Frame win = new Temp();
        win.setSize(400,290);
        win.setVisible(true);
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}
実行結果はこちら。 考察

このプログラムは摂氏華氏相互変換のプログラムです。
まず、Choiceの選択肢を選んだ際、その選択された項目がソースに書いてある通り、対象の文字列と比較され、条件が合えば、変数aに対応した数字が返されます。
この変数aは、後のボタンが押された際に判別に用いられる値となります。
最後の変換のボタンを押した際に起きるeventについて。
まずはaが1なのか0なのかで判別。
1の場合、画面に入力された値をgetSelectedItem()により、変数bに格納。
次に、変数bを用いて、cに計算した値を格納。
最後に、cを引数としてt1.setText()で出力。
aが2のときも同様。
aが1,2どちらの場合も変数bに格納されるべき値が数字以外だと、例外処理により、エラーメッセージを出力。

INDEXへ戻ります?


課題5 「電卓」プログラム。中身は自分の思うように。

作成したソース
import java.awt.*;
import java.awt.event.*;

public class Cal extends Frame {

    int a;
    String k,l,m,n,o;
    TextField t0 = new TextField();
    TextField t1 = new TextField();
    Label l0 = new Label("result...");
    Label l1 = new Label();
    Choice c0 = new Choice();
    Button b0 = new Button(" = ");

    public Cal() {
        setLayout(null);
        add (t0); t0.setBounds(10,30,50,40);
        add (c0); c0.setBounds(70,30,50,40);
        c0.add(" + "); k = " + ";
        c0.add(" ー "); l = " ー ";
        c0.add(" × "); m = " × ";
        c0.add(" ÷ "); n = " ÷ ";
        c0.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent evt) {
                    o = c0.getSelectedItem();
                    if ( o == k ) { a = 1; }
                    else if ( o == l ) { a = 2; }
                    else if ( o == m ) { a = 3; }
                    else if ( o == n ) { a = 4; }
                }
            });

        add (t1); t1.setBounds(150,30,50,40);

        add (b0); b0.setBounds(210,30,50,40);
        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    if ( a == 1 ) {
                        try {
                        int b = (new Integer(t0.getText())).intValue();
                        int c = (new Integer(t1.getText())).intValue();
                        double d = b + c;
                        l0.setText("" + d);
                        l1.setText("カンペキネ申..._〆(゚▽゚*)");
                        }catch(Exception ex) {
                            l0.setText("");
                            l1.setText("Error....\n1.数字を入力してくらさい。\n2.演算の方法を選んでくらさい。");
                        }
                    }
                    else if ( a == 2 ) {
                        try {
                            int b = (new Integer(t0.getText())).intValue();
                            int c = (new Integer(t1.getText())).intValue();
                            double d = b - c;
                            l0.setText("" + d);
                            l1.setText("カンペキネ申..._〆(゚▽゚*)");
                        }catch(Exception ex) {
                            l0.setText("");
                            l1.setText("Error....\n1.数字を入力してくらさい。\n2.演算の方法を選んでくらさい。");
                        }
                    }
                    else if ( a == 3 ) {
                        try {
                            int b = (new Integer(t0.getText())).intValue();
                            int c = (new Integer(t1.getText())).intValue();
                            double d = b * c;
                            l0.setText("" + d);
                            l1.setText("カンペキネ申..._〆(゚▽゚*)");
                        }catch(Exception ex) {
                            l0.setText("");
                            l1.setText("Error....\n1.数字を入力してくらさい。\n2.演算の方法を選んでくらさい。");
                        }
                    }
                    else if ( a == 4 ) {
                        try {
                            int b = (new Integer(t0.getText())).intValue();
                            int c = (new Integer(t1.getText())).intValue();
                            double d = b / c;
                            l0.setText("" + d);
                            l1.setText("カンペキネ申..._〆(゚▽゚*)");
                        }catch(Exception ex) {
                            l0.setText("");
                            l1.setText("Error....\n1.数字を入力してくらさい。\n2.演算の方法を選んでくらさい。");
                        }
                    }
                    else { l1.setText("Error....\n1.数字を入力してくらさい。\n2.演算の方法を選んでくらさい。");
                    }
                }
            });

        add (l0); l0.setBounds(270,30,50,40);

        add (l1); l1.setBounds(10,70,330,100);
    }

    public static void main(String args[]) {
        Frame win = new Cal();
        win.setSize(330,120);
        win.setVisible(true);
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}
実行結果はこちら。
考察
四則演算プログラムとなっています。
書いてあることは課題3,4と大体同じなので考察ははぶかせてもらいます。

INDEXへ戻ります?


感想

今回は非常に時間がかかってしまい、とても申し訳ないと思いました。
一番つらかったのはオリジナルプログラムで、なかなかひらめきが来なかったので進めきれませんでした。
しかし、その後の課題は、ほとんど同じ作りで完成させることができたのでとても楽でした。
これからプログラミングをするうえで自分にとってプラスになることが多かったということはとてもうれしいかぎりでした。

INDEXへ戻ります?


参考文献など

独習Java 第2版

INDEXへ戻ります?


ひとつ前の画面に戻ります? homeに戻ります?