我写过这个简单的程序,包括一个编码消息的方法(Caesar的密码)...虽然不起作用,但我认为它与我的if条件有关,因为字母会偏离'Z' '(因此重置到字母表的开头)。
我在网上找到了凯撒密码的其他代码,它使用了StringBuilders和我还没有学过的其他方法。这很棒,我期待有一天能到达那里,但与此同时,我的代码出了什么问题?
无需给我答案,但我会非常感激提示。 :)
import java.util.*;
class Exercice4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a message:");
String msg = (sc.nextLine()).toUpperCase();
System.out.println("Enter a value for K:");
int k = sc.nextInt();
caesar(msg, k);
}
public static void caesar(String A, int B) {
char str[]=A.toCharArray();
String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i=0; i<A.length(); i++) {
for (int j=0; j<26; j++) {
if (alpha.charAt(j) == str[i]) {
if ((j+B)>25) {
str[i] = alpha.charAt(j + B - 26);
} else {
str[i] = alpha.charAt(j + B);
}
}
}
}
String code = new String (str);
System.out.println("Here is your encoded message: ");
System.out.println(A);
System.out.println(code);
}
}
答案 0 :(得分:3)
当你查找(第二个for-loop)一个字母并找到它时,你必须退出该字母以避免重复这些内容。
例如,如果输入字符串是“A”且k = 2:
你在字母A中寻找字母A并用字母C改变它。当bucle继续迭代alpha时你会发现C并用E.等改变它。
放置断点并逐步执行。
答案 1 :(得分:-1)
虽然您的实现可以在给定正确的偏移数字的情况下工作,但您可以尝试一些更简单的方法。
你需要知道的是,一个角色可以被解释为一个整数,中间没有任何黑魔法。
char x = 'A';
System.out.println((int) x); //65
利用这个我们的优势,我们可以像这样实施凯撒:
public static String caesar(String A, int B) {
char[] newString = A.toCharArray();
for(int i = 0; i < A.length(); i++){
int newChar = newString[i]+B;
while(newChar > 65+26) // 65 = A, 26 = number of letters in the alphabet
newChar -= 26;
newString[i] = (char) (newChar);
}
return new String(newString);
}