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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

2658閲覧

Javaの電卓アプリの計算結果が全て足し算になってしまいます。

Asukaa

総合スコア1

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/06/07 21:20

編集2021/06/07 21:40

前提・実現したいこと

足し算以外の計算の処理をさせたい。

参考にしたサイト
https://qiita.com/Hori-Masayuki/items/ee14a3964e53b4a8994d

AndroidStudioのJavaで電卓アプリを作成しています。
電卓の画面上に式を表示させることはできたのですが、肝心の「=」を押すと、掛け算も割り算も引き算も足し算になってしまいます。
エラーも出ていないため、どこを直せば動くようになるのかがわかりません。
計算を正しく実行させるにはどのようにすればよろしいでしょうか?

整数の足し算、引き算、掛け算、割り算のみの単純なアプリです。

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

エラーメッセージ

なし

該当のソースコード

イコールのボタンを押した後に処理される部分です。

case R.id.equal: double tmp; double numResult = 0; //最終的な計算結果を取得する //まず文字列にして取得 String TextFormula = formula.getText().toString(); //数値がリストに入っていく List<String> nums = Arrays.asList(TextFormula.split("[\+\-×÷]", -1)); // 全て足し算の形に変換 size格納されている要素数 for (int i = 0; i < symbols.size(); i++) { switch (symbols.get(i)) { case "×": //numsのi番目とi+1番目をかけたものを代入する ex)8*9=0+72  //Double.parseDouble("変換したい文字列")引数で与えた文字列をdouble型に変換するメソッド tmp = Double.parseDouble(nums.get(i)) * Double.parseDouble(nums.get(i + 1)); //numsのi番目に0をセット nums.set(i, "0"); //numsのi+1番目にさっき計算したものを文字列に変換してセット nums.set(i + 1, String.valueOf(tmp)); break; case "÷": tmp = Double.parseDouble(nums.get(i)) / Double.parseDouble(nums.get(i + 1)); nums.set(i, "0"); nums.set(i + 1, String.valueOf(tmp)); break; case "−": nums.set(i + 1, String.valueOf(Double.parseDouble(nums.get(i + 1)) * -1)); break; } } //numsを一つ一つnumで受け取る for (String num : nums) { //numResult numResult += Double.parseDouble(num); } //テキストビューに出力 result.setText(String.valueOf(numResult)); break; } } }
Java ソースコード package com.example.calculator; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView formula, result; List<String> symbols; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //これはonCreateの中に書く //数字ボタンを取得 findViewById(R.id.number0).setOnClickListener(this); findViewById(R.id.number1).setOnClickListener(this); findViewById(R.id.number2).setOnClickListener(this); findViewById(R.id.number3).setOnClickListener(this); findViewById(R.id.number4).setOnClickListener(this); findViewById(R.id.number5).setOnClickListener(this); findViewById(R.id.number6).setOnClickListener(this); findViewById(R.id.number7).setOnClickListener(this); findViewById(R.id.number8).setOnClickListener(this); findViewById(R.id.number9).setOnClickListener(this); //それ以外のボタンを取得 findViewById(R.id.divided).setOnClickListener(this); findViewById(R.id.times).setOnClickListener(this); findViewById(R.id.minus).setOnClickListener(this); findViewById(R.id.plus).setOnClickListener(this); findViewById(R.id.equal).setOnClickListener(this); findViewById(R.id.wasa).setOnClickListener(this); findViewById(R.id.clear).setOnClickListener(this); } @Override public void onClick(View v) { //電卓の処理 //メッセージを表示するtextViewオブジェクトを取得 TextView formula = findViewById(R.id.formula); TextView result = findViewById(R.id.result); //String型でArrayListを宣言 ArrayList<String> symbols = new ArrayList<String>(); //タップされた画面部品のidの値を取得 //idのR値に応じて処理を分岐 int id = v.getId(); //押されたボタンごとに処理を分岐 switch (id) { case R.id.number0: //途中式を取得して途中式に押されたものを追加 formula.setText(formula.getText().toString() + "0"); break; case R.id.number1: formula.setText(formula.getText().toString() + "1"); break; case R.id.number2: formula.setText(formula.getText().toString() + "2"); break; case R.id.number3: formula.setText(formula.getText().toString() + "3"); break; case R.id.number4: formula.setText(formula.getText().toString() + "4"); break; case R.id.number5: formula.setText(formula.getText().toString() + "5"); break; case R.id.number6: formula.setText(formula.getText().toString() + "6"); break; case R.id.number7: formula.setText(formula.getText().toString() + "7"); break; case R.id.number8: formula.setText(formula.getText().toString() + "8"); break; case R.id.number9: formula.setText(formula.getText().toString() + "9"); break; case R.id.plus: //足し算 formula.setText(formula.getText().toString() + "+"); //リストの最後に要素を追加 symbols.add("+"); break; case R.id.minus: //引き算 formula.setText(formula.getText().toString() + "−"); symbols.add("−"); break; case R.id.divided: //割り算 formula.setText(formula.getText().toString() + "÷"); symbols.add("÷"); break; case R.id.times: //掛け算 formula.setText(formula.getText().toString() + "×"); symbols.add("×"); break; case R.id.wasa: //+-を変更する case R.id.clear: //結果表示画面をクリアにする formula.setText(""); result.setText(""); symbols.clear(); break; case R.id.equal: double tmp; double numResult = 0; //最終的な計算結果を取得する //まず文字列にして取得 String TextFormula = formula.getText().toString(); //数値がリストに入っていく List<String> nums = Arrays.asList(TextFormula.split("[\+\-×÷]", -1)); //例外が起きそうなところをtryでかこむ try { /* //-5-5ができるようにする numsに設定されていた空白に0をセットしてあげる if ((nums.get(0).length() == 0) && (symbols.get(0) == "-")) { nums.set(0, "0"); }*/ // 全て足し算の形に変換 size格納されている要素数 for (int i = 0; i < symbols.size(); i++) { switch (symbols.get(i)) { case "×": //numsのi番目とi+1番目をかけたものを代入する ex)8*9=0+72  //Double.parseDouble("変換したい文字列")引数で与えた文字列をdouble型に変換するメソッド tmp = Double.parseDouble(nums.get(i)) * Double.parseDouble(nums.get(i + 1)); //numsのi番目に0をセット nums.set(i, "0"); //numsのi+1番目にさっき計算したものを文字列に変換してセット nums.set(i + 1, String.valueOf(tmp)); break; case "÷": tmp = Double.parseDouble(nums.get(i)) / Double.parseDouble(nums.get(i + 1)); nums.set(i, "0"); nums.set(i + 1, String.valueOf(tmp)); break; case "−": nums.set(i + 1, String.valueOf(Double.parseDouble(nums.get(i + 1)) * -1)); break; } } //numsを一つ一つnumで受け取る for (String num : nums) { //numResult numResult += Double.parseDouble(num); } //テキストビューに出力 result.setText(String.valueOf(numResult)); //tryの続き } catch (Exception e) { Log.e("エラー", e.getMessage()); } break; } } }
以上です。よろしくお願いいたします。 ### 試したこと カッコの位置の移動 処理を少なくして実行 再起動 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

