teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

質問のコードの問題点の指摘を追加

2020/08/20 00:28

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -17,4 +17,39 @@
17
17
  System.out.println(s2);
18
18
  }
19
19
  }
20
- ```
20
+ ```
21
+ **追記**
22
+ "Hello" が "Byffi" になってほしいのに "B_ffi" になる。
23
+ ということは、'e' が 'y' になってほしいのに '_' になる。
24
+
25
+ 質問のコードをトレースしてみればいいでしょう。
26
+ なぜやらないのか不思議です。
27
+
28
+ ch = 'e'、rotation = -58 で letterOperatorメソッドの実行を始めます。
29
+
30
+ ch は大文字(UpperCase) ではなくて、小文字(LowerCase)なので、
31
+ `if ((rotation % 26) + ch > 122)` に行きます。
32
+ rotation % 26 は、-58 % 26 で、-6。
33
+ ch は 'e' で 101。
34
+ したがって、(rotation % 26) + ch は 95。
35
+
36
+ 95 は 122 より大きくないので
37
+ `return (char)((rottion % 26) + ch);` に行き、95 を返す。
38
+ 95 は 'y' ではなく、'_' です。
39
+
40
+ 小文字('a'~'z')の範囲は 97~122 です。
41
+ 95 はその範囲から外れています。
42
+
43
+ rotation が負の場合、% 26 の結果も 0 か負です。
44
+ ch にそれを足すと 'a' より前になることがあるのです。
45
+ 次のようにしないといけないでしょう。
46
+ ```Java
47
+ if ((rotation % 26) + ch > 'z')
48
+ return (char) ((rotation % 26) + ch - 26);
49
+ if ((rotation % 26) + ch < 'a')
50
+ return (char) ((rotation % 26) + ch + 26);
51
+ else
52
+ return (char) ((rotation % 26) + ch);
53
+ ```
54
+ コード中に 90 とか 122 と書くと何のことか分かりません。
55
+ 'Z' や 'z' と書きましょう。