Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi cäsar 1,2,3 (https://www.delphipraxis.net/133671-caesar-1-2-3-a.html)

mlhk 6. Mai 2009 20:21


cäsar 1,2,3
 
hey,
ich möchte bei meiner cäser verschlüsselung erreichen das der 1 buchstabe um 1 der 2 um 2 und 3 um 3, sowie 4wieder 1 und der 5 um 2, also ich denke ihr wisst was ich meine

Delphi-Quellcode:
function verschluesselung1(text:string;b:integer):string ;
var i,a,z : integer;
var ergtext : string;
begin
z:=1;
for i := 1 to length(text) do
begin
a:= ord(text[i]);
a:=a+z;
if z=1 then z:=z+1;
if z=2 then z:=z+1;
if z=3 then z:=1;
ergtext:=ergText+chr(a);
end;
result:=ergtext;
verschluesselung1:= ergtext;
end;
problem ist halt nur das er jetzt immer nur um 1 erhöht, erläuft den z algo halt gleich komplett durch, wie kann ich das um gehen, in dem dazwischen immer schon um 1 rauft zähle in der for schleife also keine ahnung ob ich da drauf ein fluss nehmen kann?

mfg
max

Helmi 6. Mai 2009 20:30

Re: cäsar 1,2,3
 
Hallo,

überleg dir mal was z nach deinen ganzen If-Anweisungen für einen Wert hat.

Du startest mit z = 1.

In der ersten If-Anweisung wird z = 2.
In der zweiten If-Anweisung wird, wenn z = 2 ist, z um 1 auf 3 erhöht.
In der dritten If-Anweisung wird bei z = 3, z auf 1 gesetzt.

Im nächsten Durchlauf der Schleife hat z am Anfang wieder eine 1.

Mit anderen Worten, vor den If-Anweisungen und nach den If-Anweisungen hat
z immer 1.

Du solltest die If-Anweisungen mit else verknüpfen, oder noch besser mit case.

Delphi-Quellcode:
z:=1;
for i := 1 to length(text) do
begin
a:= ord(text[i]);
a:=a+z;
case z of
  1,2: inc(z); //bei 1 oder 2 um eins erhöhen
  3  : z := 1; //bei 3 z auf eins setzen
end;

mlhk 6. Mai 2009 20:36

Re: cäsar 1,2,3
 
ah super das case ist ne super sache funktioniert eins ah, allerherzlichsten dank

himitsu 6. Mai 2009 20:50

Re: cäsar 1,2,3
 
ansonsten hätten auch zumindestens ein paar ELSE gereicht

Delphi-Quellcode:
if z=1 then z:=z+1
else if z=2 then z:=z+1
else if z=3 then z:=1;
[edit] ich seh grad, das mit else wurde doch schon gesagt ... nja, nun isses auch mal als Beispiel da [/edit]

und man braucht nichtmal ein ganzes CASE ... ein einfaches IF wäre auch gegangen :angel:
Delphi-Quellcode:
if z<3 then z:=z+1 else z:=1;
oder
Delphi-Quellcode:
if z<3 then inc(z) else z:=1;

mr_emre_d 6. Mai 2009 21:21

Re: cäsar 1,2,3
 
Falls du es mal brauchst...
Delphi-Quellcode:
function Caesar( const Buffer: String; const Digits: Byte; const Right: Boolean = True;
  const _MinVal: Byte = 32; const _MaxVal: Byte = 132 ): String;
var
  i, x: Integer;
  function InRange(const Value, _Start, _End: Cardinal): Cardinal;
  begin
    if Value in [_Start.._End] then
      Result := Value
    else
    if Value < _Start then
      Result := InRange( _End - _Start + Value+1, _Start, _End )
    else
    if Value > _End then
      Result := InRange( _Start + Value - _End-1, _Start, _End );
  end;
begin
  if Right then
    x := 1
  else
    x := -1;
  SetLength( Result, Length(Buffer) );
  for i := 1 to Length(Buffer) do
    Result[i] := Chr( Byte( InRange( Ord( Buffer[i] ) + Digits*X, _MinVal, _MaxVal ) ) );
end;
MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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