JAVAに関する質問
受付中
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,974
JAVAで以下のプログラムを作成しました。
import java.util.Scanner;
public class Sample {
//main
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int i = 0;
while(true) {
i++;
//数値を入力
System.out.print("入力 ");
int num1 = stdin.nextInt();
System.out.print("入力 ");
int num2 = stdin.nextInt();
int answer = 0; //計算結果
//1を入力したら加算、2を入力したら減算
System.out.print("1 or 2 ");
int number = stdin.nextInt();
switch(number) {
case 1:answer = add(num1,num2);
break;
case 2:answer = subtract(num1,num2);
break;
}
System.out.println("answer " + answer);
System.out.print("\n");
}
}
//加算
static int add(int num1,int num2) {
int x = num1 + num2;
return x;
}
//減算
static int subtract(int num1,int num2) {
int x = num1 - num2;
return x;
}
}
addメソッドとsubtractメソッドを作成し、1か2が入力されることにより加算または減算を行うプログラムを作成しました。
このプログラムのままで実行できるのですが、やや冗長に感じます。
どの部分を修正すればもっとさっぱりしたわかりやすいプログラムになるでしょうか。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
足し算、引き算の処理をメソッドとして定義せずに ラムダ式として記述して簡潔に表示させるようにしてみました。
この様に書いておくと、+, - 以外の計算処理を追加するのが 比較的 楽になると思います。
import java.util.HashMap;
import java.util.Scanner;
public class Sample {
// 計算処理のインターフェース
@FunctionalInterface
private interface Operation {
public int calc(int v1, int v2);
}
// 足し算、引き算の計算処理を Map に登録。
static HashMap<Integer, Operation> Ope = new HashMap<Integer, Operation>() {
{
put(1, (int v1, int v2) -> {return v1 + v2;}); // 足し算
put(2, (int v1, int v2) -> {return v1 - v2;}); // 引き算
put(3, (int v1, int v2) -> {return v1 * v2;}); // 掛け算
}
};
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
while (true) {
// 数値を2つ入力
System.out.print("入力 その1: ");
final int num1 = stdin.nextInt();
System.out.print("入力 その2: ");
final int num2 = stdin.nextInt();
// 計算種類を入力
System.out.print("1 or 2 or -1 (1:足し算, 2:引き算, 3:掛け算, その他:終了");
int number = stdin.nextInt();
// 計算結果を表示
if (Ope.get(number) != null) {
System.out.println(Ope.get(number).calc(num1, num2));
} else {
System.out.println("終了します。");
break;
}
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
せっかくなので回答も。
enumを使うという手もあります。
import java.util.Arrays;
import java.util.Scanner;
import java.util.function.IntBinaryOperator;
import java.util.stream.Collectors;
public class Q10001 {
enum Operate implements IntBinaryOperator {
ADD("足し算", Integer::sum),
SUBTRUCT("引き算", (i1, i2) -> i1 - i2),
MULTIPLY("掛け算", (i1, i2) -> i1 * i2);
private String name;
private IntBinaryOperator op;
private Operate(String name, IntBinaryOperator operator) {
this.name = name;
op = operator;
}
@Override
public String toString() {
return ordinal() + ": " + name;
}
@Override
public int applyAsInt(int left, int right) {
// TODO 自動生成されたメソッド・スタブ
return op.applyAsInt(left, right);
}
}
public static void main(String[] args) {
Operate[] ops = Operate.values();
String str = Arrays.stream(ops).map(String::valueOf).collect(Collectors.joining(", ", "", ", その他: 終了"));
try (Scanner stdin = new Scanner(System.in)){
while (true) {
// 数値を2つ入力
System.out.print("入力 その1: ");
final int num1 = stdin.nextInt();
System.out.print("入力 その2: ");
final int num2 = stdin.nextInt();
// 計算種類を入力
System.out.print(str);
int number = stdin.nextInt();
if (0 <= number && number < ops.length) {
System.out.println(ops[number].applyAsInt(num1, num2));
} else {
System.out.println("終了します。");
break;
}
}
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-3
クラスを使ってやってみました。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("加法 -> 1 減法 -> 2 を入力");
int n = Integer.parseInt(sc.nextLine());
int num1, num2;
System.out.println("2つの数字を入力");
num1 = Integer.parseInt(sc.nextLine());
num2 = Integer.parseInt(sc.nextLine());
Calculation calc = new Calculation(num1,num2);
calc.print_answer(n);
System.out.println();
}
}
class Calculation{
private int MyNum1;
private int MyNum2;
public Calculation(int num1,int num2){
MyNum1 = num1;
MyNum2 = num2;
}
public void print_answer(int n){
n = n % 2;
if(n == 0){
MyNum2 *= -1;
}
System.out.println(MyNum1 + MyNum2);
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/11/23 22:04
またMapへの値のセットはdouble brace idiomを使うよりもMap.ofを使った方がエレガントです.
さらに今回のラムダ式はbraceとreturnが省けます.
あとは好みによるかもしれませんが,Operation extends BiFunction<Integer, Integer, Integer>でも良さそうです.
2017/11/23 22:40 編集
まあOperationは既存のIntBinaryOperatorが使えますが
上がってきたからコメントしてしまったけど質問番号が若くてよく見たら2年半前の質問…
2017/11/23 23:12
質問が上の方に表示されたのでてっきり最近のものかと.
IntBinaryOperatorもおっしゃるとおりです.