STUDENT_ID : 045754A
                              NAME       : Hayato.MIYAGI

              プログラミングII 課題7

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



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


import java.awt.*;
/*GUI関係のパッケージクラス群をインポートする。*/

import java.awt.event.*;
/*1行目では「java.awt.event」までなのでそれより下の層は「java.awt.event.*」                          で指定して上げないといけない。
 */

public class GUIaa extends Frame {
    /*Frameクラスの継承。ウィンドウを表すクラスはFrameクラスを使う。*/

    Button    b0 = new Button("Even/Odd?");
    /*インスタンス変数としてボタンを生成・初期化。括弧内の文字列は、ボタンの中に表示される。*/

    Label     x0 = new Label("Type a number and press...");
    /*インスタンス変数として表示欄を生成・初期化。括弧内の文字列は、表示欄の中に表示される。
     */

    TextField t0 = new TextField();
    /*インスタンス変数として入力欄を生成・初期化。*/

    public GUIaa() {
    /*コンストラクタでウィンドウの初期設定*/

        setLayout(null);
        /*部品の自動配置機能をoffにする*/

        add(t0); t0.setBounds(10, 40, 90, 30);
        /*入力欄の貼り付け(左上隅のx/y座標、幅、高さ)*/

        add(b0); b0.setBounds(110, 40, 80, 30);
        /*同上*/

        add(x0); x0.setBounds(10, 80, 180, 30);
        /*同上*/

        b0.addActionListener(new ActionListener() {
        /*ボタンb0が押された時のイベントを無名クラスで定義する*/

                public void actionPerformed(ActionEvent evt) {
                    int i = (new Integer(t0.getText())).intValue();
                    /*「t0.getText」はテキスト内に書かれた文字列を返す。
                      Integer(値)は値をint型として返し、iに代入する。
                    */

                    t0.setText("");
                    /*t0のテキスト内を空欄に(文字がない状態を出力)する。*/

                    if(i % 2 == 0) {
                    /*偶数奇数の判定。値を2で割って余りが0なら偶数/Even、
                      それ以外は奇数/Odd。結果をラベルに表示する。
                    */ 
 
 
                        x0.setText(i + " is Even");
                    } else {
                        x0.setText(i + " is Odd");
                    }
                }
            });
    }
    public static void main(String[] args) {
        Frame win = new GUIaa();
        /*前述のFrameオブジェクトを、変数winへ生成・初期化する。*/

        win.setSize(200, 150); win.setVisible(true);
        /*ウィンドウのサイズを決め、ディスプレイに表示。*/

        win.addWindowListener(new WindowAdapter() {
        /*ウィンドウを閉じる時のイベントを無名クラスで定義する。*/
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                    /*現在実行している Java 仮想マシンを終了。ゼロ以外の値は異常終了を示す。*/
                }
            });
    }
}

gui.jpg


2.  例外処理について、考察せよ
  例外はオブジェクトとして扱われます。例外が発生すると、その種類に応じたクラス型の
オブジェクトが生成されます。
例外処理とは、このオブジェクトを捕まえて、処理することに他なりません。

全ての例外オブジェクトのクラス型は、Throwable クラスをスーパークラスに持ちます。
その継承階層に従って、三つの種類に分類できます。

reigai.jpg

それから、例外処理の方法として、例外が発生しそうな場合を想定してtry文を
用います。以下にtry文の使用例を示します。

class TestExcep2 {
        public static void main(String[] args) {
                System.out.println("実行開始。");
                try{
                        int i, j=100;
                        System.out.println("j: " + j);
                        i=Integer.parseInt(args[0]);      //実行時における、引数を指定
                        System.out.println("j/i: " + j/i);
                                //0で割ると例外がスローされる
                        System.out.println("tryブロック終了");
                } catch (ArrayIndexOutOfBoundsException e) {
                        System.out.println("例外:" + e);
                        System.out.println("引数を一つ入力してください。 ");
                } catch (NumberFormatException e) {
                        System.out.println("例外:" + e);
                        System.out.println("引数を整数で入力してください。");
                } catch (ArithmeticException e) {
                        System.out.println("例外:" + e);
                        System.out.println("引数を0以外の整数で入力してください。");
                }
                System.out.println("実行終了。");
        }
}

------------------------------------------------------------------------Result

