2016-04-12 47 views
0

我有這個程序會根據用戶輸入的指定值輸出一個字母或單詞。例如,當用戶鍵入字母a時,則用戶將再次鍵入一個數字(例如2),輸出將是c。在我的程序中,當用戶鍵入單個字母並且字母是z時,它正在工作。但是,當使用鍵入的單詞超過字母z的數字時,將不會有輸出。例如用戶輸入xyz,輸入4跳過,沒有輸出。當用戶輸入號碼跳過字母時跳過字母(字母z)時沒有輸出

public class FinalsActivity2 { 
    Scanner fc = new Scanner(System.in); 
    char characters[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 
    File file = new File("C:\\Users\\TeonGo\\Desktop\\final2.txt"); 
    PrintWriter pw = new PrintWriter(file); 

    public FinalsActivity2() throws IOException { 
     System.out.print("Enter text:"); 
     String text = fc.nextLine(); 
     System.out.print("Enter number:"); 
     int num = Integer.parseInt(fc.nextLine()); 

     try { 
      for (int f = 0; ; f++) { 
       for (int c = 0; c < 26; c++) { 
        if (text.charAt(f) == characters[c]) { 
         pw.print(characters[num + c]); 
        } 
       } 
      } 
     } catch (Exception e) { 
     } 
     pw.close(); 
    } 

    public static void main(String[] args) throws IOException { 
     new FinalsActivity2(); 
    } 
} 
+4

第一件事就是來解決:去除異常吞嚥,而是解決您的for循環來對每個剛剛循環字符串中的字母。接下來,我只是將輸出打印到屏幕上而不是文件中,並且我還將所有代碼放入'main'方法中,而不是無意中有一堆字段,並將代碼放入構造函數中。所有這些都會使閱讀代碼變得更加容易,並查看錯誤。我還建議讓你的IDE格式化代碼,並適當地縮進它。完成所有這些更改後,使用更簡單的代碼編輯您的問題。 –

+1

我認爲它正在做它應該做的事情並輸出'lipps'。爲什麼輸出是'hello'的'lippi'? – Sachin

+0

@ jay-gorio輸入:'hello',數字:'4'。然後:'h + 4 = 1','e + 4 = i','1 + 4 = p','o + 4 = s'。如果'o'被解析爲'i',那麼會被解析爲什麼?代碼工作正常。 – liggiorgio

回答

1

您沒有看到任何輸出,因爲您在嘗試訪問characters陣列時通過z獲取ArrayIndexOutOfBoundsException,因爲您正吞嚥您無法看到的異常。

如果您想在回到z時回到characters陣列,請使用取模索引的模數結果。像這樣的東西。

for (int f = 0; f < text.length(); f++) { 
     for (int c = 0; c < characters.length; c++) { 
      if (text.charAt(f) == characters[c]) { 
       int idxToGet = (num + c) % characters.length; 
       pw.print(characters[idxToGet]); 
      } 
     } 
    } 

如果你想忽略任何進入過去z然後用下面

for (int f = 0; f < text.length(); f++) { 
     for (int c = 0; c < characters.length; c++) { 
      int idxToGet = num + c; 
      if (text.charAt(f) == characters[c] && idxToGet < characters.length) { 
       pw.print(characters[idxToGet]); 
      } 
     } 
    } 
1

我看了你的代碼,並試圖糾正 (我知道我可能不應該有,因爲你需要學習這些東西,但在回答問題時的利益這樣做)的規格從上面的Jon Skeet對你的問題發表評論:

第一件要解決的問題:除去異常吞嚥,而是修復你的for循環,只是循環每個字母的字母。接下來,我只是將輸出打印到屏幕上而不是文件中,並且我還將所有代碼放入主方法中,而不是無緣無故地將一堆字段放入構造函數中。所有這些都會使閱讀代碼變得更加容易,並查看錯誤。我還建議讓你的IDE格式化代碼,並適當地縮進它。完成所有這些更改後,使用更簡單的代碼編輯您的問題。

如下是你的代碼的實現,以上述指定:

import java.util.Scanner; 

public class Test { 

private Scanner sc = new Scanner(System.in); 
private char characters[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m', 
      'n','o','p','q','r','s','t','u','v','w','x','y','z'}; 

    public static void main(String[] args){ 
     Test test = new Test(); 
     test.FinalsActivity2(); 
    } 

    public void FinalsActivity2(){ 
     System.out.print("Enter text: "); 
     String text = sc.nextLine(); 
     System.out.print("Enter number: "); 
     int num = Integer.parseInt(sc.nextLine()); 
     for(int f = 0; f < text.length(); f++){ 
      for(int c = 0; c < 26; c++){ 
       if (text.charAt(f) == characters[c]){ 
        System.out.print(characters[num + c]); 
       } 
      } 
     } 
    sc.close(); 
    } 

} 

此代碼似乎工作以及給你的榜樣。 當用戶給出四(4)作爲更改字母表的數量時,代碼確實會導致hello被轉換爲lipps。然而,這是給定碼h + 4 = 1,e + 4 = i,l + 4 = p和o + 4 = s的正確輸出。

我從當「你好」是第一個輸入控制檯得到的輸出是:

Enter text: hello 
Enter number: 4 
lipps 

,並與剛剛「O」:

Enter text: o 
Enter number: 4 
s 

的回答你的問題似乎是你錯過了計算輸出的結果。

+0

對不起,這是我的錯誤,我忽略了它。這裏的問題是,當我輸入z並輸入2時,將不會有輸出。這是我現在面臨的挑戰。你能幫我解決這個問題嗎? –

+0

問題是26 +任何數字都會大於字母表中的字母數。解決這個問題的方法是添加一個if語句,以便當num + c大於26時使用字符[num + c-26]。像這樣:'if(num + c <26){System.out.print(characters [num + c]); \t \t \t \t \t \t}否則{ \t \t \t \t \t \t \t是System.out.print(字符[NUM + C - 26]); \t \t \t \t \t \t}'' – BootsElectric