javaのプログラミングについて質問です
- 評価
- クリップ 0
- VIEW 2,243

退会済みユーザー
※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;
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
私がDentakuクラス、Keisanクラスの2つに分けるとしたら、
概要としてはこんな感じになりそう。
Dentakuクラス:入力された文字列の解析、計算結果や例外の表示といった、
電卓の外側(ボタンや、画面など)を表すクラス。
Keisanクラス:電卓としての状態の管理、四則演算などの計算処理といった、
電卓の内側(メモリー機能とか)を表すクラス。
(名前は変えたほうがいいと思う、意味被りそうだけどCalculatorとか)
Keisanクラスを分ける意味としては・・・
計算式を分けて、あとで結果だけ合計したいときとか、
複雑な計算をしたい場合は、分けていたほうが良いかもしれないですね。
mainメソッドが結構長くなっているので
クラスや、メソッドに処理を分けるというのはいい考えだと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
そもそも四則演算するコードを別クラスに独立させる必要性を余り感じないのですが…。計算するためのメソッドを新たに作るので十分な気がします。
一応メインメソッド内でも「ローカルクラス」としてクラスを宣言することは可能ですが、可読性の観点などから余りおすすめしません。
書くとしたらDentakuクラス内にstatic classとして宣言するくらいでしょうか。
"ce"の入力に対しては現在のmsgの状態などから戻る状態を判断してループの最初に戻すくらいなのでは?
私だったら演算子の列挙型を作ってしまいたくなります。
//
enum Operator {
PLUS {
@Override
public BigDecimal calculate(String num1, String num2) {
return new BigDecimal(num1).add(new BigDecimal(num2));
}
},
MINUS {
@Override
public BigDecimal calculate(String num1, String num2) {
return new BigDecimal(num1).subtract(new BigDecimal(num2));
}
},
MULTIPLY {
@Override
public BigDecimal calculate(String num1, String num2) {
return new BigDecimal(num1).multiply(new BigDecimal(num2));
}
},
DIVIDE {
@Override
public BigDecimal calculate(String num1, String num2) {
return new BigDecimal(num1).divide(new BigDecimal(num2), 20, BigDecimal.ROUND_HALF_UP);
}
};
abstract public BigDecimal calculate(String num1, String num2);
public static Operator of(String operator) {
switch (operator) {
case "+":
return PLUS;
case "-":
return MINUS;
case "*":
return MULTIPLY;
case "/":
return DIVIDE;
default:
throw new IllegalArgumentException("演算子でありません。");
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
abs123
2016/05/10 10:54
クラスを分けたい理由と、クラスを分けた場合のDentakuクラス、Keisanクラスそれぞれに、どういった機能を持たせる予定か、具体的な内容の追記をお願いします。
coco_bauer
2016/05/10 10:54
四則演算を行うクラスというのは、四則演算に対応するメソッド (" public String add(String arg1, String arg2)" というような感じ)のみを持つクラスというようなものでしょうか? そのクラスは、質問の電卓プログラム以外でも利用されるのでしょうか?