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

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

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

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

Q&A

解決済

2回答

1891閲覧

保守性を意識した四則演算子

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

1クリップ

投稿2020/05/25 14:29

編集2020/05/26 06:10

しっかりと動きはするのですが、値を入力させるメッセージが各メソッドにあるため効率が悪いです。
メソッド化させて保守性のあるプログラムを作成したいのですが、知識不足で大変申し訳ないのですが、どうかお知恵をお貸し頂けますと幸いで御座います。

前提・実現したいこと

<前提>
1:14の数値ごとにadd/substract/multiply/divideをすること・上記以外なら再入力
2:一つ目の入力の数値チェック
2-1:マイナスも考慮して0
9の整数・全角0~9の数値のみ入力させる
3:入力された値が5桁かどうかを判定し6桁以上の場合は再入力
4:2つ目の入力でdivideの時には、0を入力された場合再入力をする
5:入力をするところはmethodを作成して共通化をさせる
6:数値チェック・入力された値が5桁かどうの判定もmethodを作成
7:保守性などを意識してロジックを組むこと
8:他に共通できるところは任意のメソッドを作成して共通処理をすること。

<分からないこと>
1:数値チェックをboolean型でした場合、戻り値はtrue or falseなので2つの入力された値をどのように保持していけばいいのか?
2:2つ目の入力された値がdivideの時に0を入力された場合、再入力させ方
3:入力と数値チェックを分割させて処理をするにはどうすればいいのか。。。
4:どこで入力ストリームを閉じれば最適なのか。。。

<実現>
・保守性を考慮した四則演算子を作成
とりあえず、
上記の<分からないこと>を解決して保守性のあるプログラムを作成したい。

