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

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

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

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

Q&A

解決済

3回答

2575閲覧

プログラムについての質問です

anna10

総合スコア24

Java

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

0グッド

0クリップ

投稿2014/12/27 06:39

javaを使用して、電卓プログラムを作成しています。
以下がソースコードです。一応コンパイルと実行は出来る状態となっています。
一連の流れと質問内容はコード記載の後に説明します。

流れとしては、初期表示が

現在の値:0
演算子:
入力された値:
数値を入力して下さい>>

数字を入力すると、

現在の値:111
演算子:
入力された値:
演算子を入力して下さい>>

演算子を入力すると、

現在の値:111
演算子:+
入力された値:
数値又は演算子を入力して下さい>>

ここで- * /を入力すると、既に入力されている演算子を書き換えます。
=入力はエラーメッセージ表示です。

現在の値:111
演算子:+
入力された値:222
演算子を入力して下さい>>

数字→演算子→数字の順で入力すると、演算子(+ - * / =)で数字の計算を行います。

①「=」入力の場合
現在の値:333
演算子:
入力された値:
演算子を入力して下さい>>

②「-」いずれかの演算子入力の場合
現在の値:333
演算子:-
入力された値:
数値又は演算子を入力して下さい

となります。尚、数字→演算子(/)→0と入力すると、
0で割り切れない、というエラーメッセージを表示します。

このように、数字が演算子(+ - * / =)をそれぞれif文で判断し、msgを"演算子"・"数値又は演算子"・"数値"と書き換え、msgに代入されているメッセージで更に判断しながら計算していく、という流れになります。

演算子と数字以外の入力受付としては、

cで初期状態へ。

ceで「現在の値・「演算子」・「数値」の順番でクリアしていきます。
その際、msgも随時書き換えていきます。

eでプログラムを終了します。

「何桁でも計算出来る電卓」という仕様なので、int型は使えません。
最初のimportにある、BigDecimalを使用しようと思っています。

質問なのですが、まずは入力された値が「数字か演算子か」を判断しなければならないので、isNumber若しくは上記コードにあるisNumericメソッド(クラスや実行メソッドは適当です)で判断しようと思っているのですが、ネットを探してみても、どうにも単品で使用する事は出来ず、クラスと実装メソッドを作らなければならない、という感じだと思うのですが・・・・
どなたか教えていただけないでしょうか。よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

お邪魔します。

hello-worldさんが回答されているのですが、補足です。
Apache CommonsのStringUtilsに

org.apache.commons.lang3.StringUtils.isNumeric(String str)

というメソッドが存在するのでそれを使用してみてください。
これは正規表現でいうところの"[0-9]"と""(=空文字)にtureを返すものです。

また、小数や指数表記など[0-9]以外の文字列の入力を想定される場合
("0.0001"や"2.4e-3"などの入力を想定する場合)は、

org.apache.commons.lang3.math.NumberUtils.isNumber(String str)

で望みの結果を返すと思います。(nullや空文字に対してはfalseになります)


追記です。ダウンロードリンクを記載しておきます。
apache commons lang download

試される場合、上記ページから使用しているjavaのバージョンに対応したBinariesをダウンロードしてください。
(古いバージョンのものでなければ、Apache Commons Lang 3.3.2 (Java 6.0+)でよいと思います。)
それから、ダウンロードして展開したjarを動的リンク可能な場所に配置してください。
普通はプロジェクトフォルダのlibなどに配置してビルドパスに追加し、ビルドします。

以上、参考まで。

投稿2014/12/30 03:20

ShinpeiYamamoto

総合スコア540

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

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

anna10

2015/01/03 03:29

遅れて申し訳ありません。回答誠にありがとう御座います。つまり、isNumericやisNumberを使用するには、必ず回答にあるものをダウンロードしなければならない、という解釈でよいのでしょうか?
ShinpeiYamamoto

2015/01/03 05:57

apache.commons.langのisNumericやisNumberを使うためにはcommons langのjarが必要です。isNumericやisNumberの機能をご自分で再実装なさるのではなく、commonsの機能を使用したいのであれば、ダウンロードするしかありません。 もちろん、ご自身で再実装するという手段はあります。その場合でも、オープンソースなのでコードを参考にすることはできるかもしれません。 (javaの世界ではものすごく普及したライブラリなので大抵のプロジェクトには既に入っていたりします。ご存じなければ不安を感じるかと思いますが、世界中の何千万の使用者が日々デバッグしているので、安心して使えます。)
guest

0

挙動は質問文にあるものと同等にはなっていませんが、プログラムの構造の変更をしたものを作ってみました。
質問文にあるプログラムは、main 関数だけでほとんどすべてが記述されていてたので、処理を関数に分割しました。

lang

