回答編集履歴

1

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

2020/08/20 00:28

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -37,3 +37,73 @@
37
37
  }
38
38
 
39
39
  ```
40
+
41
+ **追記**
42
+
43
+ "Hello" が "Byffi" になってほしいのに "B_ffi" になる。
44
+
45
+ ということは、'e' が 'y' になってほしいのに '_' になる。
46
+
47
+
48
+
49
+ 質問のコードをトレースしてみればいいでしょう。
50
+
51
+ なぜやらないのか不思議です。
52
+
53
+
54
+
55
+ ch = 'e'、rotation = -58 で letterOperatorメソッドの実行を始めます。
56
+
57
+
58
+
59
+ ch は大文字(UpperCase) ではなくて、小文字(LowerCase)なので、
60
+
61
+ `if ((rotation % 26) + ch > 122)` に行きます。
62
+
63
+ rotation % 26 は、-58 % 26 で、-6。
64
+
65
+ ch は 'e' で 101。
66
+
67
+ したがって、(rotation % 26) + ch は 95。
68
+
69
+
70
+
71
+ 95 は 122 より大きくないので
72
+
73
+ `return (char)((rottion % 26) + ch);` に行き、95 を返す。
74
+
75
+ 95 は 'y' ではなく、'_' です。
76
+
77
+
78
+
79
+ 小文字('a'~'z')の範囲は 97~122 です。
80
+
81
+ 95 はその範囲から外れています。
82
+
83
+
84
+
85
+ rotation が負の場合、% 26 の結果も 0 か負です。
86
+
87
+ ch にそれを足すと 'a' より前になることがあるのです。
88
+
89
+ 次のようにしないといけないでしょう。
90
+
91
+ ```Java
92
+
93
+ if ((rotation % 26) + ch > 'z')
94
+
95
+ return (char) ((rotation % 26) + ch - 26);
96
+
97
+ if ((rotation % 26) + ch < 'a')
98
+
99
+ return (char) ((rotation % 26) + ch + 26);
100
+
101
+ else
102
+
103
+ return (char) ((rotation % 26) + ch);
104
+
105
+ ```
106
+
107
+ コード中に 90 とか 122 と書くと何のことか分かりません。
108
+
109
+ 'Z' や 'z' と書きましょう。