![]() |
Chiffre-Problem
Hi!
ich will ein Verschlüssungsprogramm schreiben. Ich hab es schon angefangen. Ich habe folgende Chiffre: Wechsel in beiden Richtungen: t-d b-p k-g t-d s-z w - v i - y (Also wenn normal 'dauert', in der Chiffre 'tauerd'). Mein zurzeitiges Programm gibt aber 'dauerd' raus. Ich bitte um Hilfe!
Code:
procedure TForm1.Button2Click(Sender: TObject);
var eingabe:string; begin eingabe:= memoanfang.lines.GetText; eingabe := StringReplace(eingabe ,'d','t',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'g','k',[rfReplaceAll]); eingabe:= StringReplace(eingabe ,'b','p',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'p','b',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'v','w',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'y','i',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'z','s',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'s','z',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'t','d',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'k','g',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'w','v',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'i','y',[rfReplaceAll]); eingabe := StringReplace(eingabe ,'ę','yn',[rfReplaceAll]); memoergebnis.lines.add(eingabe); end; end. |
AW: Chiffre-Problem
Zitat:
Zitat:
Code:
Und jetzt rate mal, was rauskommt, wenn man ein d reingibt? :angle2:
eingabe := StringReplace(eingabe ,'d','t',[rfReplaceAll]);
eingabe := StringReplace(eingabe ,'t','d',[rfReplaceAll]); Da wirst du wohl selber Zeichen für Zeichen durchgehn müssen. |
AW: Chiffre-Problem
Zitat:
EDIT: ok, vergiss es, du hast doch recht (das sollte nach der Beschreibung herauskommen) :) |
AW: Chiffre-Problem
Zitat:
[edit] :lol: |
AW: Chiffre-Problem
Zitat:
Zitat:
|
AW: Chiffre-Problem
Zitat:
|
AW: Chiffre-Problem
Nein, wie du siehst, funktioniert es ja nicht, wenn man die Ersetzungen "nacheinander" durchführt.
Sie müssen "gleichzeitig" sein, so daß immer nur eine Übersetzung je Zeichen ausgeführt wird und sich nachfolgende entgegengesetzte Ersetzungen nicht gegenseitig aufheben. Alternativ könnte man auch eine fertige Funktion nehmen, welche dieses macht, aber Delphi bringt von Haus aus sowas nicht mit. |
AW: Chiffre-Problem
Zitat:
|
AW: Chiffre-Problem
Also bevor ich nach einer speziellen nicht sonderlich aufwendigen StringErsetzungsroutine suchen würde, programmiere ich mir so etwas schnell selber (da hat man auch was eigenes - Holleri-DuDödelDi)
Delphi-Quellcode:
Patterns müsste folgenden Inhalt haben
function StrReplacePatterns( const AStr : string; Patterns : TStrings ) : string;
Code:
t=d
d=t hallo=nein |
AW: Chiffre-Problem
Delphi hat keine fertige, eingebaute Funktion dafür. Hat himitsu doch geschrieben. Was aber nicht heißt, dass irgend jemand so was schon mal geschrieben und im Internet veröffentlicht hat.
Hier mal ein Denkanstoß:
Delphi-Quellcode:
Ist in fünf Minuten selber geschrieben.
function ChiffreString(Klartext: AnsiString): AnsiString;
var s: AnsiString; i: Integer; OrdinalValue: Integer; begin s := KlarText; for i := 1 to length(s) do begin // wenn s[i] gleich dem Buchstaben X dann weise s[i] Buchstaben Y zu end; Result := s; end; |
AW: Chiffre-Problem
so geht das aber nicht, weil nicht einfach nur einzelne Chars getauscht werden sollen, sondern auch strings ;)
|
AW: Chiffre-Problem
Also wenn ich das richtig verstehe:
Zitat:
Delphi-Quellcode:
Liefert "tauernd" wie gefordert.
function ChiffreString(Klartext: AnsiString): AnsiString;
var s: AnsiString; i: Integer; OrdinalValue: Integer; begin s := KlarText; for i := 1 to length(s) do begin OrdinalValue := Ord(s[i]); case OrdinalValue of 116: s[i] := 'd'; 100: s[i] := 't'; end; end; Result := s; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ChiffreString('dauernt')); end; |
AW: Chiffre-Problem
Delphi-Quellcode:
eingabe := StringReplace(eingabe ,'ę','yn',[rfReplaceAll]);
|
AW: Chiffre-Problem
Also dafür, dass sein Code der Beschreibung widerspricht, kann ich nichts.
|
AW: Chiffre-Problem
Zitat:
aber der Ansatz war auch mein erster Gedanke :) |
AW: Chiffre-Problem
Danke für eure Hilfe. Mit letzem Fall (mit yn) gibt es das Problem mit dem Wechsel nicht.
Ich hab das Problem mit der Schleife gelöst:
Code:
var eingabe:string;
index:integer; begin eingabe:= memonimm.lines.GetText; for index := 1 to Length(eingabe) do begin if eingabe[index] = 'd' then eingabe[index]:= 't' else if eingabe[index] = 't' then eingabe[index] := 'd'; end; |
AW: Chiffre-Problem
Bei den vielen Ersetzungen kannst du, statt den vielen IF-THEN-ELSE, auch ein CASE verwenden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz