Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfe:Caesar-Verfahren (https://www.delphipraxis.net/37789-hilfe-caesar-verfahren.html)

generic 12. Jan 2005 07:46

Re: Hilfe:Caesar-Verfahren
 
wie ist es damit?
Delphi-Quellcode:
const rotation: Integer=3;

function decode(s: string):string;
var i: Integer;
begin
  Result:='';
  for i:=1 to Length(s) do
  begin
    if Upcase(s[i]) in ['A'..'Z'] then
      Result:=Result+chr((Ord(Upcase(s[i]))-Ord('A')+rotation) mod 26+Ord('A'))
    else
      Result:=Result+s[i];
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit2.Text:=decode(Edit1.Text);
end;

MaBuSE 12. Jan 2005 10:36

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von generic
wie ist es damit?
Delphi-Quellcode:
...
      Result:=Result+chr((Ord(Upcase(s[i]))-Ord('A')+rotation) mod 26+Ord('A'))
...

Mod 26 ist viel effizienter als ein if.
(An mod hatte ich in dem Moment gar nicht gedacht ;-))

Nikolas 12. Jan 2005 17:05

Re: Hilfe:Caesar-Verfahren
 
@ Mabuse:
Ein mod ist hier aber falsch, da du bei der Mod-Funktion die '0' als Ergebniss erhalten kannst. Wenn du also das Y mit dem A verschlüsselst, und dann Mod 24 anwendest, bekommst du als Ergebniss 0 und nicht 25. Also ist der Ansatz mit if
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;
der richtige, um die Zahlen in der Menge [1..24] einzusperren.

MaBuSE 12. Jan 2005 17:42

Re: Hilfe:Caesar-Verfahren
 
Zitat:

Zitat von Toxman
@ Mabuse:
Ein mod ist hier aber falsch, da du bei der Mod-Funktion die '0' als Ergebniss erhalten kannst. Wenn du also das Y mit dem A verschlüsselst, und dann Mod 24 anwendest, bekommst du als Ergebniss 0 und nicht 25. Also ist der Ansatz mit if
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;
der richtige, um die Zahlen in der Menge [1..24] einzusperren.

???

Warum, MOD ist doch der Rest einer ganzzahligen Division.

Angenommen wir wollen Ziffern verschlüsseln. um 5 Stellen

Code:
0 -> 5 : 0 + 5 = 5 : 5 mod 10 = 5
1 -> 6 : 1 + 5 = 6 : 6 mod 10 = 6
2 -> 7 : 2 + 5 = 7 : 7 mod 10 = 7
3 -> 8 : 3 + 5 = 8 : 8 mod 10 = 8
4 -> 9 : 4 + 5 = 9 : 9 mod 10 = 9
5 -> 0 : 5 + 5 = 10 : 10 mod 10 = 0
6 -> 1 : 6 + 5 = 11 : 11 mod 10 = 1
7 -> 2 : 7 + 5 = 12 : 12 mod 10 = 2
8 -> 3 : 8 + 5 = 13 : 13 mod 10 = 3
9 -> 4 : 9 + 5 = 14 : 14 mod 10 = 4
Passt doch !!!

Delphi-Quellcode:
Result := Result + chr( (Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 + Ord('A') )

Ord( Upcase(s[i]) ) - Ord('A') // => 0 für A, 1 für B, ... und 25 für Z

rotation := 3
(Ord( Upcase(s[i]) ) - Ord('A') + rotation) // => 3 für A, ... und 28 für Z

(Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 // => 3 mod 26 = 3 für A, ... 28 mod 26 = 2 = Z

chr( (Ord( Upcase(s[i]) ) - Ord('A') + rotation) mod 26 + Ord('A') ) // = D für A, E für B, ... und C für Z
Stimmt !!!

[edit]
Zitat:

Zitat von Toxman
Delphi-Quellcode:
if Zahl>24 Then Zahl:=Zahl-24;

Delphi-Quellcode:
if (zahl>24) and (zahl<=48) then zahl := zahl - 24;
ist absolut identisch mit
Delphi-Quellcode:
zahl := zahl mod 24;
ps: warum hat Dein Alphabet nur 24 Buchstaben ?
[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 Uhr.
Seite 3 von 3     123   

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