Asukaa

2021/06/07 21:36

コメントありがとうございます。 拝見し、変更させていただきました。
m.ts10806

2021/06/07 21:45

デバッグしてどこを通ってるか見ればすぐわかるように思います。 結局最後足してるところは気にはなりますが、 //numsを一つ一つnumで受け取る いずれにしてもswitch-caseでどこを通ってるか、確認されましたか?
Asukaa

2021/06/07 22:04

ログキャットで見てみたのですが、まだログの使い方がよくわかっておらず、どのように設定すればいいのでしょうか。 Log.d("Test","aaa呼ばれました。kiou="+i); これをswitch-caseの中に入れて、ビルドしました。
hoshi-takanori

2021/06/07 23:53

Log.d("Test", "TextFormula = " + TextFormula); Log.d("Test", "nums = " + nums); Log.d("Test", "symbols = " + symbols); Log.d("Test", "numResult = " + numResult); あたりを適切なところに入れて実行して、Logcat または Run ウィンドウに出力される内容をご確認ください。
kaina

2021/06/08 00:57

デバッグの仕方を知らないなら以下のページでデバッグのやり方を学習して下さい。 記事は2017年と多少古いですが、デバッグのやり方は大差ないと思います。 https://techacademy.jp/magazine/2441
dodox86

2021/06/08 01:03

参考にされること自体は良いと思いますが、コードの1行1行の内容、処理について理解されていますか?
Asukaa

