Caesar-Codierung: Darsellungsproblem bei "Nicht-Buchstaben"

V

Vodkafan91

Gast
Servus Leute,

die Ceasar-Verschlüsselung an sich habe ich soweit, jedoch wird in der Aufgabenstellung verlangt, dass "Nicht-Buchstaben" (also alle anderen möglichen char wie z.B. ' ', '4','-',':' etc.) unverschlüsselt dargestellt werden. Und hier komme ich einfach nicht weiter. Hier erstmal mein Quellcode der Methode "chiffre":

Java:
public void chiffre (int k)
	{   
		for(int i = 0;i<anz;i++)
		{
     		for(int v = 0;v<26;v++)	
     			
			{
				if(z[i]==abc[v] && v+k<26)
				System.out.print(abc[v+k]);
				else
				if(z[i]==abc[v])
				System.out.print(abc[(v+1+k)%27]);	
				 
			}	
     			
		 }	
		
	  }

Kurze Erläuterung: Der Parameter k wird in der Main-Methode festgelegt - dieser legt fest, um wieviel Indices verschoben werden soll. z ist ein Array vom Typ char in dem das Wort steht, ebenso abc[v] (entspricht dem Alphabet, wie der Name schon andeutet :) ) - besteht das z-Array nur aus Buchstaben, funktioniert die Methode tadellos, aber wie bereits erwähnt, wird verlangt, dass "Nicht Buchstaben" unverschlüsselt dargestelllt werden. Und hier komm ich einfach nicht weiter.

Also mein Ansatz ist eine if-Abfrage: if(z!=abc[v]) System.out.print(z

Sprich, wenn ein Element aus dem char-Array z nicht mit einem Element des abc-Arrays übereinstimmt, ist dies kein Buchstabe. Falls dem so ist, soll das Element z ausgegeben werden. Leider klappt das in der Praxis überhaupt nicht :/

Helft mir bitte
 
Zuletzt bearbeitet von einem Moderator:

dayaftereh

Top Contributor
Entweder bin ich zu doff oder warum läufst du den immer 26 mal über jeden Buchstaben? Du willst doch die einfach Ceasar-Verschlüsselung bei dem der Buchstabe c um n stellen verschoben wird?
 
V

Vodkafan91

Gast
Entweder bin ich zu doff oder warum läufst du den immer 26 mal über jeden Buchstaben? Du willst doch die einfach Ceasar-Verschlüsselung bei dem der Buchstabe c um n stellen verschoben wird?

Erstmal danke für die Antwort :)

Kann auch sein, dass ich mich etwas unverständlich ausgedrückt habe. Wie bereits erwähnt, habe ich zwei char-Arrays erzeugt.

Java:
private char[] z = {'j','a','v','a',' ','i','s','t',' ','t','o','l','l'};
private char[] abc={'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'};

Und das abc-Array besteht aus 26 Elementen, welche mit dem z-Array abgeglichen werden (deshalb die 26). Die Buchstaben werden ohne Probleme verschlüsselt, aber die Abstände bzw. alle "Nicht-Buchstaben" werden nicht berücksichtigt. Doch das ist in der Aufgabenstellung gewünscht, d.h. Leerzeichen sollen als Leerzeichen ausgegeben werden etc.
 

Tatze64

Mitglied
Was mir so spontan einfallen würde ist ne weitere If abfrage über all dem wo du den fall von " " "-" etc abfängst und dort dann einfach das zeichen beibehälst.
 
T

TryToHelp

Gast
um bei deinen Ansatz zu bleiben, würde ich bei jedem durchlauf deines Wortes eine boolean Variable auf false setzen (Zeile 5-6), wird er gefunden und verschoben ausgegeben auf true (dafür müsstest du deine if's, wie es finde ich sich sowieso immer gehört in
Code:
{}
) setzen nachdem deine innere Schleife abgefrühstückt wurde, testest du ob der boolean noch immer fals ist (Zeile 16), dann gibst du den buschstaben direkt aus ;-)

So sollte finde ich immer ein if aussehen, auch bei nur einer Anweisung
Java:
if (bedingung){
  Anweisung1;
  Anweisung2;
}
 

dayaftereh

Top Contributor
Warum nutzt du den ein Extra Char[] für die Buchstaben. In Java sind Buchstaben wie Zahlen, das heißt folgende Abfrage ergibt immer true.

Java:
char c = 'A';
System.out.println(c == 65); // true

Das heißt für deine caesar Verschlüsselung kannst du folgendes nutzen:

Java:
char c = 'A';
System.out.println((c + 2) == 'C'); // true

So und jetzt benötigst du nur noch die Zahlen Bereich von den Character die du verschieben willst.
Java:
int A = 'A';
System.out.println(A); // 65
int Z = 'Z';
System.out.println(Z); // 90
int a = 'a';
System.out.println(a); // 97
int z = 'z';
System.out.println(z); // 122
 

Bleiglanz

Gesperrter Benutzer
Wie schon bemerkt: verwende die Zahlen und verschlüssle nur dann, wenn im Bereich a-z oder A-Z
Java:
			int zeichen =  ausgangstext.charAt(i);	
			if(zeichen>=97 && zeichen<=122) zeichen = 97+((zeichen - 97 + offset) % 26) ;
			if(zeichen>=65 && zeichen<=90) zeichen = 65+((zeichen - 65 +offset) % 26);
 

dayaftereh

Top Contributor
Wie schon bemerkt: verwende die Zahlen und verschlüssle nur dann, wenn im Bereich a-z oder A-Z
Java:
			int zeichen =  ausgangstext.charAt(i);	
			if(zeichen>=97 && zeichen<=122) zeichen = 97+((zeichen - 97 + offset) % 26) ;
			if(zeichen>=65 && zeichen<=90) zeichen = 65+((zeichen - 65 +offset) % 26);

Ich habe gehofft das Vodkafan91 selbst auf diese Lösung kommt ;)
 
V

Vodkafan91

Gast
Super, vielen Dank Leute, jetzt klappts :D

Habe nicht gewusst, dass Buchstaben bestimmten Zahlen zugewiesen sind.

Nochmal danke an alle
 

Neue Themen


Oben