[nw0454:‾/prog2/repo7/reigai] j04054% java TestExcep2 
実行開始。
j: 100
例外:java.lang.ArrayIndexOutOfBoundsException: 0
引数を一つ入力してください。 
実行終了。
[nw0454:‾/prog2/repo7/reigai] j04054% java TestExcep2 0
実行開始。
j: 100
例外:java.lang.ArithmeticException: / by zero
引数を0以外の整数で入力してください。
実行終了。
[nw0454:‾/prog2/repo7/reigai] j04054% java TestExcep2 5
実行開始。
j: 100
j/i: 20
tryブロック終了
実行終了。

考察
 上記にある通り、例外処理を行うプログラムを用いると、3パターンの結果が得られました。
これらの結果はプログラム実行時に引数を指定してあげるか、否かで、例外処理を行っています。
実行時における、処理は値100を指定した引数で割るというものです。なので、値100を0で割る
という指示を出すと、実行時に例外処理を行い、「引数を0以外の整数で入力してください。」
という出力がされます。ここで、実行時に引数を何も指定してあげなかった場合、出力される
のは、「引数を一つ入力してください。」という風になります。


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

import java.awt.*;
import java.awt.event.*;

public class org extends Frame {
    Button    b0 = new Button("GO!");

    Label     x0 = new Label("Where are you from?");
    Label     x1 = new Label("Put Your Name,Please!");
    Label     x2 = new Label("sex");
    Label     x3 = new Label("Do you like sleeping?");
    Label     x4 = new Label("Message to Next Yaer!");
    Label     x5 = new Label("Have you done?   >>>>>>>>>>>");




    TextField t0 = new TextField();


    Checkbox  c0 = new Checkbox("Yes!");
    Checkbox  d0 = new Checkbox("NOooo‾‾!");

    List      l1 = new List();

    TextArea  t1 = new TextArea("");

    Choice    c1 = new Choice();
    
    public org() {
        setLayout(null);
        add(b0); b0.setBounds(300, 500, 80, 30);

        add(x0); x0.setBounds(10, 100, 90, 30);
        add(x1); x1.setBounds(10, 30, 90, 30);
        add(x2); x2.setBounds(200, 30, 90, 30);
        add(x3); x3.setBounds(10, 170, 90, 30);
        add(x4); x4.setBounds(10, 250, 90, 30);
        add(x5); x5.setBounds(10, 500, 90, 30);



        add(t0); t0.setBounds(10, 50, 150, 30);



        add(c0); c0.setBounds(10, 200, 90, 30);
        add(d0); d0.setBounds(80, 200, 90, 30);

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

        l1.add("male"); l1.add("female");
        add(t1); t1.setBounds(10, 270, 400, 200);
        
        add(c1); c1.setBounds(10, 120, 60, 30);
        c1.add("Ginowan"); c1.add("Tyatan"); c1.add("Naha");
        c1.add("Nishihara"); c1.add("Urasoe"); c1.add("Itoman");
        c1.add("Yonabaru"); c1.add("OUT");

        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    x5.setText("Thank you for Typing!!");
                }
            });

        
    }
    public static void main(String[] args) {
        Frame win = new org();
        win.setSize(450, 550);
        win.setVisible(true);
    }
}

----------------------------------------------------------------Result

org.jpg


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

import java.awt.*;
import java.awt.event.*;

public class henkan extends Frame{

    Button     b0 = new Button("C --> F");
    Button     b1 = new Button("F --> C");

    TextField  t0 = new TextField();
    TextField  t1 = new TextField();

    public henkan(){
        setLayout(null);
        add(t0); t0.setBounds(30,50,100,20);
        add(b0); b0.setBounds(140,40,90,20);
        add(b1); b1.setBounds(140,60,90,20);
        add(t1); t1.setBounds(240,50,100,20);

        b0.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    try{
                        int i = (new Integer(t0.getText())).intValue();
                        t1.setText("" + (i*1.8+32));
                    }catch(Exception ex){
                        t1.setText("error");
                    }
                }
            });
    
        b1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    try{
                        int i = (new Integer(t0.getText())).intValue();
                        t1.setText("" + (i-32)/1.8);
                    }catch(Exception ex){
                        t1.setText("error");
                    }                
                }
            });
    }
    
    public static void main(String[] args) {
        Frame win = new henkan();
        win.setSize(370, 100); win.setVisible(true);
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}

----------------------------------------------------------------------Result

henkan.jpg


考察 
 右上が摂氏(C)から華氏(F)への変換で、 右下が華氏(F)から摂氏(C)への変換です。
