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

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

ただいまの
回答率

87.92%

演算メソッド():voidでの計算結果を、結果出力メソッド(double):voidで画面表示させるにはどうすればいいのでしょうか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,660

score 11

前提・実現したいこと

Javaの勉強を始めて二週間程度の者です。
以下の問題の解き方がわかりません。解答例もしくはアドバイスをいただけないでしょうか。

問題:下記のようにコマンドライン引数から値を3つとり、四則演算を行うプログラムを作成しなさい。
args[0]:四則演算の左項
args[1]:四則演算の演算子(+,-,*,/)
args[2]:四則演算の右項
なお、Mainクラスと、四則演算用のクラスを作成すること。計算結果の出力は四則演算用のクラスのメソッドとして定義すること。また、args[1]に演算子以外が入力されたとき『第2引数が不正です。』と表示すること。

◎計算結果出力例
args[0] = "5.5"
args[1] = "+"
args[2] = "1.5"
のときは、実行結果が
5.5 + 1.5 = 7.0
と表示されること。

◎Calculatorクラス
・フィールド
-左項:double
-右項:double
-演算子:String

・メソッド
+Calculator(double,String,double)
+execute():void
-結果出力(double):void

発生している問題・エラーメッセージ

演算メソッド(execute)、結果出力メソッド、Calculateコンストラクタで二つのメソッド呼び出しをするという構成を考えました。
しかし、executeは問題の条件でvoid指定されてしまっているため戻り値を返せず、計算結果を結果出力メソッドに渡すことが出来ません。
そのため、executeメソッドで何をすればいいのかがわかりません。
結局、完成したコードはexecuteメソッドがありません。
Calculateコンストラクタで演算と結果出力メソッド呼び出しを行うといったものになってしまいました。

該当のソースコード

以下、問題の要件は満たしていませんが自分で考えたコードです。


//コマンド引数をleft,operator,rightに代入し、Calculateコンストラクタを実行
public class Main {

    public static String operator;
    public static double right;
    public static double left;

    public static void main(String[] args) {
        double left = Double.parseDouble(args[0]);
        String operator = (args[1]);
        double right = Double.parseDouble(args[2]);

        Calculator calculate = new Calculator(left,operator,right);
    }

}




//演算子operatorsに何が入っているかで、演算処理と出力結果を切り替える
public class Calculator {

    private static double leftNum = Main.left;
    private static String operators = Main.operator;
    private static double rightNum = Main.right;


    public Calculator(double leftNum,String operators,double rightNum) {
        if(operators.equals("+")) {
            double answerAdd = leftNum + rightNum;
            outputAdd(leftNum,rightNum,answerAdd);

        }else if(operators.equals("-")) {
            double answerMinus = leftNum - rightNum;
            outputMinus(leftNum,rightNum,answerMinus);

        }else if(operators.equals("×")) {
            double answerMultiplication = leftNum * rightNum;
            outputMultiplication(leftNum,rightNum,answerMultiplication);

        }else if(operators.equals("/")) {
            double answerDivision = leftNum / rightNum;
            outputDivision(leftNum,rightNum,answerDivision);

        }else {
            outputError();
        }
    }



    private static void outputAdd(double leftNum,double rightNum,double answer){
        System.out.println(leftNum + " " +  " + "  + " " + rightNum + " = " + answer);

    }

    private static void outputMinus(double leftNum,double rightNum,double answer){
        System.out.println(leftNum + " " +  " - "  + " " + rightNum + " = " + answer);

    }

    private static void outputMultiplication(double leftNum,double rightNum,double answer){
        System.out.println(leftNum + " " +  " * "  + " " + rightNum + " = " + answer);

    }

    private static void outputDivision(double leftNum,double rightNum,double answer){
        System.out.println(leftNum + " " +  " / "  + " " + rightNum + " = " + answer);

    }

    private static void outputError(){
        System.out.println("第2引数が不正です。");

    }

}

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

こういうことではどうでしょうか.
ngsvx さんの言われた「コンストラクタではフィールドへ値の設定のみを行ない、executeメソッドで実際の計算を行う」です.

public class Main {
  public static void main(String[] args) throws Exception {
    double left = Double.parseDouble(args[0]);
    String operator = args[1];
    double right = Double.parseDouble(args[2]);

    Calculator calculate = new Calculator(left, operator, right);
    calculate.execute();
  }
}

class Calculator {
  private double left;
  private double right;
  private String operator;
  public Calculator(double left, String operator, double right) {
    this.left = left;
    this.operator = operator;
    this.right = right;
  }
  void execute() {
    double answer;
    if(operator.equals("+")) {
      answer = left + right;
    } else if(operator.equals("-")) {
      answer = left - right;
    } else if(operator.equals("×")) {
      answer = left * right;
    } else if(operator.equals("/")) {
      answer = left / right;
    } else {
      System.out.println("第2引数が不正です。");
      return;
    }
    結果出力(answer);
  }
  void 結果出力(double answer) {
    System.out.println(left + " " + operator+ " " + right + " = " + answer);
  }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/28 23:43

    仮引数とフィールド値の違いがよく分かっていなかったので、thisを使うという発想がありませんでした。
    とても勉強になりました。回答ありがとうございました。

    キャンセル

  • 2019/04/29 00:00

    この場合は, フィールドの変数名は最初に m を付けるなど変数名を変えれば this は必要ありません.
    私は嫌いなので自分ではやりませんが.

    キャンセル

+1

「コンストラクタではフィールドへ値の設定のみを行ない、
executeメソッドで実際の計算を行う」という方法もありますが、

各メソッドで具体的に何をしなさいという説明もないのであれば、
空のexecuteメソッドだけ定義して完成でもいいのでは?

要求されたことが、全て満たされていることが前提条件ですが。

何か言われたら、

そんなことは仕様に書いてない

と一応、反論は出来ますね。

無難に回答するなら、最初に書いた方法がいいのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/28 23:43

    確かに問題文読んでも、そんなことは仕様に書いてませんでした笑
    コンストラクタではフィールド値の設定だけをするという発想はありませんでした、、、
    勉強になりました。回答ありがとうございました。

    キャンセル

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

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

関連した質問

  • トップ
  • Javaに関する質問
  • 演算メソッド():voidでの計算結果を、結果出力メソッド(double):voidで画面表示させるにはどうすればいいのでしょうか?