Autor Beitrag
Vaio
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32

Win XP Home
D7 Prof
BeitragVerfasst: Mi 19.10.05 21:25 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Mi 19.10.05 22:54 
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 20.10.05 08:22 
ausblenden 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

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!


Zuletzt bearbeitet von Kroko am Do 20.10.05 10:54, insgesamt 1-mal bearbeitet
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: Do 20.10.05 08:50 
@Kroko: Müssten da nicht ein Minuszeichen bzw. ein kleines 'a' stehen:

ausblenden 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;

_________________
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 20.10.05 10:52 
:oops: JA :oops:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 24.12.06 01:59 
Geht noch ein wenig einfacher:
ausblenden 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;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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:
ausblenden Unübersichtlicher Delphi-Quelltext ;:954c153377:)
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:
ausblenden Noch unübersichtlicherer Delphi-Quelltext ;:954c153377:)
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;