我正在尝试创建一个caesar密码,我将输入作为程序中的硬代码。当我运行该程序时,它可以工作,但应该是一个" Y"是"?"。我无法弄清楚如何循环ASCII,所以当它小于65时,它会增加26或循环回90.这是我到目前为止的代码。转变为-3来解读它。
import java.util.Scanner;
public class Caesar {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Enter the shift value");
int shiftValue = in.nextInt();
String ciphertext = "WKHQHZRUNLQJDQGFBEHUVHFXULWBGHSDUWPHQWDWURVHVWDWHF ROOHJHRIIHUVDFHUWLILFDWHSURJUDPLQLQIRUPDWLRQVHFXULWBDW DOOIHGHUDOWUDLQLQJOHYHOVWKHSURJUDPFHUWLILHVWKHVWXGH QWVVDWLVIBLQJSURJUDPUHTXLUHPHQWVDUHWUDLQHGWRWKHIHGH UDOQVWLVVLFQVVLVWDQGDUGVIRULQIRUPDWLRQVBVWHPVVHFXUL WBSURIHVVLRQDOVGHVLJQDWHGDSSURYLQJDXWKRULWLHVLQIRUPD WLRQVBVWHPVHFXULWBRIILFHUVVBVWHPVFHUWLILHUVDQGULVNDQ DOBVWUHVSHFWLYHOB";
//System.out.print(ciphertext);
System.out.println();
//I take each character, convert it to its ascii value, subtract 3,
//then convert back to a character
for(int i=0; i <= 48; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=49; i <= 102; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=103; i < 152; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=152; i < 200; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=200; i < 248; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=248; i < 307; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=307; i < 348; i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
System.out.println();
for(int i=348; i < ciphertext.length(); i++) {
System.out.print((char)((int)ciphertext.charAt(i)+shiftValue));
}
//System.out.print((char)((int)ciphertext.charAt(1)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(2)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(3)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(4)+shiftValue));
//System.out.print((char)((int)ciphertext.charAt(5)+shiftValue));
//System.out.println();
}
} // end main
// end class Assign1
答案 0 :(得分:1)
你可以检查结果值是否超出大写字母的范围并适当地调整它:
char cipher(char input,int shift){
shift%=26; //incase the shift is really big
input+=shift; //first shift the input charachter
if(input>'Z') //if its over 'Z' shift it down into range
input-=26;
else if(input <'A') //if its below 'A' shift it up into range
input+=26;
return input;
}
此外,使用String []作为输入会更容易,而不是计算每个lne结束的位置
答案 1 :(得分:1)
首先,我建议采取这个:
(char)((int)ciphertext.charAt(i)+shiftValue)
并使其成为一个单独的方法:[1]
public char newChar(char oldChar, int shiftValue) {
return (char)((int)ciphertext.charAt(i)+shiftValue);
}
现在我们有了这种方法,我们可以问一下这是怎么回事。如果您致电newChar('B', -3)
,则所需的输出为Y
,您实际获得的内容为?
。
public char newChar(char oldChar, int shiftValue) {
int value = (int)ciphertext.charAt(i);
value = value + shiftValue;
// do something here
return (char) value;
}
这可能是学校作业,所以我不会为您填写所有细节。我希望这能为你提供一条如何进行的明确途径。
[1]任何时候你多次写同样的东西,它都是refactoring的好候选人。