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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

601閲覧

方程式(足し算、引き算レベル)の結果出力プログラム

w30P9ZaR25lAQGo

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/01 16:13

編集2020/08/02 05:14

前提・実現したいこと

初心者です。
方程式を標準入力から入力し、その結果を算出するプログラム課題を作成中です。
1 + 3 = x と標準入力したら4と出力し、3 + x = 6 と標準入力したら3と出力するプログラムが作りたいです。

とりあえずは式中に存在するxの数は一つで、基本的な四則演算の結果を返してくれるものが作りたいです。
つたない文章で申し訳ないのですが、ご教授よろしくお願いいたします。

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

そもそものアルゴリズムが組み立てられない。

該当のソースコード

Java

1思考中

試したこと

nextLineで取得した値をsplit(" ")で分割し、+や-が来た時に条件式で計算式を挿入するのかな~ぐらいしかわからなかった。

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

JDK8

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/01 18:41

で、しつもんはなんでしょうか
xebme

2020/08/02 01:12

・あなたが等式と思うものと、等式でないと思うものを定義してください。 変数は1つですか2つですか?変数なしは?等号は必要? ・あなたが定義した式を解くとはどういうことですか? 「等式変形」することですか?どうしたいですか?
Zuishin

2020/08/02 06:06

x = …… の形に直すと計算できますね。左辺が二項で右辺が一項と決まっているなら x の位置によって 3 パターンの変形を用意すれば良いでしょう。決まってないなら構文解析が必要になるので恐らくあなたの手に余ります。あきらめてもっと簡単な問題にとりかかりましょう。
kazuma-s

2020/08/02 13:09

四則演算と言っていますが、足し算と引き算だけなんですよね。括弧はあるんですか? 例えば、3 - (x - 4) = 5 - 7 はどうですか?
kazuma-s

2020/08/02 13:21

- は 2項演算子だけですか? それとも単項演算子の - もあって、-3 + 7 = -x - 8 もありますか? あるいは、単項演算子の - は許さず -x はないが、-3 は一つの数とみなして許すとか。 とにかく、等式の定義を明確にしてください。
guest

回答2

0

ベストアンサー

  • 演算子は、2項演算子の +- のみで、いくつあってもよい。
  • 等号 = は 1個だけ。
  • 変数は x で、1個だけ。左辺と右辺のどちらにあってもよい。
  • 数は、符号なし整数のみ。
  • 括弧はない。

Java

1import java.util.Scanner; 2 3class Equation { 4 String str; int pos, len, val; char c; 5 6 Equation(String s) { str = s; len = s.length(); pos = 0; } 7 8 char get() { 9 while (pos < len) 10 if ((c = str.charAt(pos++)) != ' ' ) { 11 if (!Character.isDigit(c)) return c; 12 for (val = c - '0'; ; ) { 13 if (pos == len) return c ='0'; 14 c = str.charAt(pos++); 15 if (!Character.isDigit(c)) { pos--; return c = '0'; } 16 val = val * 10 + (c - '0'); 17 } 18 } 19 return c = 0; 20 } 21 22 int solve() { 23 int v = 0, op = '+', x = 0, eq = -1; 24 while (true) { 25 if (get() == '0') { 26 if (op == '+') { v -= val * eq; op = 0; } 27 else if (op == '-') { v += val * eq; op = 0; } 28 else return c = 1; 29 } 30 else if (c == 'x') { 31 if (x != 0) return c = 1; 32 x = (op == '-') ? 1 : -1; 33 if (eq == 1) x = -x; 34 op = 0; 35 } 36 else return c = 1; 37 if (get() == '+' || c == '-') { 38 if (op != 0) return c = 1; 39 op = c; 40 } 41 else if (c == '=') { 42 if (eq == 1) return c = 1; 43 eq = 1; 44 op = '+'; 45 } 46 else if (c == 0) return (x == 0 || eq < 0) ? c = 1 : v * x; 47 else c = 1; 48 } 49 } 50 51 public static void main(String[] args) { 52 for (Scanner scn = new Scanner(System.in); ; ) { 53 System.out.print(">> "); 54 if (!scn.hasNextLine()) break; 55 String s = scn.nextLine(); 56 if (s.equals(".")) break; 57 Equation e = new Equation(s); 58 int v = e.solve(); 59 System.out.println(e.c == 0 ? " x = " + v : " Error"); 60 } 61 } 62}

追記
= の無い式がエラーにならないバグがあったので修正しました。

投稿2020/08/03 02:44

編集2020/08/03 07:49
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

x や = が 2つ以上あったりする不正な式ではなく、
数値や演算子などが必ずスペースで区切られているなら、
質問にあるように、split でもっと簡単に書けます。

Java

1import java.util.Scanner; 2 3class Equation { 4 public static void main(String[] args) { 5 for (Scanner sc = new Scanner(System.in); ; ) { 6 System.out.print(">> "); 7 if (!sc.hasNextLine()) break; 8 String line = sc.nextLine(); 9 if (line.equals(".")) break; 10 String op = "+", op2 = "-"; 11 int val = 0; 12 boolean sgn = false; 13 for (String s : line.split(" +")) 14 if (s.equals("x")) sgn = op.equals(op2); 15 else if (s.equals("+") || s.equals("-")) op = s; 16 else if (s.equals("=")) op = op2 = "+"; 17 else { 18 int v = Integer.parseInt(s); 19 val = op.equals(op2) ? val + v : val - v; 20 } 21 System.out.println(" x = " + (sgn ? -val : val)); 22 } 23 } 24}

投稿2020/12/05 12:41

編集2020/12/05 12:53
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問