![]() |
Buchstabenshifter
Moin,
ich muss für die Schule ein Programm schreiben, in welchem sämtliche Buchstaben in nem Text um 1 verschoben werden! Sprich: A zu Z ; B zu A; C zu B ; usw. Ich hab versucht das ganze mit zwei Editfenstern zu realisieren! Hier der Quelltext:
Delphi-Quellcode:
Mein Problem ist, dass ich bei der Ausgabe nur "Z" bekomme!
var
Form1: TForm1; LCaseChars, UCaseChars: array [0..25]of Char; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i :integer; begin for i:=0 to 25 do begin UCaseChars[i]:=Char(65+i); LCaseChars[i]:=Char(97+i); end; end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin edit2.clear; for i:=1 to length(edit1.text) do begin case pos (edit1.text[i], UcaseChars) of 0:edit2.text:= edit2.text+UCaseChars[25]; 12..24:edit2.text:=edit2.text+UCaseChars[pos(edit1.text,UCaseChars)-1]; 25:Edit2.text:=edit2.text+UCaseChars[0]; end; begin case pos (edit1.text[i], LcaseChars) of 0:edit2.text:= edit2.text+LCaseChars[25]; 12..24:edit2.text:=edit2.text+LCaseChars[pos(edit1.text,LCaseChars)-1]; 25:Edit2.text:=edit2.text+LCaseChars[0]; end; end; Und so langsam hab ich auch keihne Ahnung mehr woran es liegen könnte! Um Antworten wird gebeten Gruß benisenis |
Re: Buchstabenshifter
Also ich würd es so machen: (ungetestet)
Delphi-Quellcode:
var i : integer;
begin for i := 1 to length(Edit1.Text) do if ord(Edit1.text[i]) = 97 then Edit2.Text := Edit2.Text + 'z' else if ord(Edit1.text[i]) = 65 then Edit2.Text := Edit2.Text + 'Z' else Edit2.Text := Edit2.Text + Char(Ord(Edit1.text[i])-1); |
Re: Buchstabenshifter
Jetzt frag ich mich, wieso muss ichs immer nur so kompliziert machen :-)
Deine Variante funtioniert ohne Probleme !Thx Trotzdem würds mich intressieren, was mein Fehler war? Gruß benisenis |
Re: Buchstabenshifter
EDIT: schwachfug geschrieben....
|
Re: Buchstabenshifter
hmm und was passiert wenn er a eingibt??
dann kommt nicht z sondern irgendein sonderzeichen mit deinem code, hier mal nen update von meinem:
Delphi-Quellcode:
function ceaser(text : string; pos : integer) : string;
var i : integer; Begin for i := 1 to length(Text) do if ord(text[i])-pos < 97 then result := result + char(ord(123 - (pos - (Ord(text[i]) - 97)))) else if ord(text[i])-pos < 65 then result := result + char(ord(91 - (pos - (Ord(text[i]) - 65)))) else result := result + Char(Ord(text[i])-pos); end; |
Re: Buchstabenshifter
Hallo,
noch eine Möglichkeit:
Delphi-Quellcode:
s := Edit1.Text;
for z := 1 to Length(s) do case s[z] of 'Z' : s[z] := 'A'; 'z' : s[z] := 'a'; 'A'..'Y', 'a'..'y' : s[z] := Chr(Ord(s[z])+1); 'ä' : s[z] := 'ö'; 'ö' : s[z] := 'ü'; 'ü' : s[z] := 'ä'; 'Ä' : s[z] := 'Ö'; 'Ö' : s[z] := 'Ü'; 'Ü' : s[z] := 'Ä'; end; Edit2.Text := s; |
Re: Buchstabenshifter
hmm ja, für 1ne verschiebung ist das ja okay, aber es ist recht unflexibel und schön find ich die möglichkeit nicht!
Dafür sind die umlaute abgedeckt! |
Re: Buchstabenshifter
dann will ich auchmal vorschlagen...
Delphi-Quellcode:
ohne Umlaute leider...
S:=Edit1.Text;
for i:=1 to Length(S) do if S[i]='A' then S[i]:='Z' else if S[i]='a' then S[i]:='z' else S[i]:=Chr(Ord(S[i])-1); Edit: Achso, muss es überhaupt Case-Sensitiv sein? wenn nicht:
Delphi-Quellcode:
Und Noch ein Edit...Nicht hoch sondern runter Shiften!!!
S:=LowerCase(Edit1.Text);
for i:=1 to Length(S) do if S[i]='a' then S[i]:='z' else S[i]:=Chr(Ord(S[i])-1); Und noch eine Version mit Umlauten...
Delphi-Quellcode:
const
Chars: String = ('ab...yzäöü'); begin //Nicht Case-Sensitiv for i:=1 to Length(S) do Case Pos(S[i],Chars) of 1..27: S[i]:=Chars[Pos(S[i],Chars)+1]; 28: S[i]:=Chars[1]; end; //Case-Sensitiv mit allen möglichen Zeichen function GetChar(ID: Integer; Lower: Boolean):Char; begin if Lower then Result:=LowerCase(Chars[ID])[1] else Result:=UpperCase(Chars[ID])[1]; end; function PosInChars(Val: Char):Integer; begin Result:=Pos(LowerCase(Val),LowerCase(Chars)); end; begin for i:=1 to Length(S) do begin L:=LowerCase(S[i])=S[i]; Case PosInChars(S[i]) of 1..27: S[i]:=GetChar(PosInChars(S[i])+1,L); 28: GetChar(1,L) end; end; end; |
Re: Buchstabenshifter
So
nach ein bisschen rumprobieren habe ich hier die ultimative funktion!!! naja, ok, so toll ist sie nun auch wieder nicht, aber die funktiuniert und ist nicht allzu kompliziert....
Delphi-Quellcode:
für dein Beispiel wäre der Aufruf wie folgt:
function ShiftChars(Value: String; ShiftDir: ShortInt = 1; Chars: String = 'abcdefghijklmnopqrstuvwxyzäöü'): String;
function GetChar(ID: Integer; Lower: Boolean):Char; begin if Lower then Result:=LowerCase(Chars[ID])[1] else Result:=UpperCase(Chars[ID])[1]; end; function PosInChars(Val: Char):Integer; begin Result:=Pos(LowerCase(Val),LowerCase(Chars)); end; function PosOrTrunc(Val: Integer): Integer; begin if Val>0 then Result:=Val else Result:=0; end; var i: Integer; L: Boolean; SprungID, ZielID: Integer; begin SprungID:=PosOrTrunc(ShiftDir*Length(Chars)-1)+1; ZielID:=PosOrTrunc(ShiftDir*(-1)*Length(Chars)-1)+1; for i:=1 to Length(Value) do begin L:=LowerCase(Value[i])=Value[i]; if PosInChars(Value[i])=SprungID then Value[i]:=GetChar(ZielID,L) else if PosInChars(Value[i])>0 then Value[i]:=GetChar(PosInChars(Value[i])+ShiftDir,L); end; Result
Delphi-Quellcode:
Edit:
Edit2.Text:=ShiftChars(Edit1.Text,-1);
Naja, eben doch nicht ultimativ, eher fehlerhaft...aber jetzt :stupid: |
Re: Buchstabenshifter
Danke für die vielen Antworten ;)
Und mein Problem ist gelöst .... Gruß benisenis |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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 by Thomas Breitkreuz