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

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

ただいまの
回答率

90.13%

四則演算の優先順位について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,083

aki27

score 4

 前提・実現したいこと

電卓を作っています。
実現したいことは以下です。

数字は何回でも入力できる
= が入力されたときに終了(結果をだす)
計算は乗算除算を優先する。

乗算除算を優先しないのはできたのですが…
再帰下降構文解析や逆ポーランド技法を
用いない方法でも実現できるのでしょうか。

ご教授のほど、よろしくお願いいたします。

■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

 該当のソースコード

Java
ソースコード

import java.util.Scanner;

public class TextDentaku {

     public static void main(String[] args){


          System.out.println("任意の数字を入力してください");
          Scanner scan = new Scanner(System.in);
          int num = scan.nextInt();


          while(true){

          System.out.println("演算子を入力してください");
          Scanner ope = new Scanner(System.in);
          String operator = scan.next();

          if(operator.equals("=")){
             System.out.println(num);
             break;
          }


          System.out.println("任意の数字を入力して下さい");
          Scanner sca = new Scanner(System.in);
          int value = scan.nextInt();
          if(operator.equals("+")){
             num += value;
          }else if(operator.equals("-")){
             num -= value;
          }else if(operator.equals("*")){
             num *= value;
          }else if(operator.equals("/")){
             num /= value;
          }else{
             System.out.println("演算子には+,-,*,/のいづれかをご使用いただく必要がございます。");
          }
          }
     }
}

 試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/03/27 10:43 編集

    乗除算を優先するコードを全く書けないのでしょうか?

    キャンセル

  • aki27

    2018/03/27 11:06

    単純にSystem.out.println(5 + (4 * 3) )で優先順位をあげるぐらいしか思いつきません。入力された文字に対してどう優先させるのかが分かっていない状況です

    キャンセル

  • fuzzball

    2018/03/27 11:12

    それは思い付かないのではなく、「思い付くけど自分で作れそうにない」と思っているだけではないのですか?自分が計算するときと同じような手順で処理を行えばいいと思うのですが。

    キャンセル

回答 3

+3

やり方ならいろいろあると思いますが、ご提示のソースをちょっと修正して。
演算子が/*なら即計算、+-なら後で計算みたな方式です。
あまり詳しい挙動は見ていませんのであしからず。

    public static void main(String... args) {

        String methodName = new Object() {
        }.getClass().getEnclosingMethod().getName();
        System.out.println(methodName);
        System.out.println("任意の数字を入力してください");
        Scanner scan = new Scanner(System.in);
        int value = scan.nextInt();

        int beforeValue = value;
        List<String> list = new ArrayList<>();

        while (true) {

            System.out.println("演算子を入力してください");
            String operator = scan.next();

            if (operator.equals("=")) {
                break;
            }

            System.out.println("任意の数字を入力して下さい");
             value = scan.nextInt();
            if (operator.equals("+")) {
                list.add(beforeValue + "");
                list.add("+");
                beforeValue = value;
            } else if (operator.equals("-")) {
                list.add(beforeValue + "");
                list.add("-");
                beforeValue = value;
            } else if (operator.equals("*")) {
                beforeValue *= value;
            } else if (operator.equals("/")) {
                beforeValue /= value;
            } else {
                System.out.println("演算子には+,-,*,/のいづれかをご使用いただく必要がございます。");
            }
        }
        scan.close();
        list.add(beforeValue + "");
        int num = Integer.parseInt(list.get(0));
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (s.equals("+")) {
                num += Integer.parseInt(list.get(i + 1));
            } else if (s.equals("-")) {
                num -= Integer.parseInt(list.get(i + 1));
            }
        }
        System.out.println(num);

    }

再帰下降構文解析逆ポーランド記法のほうがきれいですね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/27 18:31

    ソースまで頂き、ありがとうございました。
    参考にさせていただきます。

    キャンセル

+3

質問のコードは入力されるたびに計算していますから、5 + 4 * 3 のように入力した場合に ((5+4)*3)と左優先の結果になります。

5 + 4 * 3 を乗除算優先で 5 + (4 * 3)のように計算するためには、計算式全体の入力を先にして、それから乗除算優先で計算していくようなコードにする必要があります。

乗除算優先の計算は、次の2ステップで行えます。
1) "*"か"/"で連結された数字の部分(例: 1*2*3 3*4/2 )を左優先で計算して、計算結果で置き換える(例: 1*2*3 の部分を6に置き換える)
2) 1の置き換えが全て終わったら"+"か"-"で結合された数字になるので、左優先で計算する。 

このぐらいのヒントでコードが書けるのではないかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/27 18:32

    ありがとうございます。
    一度式全体の入力を先にすると実現できそうな
    イメージがわきましたので取り組みたいと思います。

    キャンセル

+2

自分でやるなら逆ポーランド記法に変換するのが簡単だと思います。
しかしもっと簡単にやりたいんでしょう?
それならまず数字、ドット、四則演算子以外のものが含まれていないことをチェックしてから JavaScript エンジンに任せる手段もあります。

5. スクリプティング機能

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/27 18:34

    JavaScriptを用いる方法があるとは知りませんでした。
    おかげさまで見識が広まりました。
    ありがとうございます。

    キャンセル

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

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

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