D0P3 F!$H hat folgendes geschrieben: |
Aber ich poste zur Sicherheit meinen Quellcode hier hin ... |
Ich habe mal deinen Code verkürzt. Ging leider nicht eher; man kann ja nicht nur am Computer sitzen ... Du sagtest ja: du fängst immer einfach an -was ich sehr gut verstehe!- und dann arbeitest du dich zu schwereren Sachen vor. Also, hier hast du eine zweite Variante des relevanten Codes:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| const Walze1 : array[0..25]of char = ('Q','W','E','R','T','Z','U','I','O','P','A','S','D', 'F','G','H','J','K','L','Y','X','C','V','B','N','M'); var DrehungenWalze1 : integer = 0; KodierterText : string = '';
procedure TForm1.KlartextKeyPress(Sender: TObject; var Key: Char); var PositionWalze1 : integer; begin Key := UpCase(Key);
case Key of 'A'..'Z': begin PositionWalze1 := ((ORD(Key) - 65) + DrehungenWalze1) mod 26; KodierterText := KodierterText + Walze1[PositionWalze1]; DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26; end; { ... } else Key := #0; end;
{ ... } end; |
Die Kommentare habe ich mal weggelassen. Auf die Geschichte mit
mod bin ich durch ein anderes Beispiel gekommen. Will sagen:
Quelltext
1:
| DrehungenWalze1 := (DrehungenWalze1 + 1) mod 26; |
entspricht deiner Version
Quelltext
1: 2:
| if(DrehungenWalze1 = 25) then DrehungenWalze1 := 0 else inc(DrehungenWalze1); |
dürfte aber ebenfalls wieder effizienter sein, weil die if-Abfrage wegfällt. Damit ich die gleiche Vereinfachung auch bei der Position nutzen konnte, habe ich aus dem Walzen-String ein Char-Array gemacht, das bei Null anfängt. Dadurch habe ich diese Zeilen
Quelltext
1: 2:
| PositionWalze1 := (Ord(GedrueckteTaste) - 64) + DrehungenWalze1; if (PositionWalze1 > 26) then Dec(PositionWalze1, 26); |
einsparen können. Das Ergebnis bleibt aber das selbe.
<PS>
Ausgehend von meiner o.g. Änderung des Codes habe ich noch folgendes für dich. Da du aber die gute Note haben willst, mache ich´s dir nicht ganz so einfach ...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| ZCHZBFXX SFDMHCWC(LN: XQXD): NTNJ; CWY KPANSW : AOTJ; GLCNT UNMFQJ := ((FFL(RP,MTJZS1) - 1) - SQGLUQXYRFLTYM1 + 26) OSW 26; JTYVGB := (IFN(VGHRJU + HFPC('L'))); VSMRKSZTGNRHTA1 := (AMFKZMYLEDKRLN1 + 1) IAQ 26; EDR; |
Sonderzeichen bleiben unverändert!
</PS>
So, jetzt zu "meiner" ENIGMA. Die Rotoren und den Reflektor habe ich bereits nach Delphi umgesetzt. War relativ einfach (weil ich ja eine Vorlage hatte), und da zeigt sich dann bereits der Vorteil der Kodierung. Du gibst den Klartext ein, etwa
Quelltext
und erhältst z.B. den Code
Quelltext
Das Ergebnis ist natürlich abhängig von der Einstellung der ENIGMA. Startest du das Programm mit der gleichen Konfiguration neu und gibst dann den kodierten Text ein, erhältst du wieder den Klartext, ohne dass du eine separate Dekodierfunktion brauchst.
Im Augenblick kann man leider noch nichts an den Einstellungen ändern, d.h. die Kodierung erfolgt immer nach dem selben Schema. Walzenwechsel usw. kommen aber noch, sofern ich Zeit finde und Lust habe ...