# Caesar-Codierung: Darsellungsproblem bei "Nicht-Buchstaben"



## Vodkafan91 (29. Nov 2012)

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":


```
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_


----------



## dayaftereh (29. Nov 2012)

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?


----------



## Vodkafan91 (29. Nov 2012)

dayaftereh hat gesagt.:


> 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.


```
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 (30. Nov 2012)

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.


----------



## TryToHelp (30. Nov 2012)

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 
	
	
	
	





```
{}
```
) 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

```
if (bedingung){
  Anweisung1;
  Anweisung2;
}
```


----------



## dayaftereh (30. Nov 2012)

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*.


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

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


```
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.

```
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 (30. Nov 2012)

Wie schon bemerkt: verwende die Zahlen und verschlüssle nur dann, wenn im Bereich a-z oder A-Z

```
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 (30. Nov 2012)

Bleiglanz hat gesagt.:


> Wie schon bemerkt: verwende die Zahlen und verschlüssle nur dann, wenn im Bereich a-z oder A-Z
> 
> ```
> int zeichen =  ausgangstext.charAt(i);
> ...



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


----------



## Vodkafan91 (30. Nov 2012)

Super, vielen Dank Leute, jetzt klappts 

Habe nicht gewusst, dass Buchstaben bestimmten Zahlen zugewiesen sind. 

Nochmal danke an alle


----------

