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

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

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

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

Q&A

解決済

2回答

3900閲覧

javaのプログラミングについて質問です

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2016/05/10 01:34

編集2016/05/10 02:07

※Keisanクラスの内容を最下層に追記しました。
まだ中身は適当です;

javaで電卓のプログラムを作成しています。
実行まで一応動作する状態です・・・

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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 = "数値"; // 無限ループのどこかでkeisanクラス呼び出し予定 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)) { System.exit(0); } // cを入力で起動時の状態へ if ("c".equals(data)) { now = "0"; enzan = ""; input = ""; msg = "数値"; } if ("=".equals(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 { now = 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; } // 演算子じゃなければ例外発生 static String parseEnzan(String str) throws IllegalArgumentException { if (is_Enzan(str) == false) { throw new IllegalArgumentException("演算子でありません。"); } return str; }

}

実際に四則演算を行うのは別のクラスに分けようと思っています。
分からないことだらけなのですが、今回まずお尋ねしたいのは、
①四則演算するKeisanクラスをソース内のどこに挿入すべきか?
(”=”が入力されたら現在の値:nowが変動するのでそこと絡めるべきか?と考えています)
②ceを入れると一つ前の入力画面に戻したいのですが、どうすればそのような操作が出来るのか?

よろしくお願いいたします。


四則演算の結果を戻り値で返すようにしたい予定です。
クラスを分けたい理由は、そのほうが見やすいかと思ったからです。
import java.math.BigDecimal;

public class Keisan{

BigDecimal one = new BigDecimal(); BigDecimal two = new BigDecimal(); public BigDecimal add() { BigDecimal add = one.add(two); return add; } public BigDecimal subtract() { BigDecimal subtract = one.subtract(two); return subtract; } public BigDecimal multiply() { BigDecimal multiply = one.multiply(two); return multiply; } public BigDecimal divide() { BigDecimal divide = one.divide(two, 20, BigDecimal.ROUND_HALF_UP); return divide; }

}

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

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

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

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

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

abs123

2016/05/10 01:54

クラスを分けたい理由と、クラスを分けた場合のDentakuクラス、Keisanクラスそれぞれに、どういった機能を持たせる予定か、具体的な内容の追記をお願いします。
coco_bauer

2016/05/10 01:54

四則演算を行うクラスというのは、四則演算に対応するメソッド (" public String add(String arg1, String arg2)" というような感じ)のみを持つクラスというようなものでしょうか? そのクラスは、質問の電卓プログラム以外でも利用されるのでしょうか?
guest

回答2

0

ベストアンサー

私がDentakuクラス、Keisanクラスの2つに分けるとしたら、
概要としてはこんな感じになりそう。

Dentakuクラス:入力された文字列の解析、計算結果や例外の表示といった、
電卓の外側(ボタンや、画面など)を表すクラス。

Keisanクラス:電卓としての状態の管理、四則演算などの計算処理といった、
電卓の内側(メモリー機能とか)を表すクラス。
(名前は変えたほうがいいと思う、意味被りそうだけどCalculatorとか)

Keisanクラスを分ける意味としては・・・
計算式を分けて、あとで結果だけ合計したいときとか、
複雑な計算をしたい場合は、分けていたほうが良いかもしれないですね。

mainメソッドが結構長くなっているので
クラスや、メソッドに処理を分けるというのはいい考えだと思います。

投稿2016/05/10 02:51

abs123

総合スコア1280

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

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

退会済みユーザー

退会済みユーザー

2016/05/10 04:03

ご回答ありがとうございます! 今回は特に外側部分(ボタンや画面)は必要としていない、コマンドプロンプトだけで動作する簡易的なものではあるのですが・・・ メインメソッドが長い(長くなりそう)だと感じていましたので、本当にどちらがいいのかということをもう少し考えてみたいと思います。 ありがとうございました、またよろしくおねがいいたします。
guest

0

そもそも四則演算するコードを別クラスに独立させる必要性を余り感じないのですが…。計算するためのメソッドを新たに作るので十分な気がします。
一応メインメソッド内でも「ローカルクラス」としてクラスを宣言することは可能ですが、可読性の観点などから余りおすすめしません。
書くとしたらDentakuクラス内にstatic classとして宣言するくらいでしょうか。

"ce"の入力に対しては現在のmsgの状態などから戻る状態を判断してループの最初に戻すくらいなのでは?

私だったら演算子の列挙型を作ってしまいたくなります。

java

1// 2 enum Operator { 3 PLUS { 4 @Override 5 public BigDecimal calculate(String num1, String num2) { 6 return new BigDecimal(num1).add(new BigDecimal(num2)); 7 } 8 }, 9 MINUS { 10 @Override 11 public BigDecimal calculate(String num1, String num2) { 12 return new BigDecimal(num1).subtract(new BigDecimal(num2)); 13 } 14 }, 15 MULTIPLY { 16 @Override 17 public BigDecimal calculate(String num1, String num2) { 18 return new BigDecimal(num1).multiply(new BigDecimal(num2)); 19 } 20 }, 21 DIVIDE { 22 @Override 23 public BigDecimal calculate(String num1, String num2) { 24 return new BigDecimal(num1).divide(new BigDecimal(num2), 20, BigDecimal.ROUND_HALF_UP); 25 } 26 }; 27 28 abstract public BigDecimal calculate(String num1, String num2); 29 30 public static Operator of(String operator) { 31 switch (operator) { 32 case "+": 33 return PLUS; 34 case "-": 35 return MINUS; 36 case "*": 37 return MULTIPLY; 38 case "/": 39 return DIVIDE; 40 41 default: 42 throw new IllegalArgumentException("演算子でありません。"); 43 } 44 } 45 }

投稿2016/05/10 01:56

編集2016/05/10 02:29
swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2016/05/10 02:15

ご回答ありがとうございます。 Keisanクラス作成は取りやめにしてメソッド作成で対応したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問