Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

電卓のソースコード

はじめまして。Javaを独学で勉強中の学生です。
やっと入門本を読み終わり、自分でプログラムを書いてみようと思い電卓を作ってみたのですが、
果たして自分の書き方が正しいのか自信がありません。
もしどなたかチェックしていただける方がいらっしゃいましたら見ていただけませんでしょうか。
如何せん初めてのプログラミングなのでお手柔らかにお願いします!
以下ソースコードです。

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

public class DentakuState extends Frame {                    //Frameクラスを継承
    static Button b0 = new Button("0");                        //各種ボタンを生成
    static Button b1 = new Button("1");
    static Button b2 = new Button("2");
    static Button b3 = new Button("3");
    static Button b4 = new Button("4");
    static Button b5 = new Button("5");
    static Button b6 = new Button("6");
    static Button b7 = new Button("7");
    static Button b8 = new Button("8");
    static Button b9 = new Button("9");
    static Button plus = new Button("+");
    static Button minus = new Button("−");
    static Button kakeru = new Button("×");
    static Button waru = new Button("÷");
    static Button equal = new Button("=");
    static Button clear = new Button("C");
    static Button dot = new Button(".");
    static TextField t = new TextField("0");
    static Button check = new Button("c");
    
    public static double dA = 0;                            //フラグBの数列を格納
する変数
    public static double dB = 0;                            //フラグAの数列を格納
する変数
    public static int state = 0;                            //状態フラグを判別する変数
    public static int enzan = 0;                            //演算子を判別する変数
    public static double total = 0;                            //フラグAとBの計算結
果を格納する変数
    public static String dis = new String();                //ディスプレイに表示する文
字列を格納する変数
    
    
    public DentakuState () {                                //DentakuStateクラス
のコンストラクタ
        setLayout(null);                                    //自動配置を無効化
        add(b0); b0.setBounds(70, 250, 40, 40);                //各種ボタン配置
        add(b1); b1.setBounds(20, 200, 40, 40);
        add(b2); b2.setBounds(70, 200, 40, 40);
        add(b3); b3.setBounds(120, 200, 40, 40);
        add(b4); b4.setBounds(20, 150, 40, 40);
        add(b5); b5.setBounds(70, 150, 40, 40);
        add(b6); b6.setBounds(120, 150, 40, 40);
        add(b7); b7.setBounds(20, 100, 40, 40);
        add(b8); b8.setBounds(70, 100, 40, 40);
        add(b9); b9.setBounds(120, 100, 40, 40);
        add(plus); plus.setBounds(170, 250, 40, 40);
        add(minus); minus.setBounds(170, 200, 40, 40);
        add(kakeru); kakeru.setBounds(170, 150, 40, 40);
        add(waru); waru.setBounds(170, 100, 40, 40);
        add(equal); equal.setBounds(20, 300, 190, 40);
        add(clear); clear.setBounds(20, 250, 40, 40);
        add(dot); dot.setBounds(120, 250, 40, 40);
        add(t); t.setBounds(20, 40, 190, 40);
        add(check); check.setBounds(5, 20, 30, 20);
    }
    
    public static void keepA (String strA) {                //フラグAの時の値を保存する
メソッド
            dA = new Double(strA).doubleValue();
    }
    
    public static void keepB (String strB) {                //フラグBの時の値を保存する
メソッド
            dB = new Double(strB).doubleValue();
    }
    
    public static void answer () {                            //演算子に基づいて計算
を行うメソッド
        switch (enzan) {
        case 1:
            total = dA + dB;
            break;
        case 2:
            total = dA - dB;
            break;
        case 3:
            total = dA * dB;
            break;
        case 4:
            total = dA / dB;
            break;
        default:
            total = 0;
            break;
        }
    }
    
