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

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

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

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

Q&A

解決済

2回答

10833閲覧

java 電卓プログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2016/05/12 05:44

前回から少しだけ前進しましたが、まだ壁にぶつかっているのでご助力お願いいたします。

表記イメージとしては、実行するとまずは下記が表示されます。
C\JAVA>java Dentaku
現在の値:0
演算子:
入力された値:
数値を入力してください >>

実際に入力開始後のイメージ↓
現在の値:0
演算子:
入力された値:
数値を入力してください >>1

現在の値:1
演算子:
入力された値:
演算子を入力してください >>+

現在の値:1
演算子:+
入力された値:
数値又は演算子を入力してください >>60

現在の値:1
演算子:+
入力された値:60
数値又は演算子を入力してください >>

"E"が入力されるまでずっとループ。

現在出来ているコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;

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 = "数値"; 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)) { break; } // cを入力で起動時の状態へ if ("c".equals(data)) { now = "0"; enzan = ""; input = ""; msg = "数値"; data = ""; } if ("=".equals(data)) { if ("+".equals(enzan)){ BigDecimal bd1 = add(now, input); now = bd1.toString(); } else if ("-".equals(enzan)){ BigDecimal bd2 = subtract(now, input); now = bd2.toString(); } else if ("*".equals(enzan)){ BigDecimal bd3 = multiply(now, input); now = bd3.toString(); } else if ("/".equals(enzan)){ try { BigDecimal bd4 = divide(now, input); now = bd4.toString(); } catch (ArithmeticException e) { System.out.println("0で割ることは出来ません"); } } enzan =""; 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 { input = 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; } // str が演算子でなければ、例外発生 static String parseEnzan(String str) throws IllegalArgumentException { if (is_Enzan(str) == false) { throw new IllegalArgumentException("演算子でありません。"); } return str; } static BigDecimal add(String num1, String num2){ return new BigDecimal(num1).add(new BigDecimal(num2)); } static BigDecimal subtract(String num1, String num2){ return new BigDecimal(num1).subtract(new BigDecimal(num2)); } static BigDecimal multiply(String num1, String num2){ return new BigDecimal(num1).multiply(new BigDecimal(num2)); } static BigDecimal divide(String num1, String num2){ return new BigDecimal(num1).divide((new BigDecimal(num2)), 20, BigDecimal.ROUND_HALF_UP); }

}

___________________
①if ("c".equals(data)) {
で最初の表示画面にしたいが、現状だとnow:cとなってしまい上手くいかない。
②nowに文字を入れても動作してしまう(aadcなどでも通ってしまう)が、数字でなければエラーを出したい。

以上二点をどうすればよいか教えてください。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

前回の質問を探すためにプロフィールをみたところ勉強中ということで、単純に質問の内容だけを答えさせてもらいます。(あえて、他の部分には口をだしません)

①if ("c".equals(data)) {
で最初の表示画面にしたいが、現状だとnow:cとなってしまい上手くいかない。

これに関しては単純です。
各if文が別れてしまっているからです。

java

1if ("e".equals(data)) { 2 //略 3}else if ("c".equals(data)) { 4 //略 5}else if ("=".equals(data)) { 6 //略 7}else if ("ce".equals(data)) { 8 //略 9}else{ 10 try { 11 if ("数値".equals(msg)) { 12 now = data; 13 msg = "演算子"; 14 } else if ("演算子".equals(msg)) { 15 enzan = parseEnzan(data); 16 msg = "数値又は演算子"; 17 } else { 18 if (is_Enzan(data)) { 19 enzan = parseEnzan(data); 20 } else { 21 input = data; 22 } 23 msg = "数値又は演算子"; 24 } 25 } catch(Exception e) { 26 System.out.println(msg + "ではありません"); 27 } 28}

というようにelseをつかって"C"が入力された時には処理が行われないようにしましょう。
現状ではelseがないためmsgが"数字"のに設定されたままtryの中にある条件式に処理が行くようになっています。

②nowに文字を入れても動作してしまう(aadcなどでも通ってしまう)が、数字でなければエラーを出したい。

nowに文字を入れても・・とありますが、条件式("数値".equals(msg))の時にnow=dataとしています。
単純に回答をするとその条件の時にdataが数字がどうか判定すればよいです。

java

1if("数値".equals(msg)){ 2 if(/*dataが数字かどうかの判定*/){ 3 now=data; 4 msg="演算子" 5 }else{ 6 //数字じゃなかった場合の処理 7 } 8}

数字かどうかの判定はteratailを探せば幾つか出てくるみたいなので勉強してみてください。
いくつか方法はあります。

余談ですが

java

1"+-*/".indexOf(str) == -1

この文は「あ、なるほど・・・」と思ったやり方です。
私はすぐにPattern等を使って判定を始めてしまうため頭が固くなっているなぁと感心しました。

勉強頑張ってください。

投稿2016/05/12 15:08

RyotaKondo

総合スコア94

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

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

退会済みユーザー

退会済みユーザー

2016/05/12 15:19

RyotaKondoさま、ご回答ありがとうございます! ①も②も私のレベルまで下げて丁寧に解説いただいたおかげでとても良く理解出来ました、本当にありがとうございます。 (やはり他の部分にも多々ツッコミどころがあるようですが;;まずは現時点の疑問を解消すべく頑張ります;) "+-*/".indexOf(str) == -1についてもお褒めいただきありがとうございます! ちょうどindexOfというメソッドを使ってみたばかりだったので、これで出来るかな?と再び使用してみました…勉強頑張ります、ありがとうございます!
guest

0

"c".equals(data)...

普通は、

オブジェクト.equals( "c" )

見たいにするのでは?

2は私は発想を変えて、
文字列で受けてint型に変換できなければ false ( あるいは例外を投げる ) とします。

たとえば、取得用クラス&メソッドを作り、

String型でいったん取得して、
int型に変換してみる。
で、NumberFormatException っていう例外が発生したら、
数字以外があるってことなので、
再度例外を投げる ( or false を返す ) とか。

あ、でも、計算で、"+", "-", "/" ... と計算で使う記号もあるので、

文字列として取得 -> 変換できればその数値を返し、できなければ 数字以外とみなす -> 数字以外のとき、指定記号 ( "+", "-", "/", "*"... ) のときも true とみなす ( つまりOK ということ。 )

みたいに、

int型に変換して、できたらtrue, できなければ 指定記号でなければ false とか。

投稿2016/05/12 07:29

BeatStar

総合スコア4958

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

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

RyotaKondo

2016/05/12 10:24

"c".equals(data)はdataがnullであるときでも動作する表記で実用的なものですよ。
退会済みユーザー

退会済みユーザー

2016/05/12 15:15

BeatStarさまご回答ありがとうございます。 普通はオブジェクト.equals( "c" )にするもの…まだその普通すら分からない状態でして、申し訳ありません; ただ、数字でなければ例外を投げる方法というものは少しわかりました。 ご助力ありがとうございました!
BeatStar

2016/05/16 03:26

"c".equals(data) もありなんですね。 C/C++から来たので違和感があったので...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問