Verschiebechiffre

brnhrd

Mitglied
Hallo!

Ich hätte ja an sich schon gesucht, bin aber irgendwie nicht wirklich weitergekommen, und nun wollt ich fragen wie ich so einen Verschiebechiffre machen kann.

Java:
public class caesar {
	public static void main (String [] args){
		
		int key = 1;
		char c = 0;
		
		System.out.println("");
                System.out.println("Caesar Chiffre.");	
                System.out.println("");
			
		while (key > 0){
			System.out.print("Bitte einen Schlüssel eingeben (0 oder weniger zum beenden): ");
			key = Input.readInt();
				
			if (key > 0){
				System.out.print("Zu codierenden Text eingeben: ");
				
				while (c != '\n'){
					c = Input.readCharSequence ();
					
					System.out.print(c);
				}
			}
		}		
}
}

Dieser Code liest die Zeichenfolge ein.
Gibt man abc ein, wird abc wieder ausgegeben.

Meine Frage lautet nun, wie kann ich mit char und int den eingegebenen Schlüssel berücksichtigen?

Bitte um Hilfe, ich glaub ich denk da irgendwie zu umständlich...auch wenn die Problemstellung wohl denkbar einfach ist...
 

Ditoran

Mitglied
Ich hoffe, ich verstehe dich richtig. Du willst also die eingegebene Buchstabenfolge um den eingegebenen Schlüssel im alphabet verschieben?

Spontan fällt mir folgendes ein:

Java:
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Das hier ist der "Hilfsstring", im die Indizes der einzelnen Buchstaben zu bekommen.

Du könntest jetzt mit
Java:
int index = alphabet.indexOf(c)
nachschauen, welchen Index der Buchstabe hat, und dann "key" zu "index" addieren.

Der nächste Schritt wäre das Aussuchen des nun verschlüsselten Buchstabes:

Java:
char verschluesselt = alphabet.charAt(index);

Das wäre dann dein neuer Buchstabe.

Aber Achtung! Beachte, dass du natürlich den Index im Auge behältst. Er darf nicht größer werden, als Buchstaben im Alphabet vorhanden sind und muss wieder von vorne anfangen, wenn du am Ende des Alphabets angekommen bist. Das kannst du dann direkt nach der Berechnung des neuen Index durch ein einfaches if lösen:

Java:
if (index>=26) {
   crypto = crypto - 26;
}
 
Zuletzt bearbeitet:

brnhrd

Mitglied
Danke vielmals für die Hilfe!

Es hat schonmal gut funktioniert, und es schiebt auch weiter.

Einziges Problem ist das mir am Schluss immer noch ein Buchstabe dazugegeben wird.

Sprich, wenn ich abc um 1 verschiebe, gibt es mir bcda aus....keine Ahnung woher dieses weitere a dann kommt, hmmm...

Hier der Code:
Java:
public class caesar {
	public static void main (String [] args){
		
		int key = 1;
		int index = 0;
		char c = 0;
		char verschluesselt;
		String alphabet = "abcdefghijklmnopqrstuvwxyz";
	
	
		System.out.println("");
        System.out.println("Caesar Chiffre.");	// Spieltitel
        System.out.println("");
	
		System.out.print("Bitte einen Schlüssel eingeben (0 oder weniger zum beenden): ");
		key = Input.readInt();				
		

				System.out.print("Zu codierenden Text eingeben: ");

				while (c != '\n') {
					c = Input.readCharSequence ();
					index = alphabet.indexOf(c);
					//index = index * (-1);
					verschluesselt = alphabet.charAt(index+key);
					System.out.print(verschluesselt);	
					//System.out.print(c);
					//System.out.print(index);				
				}				
				System.out.println("");
	}
}
 

Ditoran

Mitglied
Also deine while-Schleife bekommt im letzten Durchgang als char einen Zeilenumbruch ("\n"). Nun wird geschaut, welchen Index der Zeilenumbruch hat. Da dieser nicht im Alphabet vorhanden ist, gibt die Methode den Index -1 zurück. Und -1+1=0, also wird ein a ausgegeben.

Du musst also die Schleife unterbrechen, bevor der Zeilenumbruch verarbeitet wird.
 
Zuletzt bearbeitet:

brnhrd

Mitglied
Hab mir schon sowas in die Richtung gedacht, hätt jetzt eine if schleife eingebaut die beendet wenn ein Enter kommt, nur funktioniert das irgendwie nicht...

Java:
while (c != '\n') {
					
					if (c == '\n') {
						System.exit(0); 
					
					} else {
					c = Input.readCharSequence ();
					index = alphabet.indexOf(c);
					verschluesselt = alphabet.charAt(index+key);
					System.out.print(verschluesselt);	
			
					}
				}
 

Ditoran

Mitglied
Die if-Abfrage (if-Schleifen gibt es nicht :bae:) sollte eher an die Stelle, nachdem der char eingegeben wurde, also nach der Zeile
Java:
c = Input.readCharSequence ();

Statt "System.exit" reicht ein einfaches "break;".
 
Zuletzt bearbeitet:

brnhrd

Mitglied
Haha, vielen Dank!
Entschuldige den Fauxpas, im Eifer des Gefechts ist mir das so passiert! :)

Hab noch eingebaut das es Leerzeichen auch versteht, funktioniert jetzt!

