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.
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 B := Ord(AChar)-Ord('A'); B := (B+ATrans) mod 26; AChar := Chr (B+Ord('A')); end; 'a'..'z': begin B := Ord(AChar)-Ord('a'); 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 B := Ord(AChar) - Ord('A'); B := (B + ATrans) mod 26; AChar := Chr(B + Ord('A')); end; 'a'..'z': begin B := Ord(AChar) - Ord('a'); 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+13) mod 26; 97..97+25: B := 97+(B-97+13) mod 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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!