2014-07-19 110 views
0

我想創建一個凱撒密碼,我有輸入作爲程序中的硬代碼。當我運行該程序時,它的工作原理是,但應該是「Y」的所有內容都是「?」。我無法弄清楚如何循環ASCII,所以當它小於65時,它會增加26或循環回到90.下面是我到目前爲止的代碼。這個轉變是-3來破譯它。凱撒密碼幫助ASCII循環

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 
+1

如果爲'ciphertext'包含一個短得多的字符串,只顯示不起作用的部分,那麼您的示例將更容易閱讀。你也可以刪除所有的for循環。 –

+1

你需要在紙上逐步寫出你的邏輯,找出你如何循環訪問字符串。如果你在紙上做這個,你會完全循環七次嗎?不,我不這麼認爲。你只需循環**一次**。所以在這裏做同樣的事情。 –

回答

1

你可以檢查結果值超出側大寫字母的範圍和approriately進行調整:

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

首先,我建議採取這樣的:

(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