2016-04-12 5 views
0

Ich habe dieses Programm, das einen Buchstaben oder ein Wort entsprechend dem angegebenen Wert ausgeben wird, der von einem Benutzer eingegeben wird. Wenn beispielsweise ein Benutzer den Buchstaben a eintippt, dann gibt der Benutzer erneut eine Nummer ein (z. B. 2), die Ausgabe wird c sein. In meinem Programm funktioniert es, wenn ein Benutzer einen einzelnen Buchstaben eingibt und der Buchstabe bis z. Wenn ein Benutzer jedoch ein Wort eingibt, das die Zahl für Buchstabe z überschreitet, wird keine Ausgabe ausgegeben. Beispiel: Benutzertypen in xyz und Typ 4, die übersprungen werden sollen, gibt es keine Ausgabe.Keine Ausgabe beim Überspringen von Buchstaben (Buchstabe z), wenn der Benutzer eine Zahl eingibt, um einen Buchstaben zu überspringen

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

Den ersten, was zu beheben: Entfernen Sie die Ausnahme-Schlucke, und stattdessen fixieren Sie Ihre for-Schleife nur eine Schleife über jeden Buchstabe in der Zeichenfolge. Als nächstes würde ich die Ausgabe einfach auf den Bildschirm anstatt in eine Datei drucken, und ich würde auch den ganzen Code in die "main" -Methode setzen, anstatt einen Haufen Felder ohne Grund zu haben und Code in den Konstruktor zu schreiben. All dies macht es einfacher, den Code zu lesen und zu sehen, was falsch ist.Ich würde auch vorschlagen, dass Ihre IDE den Code formatiert und ihn entsprechend einrückt. Nach all diesen Änderungen bearbeiten Sie Ihre Frage mit dem einfacheren Code. –

+1

Ich denke, es macht was es soll und gibt 'lipps' aus. Warum sollte die Ausgabe "lippi" für "Hallo" sein? – Sachin

+0

@ jay-gorio Eingabe: 'Hallo', Nummer: '4'. Dann: h + 4 = l, e + 4 = i, l + 4 = p, o + 4 = s. Wenn 'o' geparst würde, was würde' e' geparst werden? Der Code funktioniert einwandfrei. – liggiorgio

Antwort

1

Sie keine Ausgabe sehen, weil Sie eine ArrayIndexOutOfBoundsException bekommen, wenn Sie versuchen, characters Array Vergangenheit z zuzugreifen, da Sie die Ausnahme schlucken sind Sie nicht in der Lage, es zu sehen.

Wenn Sie nach z zu Ihrem characters Array zurückkehren möchten, verwenden Sie das Modulo-Ergebnis, um den Index zu erhalten. etwas wie das.

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]); 
      } 
     } 
    } 

Wenn Sie wollen einfach nur etwas ignorieren, die Vergangenheit z geht dann die Verwendung unter

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

Ich habe auf den Code angesehen und versucht, es (ich weiß, dass ich wahrscheinlich wie Sie diese Sache lernen müssen, sollten nicht haben, aber tat dies im Interesse der Beantwortung der Frage) zu korrigieren, um den Spezifikationen im Kommentar zu Ihrer Frage von Jon Skeet oben:

Erste Sache zu beheben: Entfernen Sie die Ausnahme-Schluck, und stattdessen reparieren Sie Ihre for-Schleife, nur über jeden Buchstaben in der Zeichenfolge Schleife. Als nächstes würde ich die Ausgabe einfach auf den Bildschirm anstatt in eine Datei drucken, und ich würde auch den gesamten Code in die Hauptmethode einfügen, anstatt einen Haufen Felder ohne Grund zu haben und Code in den Konstruktor zu schreiben. All dies macht es einfacher, den Code zu lesen und zu sehen, was falsch ist. Ich würde auch vorschlagen, dass Ihre IDE den Code formatiert und ihn entsprechend einrückt. Nach all diesen Änderungen bearbeiten Sie Ihre Frage mit dem einfacheren Code.

wie folgt ist eine Implementierung des Codes an die Spezifikation:

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(); 
    } 

} 

Dieser Code scheint Ihr Beispiel auch gegeben zu arbeiten. Der Code führt dazu, dass hallo in lipps umgewandelt wird, wenn der Benutzer vier (4) als die Menge angibt, um die das Alphabet geändert werden soll. Dies ist jedoch die korrekte Ausgabe, wenn der Code h + 4 = 1, e + 4 = i, 1 + 4 = p und o + 4 = s ist.

Der Ausgang I von der Konsole erhalten, wenn „Hallo“ der erste Eingang ist:

Enter text: hello 
Enter number: 4 
lipps 

und mit nur „o“:

Enter text: o 
Enter number: 4 
s 

Die Antwort auf Ihre Frage scheint zu sein, dass du vermisst hast, was die Ausgabe sein soll.

+0

Ja Entschuldigung, das ist mein Fehler Ich habe es übersehen. Das Problem hier ist, dass wenn ich z gebe und 2 eingeben, wird es keine Ausgabe geben. Dies ist die Herausforderung, der ich mich jetzt stellen muss. Kannst du mir bitte dabei helfen? –

+0

Das Problem ist, dass 26 + eine Zahl größer als die Anzahl der Buchstaben im Alphabet sein wird. Der Weg, um dies zu umgehen wäre eine if-Anweisung hinzuzufügen, so dass, wenn die Zahl + c größer als 26 ist, die Zeichen [num + c-26] verwenden. Wie folgt: 'if (num + c <26) { \t \t \t \t \t \t System.out.print (Zeichen [num + c]); \t \t \t \t \t \t} else { \t \t \t \t \t \t \t System.out.print (Zeichen [num + c - 26]); \t \t \t \t \t \t} ' – BootsElectric

Verwandte Themen