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版 ジョセフ.オニール 著 トップスタジオ 訳 武藤 健志 監修