Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Chiffre-Problem (https://www.delphipraxis.net/165370-chiffre-problem.html)

Marcel Hans 27. Dez 2011 00:08

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.

himitsu 27. Dez 2011 00:14

AW: Chiffre-Problem
 
Zitat:

Zitat von Marcel Hans (Beitrag 1143221)
Wechsel in beiden Richtungen:
t-d

(Also wenn normal 'dauert', in der Chiffre 'tauert'). Mein zurzeitiges Programm gibt aber 'dauerd' raus.

tauerd :zwinker:

Zitat:

Zitat von Marcel Hans (Beitrag 1143221)
Ich bitte um Hilfe!

Eine Bitte oder eine Forderung?


Code:
eingabe := StringReplace(eingabe ,'d','t',[rfReplaceAll]);
eingabe := StringReplace(eingabe ,'t','d',[rfReplaceAll]);
Und jetzt rate mal, was rauskommt, wenn man ein d reingibt? :angle2:



Da wirst du wohl selber Zeichen für Zeichen durchgehn müssen.

Sir Rufo 27. Dez 2011 00:16

AW: Chiffre-Problem
 
Zitat:

Zitat von himitsu (Beitrag 1143222)
tauerd :zwinker:

falsch, wie der TE angegeben hat kommt dauerd heraus, den Grund hast du ebenfalls genannt ;)

EDIT: ok, vergiss es, du hast doch recht (das sollte nach der Beschreibung herauskommen) :)

himitsu 27. Dez 2011 00:18

AW: Chiffre-Problem
 
Zitat:

Zitat von Sir Rufo (Beitrag 1143223)
falsch

Falsch, richtig sollte tauerd rauskommen, also laut seiner Definition. :zwinker:

[edit]
:lol:

Marcel Hans 27. Dez 2011 00:20

AW: Chiffre-Problem
 
Zitat:

Eine Bitte oder eine Forderung?
Natürlich eine Bitte :wink:

Zitat:

Da wirst du wohl selber Zeichen für Zeichen durchgehn müssen.
Gibt es kein anderer Weg? :(

Sir Rufo 27. Dez 2011 00:22

AW: Chiffre-Problem
 
Zitat:

Zitat von Marcel Hans (Beitrag 1143226)
Gibt es kein anderer Weg? :(

doch, aber die führen nicht zum Ziel ;)

himitsu 27. Dez 2011 00:24

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.

Marcel Hans 27. Dez 2011 00:28

AW: Chiffre-Problem
 
Zitat:

Zitat von himitsu (Beitrag 1143229)
Alternativ könnte man auch eine fertige Funktion nehmen, welche dieses macht, aber Delphi bringt von Haus aus sowas nicht mit.

Hmm, also gibt es solche Funktion nicht oder muss man sie nachsuchen?

Sir Rufo 27. Dez 2011 00:33

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:
function StrReplacePatterns( const AStr : string; Patterns : TStrings ) : string;
Patterns müsste folgenden Inhalt haben
Code:
t=d
d=t
hallo=nein

Luckie 27. Dez 2011 00:37

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:
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;
Ist in fünf Minuten selber geschrieben.

Sir Rufo 27. Dez 2011 00:38

AW: Chiffre-Problem
 
so geht das aber nicht, weil nicht einfach nur einzelne Chars getauscht werden sollen, sondern auch strings ;)

Luckie 27. Dez 2011 00:40

AW: Chiffre-Problem
 
Also wenn ich das richtig verstehe:
Zitat:

Wechsel in beiden Richtungen:
t-d
b-p
k-g
t-d
s-z
w - v
i - y
Sollen nur einzelne Zeichen getauscht werden.

Delphi-Quellcode:
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;
Liefert "tauernd" wie gefordert.

Sir Rufo 27. Dez 2011 00:41

AW: Chiffre-Problem
 
Delphi-Quellcode:
eingabe := StringReplace(eingabe ,'ę','yn',[rfReplaceAll]);

Luckie 27. Dez 2011 00:42

AW: Chiffre-Problem
 
Also dafür, dass sein Code der Beschreibung widerspricht, kann ich nichts.

Sir Rufo 27. Dez 2011 00:43

AW: Chiffre-Problem
 
Zitat:

Zitat von Luckie (Beitrag 1143238)
Also dafür, dass sein Code der Beschreibung widerspricht, kann ich nichts.

das hat auch niemand gesagt ;)
aber der Ansatz war auch mein erster Gedanke :)

Marcel Hans 27. Dez 2011 12:19

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;

himitsu 27. Dez 2011 12:23

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 10:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz