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

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

ただいまの
回答率

90.60%

  • Java

    13511questions

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

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

解決済

回答 3

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 1,314

anna10

score 41

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

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

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

数字を入力すると、

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

演算子を入力すると、

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

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

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

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

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

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

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


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

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

cで初期状態へ。

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

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


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

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などに配置してビルドパスに追加し、ビルドします。

以上、参考まで。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/03 12:29

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

    キャンセル

  • 2015/01/03 14:57

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

    キャンセル

0

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

enum Kind { EXIT, HELP, CLEAR, INIT, NUMBER, ENZAN, OTHER }

class StringUtils {
    final static String EXIT = "e";
    final static String HELP = "?";
    final static String CLEAR = "ce";
    final static String INIT = "c";
    final static String ENZANS[] = {"=", "+", "-", "*", "/", "%"};

    public static Kind getKind(String str) {
    if (EXIT.equals(str)) {
        return Kind.EXIT;
    }
    if (HELP.equals(str)) {
        return Kind.HELP;
    }
    if (INIT.equals(str)) {
        return Kind.INIT;
    }
    if (CLEAR.equals(str)) {
        return Kind.CLEAR;
    }
    for( String s: ENZANS) {
        if (s.equals(str)) {
        return Kind.ENZAN;
        }
    }
    if (str != null && Pattern.matches("^[0-9]+$", str)) {
        return Kind.NUMBER;
    }
    return Kind.OTHER;
    }
}

class Calculator {
    final String MSG_NUMBER = "数値";
    final String MSG_ENZAN  = "演算子";
    final String MSG_NUMBER_OR_ENZAN = "数値または演算子";

    BigDecimal result;
    BigDecimal memory;
    BigDecimal number;
    String enzan;
    String message;
    BufferedReader br;

    Calculator() {
    do_init("");
    this.br = new BufferedReader(new InputStreamReader(System.in));
    }

    public void showBoard() {
    System.out.println("");
    System.out.println("現在の値:" + this.result);
    System.out.println("演算子:" + this.enzan);
    System.out.println("入力された値:" + this.number);
    }

    // キーボードから文字を読み込む
    public String readString() throws IOException {
    System.out.print(this.message + "を入力してください >>");
    String str = br.readLine();
    return str;
    }

    public boolean execute(String str) {
    Kind kind = StringUtils.getKind(str);
    switch(kind) {
        default:
        break;
    case EXIT:
        return false;   //  プログラムの終了
    case HELP:
        do_help(str);
        break;
    case CLEAR:
        do_clear(str);
        break;
    case INIT:
        do_init(str);
        break;
    case NUMBER:
        do_number(str);
        break;
    case ENZAN:
        do_enzan(str);
        break;
    }
    return true;
    }

    private void do_init(String str) {
    this.result = BigDecimal.ZERO;
    this.memory = BigDecimal.ZERO;
    this.number = BigDecimal.ZERO;
    this.enzan = null;
    this.message = MSG_NUMBER;
    }

    private void do_help(String str) {
    // TODO:
    System.out.println("------ オンラインヘルプを表示する。 --------");
    }

    private void do_clear(String str) {
    // TODO:
    }

    private void do_number(String str) {
    this.number = new BigDecimal(str);
    if (this.enzan != null && this.enzan.length() > 0) {
        this.result = calc(this.result, this.number, this.enzan);
        this.message = MSG_NUMBER_OR_ENZAN;
    } else {
        this.message = MSG_ENZAN;
    }
    }

    private void do_enzan(String str) {
    this.message = MSG_NUMBER;

    this.result = this.number;
    this.enzan = str;
    this.number = BigDecimal.ZERO;
    }

    private BigDecimal calc(BigDecimal x, BigDecimal y, String enzan) {
    switch(enzan) {
    default:
        break;
    case "+":
        result = x.add(y);
        break;
    case "-":
        result = x.subtract(y);
        break;
    case "*":
        result = x.multiply(y);
        break;
    case "/":
        if (y.equals(BigDecimal.ZERO)) {
        this.message = "0 で割ることはできません。\n" + this.message;
        } else {
        result = x.divideToIntegralValue(y);
        }
        break;
    case "%":
        result = x.remainder(y);
        break;
    }
    return result;
    }
}

public class Dentaku2 {
    public static void main(String[] args) throws IOException {
    Calculator calc = new Calculator();
    boolean ret = true;
        while (ret) {
            // 最初の表示一覧
        calc.showBoard();

            // キーボードから文字を読み込む
        String str = calc.readString();

        // 入力に応じて処理を行う。
        ret = calc.execute(str);
    }
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    Ruby オープンクラスについて

    オープンクラスは、既にあるクラスを好きな場所で再オープンして、 メソッドを修正したり追加したりするというのが よく理解できません。 どなたかオープンクラスを使った、 サンプルプロ

  • 受付中

    Rubyで複数の文字列が含まれるか調べたい

    Mechanizeを使いエラーページが出るかか調べています。 agent.page.body.include?("エラーメッセージ1")のようにしていたのですが、エラーメッセージ

  • 解決済

    2つの2次元配列を水平方向に結合する方法について

    同じ行数を有する2つの2次元配列を水平方向に結合したいと思っています。SQLのもっとも単純な横結合(条件もなく)のイメージです。 流れとしては各2次元配列について、いったんカンマ区

  • 解決済

    strings.xml コード内処理結果をダイアログで表示する方法

    class内の3つの変数の値をstrings.xmlで宣言したmsgにいれて、 AlertDialogのbuilder.setMessageで表示したいのですが何か方法はありますで

  • 解決済

    PHP全般 変数の展開などについて

    PHPの文字列の操作について、教えていただきたいです。 例えば以下のようなダブルクオートや各種記号などが入った文字列をそのままの状態でfile_get_contentsの一部で利

  • 解決済

    Java replaceAllメソッドの使い方がわかりません。

    Java SE7 Silver の取得を目指し勉強中です。 replaceAllメソッド(8行目)の使い方が分かりません。 以下は黒本の問題集(p36)より抜粋です。

  • 受付中

    ダイアログ表示

    前提・実現したいこと javaプログラムでmainの中のHelloの出力をダイアログボックスで出したいです。 試したことにあるプログラムはmainが使われているので困っています

  • 解決済

    ラムダ式内(戻り値部分で使用)でテキストボックスに値をいれたい

    C#のクラスメソッドの返り値にラムダ式を設定し、その内で、Formのテキストボックスに文字を表示させようとしましたがうまくいきません。クラスの生成時に、Formのインスタンス(th

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

  • Java

    13511questions

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