| Autor |
Beitrag |
Quegge
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 11:55
Hey Leute, ich habe folgendes Problem:
Ich hab mir mit nem Kumpel eine eigene Sprache ausgedacht(Deutsch in anderen Zeichen).
Dachte mir dann so: Könntest ja mal versuchen dafür einen Übersetzer zu programmieren.
Hab also alles, was nötig ist gemacht, aber ich weiß nicht wie ich es schaffen soll den kompletten Text aus einem Editfeld (oder anderes Textfeld; spielt keine Rolle) zu übersetzen. Man könnte für jeden Buchstaben ein Feld anlegen, das auslesen, übersetzen, in ein anderes Feld den entsprechenden Buchstaben ausgeben. Bringt aber nicht sehr viel, find ich. Es sollen alle Zeichen (siehe unten) aus einem Feld gelesen werden. Schon mal Danke an den, der mir helfen kann. =)
Beispiel wäre:
a -.,
b ,.-
In dieser Art sollen die Buchstaben ausgelesen werden.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 12:07
 erstmal
Ich verstehe nicht ganz, du willst eine Art Verschlüsselung implementieren? Also du hast einen deutschen Text und möchtest, dass aus einem 'a' ein 'b' wird, etc?
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 30.01.09 12:12
ich denke eher das er sowas wie einen hmmm, übersetzer bauen will, also der Buchstabe "a" soll in die zeichenkombination "-.," umgewandelt werden, "b" in ",.-" und so weiter also wie ein Morsealphabet.
Dafür würde sich Stringreplace anbieten. Oder aber auch eine For-Schleife, würd ich aber dazu abraten.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 12:22
Hallo
Das, was elundril geschrieben hat, meine ich. Genau so!
Ich hab schon angefangen und mir gedacht, dass ich es mit if machen könnte.
Wird bestimmt auch funktionieren, aber dann kann ich es nicht aus einem Feld herauslesen.
Beispiel:
im Edit1 Feld steht:
.-. -_. -.- .__ ..-
Jetzt soll er erkennen, dass es 5 Buchstaben sind und diese in einem anderem Edit2 Feld darstellt.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 12:23
elundril hat folgendes geschrieben : | ich denke eher das er sowas wie einen hmmm, übersetzer bauen will, also der Buchstabe "a" soll in die zeichenkombination "-.," umgewandelt werden, "b" in ",.-" und so weiter also wie ein Morsealphabet.
Dafür würde sich Stringreplace anbieten. Oder aber auch eine For-Schleife, würd ich aber dazu abraten.
lg elundril |
StringReplace ist gefährlich, hier. Du wirst für jedes Zeichen ein StringReplace benötigen (Viel Copy&Paste => Unübersichtlicher Code => unsaubere Programmierung und schlechte Wartbarkeit) und je nach dem, wie dein "verschlüsseltes Alphabet" aussieht, könnte eine doppelte Ersetzung statt finden: Angenommen, 'a' würde in 'bb' übersetzt, und 'b' in 'cc', dann wird aus dem Text 'a' nicht 'bb' sondern 'cccc'.
Eine For-Schleife ist für solche Aktionen immer von Vorteil. Ich gebe dir mal ein kleines Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| const Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', ); function Uebersetze(Klartext : String): String; var i : Integer; begin result := ''; for i := 1 to Length(Klartext) do begin result := result + Code_Alphabet[Ord(Klartext[i])]; end; end; |
Achtung: Diese Methode ist langsam, da das Result immer wieder vergrößert werden muss.
Die Umkehrung hiervon ist etwas komplizierter, da bei dir ein Buchstaben in mehrere Zeichen übersetzt wird. Sind diese Zeichenketten immer gleich lang? Dann lässt sich das mit copy lösen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 12:54
Jetzt musste ich erstmal alles gründlich nachlesen, weil ich gar nicht durchgesehen habe.
Kann man das nicht anders schreiben?
Man legt für jedes eine Variable an und vergleicht diese dann. Keine Ahnung
Es handelt sich übringens immer um 3 Zeichen.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 13:13
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 13:20
Quegge hat folgendes geschrieben : | | Kann man das nicht anders schreiben? |
Was stört dich an meinem Ansatz?  Er ist eigentlich relativ simpel und übersichtlich. Ich erklär dir gern nochmal ausführlicher was in meiner Funktion passiert, wenn du magst.
Übrigens, wenn dir GroßKleinschreibung egal ist, kannst du ja einfach ersteinmal LowerCase (Gibt den übergebenen String in Kleinbuchstaben zurück) über den Text laufen lassen, dadurch kannst du die Großbuchstaben getrost vergessen.
Bedenke aber, dass nur Zeichen, die im Array abgedeckt sind, im Text stehen dürfen. Du musst also auch eine Abfrage in meine Funktion einbauen, die zunächst prüft, ob es sich bei dem Zeichen um z.B. eine Leertaste handelt, diese sollte dann entweder ignoriert oder einfach übernommen werden. Das einfachste wäre es aber glaube ich, wenn du für Leertasten eine eigene 3-Zeichen-Kette definierst.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 13:43
Es wäre besser, wenn du mir noch einiges erklären könntest
| Zitat: | const
Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', {...} ); |
Ich habe es mal ausprobiert. Er zeigt an, dass die Klammer nicht geht !?
Außerdem ist der kleinste/größte Index doch gar nicht wichtig oder?
Er soll einfach die Zeichen des gesamten Textes (mit Leerzeichen )zurückgeben.
Und Length sagt dann aus, dass wenn min. 1 Zeichen gegeben ist, das Resultat als Klartext gegeben wird?
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 14:02
Fangen wir vorn an
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| const Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', ); function Uebersetze(Klartext : String): String; var i : Integer; begin result := ''; for i := 1 to Length(Klartext) do begin result := result + Code_Alphabet[Ord(Klartext[i])]; end; end; |
Zunächst definiere ich mir eine Konstante, ein Array. Was ein Array ist weißt du? Falls nicht: Es ist im prinzip ein großer Schrank mit Schubladen, die nummeriert sind. Als Beschriftung für die unterste Schublade hab ich das Zeichen 'a' gewählt (Umgewandelt in eine Zahl), dies ist damit das unterste Element des Arrays, welches mit dem kleinsten Index angesprochen wird.
Ich hab Delphi gesagt, in die Schubladen dürfen nur Strings rein. Da das Array eine Konstante ist, muss ich es sofort mit den ganzen 26 Elementen füllen. In meinem kurzen Codeabschnitt habe ich dir nur gezeigt, wie die ersten 2 Elemente eingefüllt werden, die restlichen 24 habe ich mit dem Kommentar {...} angedeutet, das musst du natürlich selbst übernehmen
Nun kann ich das Array ansprechen. Ich sage dem Array: Ich hätte gern den Inhalt der Schublade, die mit dem Zeichen 'b' beschriftet ist, wie folgt: Code_Alphabet[Ord('b')] Hierbei wandelt die Funktion Ord das Zeichen 'b' in eine Zahl um, vom Array bekomme ich also genau das, was in meinem "verschlüsselten" Text dann ein 'b' sein soll.
Warum ist bei dir ein Fehler aufgetreten? Weil dein Array nicht komplett gefüllt war! Delphi hat gemerkt, dass statt 26 Schubladen nur 2 angegeben waren, ausserdem war da ein Komma, welches Delphi sagt, dass noch ein Element kommen soll, aber es kam keines (Statt dessen nur ein Kommentar {...}, welches ja vom compiler ignoriert wird. Für ihn stand da nur ('-.,', ',.-', ); also fehlte was hinter dem Komma).
Nun zur Funktion.
Ich bekomme in der Funktion den Klartext als String übergeben, Klartext ist also jetzt eine Variable vom Typ String, in der z.B. "hallo" stehen könnte.
Ich setze den Rückgabewert der Funktion zunächst auf '', also leer.
Dann laufe ich mit der For-Schleife durch den String Klartext: die Variable i wird in jedem Durchlauf um 1 erhöht (das machen For-Schleifen immer!) und zwar so lange, bis sie, im Fall Klartext='hallo' 5 erreicht hat, denn Length('hallo') ergibt 5 (der String ist 5 Zeichen lang).
In jedem Durchlauf der Schleife wird nun ein Zeichen im Klartext behandelt, und zwar (in Pseudocode) so:
Füge dem Rückgabewert der Funktion (Der am Anfang leer ist!) genau den String hinzu, der in der Schublade des Arrays Code_Alphabet mit der Aufschrift *mein aktuell behandelter Buchstabe* liegt. Du erinnerst dich: Ord macht aus dem Buchstaben eine Zahl, damit der Array damit umgehen kann.
Das Problem dabei ist natürlich: Sobald in meinem Klartext ein Zeichen ist, für das im Array keine Schublade existiert, hagelt's einen Fehler ("Listenindex überschreitet das Maximum (*zahl*)" wird die Nachricht vermutlich sein  ), also muss ich der Funktion noch eine If-Abfrage hinzufügen, die, bevor ich auf das Array zugreife, überprüft, ob das Zeichen auch wirklich eine Schublade im Array hat. Das würde z.B. so gehen: Delphi-Quelltext 1: 2: 3: 4: 5:
| if Klartext[i] in [Ord('a') .. Ord('z')] then else result := result + Klartext[i]; |
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 17:04
Danke erstmal für diese ausführliche Anleitung.
Es klingt alles ganz einleuchtend, das Problem nun ist:
Davon hatte ich zuvor noch nichts gehört und dachte, dass es auch anders geht.
Jetzt habe ich versucht das alles so zu schreiben, das möglichst wenig Fehler vorhanden sind.
Weißt du, wo hier der Fehler ist? Nach dem, was Delphi mir sagt, muss ein begin-end falsch sein (aber wo) !?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); begin const Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---','.._','._.','_..','.__','_._','__.','___','--_','-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.');
function Uebersetze(Klartext : String): String; var i : Integer;
begin result := '';
for i := 1 to Length(Klartext) do begin result := result + Code_Alphabet[Ord(Klartext[i])]; end;
end; |
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Fr 30.01.09 17:34
Probiers mal so.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| public end;
var Form1: TForm1; const Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---','.._','._.','_..','.__','_._','__.','___','--_','-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.'); implementation
{$R *.dfm}
function Uebersetze(Klartext : String): String; var i : Integer; begin result := ''; for i := 1 to Length(Klartext) do begin result := result + Code_Alphabet[Ord(Klartext[i])]; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Caption:=Uebersetze('hallo'); end;
end. |
Und schau dir mal das an.
www.christian-stelzm...rtikel/crashkurs.htm
_________________ Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 19:50
Quegge hat folgendes geschrieben : | Nach dem, was Delphi mir sagt, muss ein begin-end falsch sein (aber wo) !?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); begin const Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---', '.._','._.','_..','.__','_._','__.','___','--_', '-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.'); function Uebersetze(Klartext : String): String; var i : Integer; begin result := '';
for i := 1 to Length(Klartext) do begin result := result + Code_Alphabet[Ord(Klartext[i])]; end;
end; | |
Schaun wir uns das mal an und vorallem: rücken wir den Code mal richtig ein. Die Einrückung sollte das deutlich machen, und das tut sie auch: Eine Variablen- oder Konstantendeklaration innerhalb des begin-end-Blocks einer Prozedur ist nicht möglich (Ich verweise auf den Delphi-Crashkurs, den dir BlackHeart schon gepostet hat - wirklich gutes Dokument, unbedingt anschauen!), die gehört zwischen das procedure bla(); und das begin, ebenso die Deklaration der Funktion.
Mein Gedanke dabei war allerdings auch, die Funktion und die Konstante Global zu deklarieren, etwa so, wie Blackheart das schon getan hat.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 20:28
Diese Seite werde ich mir unbedingt mal anschauen.
Es werden keine Fehler mehr angezeigt, aber der Klartext steht als Caption da
und wo soll ich ein Leerzeichen einfügen? Wo kann man dieses 3 stelliges Zeichen einfügen?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 21:32
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 22:05
das ist mir auch klar -.-
die frage ist ja, was muss man tun um das zu verändern + leerzeichen erkennen
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 22:10
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 22:42
ich auch und bei mir steht die Caption in .-_ Zeichen.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin Caption:=Uebersetze('hallo'); end; |
das wort, welches man für hallo einsetzt, wird dann in der caption angezeigt.
Das Zeil ist aber das Edit2 Feld. Also hab ich folgendes getan:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); begin Caption:=Uebersetze(Edit1.Text); end;
end. |
Jetzt muss er es nur noch in das Edit 2 Feld einsetzen. Wie geht das?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 22:46
Naja, dann pack das Ergebnis doch in Edit2.Text statt in Caption. 
|
|
Quegge 
Hält's aus hier
Beiträge: 10
|
Verfasst: Fr 30.01.09 22:53
Ging erst nicht, jetzt schon.
Immer noch keine Leerzeichen^^
|
|
|