Entwickler-Ecke

Sonstiges (Delphi) - Buchstaben um eine bestimmte Zahl verschieben


Vaio - Mi 19.10.05 21:25
Titel: Buchstaben um eine bestimmte Zahl verschieben
Ich soll für den Informatikunterricht ein kleines Verschlüsselungsprogramm schreiben, was mir da auf Anhieb einfiel war Rot13, also das jeder Buchstabe um 13 Stellen im Alphabet nach Rechts verschoben wird. So wird z.B. aus dem a ein n.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
begin
 If edit1.text='a' then
    edit1.text:='n';
 If edit1.text='b' then
    edit1.text:='o';
end;

end.


Das ist ja schon zum Scheitern verurteilt! :D
Wenn ich in das Editfeld "ab" reinschreibe passiert gar nichts, es darf nur immer ein Buchstabe im Editfeld stehen, was man aber irgendwie doch mit Delphi ändern kann oder nicht?
Das Programm müsste automatisch jeden Buchstaben nach dem Klick auf den Button um 13 Stellen im Alphabet nach rechts verschieben. Hat jemand einen Tipp?

Danke


alzaimar - Mi 19.10.05 22:34

Du must durch den Text durchiterieren und jeden Buchstaben einzeln anfassen. Schau mal bei dem Schlüsselwort 'For'...
Dazu solltest Du die Eingabe in eine Hilfsvariable vom Typ String kopieren, das ist übersichtlicher, aber nicht nötig.
Wenn Du fertig bist, schreibst Du die Hilfsvariable wieder zurück in das Eingabefeld, oder besser noch, in ein zweites Feld.


Blackheart666 - Mi 19.10.05 22:54

Schau mal hier.
http://www.delphi-forum.de/viewtopic.php?t=16298


Kroko - Do 20.10.05 08:22


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure SwapChar(var AChar: Char; const ATrans: Byte);
var
  B: Byte;
begin
  case AChar of
    'A'..'Z'begin // große Buchstaben
                B := Ord(AChar)-Ord('A'); // 'A'=0 ... //Danke Grishnak
                B := (B+ATrans) mod 26;
                AChar := Chr (B+Ord('A'));
              end;
    'a'..'z'begin  //kleine Buchstaben
                B := Ord(AChar)-Ord('a'); // 'a'=0 ... //Danke Grishnak
                B := (B+ATrans) mod 26;
                AChar := Chr (B+Ord('a'));
              end;
  end;
end;

als Grundidee, Optimierung und Verbesserungen exclusiv :lol:

//EDIT: QT korrigiert


Grishnak - Do 20.10.05 08:50

@Kroko: Müssten da nicht ein Minuszeichen bzw. ein kleines 'a' stehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure SwapChar(var AChar: Char; const ATrans: Byte);
var
  B: Byte;
begin
  case AChar of
    'A'..'Z'begin // großer Buchstaben
                B := Ord(AChar) - Ord('A'); // 'A'=0 ...
                B := (B + ATrans) mod 26;
                AChar := Chr(B + Ord('A'));
              end;
    'a'..'z'begin  // kleiner Buchstaben
                B := Ord(AChar) - Ord('a'); // 'a'=0 ...
                B := (B + ATrans) mod 26;
                AChar := Chr(B + Ord('a'));
              end;
  end;
end;


Kroko - Do 20.10.05 10:52

:oops: JA :oops:


BenBE - So 24.12.06 01:59

Geht noch ein wenig einfacher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure ROT13(var AChar: Char);
var
  B: Byte;
begin
  B := Ord(AChar);
  case B of
    65..65+25: B := 65+(B-65+13mod 26;
    97..97+25: B := 97+(B-97+13mod 26;
  end;
  AChar := Chr(B);
end;


delfiphan - So 24.12.06 02:17

65 mod 26 = 13, d.h. bei den Grossbuchstaben reicht im Prinzip "B := B mod 26+65" ;)
Ich finde übrigens 'A'..'Z' wesentlich eleganter als 65..65+25. Durch die Rechnung mit Bytes statt Chars verliert man die Übersicht und gewinnt dabei nichts.

Oder: Wenn schon unübersichtlich, dann richtig:

Unübersichtlicher Delphi-Quelltext ;)
1:
2:
3:
if c in['A'..'Z','a'..'z']then
 c:=char(ord(c)and(ord('A')or not ord('a'))mod 26+
 ord('A')or ord(C)and ord('a')and not ord('A'));

Oder alternativ als Funktion:

Noch unübersichtlicherer Delphi-Quelltext ;)
1:
2:
3:
4:
5:
6:
7:
function rot13(c:char):char;
var b:byte absolute result;
begin
 rot13 := c;
 if b in[65..90,97..122]then
  b:=b and 223 mod 26+65 or b and 32;
end;