    public static void main(String [] args) {
        Frame win = new DentakuState();                        //Frameクラスの
サブクラスとしてDentakuStateクラスを宣言
        win.setSize(230, 360);
        win.setVisible(true);
        win.addWindowListener(new WindowAdapter(){            //ウィンドウを閉じるイ
ベント
            public void windowClosing(WindowEvent evt){
                System.exit(0);
            }
        });
        
        b0.addActionListener(new DentakuButton());
        b1.addActionListener(new DentakuButton());
        b2.addActionListener(new DentakuButton());
        b3.addActionListener(new DentakuButton());
        b4.addActionListener(new DentakuButton());
        b5.addActionListener(new DentakuButton());
        b6.addActionListener(new DentakuButton());
        b7.addActionListener(new DentakuButton());
        b8.addActionListener(new DentakuButton());
        b9.addActionListener(new DentakuButton());
        dot.addActionListener(new ActionListener(){                //"."ボタンが押さ
れた場合のイベント
            public void actionPerformed(ActionEvent evt){        //入れ子クラス
                if (state == 1) {                                //フラグ1の時はフ
ラグを2に変更し、
                    state = 2;
                    t.setText("0.");                            //"0."を表示
                } else {
                    dis = DentakuState.t.getText();                //その他の場合の
動作
                    if (dis.contains(".")) {                    //既に"."を含かどうかで
場合分け
                        return;
                    } else {
                        DentakuState.t.setText(dis + ".");
                    }
                }
            }
        });
        plus.addActionListener(new DentakuEnzan());                //+ボタンが押さ
れた場合のイベント
        minus.addActionListener(new DentakuEnzan());            //−ボタンが押さ
れた場合のイベント
        kakeru.addActionListener(new DentakuEnzan());            //×ボタンが押さ
れた場合のイベント
        waru.addActionListener(new DentakuEnzan());                //÷ボタンが押さ
れた場合のイベント
        equal.addActionListener(new ActionListener(){            //イコールボタンが押さ
れた場合のイベント
            public void actionPerformed(ActionEvent evt){
                switch(state){
                case 0:
                    return;
                case 1:
                    return;
                case 2:
                    keepB(t.getText());
                    answer();
                    t.setText(dis.valueOf(total));
                    break;
                }
            }
        });
        clear.addActionListener(new ActionListener(){                //クリアボタンが
押された場合のイベント
            public void actionPerformed(ActionEvent evt){
                t.setText("0");
                dA = 0;
                dB = 0;
                state = 0;
                enzan = 0;
                total = 0;
                dis = "";
            }
        });
        check.addActionListener(new ActionListener(){                //チェック用
            public void actionPerformed(ActionEvent evt){
            System.out.println("dA = " + dA);
            System.out.println("dB = " + dB);
            System.out.println("total = " + total);
            System.out.println("enzan = " + enzan);
            System.out.println("state = " + state);
            System.out.println("dis = " + dis);
            }
        });
    }
    
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーー
別クラス
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

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

public class DentakuButton implements ActionListener {
    public void actionPerformed(ActionEvent evt){
        Button b = (Button)evt.getSource();                                                
//ボタンのラベルを取得
        String buttonLabel = b.getLabel();
        switch(DentakuState.state) {                                                    
//フラグで場合分け
        case 0:
            DentakuState.dis = DentakuState.t.getText();                                
//TextFieldからString取得
            if (DentakuState.dis.length() == 1 && DentakuState.dis.charAt(0) == '0'){    //
すでに0のみが表示されている場合の処理
                DentakuState.t.setText(buttonLabel);                                    
//0に上書き
            } else {
                DentakuState.t.setText(DentakuState.dis + buttonLabel);
            }
            break;
        case 1:
            DentakuState.state = 2;
            DentakuState.t.setText(buttonLabel);
            break;
        case 2:
            DentakuState.dis = DentakuState.t.getText();
            if (DentakuState.dis.length() == 1 && DentakuState.dis.charAt(0) == '0'){
                DentakuState.t.setText(buttonLabel);
            } else {
                DentakuState.t.setText(DentakuState.dis + buttonLabel);
            }
            break;
        }
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
別クラス
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

import java.awt.*;
import java.awt.event.*;
public class DentakuEnzan implements ActionListener {            //四則演算子ボタンが押
された場合のイベント
    public void actionPerformed(ActionEvent evt){
        Button b = (Button)evt.getSource();                        //ボタンのラベル
を取得
        String enzanshi = b.getLabel();
        switch(DentakuState.state) {                            //フラグによって
場合分け
        case 0:                                                    //フラ
グ0の時の動作
            if(enzanshi.equals("+")){
                DentakuState.enzan = 1;                            //演算モード
をプラスにセット
                DentakuState.state = 1;                            //フラグを1
にセット
                DentakuState.keepA(DentakuState.t.getText());    //フラグ0の値をキープ
            } else if (enzanshi.equals("−")) {
                DentakuState.enzan = 2;                            //演算モード
をマイナスにセット
                DentakuState.state = 1;
                DentakuState.keepA(DentakuState.t.getText());
            } else if (enzanshi.equals("×")) {
                DentakuState.enzan = 3;                            //演算モード
をかけるにセット
                DentakuState.state = 1;
                DentakuState.keepA(DentakuState.t.getText());
            } else if (enzanshi.equals("÷")) {
                DentakuState.enzan = 4;                            //演算モード
を割るにセット
                DentakuState.state = 1;
                DentakuState.keepA(DentakuState.t.getText());
            } else {
                return;
            }
            break;
        case 1:                                                    //フラ
グ1の時の動作
            if(enzanshi.contains("+")){                            //演算子フラ
グを押されたボタンによって上書き
                DentakuState.enzan = 1;
            } else if (enzanshi.contains("−")){
                DentakuState.enzan = 2;
            } else if (enzanshi.contains("×")){
                DentakuState.enzan = 3;
            } else if (enzanshi.contains("÷")){
                DentakuState.enzan = 4;
            }
            break;
        case 2:                                                    //フラ
グ2の時の動作
            if(enzanshi.equals("+")){                            //押された演算子
によって場合分け
                DentakuState.keepB(DentakuState.t.getText());    //フラグ1の値をキープ
                DentakuState.answer();                            //フラグ0と
1の合計値を算出
                DentakuState.dis = String.valueOf(DentakuState.total);
                DentakuState.t.setText(DentakuState.dis);        //上の合計値を表示
                DentakuState.keepA(DentakuState.dis);            //フラグ2の値を
キープ
                DentakuState.enzan = 1;                            //演算モード
をプラスにセット
                DentakuState.state = 1;                            //フラグを1
にセット
            } else if (enzanshi.equals("−")) {
                DentakuState.keepB(DentakuState.t.getText());
                DentakuState.answer();
                DentakuState.dis = String.valueOf(DentakuState.total);
                DentakuState.t.setText(DentakuState.dis);
                DentakuState.keepA(DentakuState.dis);
                DentakuState.enzan = 2;    
                DentakuState.state = 1;
            } else if (enzanshi.equals("×")) {
                DentakuState.keepB(DentakuState.t.getText());
                DentakuState.answer();
                DentakuState.dis = String.valueOf(DentakuState.total);
                DentakuState.t.setText(DentakuState.dis);
                DentakuState.keepA(DentakuState.dis);
                DentakuState.enzan = 3;
                DentakuState.state = 1;
            } else if (enzanshi.equals("÷")) {
                DentakuState.keepB(DentakuState.t.getText());
                DentakuState.answer();
                DentakuState.dis = String.valueOf(DentakuState.total);
                DentakuState.t.setText(DentakuState.dis);
                DentakuState.keepA(DentakuState.dis);
                DentakuState.enzan = 4;
                DentakuState.state = 1;
            } else {
                return;
            }
            break;
        }
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
以上です。
見辛く、しかも長くてすみません。
よろしくお願いいたします。

2

回答

90272

閲覧

2件の回答

評価

0

ちなみに環境はEclipseです。
問題としては
・エラーの処理(Try文)が入ってない、というよりどこに入れたらいいかわからない。
・カプセル化(?)というのができていない、というより分からない。
・インスタンスをもっと生成するべき、と言われた…
・とにかく長い…
・Double型の数値なので精度が低い?
などがあります。
とにかく電卓としてどうと言うより、プログラムの書き方としてどうかを見て頂けたら助かりま
す。
宿題や授業の一環で勉強している訳ではないので気長にお待ちしてます^^

評価

0

うーむ…。

>やっと入門本を読み終わり、
読んでいる間、どれだけコードを書いていた?

>果たして自分の書き方が正しいのか自信がありません。
小さいものから順々に、じっくりとやっていかないとそういうことになる。

すでに指摘されているのなら、まずはそれぞれ調査してみるところからじゃないかね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。