Ich hab es mal etwas umgeschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function VerschluesseleCeasar(const Text: String; IntSchluessel: Integer): String; var i: Integer; begin SetLength(Result, Length(Text));
for i := 1 to Length(Result) do case Text[i] of 'a'..'z': Result[i] := Chr((((Ord(Text[i]) - 97) mod 26) + IntSchluessel) mod 26 + 97); 'A'..'Z': Result[i] := Chr((((Ord(Text[i]) - 65) mod 26) + IntSchluessel) mod 26 + 65); else Result[i] := Text[i]; end; end; |
Der Unterschied zu deiner Varianten besteht darin, dass ich nicht ständig den ganzen String kopiere und einen Case-Of-Block anstelle der vielen If-Abfragen einsetze.
Ich will kurz erklären, warum diese Variante etwas besser ist:
Ein String ist ja nichts anderes als Array of Char. Weißt du jedoch einem String ein neues Element respektive Zeichen zu, also z.B.
s := s + 'a'; wird neuer Speicher allokiert (angefordert), und der komplette String kopiert.
Bei meiner Variante passiert dies nicht. Ich verwende zudem keine zusätzliche Hilfsvariable als Ablage, sondern direkt die für das Endergebnis vorgesehene "Variable"
Result.
Da bei der Ceasarverschlüsselung die Länge des original Textes mit der des Verschlüsselten übereinstimmt, passe ich diese direkt im ersten Schritt mittels SetLength an.
Nun
ersetze ich nur noch Zeichen mit bestimmten Index und lasse den Rest des Strings unberührt.
Hoffe, das kam jetzt einigermaßen verständlich rüber.
Ich empfehle dir übrigens sinnvollere Parameterbezeichnungen als "Hilf1" zu wählen. Mit "Text" oder "originalText" kann man doch schon deutlich mehr anfangen.
Schau dir zur Codeformatierung
DelForExp an.
Ansonsten klappt deine eigene Variante auch ganz gut:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function verschluessele(hilf1: string; IntSchluessel: integer): string; var hilf2: string; j: integer; begin hilf2 := ''; for j := 1 to length(hilf1) do begin if hilf1[j] in ['A'..'Z'] then hilf2 := hilf2 + chr((((ord(hilf1[j]) - 65) mod 26) + IntSchluessel) mod 26 + 65) else if hilf1[j] in ['a'..'z'] then hilf2 := hilf2 + chr((((ord(hilf1[j]) - 97) mod 26) + IntSchluessel) mod 26 + 97) else hilf2 := hilf2 + hilf1[j]; end; verschluessele := hilf2; end; [...] memo2.Lines.Add(verschluessele(Memo1.Text, IntSchluessel)); |
Aber entscheide du selbst, welche du übernehmen willst
Grüße,
Marc