新人の時に作ったプログラムを、2年目になった今はあっさり書けるのか、はたまた忘れてしまっているのか・・
と思ったので、作ってみました。
結論
* とりあえず動くものは作れる(ただしほぼEclipseのおかげ感もある)
* 新人の時は疑問に思わなかったことを、疑問に思う
問題
- ソースファイル名「Check22.java」
- 2数(整数)と演算方法(1文字)を入力します
- 指定した演算を行い、計算結果を出力します
- 計算方法による処理の分岐はswitch文を使用してください
- その他の詳細は以下の実行結果を参考にしてください
1つめの数値を入力してください>
10
2つめの数値を入力してください>
3
計算方法を選択してください>
(a)加算
(b)減算
(c)乗算
(b)除算
d
答えは3です
実装
以下のように作りました。
Check22.java
package practice;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Check22 {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
int num1 = 0;
int num2 = 0;
try {
System.out.println("1つ目の数値を入力してください");
line = reader.readLine();
num1 = Integer.parseInt(line);
System.out.println("2つ目の数値を入力してください");
line = reader.readLine();
num2 = Integer.parseInt(line);
System.out.println("計算方法を選択してください");
System.out.println("(a)加算");
System.out.println("(b)減算");
System.out.println("(c)乗算");
System.out.println("(d)除算");
line = reader.readLine();
if (!( line.equals("a")) && !( line.equals("b") )&& !( line.equals("c") )&& !( line.equals("d"))) {
System.out.println("a,b,c,dのどれかを入力してください");
}else {
String symbol = line;
int answer = calc(num1,num2,symbol);
System.out.println("答えは" + answer + "です。");
}
}catch(NumberFormatException e) {
System.out.println("数値を入力してください");
}catch (IOException e) {
e.printStackTrace();
}
}
public static int calc(int num1, int num2, String symbol) {
int result;
switch(symbol) {
case "a":
result = num1 + num2;
break;
case "b":
result = num1 - num2;
break;
case "c":
result = num1 * num2;
break;
default:
result = num1 / num2;
break;
}
return result;
}
}
疑問点
- calcメソッドのswitch文に、breakを書かないとすべての処理が走ってしまう
ー最初はbreak;を書いておらず、aを入力しても、全てのcaseの処理を通ってしまって、思った通りの結果になりませんでした。case"a":に入ったら、aのところだけしか処理されないと思っていましたが、break;がくるまで、処理がおわらないことを知りました。(去年はとりあえずbreak;って書いているからbreak;を付けようというノリで書いていた気がします。) - calcメソッドにstaticをつけないとエラーになる(エラー内容:型Check22の非staticメソッドcalc(int,int,string)をstatic参照することはできません)
ー同じクラスにあるメソッドなんだから、staticつけなくても参照できるでしょ!と思っていました。エラー内容そのままですが、staticがついているメソッドは、非staticメソッドを直接使うことができないことを知りました。staticメソッドはインスタンスに関連づいていないところで管理されるので、非staticメソッドから参照しようと思っても、「これどこのインスタンスのメソッドなの?」と判断がつかない状況になるので、コンパイルエラーになるよう。なんとなくわかったような気がします。
(けどmainメソッドはstaticなメソッドなので、そこからメソッドを参照しようと思ったら全部のメソッドにstaticつけないといけなくなる気がするのですが、どうしたらいいんだろうっていうところが未解決です。)
感想
- たぶん1年目のころは例外処理とか考えてなかったかも
- 変数名とかメソッド名を考えるのが苦手