該当のソースコード

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.Scanner; 5/** 6 *Create an Aritmetico Programma 7 * 8 * 9 */ 10public class AritmeticoProgramma { 11 static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 12 static Scanner sc = new Scanner(System.in); 13 final static int max = 5;// set 5 of the max digits 14/** 15 * isNum method 16 *check if the numeric value input from keyboard is less than 5 digits 17 * @return a 18 */ 19 public static int isNum() { 20 int a = 0; 21 try { 22 String str; 23 24 while ((str = br.readLine()) != null) { 25 if (!str.isEmpty()) { 26 27 28 29 if (str.length() <= max) { 30 try { 31 a = Integer.valueOf(str); 32 break; 33 } catch (NumberFormatException e) { 34 System.out.println("Please input number"); 35 } 36 37 } else { 38 System.out.println("Please input within 5 digits"); 39 } 40 }else { 41 System.out.println("0~9の整数を入力してください"); 42 } 43 } 44 45 } catch (IOException e) { 46 System.out.println("Arised an IOException"); 47 System.exit(1); 48 } 49 50 return a; 51 52 } 53 54 55 56/** 57 * add method 58 * add the two values and output the result 59 */ 60 public static void add() { 61 System.out.println("Please input the first value"); 62 int num1 = isNum(); 63 System.out.println("Please input the sec value"); 64 int num2 = isNum(); 65 66 int num3 = num1 + num2; 67 System.out.println("Calculation result:" + num1 + "+" + num2 + "=" + num3); 68 } 69 /** 70 * Substract 71 * Minus the two values and output the result 72 */ 73 74 public static void substract() { 75 System.out.println("Please input the first value"); 76 int num1 = isNum(); 77 System.out.println("Please input the sec value"); 78 int num2 = isNum(); 79 int num3 = num1 - num2; 80 System.out.println("Calculation result:" + num1 + "-" + num2 + "=" + num3); 81 } 82/** 83 * multiply 84 * multiply the two values and output the result 85 */ 86 public static void multiply() { 87 System.out.println("Please input the first value"); 88 int num1 = isNum(); 89 System.out.println("Please input the sec value"); 90 int num2 = isNum(); 91 92 int num3 = num1 * num2; 93 System.out.println("Calculation result:" + num1 + "*" + num2 + "=" + num3); 94 } 95/** 96 * divide 97 * divide the two values, extra value and output the results 98 */ 99 public static void divide() { 100 System.out.println("Please input the first value"); 101 int num1 = isNum(); 102 System.out.println("Please input the sec value"); 103 int num2 = isNum(); 104 105 int num3 = num1 / num2 + num1 % num2; 106 System.out.println("Calculation result:" + num1 + "/ " + num2 + " + " + "extra" + "+" + num1 + "%" + num2 + "=" + num3); 107 } 108/** 109 * main 110 * with following the handling number, run each method 111 * 112 * @param args 実行引数 113 */ 114 public static void main(String[] args) { 115 again: while (true) { 116 117 int n; 118 while (true) { 119 System.out.println("Please enter handling-number"); 120 System.out.println("1.add 2.substract 3.multiply 4.devide"); 121 122 n = Integer.parseInt(sc.nextLine()); 123 124 switch (n) { 125 case 1: 126 add(); 127 break; 128 case 2: 129 substract(); 130 break; 131 case 3: 132 multiply(); 133 break; 134 case 4: 135 divide(); 136 break; 137 default: 138 System.out.println("The input value is a wrong"); 139 continue again; 140 } 141 142 back: while (true) { 143 try { 144 int product; 145 System.out.println("1.continue a handling 2.end"); 146 String str; 147 while ((str = br.readLine()) != null) { 148 if (str.isEmpty()) 149 break back; 150 { 151 152 product = Integer.valueOf(str); 153 154 } 155 if (product == 1) { 156 continue again; 157 158 } 159 if (product == 2) { 160 break again; 161 } 162 163 else { 164 System.out.println("The input value is a wrong"); 165 continue back; 166 } 167 } 168 169 } catch (NumberFormatException e) { 170 System.out.println("Please enter a number"); 171 } catch (IOException e) { 172 System.out.println("arised IOException"); 173 174 } 175 } 176 } 177 } 178 } 179} 180

試したこと

知識不足で大変申し訳ないのですが、以下のようなかたちでしてみましたが未完成の状態です。

public void Input() { System.out.println("Please input the first value"); String i; i = sc.nextLine(); AritmeticoProgramma.isNumber(i); } public static boolean isNumber(String num) { try { if (!num.isEmpty()) { if (num.length() <= max) { try { int a = Integer.valueOf(num); return true; } catch (NumberFormatException e) { System.out.println("please enter a number "); } } else { System.out.println("please enter value no more than 5 digits"); } }else { System.out.println("0~9の半角・全角で入力してください。 "); } return false; }

補足情報(FW/ツールのバージョンなど)

Java_version_1.8
Eclipse_version_14

swordone👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

1:数値チェックをboolean型でした場合、戻り値はtrue or falseなので2つの入力された値をどのように保持していけばいいのか?

2:2つ目の入力された値がdivideの時に0を入力された場合、再入力させ方
3:入力と数値チェックを分割させて処理をするにはどうすればいいのか。。。
4:どこで入力ストリームを閉じれば最適なのか。。。

まず、1と3について

入力チェックと数値チェックは別メソッドにすればよいです。
staticとか可視性はいったん無視してください。

java

1// 数値入力 2int isNum() { 3 // 整数だけ返すメソッド。 Numberformatとかはここで対処 4} 5// 数値チェック 6boolean isValid(int num) { 7 // 入力された整数が有効か判断する 8 // ここでは5桁 以内(10000以上と-10000以下?をfalseとする)のチェック 9} 10// 上記2つを呼ぶメソッド 11int[] inputNumbers(String... msg) { 12 int[] ret = new int[msg.length]; 13 for(int i = 0; i < msg.length; i++) { 14 System.out.println(msg[i]); 15 while(true) { 16 ret[i] = isNum(); 17 if (isValid(ret[i])) { 18 break; 19 } 20 }; 21 } 22 return ret; 23} 24// 呼び出し 25public static void add() { 26 int[] nums = inputNumbers("Please input the first value", "Please input the sec value"); 27 28 int num3 = nums[0] + nums[1]; 29}

2:2つ目の入力された値がdivideの時に0を入力された場合、再入力させ方

他のメソッドの使い方と違いがでないように
0で割れませんを表示して処理を終了して、もう一度2つの数値を入力させるかじゃないでしょうか。
それか、divideの中でゼロのチェックして、そこだけ再入力させるか。

4:どこで入力ストリームを閉じれば最適なのか。。。

不要と判断したタイミングなのですが、AritmeticoProgramma自身では判断できないのであれば、closeメソッドを用意してmain側で閉じればいいと思います。

投稿2020/05/25 16:24

momon-ga

総合スコア4826

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

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

momon-ga

2020/05/25 16:27

あ、5桁はOKだった・・・まぁ見ればわかるか。
退会済みユーザー

退会済みユーザー

2020/05/26 06:13 編集

1と3に関しましては何とか出来ました。お忙しいところ、ご回答ありがとうございました。 2つ目の入力された値がdivideの時に0を入力された場合、再入力させ方につきましては、 2つめの値のみを再入力させる形にしたかったので、そのように修正しました。 大変お忙しい中、ご教示頂きまして、ありがとうございました。
momon-ga

2020/05/26 06:19 編集

ちなみに、 1~4に回答するようにしましたが、 swordoneさんの回答にある > 入力をswitchで分岐する前にやって、各演算を引数2つ取るように も、普通にやりますし計算ロジックをクラスにするなら入力と出力は別っていうのは一般的な考え方だと思います。
guest

0

入力をswitchで分岐する前にやって、各演算を引数2つ取るように変更し、受け取った引数で各々演算させればよい。
数値型で得る必要はなさそうなので、各演算で文字列を返すように変更し、各出力の":"以降の文字列を組み立てて返すようにすれば、"Calculation result:"も共通化できる。

投稿2020/05/25 14:54

swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問