2021/06/08 12:35

>>hoshi-takanoriさん 丁寧に教えていただきありがとうございます。 ログを取ったところ、symbolsに何も格納されていないことがわかりました。 すごく助かりました。ありがとうございます。 >>kainaさん コメントありがとうございます。 教えていただいたサイトとてもわかりやすいです。 今回でデバックはマスターします。 ありがとうございました。 >>dodox86さん コメントありがとうございます。 はい。エラーを解消するために読み込んでいくうちに説明できるようになりました。笑 ありがとうございました。
guest

回答3

0

ベストアンサー

これだけの問題ではなさそうですが、「-」と「−」が混在しているように見受けられます。
これによって「-」を含む計算時は、TextFormulaの「-」前後の数字が分割されていない状態になっており、計算過程にも影響があります。
但し、これを解消しても当該エラーは解決しないと思われるので、別の要因があると思います。

splitの引数の[]内 こちらは「-」Unicode 002D:よく使われる一般的な半角ハイフンマイナス

Java

1//数値がリストに入っていく 2 List<String> nums = Arrays.asList(TextFormula.split("[\+\-×÷]", -1));

""で囲まれてる箇所「−」 Unicode 2212 :マイナスではあるけど上記とは別物
※(nums.get(i + 1)) * -1) の-1 は算術演算子としての正しいマイナス

Java

1case R.id.minus: 2 //引き算 3 formula.setText(formula.getText().toString() + "−"); 4 symbols.add("−"); 5 break;

Java

1 case "−": 2 nums.set(i + 1, String.valueOf(Double.parseDouble(nums.get(i + 1)) * -1)); 3 break;

プログラム内ではマイナスの算術演算子としてではなくマイナスを表す記号として使われているので、どちらかに統一すれば機能するとは思います。
(Unicode 2212に統一する場合は 正規表現でエスケープする必要がないので下記のようにする必要があります)

Java

1List<String> nums = Arrays.asList(TextFormula.split("[\+-×÷]", -1));

但しミスを防ぐためにも一般的な「-」Unicode 002D:半角ハイフンマイナスに統一すべきでしょう。

余談ですが、エディターのフォントにMSゴシックだったりを使っているのであれば、
違いがわかりにくいので適切なフォントに変更することをお奨めします。
イメージ説明

投稿2021/06/08 06:55

Crimson_Tide

総合スコア509

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

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

Asukaa

2021/06/08 12:24

コメントありがとうございます。 ご指摘の通り-の処理ができなくなり、全部揃えたところうまく行きました。 エディターのフォントを変えることができるのは知らなかったので、早速変えてみます。 ありがとうございました。
guest

0

java

1 //numsを一つ一つnumで受け取る 2 for (String num : nums) { 3 //numResult 4 numResult += Double.parseDouble(num); 5 } 6 //テキストビューに出力 7 result.setText(String.valueOf(numResult));

なんかここで全部足し込んで出力してますが、これのことかな

投稿2021/06/08 00:51

y_waiwai

総合スコア87719

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

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

Asukaa

2021/06/08 12:28

コメントありがとうございます。 ここは足し算以外の計算を足し算の処理に直した後に足している処理なのですが、ここだけ動いていたため、足し算だけができているという状態でした。 ありがとうございました。
guest

0

解決いたしました。

//String型でArrayListを宣言 ArrayList<String> symbols = new ArrayList<String>();

このsymbolsを格納するリストがonClick(View v)の中に入っていたことにより、ボタンが押されるたびに新しくnewされてしまい、-×÷が保存されていないことが原因でした。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

の下に移したところ動くようになりました。
Activityのライフサイクルを考えることが不足していました。

ご回答いただいた方々、本当にありがとうございました。

投稿2021/06/08 12:21

編集2021/06/08 12:30
Asukaa

総合スコア1

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

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

kaina

2021/06/08 12:35

y_waiwaiさんとCrimson_Tideさんのどちらも参考になったはずで、自己解決ではありませんよね? ベストアンサーは変更することが出来ます。 以下のヘルプに書いてある通り、ベストアンサーは一番参考になった回答に付けてあげて下さい。 https://teratail.com/help#resolve-question
Asukaa

2021/06/08 12:40

やり方がよくわからず大変失礼いたしました。 変更させていただきました。 教えていただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問