質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

javaのプログラミングについて質問です

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,243
退会済みユーザー

退会済みユーザー

※Keisanクラスの内容を最下層に追記しました。
まだ中身は適当です;

javaで電卓のプログラムを作成しています。
実行まで一応動作する状態です・・・

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Dentaku {

    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String now = "0";
        String enzan = "";
        String input = "";
        String msg = "数値";

        // 無限ループのどこかでkeisanクラス呼び出し予定
        while(true){
            System.out.println("現在の値:" + now);
            System.out.println("演算子:" + enzan);
            System.out.println("入力された値:" + input);
            System.out.print(msg + "を入力してください >>");

            String data = br.readLine();
            System.out.println("");

            // eを入力されたらループ終わり
            if ("e".equals(data)) {
                System.exit(0);
            }

            // cを入力で起動時の状態へ
            if ("c".equals(data)) {
                now = "0";
                enzan = "";
                input = "";
                msg = "数値";
            }
            if ("=".equals(data)) {

                /*現在の値:○ ←に計算結果を入れたい*/

            }
            if ("ce".equals(data)) {

                /*直前の入力をクリア*/
            }

            try {
                if ("数値".equals(msg)) {
                    now = data;
                    msg = "演算子";
                } else if ("演算子".equals(msg)) {
                    enzan = parseEnzan(data);
                    msg = "数値又は演算子";
                } else {
                    if (is_Enzan(data)) {
                        enzan = parseEnzan(data);
                    } else {
                        now = data;
                    }
                    msg = "数値又は演算子";
                }
            } catch(Exception e) {
                System.out.println("エラー: " + msg + "ではありません");
            }
        }
    }

    // str が演算子かチェック
    static boolean is_Enzan(String str) {
        if ((str.length() != 1) || ("+-*/".indexOf(str) == -1)) {
            return false;
        }
        return true;
    }

    // 演算子じゃなければ例外発生
    static String parseEnzan(String str) throws IllegalArgumentException {
        if (is_Enzan(str) == false) {
            throw new IllegalArgumentException("演算子でありません。");
        }
        return str;
    }
}

実際に四則演算を行うのは別のクラスに分けようと思っています。
分からないことだらけなのですが、今回まずお尋ねしたいのは、
①四則演算するKeisanクラスをソース内のどこに挿入すべきか?
(”=”が入力されたら現在の値:nowが変動するのでそこと絡めるべきか?と考えています)
②ceを入れると一つ前の入力画面に戻したいのですが、どうすればそのような操作が出来るのか?

よろしくお願いいたします。


四則演算の結果を戻り値で返すようにしたい予定です。
クラスを分けたい理由は、そのほうが見やすいかと思ったからです。
import java.math.BigDecimal;

public class Keisan{

    BigDecimal one = new BigDecimal();
    BigDecimal two = new BigDecimal();

    public BigDecimal add() {

        BigDecimal add = one.add(two);

        return add;
    }
    public BigDecimal subtract() {

        BigDecimal subtract = one.subtract(two);

        return subtract;
    }
    public BigDecimal multiply() {

        BigDecimal multiply = one.multiply(two);

        return multiply;
    }
    public BigDecimal divide() {

        BigDecimal divide = one.divide(two, 20, BigDecimal.ROUND_HALF_UP);

        return divide;
    }
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • abs123

    2016/05/10 10:54

    クラスを分けたい理由と、クラスを分けた場合のDentakuクラス、Keisanクラスそれぞれに、どういった機能を持たせる予定か、具体的な内容の追記をお願いします。

    キャンセル

  • coco_bauer

    2016/05/10 10:54

    四則演算を行うクラスというのは、四則演算に対応するメソッド (" public String add(String arg1, String arg2)" というような感じ)のみを持つクラスというようなものでしょうか? そのクラスは、質問の電卓プログラム以外でも利用されるのでしょうか?

    キャンセル

回答 2

checkベストアンサー

+1

私がDentakuクラス、Keisanクラスの2つに分けるとしたら、
概要としてはこんな感じになりそう。

Dentakuクラス:入力された文字列の解析、計算結果や例外の表示といった、
電卓の外側(ボタンや、画面など)を表すクラス。

Keisanクラス:電卓としての状態の管理、四則演算などの計算処理といった、
電卓の内側(メモリー機能とか)を表すクラス。
(名前は変えたほうがいいと思う、意味被りそうだけどCalculatorとか)

Keisanクラスを分ける意味としては・・・
計算式を分けて、あとで結果だけ合計したいときとか、
複雑な計算をしたい場合は、分けていたほうが良いかもしれないですね。

mainメソッドが結構長くなっているので
クラスや、メソッドに処理を分けるというのはいい考えだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 13:03

    ご回答ありがとうございます!
    今回は特に外側部分(ボタンや画面)は必要としていない、コマンドプロンプトだけで動作する簡易的なものではあるのですが・・・
    メインメソッドが長い(長くなりそう)だと感じていましたので、本当にどちらがいいのかということをもう少し考えてみたいと思います。
    ありがとうございました、またよろしくおねがいいたします。

    キャンセル

+1

そもそも四則演算するコードを別クラスに独立させる必要性を余り感じないのですが…。計算するためのメソッドを新たに作るので十分な気がします。
一応メインメソッド内でも「ローカルクラス」としてクラスを宣言することは可能ですが、可読性の観点などから余りおすすめしません。
書くとしたらDentakuクラス内にstatic classとして宣言するくらいでしょうか。

"ce"の入力に対しては現在のmsgの状態などから戻る状態を判断してループの最初に戻すくらいなのでは?

私だったら演算子の列挙型を作ってしまいたくなります。

//
    enum Operator {
        PLUS {
            @Override
            public BigDecimal calculate(String num1, String num2) {
                return new BigDecimal(num1).add(new BigDecimal(num2));
            }
        },
        MINUS {
            @Override
            public BigDecimal calculate(String num1, String num2) {
                return new BigDecimal(num1).subtract(new BigDecimal(num2));
            }
        },
        MULTIPLY {
            @Override
            public BigDecimal calculate(String num1, String num2) {
                return new BigDecimal(num1).multiply(new BigDecimal(num2));
            }
        },
        DIVIDE {
            @Override
            public BigDecimal calculate(String num1, String num2) {
                return new BigDecimal(num1).divide(new BigDecimal(num2), 20, BigDecimal.ROUND_HALF_UP);
            }
        };

        abstract public BigDecimal calculate(String num1, String num2);

        public static Operator of(String operator) {
            switch (operator) {
            case "+":
                return PLUS;
            case "-":
                return MINUS;
            case "*":
                return MULTIPLY;
            case "/":
                return DIVIDE;

            default:
                throw new IllegalArgumentException("演算子でありません。"); 
            }
        }
    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 11:15

    ご回答ありがとうございます。
    Keisanクラス作成は取りやめにしてメソッド作成で対応したいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る