Java:
public class chiffre {
	public static void main (String [] args){
		
		int key = 1;
		int index = 0;
		char c = 0;
		char verschluesselt;
		String alphabet = "abcdefghijklmnopqrstuvwxyz";

		System.out.println("");
        System.out.println("Caesar Chiffre.");	// Spieltitel
				
		System.out.println("");
		System.out.print("Bitte einen Schlüssel eingeben (0 zum beenden): ");
		key = Input.readInt();
			
		System.out.print("Zu codierenden Text eingeben: ");
				
			while (c != '\n') {
					c = Input.readCharSequence ();
					
					if (c == '\n') {
                        break; 
					} else {
					
										
					if (c == ' ') {
                        System.out.print(" ");
    				} else {
					
					index = alphabet.indexOf(c);
					//index = index * (-1);
					verschluesselt = alphabet.charAt(index+key);
					System.out.print(verschluesselt);	
					//System.out.print(c);
					//System.out.print(index);	
					
					}
				}
		}
		
		System.out.println("");
		System.out.println("");

}
}

Nochmal danke für die Hilfe!
 

brnhrd

Mitglied
Eine kleine Frage hätt ich noch, ich wollte jetzt noch ein While rundherum bauen, damit es erst bei der Eingabe von 0 beendet und sonst immer wieder das Programm durchläuft.

Jetzt hätte ich die while eingebaut, nur springt es beim zweiten mal einfach über die Texteingabe?
Was hab ich da falsch gemacht?



Java:
public class chiffre {
	public static void main (String [] args){
		
		int key = 1;															// Um die Variable key wird verschoben
		int index = 0;															// Der Index gibt den Ort des Buchstabens an
		char c = 0;																// c ist der jeweils eingegebene Buchstabe
		char verschluesselt;													// verschluesselt gibt den verschlüsselten Text aus 
		String alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
																				// mit diesem String bekommen wir die Indizes des Textes.
		System.out.println("");
        System.out.println("Caesar Chiffre.");									// Titel des Programms
				
		System.out.println("");
				
		while (key > 0){

		System.out.print("Bitte einen Schlüssel eingeben (0 zum beenden): "); 	// Eingabe des Werts um den verschoben werden soll
		key = Input.readInt();													// Bei 0 wird beendet
		
		if (key == 0){
		  	System.out.println(""); 
		  	System.exit(0);		  	
		} else {


		System.out.print("Zu codierenden Text eingeben: ");						// Eingabe des Textes
				
			while (c != '\n'){													// Solange kein Enter gedrückt wird, wird der Text verschlüsselt
					c = Input.readCharSequence ();		
					
					if (c == '\n'){												// Sollte ein Enter kommen endet die Verschlüsselung
                        break; 
					} else {						
						if (c == ' '){											// Kommt eine Leertaste wird eine solche ausgegeben
                    	    System.out.print(" ");
    					} else {
							index = alphabet.indexOf(c);						// Zeigt den Index des eingegeben Texts ei
							if (index > 26){									// Ist der Index zu groß, fängt es wieder von vorne an
                    		    index = index - 26;	
    						} else {
					
								verschluesselt = alphabet.charAt(index+key);	// Verschlüsselung mit dem eingegeben Key
								System.out.print(verschluesselt);				// Ausgabe des Buchstaben
							}
						}
					}
			}
		}
		System.out.println("");													
		System.out.println("");
		
		}
}
}
 

Ditoran

Mitglied
Ich glaube ich hab den Fehler gefunden. In der 2. Runde enthält dein c noch den Zeilenumbruch. Du könntest in Zeile 25
Java:
c = 0;
einsetzen, um die Variable nach jedem "Start einer neuen Runde" zurückzusetzen.

Aber noch zwei Sachen, die mir aufgefallen sind:

Was beabsichtigst du mit dem ewig langen Alphabet-String? Durch die Regelung, dass es bei 26 wieder am Anfang anfängt, reicht das Alphabet doch einmal aus, oder?

Das Zweite sind die Zeilen 34-45:
Java:
if (c == ' '){                                          // Kommt eine Leertaste wird eine solche ausgegeben
     System.out.print(" ");
} else {
     index = alphabet.indexOf(c);                        // Zeigt den Index des eingegeben Texts ei
     if (index > 26){                                    // Ist der Index zu groß, fängt es wieder von vorne an
        index = index - 26;
     } else {
                   
        verschluesselt = alphabet.charAt(index+key);    // Verschlüsselung mit dem eingegeben Key
        System.out.print(verschluesselt);               // Ausgabe des Buchstaben
     }
}

Wenn der Index größer als 26 ist, wird er zwar angepasst, aber durch das else wird die verschlüsselung nicht mehr getätigt. Also das else streichen und die Verschlüsselung so stehen lassen:

Java:
if (c == ' '){                                          // Kommt eine Leertaste wird eine solche ausgegeben
	System.out.print(" ");
} else {
	index = alphabet.indexOf(c);                        // Zeigt den Index des eingegeben Texts ei
	if (index > 26){                                    // Ist der Index zu groß, fängt es wieder von vorne an
		index = index - 26;
	}
	verschluesselt = alphabet.charAt(index+key);    // Verschlüsselung mit dem eingegeben Key
	System.out.print(verschluesselt);               // Ausgabe des Buchstaben
}
 
Zuletzt bearbeitet:

Oben