1import java.io.InputStreamReader; 2import java.io.IOException; 3import java.math.BigDecimal; 4import java.util.regex.Pattern; 5import java.util.regex.Matcher; 6 7enum Kind { EXIT, HELP, CLEAR, INIT, NUMBER, ENZAN, OTHER } 8 9class StringUtils { 10 final static String EXIT = "e"; 11 final static String HELP = "?"; 12 final static String CLEAR = "ce"; 13 final static String INIT = "c"; 14 final static String ENZANS[] = {"=", "+", "-", "*", "/", "%"}; 15 16 public static Kind getKind(String str) { 17 if (EXIT.equals(str)) { 18 return Kind.EXIT; 19 } 20 if (HELP.equals(str)) { 21 return Kind.HELP; 22 } 23 if (INIT.equals(str)) { 24 return Kind.INIT; 25 } 26 if (CLEAR.equals(str)) { 27 return Kind.CLEAR; 28 } 29 for( String s: ENZANS) { 30 if (s.equals(str)) { 31 return Kind.ENZAN; 32 } 33 } 34 if (str != null && Pattern.matches("^[0-9]+$", str)) { 35 return Kind.NUMBER; 36 } 37 return Kind.OTHER; 38 } 39} 40 41class Calculator { 42 final String MSG_NUMBER = "数値"; 43 final String MSG_ENZAN = "演算子"; 44 final String MSG_NUMBER_OR_ENZAN = "数値または演算子"; 45 46 BigDecimal result; 47 BigDecimal memory; 48 BigDecimal number; 49 String enzan; 50 String message; 51 BufferedReader br; 52 53 Calculator() { 54 do_init(""); 55 this.br = new BufferedReader(new InputStreamReader(System.in)); 56 } 57 58 public void showBoard() { 59 System.out.println(""); 60 System.out.println("現在の値:" + this.result); 61 System.out.println("演算子:" + this.enzan); 62 System.out.println("入力された値:" + this.number); 63 } 64 65 // キーボードから文字を読み込む 66 public String readString() throws IOException { 67 System.out.print(this.message + "を入力してください >>"); 68 String str = br.readLine(); 69 return str; 70 } 71 72 public boolean execute(String str) { 73 Kind kind = StringUtils.getKind(str); 74 switch(kind) { 75 default: 76 break; 77 case EXIT: 78 return false; // プログラムの終了 79 case HELP: 80 do_help(str); 81 break; 82 case CLEAR: 83 do_clear(str); 84 break; 85 case INIT: 86 do_init(str); 87 break; 88 case NUMBER: 89 do_number(str); 90 break; 91 case ENZAN: 92 do_enzan(str); 93 break; 94 } 95 return true; 96 } 97 98 private void do_init(String str) { 99 this.result = BigDecimal.ZERO; 100 this.memory = BigDecimal.ZERO; 101 this.number = BigDecimal.ZERO; 102 this.enzan = null; 103 this.message = MSG_NUMBER; 104 } 105 106 private void do_help(String str) { 107 // TODO: 108 System.out.println("------ オンラインヘルプを表示する。 --------"); 109 } 110 111 private void do_clear(String str) { 112 // TODO: 113 } 114 115 private void do_number(String str) { 116 this.number = new BigDecimal(str); 117 if (this.enzan != null && this.enzan.length() > 0) { 118 this.result = calc(this.result, this.number, this.enzan); 119 this.message = MSG_NUMBER_OR_ENZAN; 120 } else { 121 this.message = MSG_ENZAN; 122 } 123 } 124 125 private void do_enzan(String str) { 126 this.message = MSG_NUMBER; 127 128 this.result = this.number; 129 this.enzan = str; 130 this.number = BigDecimal.ZERO; 131 } 132 133 private BigDecimal calc(BigDecimal x, BigDecimal y, String enzan) { 134 switch(enzan) { 135 default: 136 break; 137 case "+": 138 result = x.add(y); 139 break; 140 case "-": 141 result = x.subtract(y); 142 break; 143 case "*": 144 result = x.multiply(y); 145 break; 146 case "/": 147 if (y.equals(BigDecimal.ZERO)) { 148 this.message = "0 で割ることはできません。\n" + this.message; 149 } else { 150 result = x.divideToIntegralValue(y); 151 } 152 break; 153 case "%": 154 result = x.remainder(y); 155 break; 156 } 157 return result; 158 } 159} 160 161public class Dentaku2 { 162 public static void main(String[] args) throws IOException { 163 Calculator calc = new Calculator(); 164 boolean ret = true; 165 while (ret) { 166 // 最初の表示一覧 167 calc.showBoard(); 168 169 // キーボードから文字を読み込む 170 String str = calc.readString(); 171 172 // 入力に応じて処理を行う。 173 ret = calc.execute(str); 174 } 175 } 176}

投稿2014/12/28 00:37

katoy

総合スコア22324

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

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

0

投稿2014/12/27 11:31

hello-world

総合スコア1342

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問