ちなみに華氏(F)と摂氏(C)との関係は、

F = 1.8*C + 32

という関係があります。

b0.addActionListener(new ActionListener() {
					.
					.
					.
					.

}

の部分で、 TextField  t0 = new TextField();で入力された値を摂氏として、摂氏から華氏へ
変換して TextField  t1 = new TextField();へ出力しています。

b1.addActionListener(new ActionListener() {
					.
					.
					.
					.

}

の部分では、逆に入力された値を華氏として、華氏から摂氏へ変換して出力しています。

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


import java.awt.*;
import java.awt.event.*;

public class den extends Frame{

    Button     b0 = new Button("+");
    Button     b1 = new Button("-");

    Label      x0 = new Label("and");


    TextField  t0 = new TextField();
    TextField  t1 = new TextField();
    TextField  t2 = new TextField();

    public den(){
        setLayout(null);
        add(t0); t0.setBounds(30,50,100,20);
        add(b0); b0.setBounds(340,40,50,20);
        add(b1); b1.setBounds(340,60,50,20);
        add(t1); t1.setBounds(180,50,100,20);

public class den extends Frame{

    Button     b0 = new Button("+");
    Button     b1 = new Button("-");
    Button     b2 = new Button("*");
    Button     b3 = new Button("/");

    Label      x0 = new Label("and");

    TextField  t0 = new TextField();
    TextField  t1 = new TextField();
    TextField  t2 = new TextField();

    public den(){
        setLayout(null);
        add(t0); t0.setBounds(30,50,100,20);
        add(b0); b0.setBounds(300,40,50,20);
        add(b1); b1.setBounds(300,60,50,20);
        add(t1); t1.setBounds(180,50,100,20);
        add(t2); t2.setBounds(370,50,100,20);

        b1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    try{
                        int i = (new Integer(t0.getText())).intValue();
                        int k = (new Integer(t1.getText())).intValue();
                        t2.setText("" + (i - k));

                    }catch(Exception ex){
                        t1.setText("error");
                    }
                }
import java.awt.event.*;

public class den extends Frame{

    Button     b0 = new Button("+");
    Button     b1 = new Button("-");
    Button     b2 = new Button("*");
    Button     b3 = new Button("/");

    Label      x0 = new Label("and");


    TextField  t0 = new TextField();
    TextField  t1 = new TextField();
    TextField  t2 = new TextField();

    public den(){
        setLayout(null);
        add(t0); t0.setBounds(30,50,100,20);
        add(b0); b0.setBounds(300,40,50,20);
        add(b1); b1.setBounds(300,60,50,20);
        add(b2); b2.setBounds(300,80,50,20);
        b3.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    try{
                        int i = (new Integer(t0.getText())).intValue();
                        int k = (new Integer(t1.getText())).intValue();
                        t2.setText("" + (i / k));
                    }catch(Exception ex){
                        t1.setText("error");
                    }
                }
            });
    }

    public static void main(String[] args) {
        Frame win = new den();
        win.setSize(570, 150); win.setVisible(true);
        win.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent evt) {
                    System.exit(0);
                }
            });
    }
}

--------------------------------------------------------------------------------Result


den.jpg

考察
 今回の電卓プログラムは先ほどの「華氏から摂氏へ変換するプログラム」にいくつか
追加部分を加えて作成しました。実行結果より、理解できることなんですが、上から順に
加算、減算、乗算、除算の四則演算した結果となっています。
 今回新たに追加した部分というのは、まず、計算したい二数をある演算により処理した
値を出力するテキストフィールドと、int型変数kを追加して四則演算させたい二数を入力
できるようにしてしました。
 つまり、テキストフォームをひとつ追加して電卓に近い処理を行えるようにしました。

感想と反省
 今回のレポートは課題をこなしていて、けっこう楽しくできました。GUIの部品を
つなぎ合わせて、新しいプログラムができたときはうれしかったです。なんか、パズルを
完成させる喜びに似たものを感じました。でも、GUIはパズルとまた少し違う部分も持って
いて、それは、自分の思い通りに姿、形を変えることができ、カンタンに応用がきくという
所です。
 最後に、
今回も余裕をもって課題を終えることができなかったので、悔しかったですね。
でも、最後の課題もきちんと出せるように頑張ります!


参考文献
  独習Java第2版               ジョセフ.オニール 著
                       トップスタジオ  訳
                       武藤 健志   監修