Report#7
課題
・Report#7:講義資料GUIプログラムをもとに、以下の課題を行え。
- 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
- 例外処理について、考察せよ。
- 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
- 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
- 「電卓」プログラム。中身は自分の思うように。
解答・考察
1.偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
偶数奇数判定プログラム (GUIaa.java)
import java.awt.*;
import java.awt.event.*;
public class GUIaa extends Frame {
Button b0 = new Button("Even/Odd?");
Label x0 = new Label("Type a number and press...");
TextField t0 = new TextField();
public GUIaa() {
setLayout(null);
add(t0); t0.setBounds(10, 40, 90, 30);
add(b0); b0.setBounds(110, 40, 80, 30);
add(x0); x0.setBounds(10, 80, 180, 30);
b0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
int i = (new Integer(t0.getText())).intValue();
t0.setText("");
if(i % 2 == 0) {
x0.setText(i + " is Even");
} else {
x0.setText(i + " is Odd");
}
}
});
}
public static void main(String[] args) {
Frame win = new GUIaa();
win.setSize(200, 150); win.setVisible(true);
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
}
}
実行結果
2.例外処理について、考察せよ。
3.上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
オリジナルプログラム(BMI.java)
import java.awt.*;
import java.awt.event.*;
class BMIClass extends Frame{
Button bt = new Button("結果を表示");
Label l1 = new Label("身長(cm)");
Label l2 = new Label("体重(kg)");
Label l3 = new Label("判定");
TextField t1 = new TextField();
TextField t2 = new TextField();
TextField t3 = new TextField();
public BMIClass(){
setLayout(null);
add(l1); l1.setBounds(20, 50, 60, 30);
add(l2); l2.setBounds(20, 100, 60, 30);
add(l3); l3.setBounds(20, 150, 60, 30);
add(t1); t1.setBounds(80, 50, 60, 30);
add(t2); t2.setBounds(80, 100, 60, 30);
add(t3); t3.setBounds(80, 150, 60, 30);
add(bt);bt.setBounds(60,200,100,40);
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
try{
double height = (new Double(t1.getText())).doubleValue();
double weight = (new Double(t2.getText())).doubleValue();
t1.setText("");
t2.setText("");
double bmi = weight/((height*0.1)*(height*0.1));
if(bmi>=27){
t3.setText("肥満");
}else if((bmi>=23)&&(bmi<27)){
t3.setText("やや肥満");
}else if((bmi>=21)&&(bmi<23)){
t3.setText("普通");
}else if((bmi>=18)&&(bmi<21)){
t3.setText("やや痩せ");
}else if(bmi<18){
t3.setText("痩せ");
}
}catch(Exception ex){
t3.setText("整数を入れて下さい");
}
}
});
}
}
public class BMI{
public static void main(String[] args) {
BMIClass win = new BMIClass();
win.setTitle("BMI");
win.setSize(200, 250);
win.setVisible(true);
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
}
}
実行結果
考察
- BMI値によって、入力した身長と体重から肥満かそうでないかを判定する。
基本のおさらいといった感じ。GUI部品にはラベル、ボタン、テキストフィールドを用いた。
また、結果が表示される(ボタンが押される)と入力した値はリセットされるようにした。
4.摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
温度変換プログラム(henkan.java)
//(華氏温度) = 1.8 × (摂氏温度) + 32
import java.awt.*;
import java.awt.event.*;
class Ondohenkan extends Frame{
Button sb = new Button("C→F");
Button cb = new Button("F→C");
TextField t1 = new TextField();
TextField t2 = new TextField();
Label l1 = new Label();
Label l2 = new Label();
public Ondohenkan(){
setLayout(null);
add(sb); sb.setBounds(110,50,60,20);
add(cb); cb.setBounds(110,80,60,20);
add(t1); t1.setBounds(20,50,80,20);
add(t2); t2.setBounds(20,80,80,20);
add(l1); l1.setBounds(180,50,80,20);
add(l2); l2.setBounds(180,80,80,20);
sb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try{
int i = (new Integer(t1.getText())).intValue();
t1.setText("" + (i-32)/1.8);
l1.setText("Succeed");
}catch(Exception ex){
l1.setText("Not Integer");
}
}
});
cb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
int i = (new Integer(t2.getText())).intValue();
t2.setText("" + i*1.8+32);
l2.setText("Succeed");
}catch(Exception ex) {
l2.setText("Not Integer");
}
}
});
}
}
public class Sample{
public static void main(String args[]){
Frame window = new Ondohenkan();
window.setTitle("Centigrade⇔Fahrenheit");
window.setSize(300, 150);
window.setVisible(true);
window.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt){
System.exit(0);
}
});
}
}
実行結果
考察
- 基本的な部分はサンプルプログラムを多少変えただけ。
- try~catch文を用いて、演算に成功した場合と失敗した場合(整数以外の値が入力された場合)にそれぞれ異なるメッセージがラベルに出力されるようにした。
5.「電卓」プログラム。中身は自分の思うように。
オリジナル電卓プロぐラム(CalMachine.java)
import java.awt.*;
import java.awt.event.*;
public class CalMachine extends Frame{
Button b0 = new Button("0");
Button b1 = new Button("1");
Button b2 = new Button("2");
Button b3 = new Button("3");
Button b4 = new Button("4");
Button b5 = new Button("5");
Button b6 = new Button("6");
Button b7 = new Button("7");
Button b8 = new Button("8");
Button b9 = new Button("9");
Button bp = new Button("+");
Button bm = new Button("-");
Button be = new Button("=");
Button bk = new Button("×");
Button bw = new Button("÷");
Button bc = new Button("C");
Button bt = new Button(".");
Label lb = new Label("Let's Calcutate!");
TextField label =new TextField();
double[] num = new double[]{0.0,0.0,};//数字の初期設定
int count=0;//numを記憶(0,1)
int cal=0;//足し算=1,引き算=2,かけ算=3,割り算=4
double a=1.0;//位を判別するための場合分けに用いる
public CalMachine(){
setLayout(null);
add(b0); b0.setBounds(10,185,35,25);
add(b1); b1.setBounds(10,155,35,25);
add(b2); b2.setBounds(50,155,35,25);
add(b3); b3.setBounds(90,155,35,25);
add(b4); b4.setBounds(10,125,35,25);
add(b5); b5.setBounds(50,125,35,25);
add(b6); b6.setBounds(90,125,35,25);
add(b7); b7.setBounds(10,95,35,25);
add(b8); b8.setBounds(50,95,35,25);
add(b9); b9.setBounds(90,95,35,25);
add(bc); bc.setBounds(130,65,35,25);
add(bw); bw.setBounds(130,185,35,25);
add(bk); bk.setBounds(130,155,35,25);
add(bm); bm.setBounds(130,95,35,25);
add(bp); bp.setBounds(130,125,35,25);
add(be); be.setBounds(90,185,35,25);
add(bt); bt.setBounds(50,185,35,25);
add(lb); label.setBounds(10,30,155,25);
add(label); lb.setBounds(10,65,185,25);
try{
b0.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count];
a=a*0.1;
}else{
num[count]=num[count]*10;
}
label.setText(num[count] + "");
}
});
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a;
a=a*0.1;
}else{
num[count]=num[count]*10+1;
}
label.setText(num[count] + "");
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*2.0;
a=a*0.1;
}else{
num[count]=num[count]*10+2.0;
}
label.setText(num[count] + "");
}
});
b3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*3.0;
a=a*0.1;
}else{
num[count]=num[count]*10+3.0;
}
label.setText(num[count] + "");
}
});
b4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*4.0;
a=a*0.1;
}else{
num[count]=num[count]*10+4.0;
}
label.setText(num[count] + "");
}
});
b5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*5.0;
a=a*0.1;
}else{
num[count]=num[count]*10+5.0;
}
label.setText(num[count] + "");
}
});
b6.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*6.0;
a=a*0.1;
}else{
num[count]=num[count]*10+6.0;
}
label.setText(num[count] + "");
}
});
b7.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*7.0;
a=a*0.1;
}else{
num[count]=num[count]*10+7.0;
}
label.setText(num[count] + "");
}
});
b8.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*8.0;
a=a*0.1;
}else{
num[count]=num[count]*10+8.0;
}
label.setText(num[count] + "");
}
});
b9.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*9.0;
a=a*0.1;
}else{
num[count]=num[count]*10+9.0;
}
label.setText(num[count] + "");
}
});
bc.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
num[0]=0;
num[1]=0;
cal=0;
count=0;
a=1.0;
label.setText(num[count] + "");
}
});
bp.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=1;
count=1;
num[1]=0.0;
a=1.0;
}
});
bm.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=2;
count=1;
num[1]=0.0;
a=1.0;
}
});
bk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=3;
count=1;
num[1]=0.0;
a=1.0;
}
});
bw.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=4;
count=1;
num[1]=0.0;
a=1.0;
}
});
be.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=0;
count=0;
num[1]=0.0;
num[0]=0.0;
a=1.0;
}
});
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
a=0.1;
}
});
}catch(Exception evt){
label.setText(evt.toString());
}
}
public static void main(String[] args) {
Frame win = new CalMachine();
win.setSize(200, 250);
win.setVisible(true);
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
}
}
実行結果
考察
- (A)…数字ボタン("2"を一例とする)
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*2.0;
a=a*0.1;
}else{
num[count]=num[count]*10+2.0;
}
label.setText(num[count] + "");
}
});
同じ"2"というボタンが押された場合でも、それがどの位にあたるものなのか考えなければならない。
そこで変数aを用いた場合分けをする。初期設定a=1.0であり、 a<1すなわち他の数字ボタンが"C"や"="より前に押されていない場合とそれ以外の場合でif文を用いた場合分けをしている(count=0または1しかないのでこれが可能になる)
- (B)…演算ボタン("+"を一例とする)
bp.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=1;
count=1;
num[1]=0.0;
a=1.0;
}
});
変数cal(初期設定は0)に四則演算のそれぞれの働きを持たせ、各ボタンに割り振る。
また演算ボタンが押された時点でcount=1とし同時にnum[1]とaを初期化する。 これによってさらに演算を続けて行く事ができる。
なお"="は演算の結果を表示するのみで、"C"は全ての値を初期化する。
感想・反省
今回の課題は本当にきつかった。内部クラスやインターフェースなどの意味を理解するだけでも大変だった。変数に演算を割り振るところはもっとスマートにできそうな気がした。コンストラクタで初期設定してみようとしたらエラーが出てしまった。別の方法を考えようと思う。
また,"部品をすべて使ったプログラム"とあるのに3種類しか使ってない事に後で気づいてしまった。ごめんなさい
ウィザード (wizard)
魔法使い。専門知識にかけては誰にも負けない、その道のエキスパート。 この分野は誰、という風に分担が決まっていて、欠員が出ると満月の晩に 世界中のウィザードが集まり後任者を決めるのだという。
参考資料・参考サイト
課題のページへ