Autor Beitrag
goog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: Mi 12.01.05 19:22 
Hi Leute !

Bin noch ziemlich neu im Umgang mit Delphi! Was muss ich bei ner Prozedur beachten wenn ich Strings zurückgebe? Ich will das ein String auf doppelte Buchstaben untersucht wird, und wenn doppelte vorhanden sind, dann soll aus dem zweiten ein X werden. Trotzdem soll er noch erscheinen. Wenn die Länge ungerade ist soll noch ein X ran.

Beispiel:
MITTWOCH --> MITXTWOCHX

Was muss ich hier noch verändern?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure verschluessel (text:string);
var l,i:integer;
begin
l:=length(text);
for i:=1 to l do
 if text[i]=text[i+1then text[i+1]:='X';
 text[i]:=text[i];
end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Zuletzt bearbeitet von goog am Do 13.01.05 16:36, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.01.05 19:35 
Entweder du übergibst den Parameter als var-Parameter oder du machst eine Funktion, was ich für sinnvoller erachten würde.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mi 12.01.05 20:28 
Titel: Re: Parameterübergabe
goog hat folgendes geschrieben:
Beispiel:
MITTWOCH --> MITXTWOCHX

Was muss ich hier noch verändern?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure verschluessel (text:string);
var l,i:integer;
begin
l:=length(text);
for i:=1 to l do
 if text[i]=text[i+1then text[i+1]:='X';
 text[i]:=text[i];
end;


Vieles.

1.) Das kann nicht laufen, weil du auch den letzten Buchstaben mit dem letzten+1 vergleichst. Den letzten+1 gibt es aber nicht. :wink:

2.) Du vergleichst einen Buchstaben mit dem darauffolgenden. Sind sie gleich, verwandelst du den zweiten davon in ein X. Der zweite ist damit aber weg. Aus MITTWOCH würde MITXWOCH.

3.) text(i):=text(i) tut nicht so wirklich viel. :wink:

4.) Wenn 2.) nicht wäre und du tatsächlich das X einfügen würdest, würde dein String text aber verlängert, was wiederum bedeuten würde, dass deine for-Schleife nie bis an das (neue) Ende käme.

Mache eine Funktion davon (wie auch Luckie schon vorschlug), keine Prozedur. Übergebe deinen String text und baue in der Funktion den Rückgabewert result auf. Wenn du in der Funktion nicht text selber veränderst, dann entfällt schon mal 4.) ganz automatisch.

Aufrufen würdest du die Funktion mittext := verschluessel(text);

Überlege mal, wie die Funktion ausehen müsste. :)
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: Mi 12.01.05 22:57 
Hi
Vielen Dank für die guten Tips!!! :D

Aber funktioniert immer noch nicht, finde nicht den Fehler.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function verschluessel (text:string):string;
var i,l: integer;
  text2:string;
begin
l:=length(text);
if (l mod 2) <> 0 then text2[l]:='X';
for i:=1 to l do
 begin
  if text[i]=text[i+1then text2[i+1]:='X' else
  text2[i]:=text[i];
 end;
result:=text2;
end;


gruß johannes

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 12.01.05 23:14 
erstmal aus den Codetags Delphitags machen, bitte...
zweitens: bist du auf die antwort von IngoD7 ÜBERHAUPT eingegangen? du überprüfst IMMERNOCH ob der letzte buchstabe mit dem letzten + 1 übereinstimmt (es GIBT keinen buchstaben hinter dem letzten!!!!!!) ausserdem müsstest du erstmal bestimmen, dass text2 die selbe länge hat wie text. das tust du nicht, du graifst auf buchstaben zu, die es nicht gibt; soweit ich weis ist ein String mit index (also ein Char dieses strings) eine nur-lesen eigenschaft, also kannst du text2[i] nichts zuweisen. versuchs mit text2:=text2+text[i]...
und als allerletztes: bitte schreib doch glecih von vornerein die Compilerfehlermeldungen dazu oder was an der sache nicht klappt. sonst müssen arme leute wieder ihre Glaskugeln rauskramen und anschmeissen... und arme mods müssen sich wieder um deine Code Tags kümmern.. (TUFKAPL.... *hrhr*)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
BJ
Hält's aus hier
Beiträge: 13

Win XP
D7 Pers
BeitragVerfasst: Mi 12.01.05 23:24 
Hi,

ich hab mir das ganze mal angesehen und aus meiner Sicht sollte es so funktionieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function verschluessel (text:string):string;  
var i,l: integer;
  text2:string;
begin
l:=length(text);
text2:=text;                                   //text2 einen Wert zuteilen
if (l mod 2) <> 0 then text2:=text2+'X';       //Bei ungerade ein X anhängen
for i:=1 to l-1 do                             // bis zum vorletzten Element, da ich i+1 auslese
 begin
  if text2[i]=text2[i+1then insert('X',text2,i+1//Insert fügt das x an richtiger Stelle ein 
 end;
result:=text2;
end;


Mir ist aufgefallen, daß text2 am Anfang noch leerer String war --> daher Exception beim Start

Im Endeffekt kann man das ganze auch so gestalten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function verschluessel (text:string):string;  
var i,l: integer;
begin
l:=length(text);
if (l mod 2) <> 0 then text:=text+'X';
for i:=1 to l-1 do
 begin
  if text[i]=text[i+1then insert('X',text,i+1)
 end;
result:=text;
end;


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.

_________________
Studium non semper delectat, sed nihil agere delectat.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 12.01.05 23:26 
JayEff hat folgendes geschrieben:
erstmal aus den Codetags Delphitags machen, bitte...

OH BITTEEEE!!! Jetzt hat sich TUFKAPL schon um die oben gekümmert... xD

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
BJ
Hält's aus hier
Beiträge: 13

Win XP
D7 Pers
BeitragVerfasst: Mi 12.01.05 23:34 
Ach ja, ehe ichs vergesse.

Bei Zuweisungen wie: text:=fkt(text), wobei fkt eine Funktion mit Wertparameter ist braucht man keine Hilfsvariable einführen. Man kann die übergebenen Werte verwenden (lokale Parameter), da für diese eine lokale Kopie auf dem Stack angelegt wird.

Das wollte ich nur noch mal zeigen.

_________________
Studium non semper delectat, sed nihil agere delectat.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 11:01 
JayEff hat folgendes geschrieben:
soweit ich weis ist ein String mit index (also ein Char dieses strings) eine nur-lesen eigenschaft, also kannst du text2[i] nichts zuweisen.


Man kann natürlich String[x] direkt etwas zuweisen, nämlich ein Char. Ein String ist im Prinzip ein Array of Char. String[x] ist ein Element dieses Arrays.
String1[x] := String2[y] ist völlig korrekt.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 11:12 
BJ hat folgendes geschrieben:
Hi,
ich hab mir das ganze mal angesehen und aus meiner Sicht sollte es so funktionieren:
[...]
Im Endeffekt kann man das ganze auch so gestalten:
[...]


Leider nein! Du hast auch das 4.) aus meinem ersten Posting erwischt.
Das Wort "Gruppenbett" z.B. wird nicht korrekt behandelt.

Andererseits bewahrt dich dieser Fehler vor einer größeren Katastrophe, wie dem endlosen Einfügen von 'X' in das Wörtchen "LEXXER", z.B. 8)

Allgemein:
Wenn das hier ...
goog hat folgendes geschrieben:
Beispiel:
MITTWOCH --> MITXTWOCHX
... der Fall sein soll, dann dürfen eure ganzen Lösungen nicht das Wort am Anfang auf ungerade Länge prüfen, sondern nach der Verschlüsselung.

Apropos "ungerade": Dafür gibt es die Funktion Odd(). :wink:


Zuletzt bearbeitet von IngoD7 am Do 13.01.05 12:12, insgesamt 1-mal bearbeitet
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Do 13.01.05 11:49 
Klingt nach einer Arbeit an www.delphi-forum.de/...irChiffre_34721.html

Moin,

wenn Du gerade an den Elementen rumsägst, warum schneidest Du nicht noch alle Satz- und Leerzeichen ab und baust danach (oder sogar gleich) eine Liste, die die neuen Zeichenpaare enthält?

by the way: Ich würde mit einer while-Schleife arbeiten, weil ich so Einfluß auf den Index habe.

gegrüßt!
MitschL
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 12:04 
MitschL hat folgendes geschrieben:
Klingt nach einer Arbeit an www.delphi-forum.de/...irChiffre_34721.html

Ach, guck an ... :shock: Wird also noch was größeres. :)

MitschL hat folgendes geschrieben:
wenn Du gerade an den Elementen rumsägst, warum schneidest Du nicht noch alle Satz- und Leerzeichen ab und baust danach (oder sogar gleich) eine Liste, die die neuen Zeichenpaare enthält?

Mal langsam. Er tastet sich doch langsam ran. Das finde ich gut. Probleme gibt das bestimmt noch genug. :wink:

MitschL hat folgendes geschrieben:
Ich würde mit einer while-Schleife arbeiten, weil ich so Einfluß auf den Index habe.


So ist es. Und da hier schon falsche Lösungen gepostet wurden und goog das mit dem Index möglicherweise noch nicht ganz versteht, hier jetzt mal mein Lösungsvorschlag (etwas überkommentiert :P , zum Verständnis):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function verschluessel(text:string):string;    
var
  i : integer;
begin
i:=1;                       //i auf erstes Zeichen.
while i < length(text) do   //Solange i das Ende von text ..
                            //.. nicht erreicht hat, ..
   begin                       //.. schauen, ob der nächste Buchstabe ..
   if text[i]=text[i+1then   //.. identisch ist.
      begin                       //Wenn ja, 'X' einfügen und i ..
      insert('X',text,i+1);       //.. erhöhen, damit das eingefügte X ..
      inc(i);                     //.. nicht auch noch in die Prüfung ..
      end;                        //.. einbezogen wird.
   inc(i);                     //i auf nächstes Zeichen setzen
   end;
if odd(length(text)) then   //Wenn text-Länge ungerade, 'X' anhängen.
   text:=text+'X';
result:=text;               //Rückgabewert
end;
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Do 13.01.05 12:58 
Etwa so,

es ist aber Vorsicht geboten. Wer weis, ob goog später in dieser Schleife auch die Satzzeichen rausschmeißen will.

gegrüßt!
MitschL
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 13:34 
MitschL hat folgendes geschrieben:
es ist aber Vorsicht geboten. Wer weis, ob goog später in dieser Schleife auch die Satzzeichen rausschmeißen will.

Wie schon gesagt, das wird insgesamt spannend. Die Funktion, so wie sie da jetzt steht, ist zwar gemäß den hier geschilderten Anforderungen, aber sie ist trotzdem Schrott.

Irgendwas stimmt mit den Anforderungen nicht. Die Funktion ist so jedenfalls nicht eindeutig. Die Wörter "ROTHEXE" und "ROTHEE" bringen nach der Verschlüsselung dasselbe Ergebnis. Da wird der Rückweg schwer. :roll:
goog Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 37



BeitragVerfasst: Do 13.01.05 14:05 
hi ingod7

Danke für die schnelle Hilfe :)
Aber du hast recht, das ware ist das noch nicht.
Wenn ich z.B ICHKOMMEAMMITTWOCH eingebe, dann gibt er
mir IC HK OM XM EA MX MI TX TW OC HX zurück.
Es müsste aber eigentlich IC HK OM ME AM MI TX TW OC HX rauskommen.
Es wird nämlich in Zweiergruppen untersucht und dann verschlüsselt.
Mit dem Schlüssel:"Mathematiker" kommt als Chiffre RD KM TG EG FH ED SZ QZ SR KW
heraus.
Man ich find das echt kompliziert!

vielleicht könnt ihr mir noch mal helfen?

gruß jo
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 14:56 
goog hat folgendes geschrieben:

Es wird nämlich in Zweiergruppen untersucht und dann verschlüsselt.
Du Witzeimer! :eyecrazy:
Dann solltest du sowas zukünftig rechtzeitig schreiben ... :motz:

:wink:

Dann nimm das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function verschluessel (text:string):string;    
var
  i : integer;
begin
i:=1;                       //i initialisieren.
while i < length(text) do   //Solange i das Ende von text ..
                            //.. nicht erreicht hat, ..
   begin                       //.. schauen ob der nächste Buchstabe ..
   if text[i]=text[i+1then   //.. identisch ist.
      begin                       //Wenn ja, 'X' einfügen und i ..
      insert('X',text,i+1);       //.. erhöhen, damit das eingefügte X ..
      inc(i);                     //.. nicht auch in die Prüfung ..
      end;                        //.. einbezogen wird.
   inc(i,2);                     //i erhöhen --> auf nächste Zweiergruppe setzen
   end;
if odd(length(text)) then   //Wenn text-Länge ungerade, 'X' anhängen.
   text:=text+'X';
result:=text;               //Rückgabewert
end;


Aber bei "ROTHEXE" und "ROTHEE" kommt immer noch dasselbe raus. Also wieder nicht eindeutig.

Außerdem ergibt sich folgende Frage:
Was macht er, wenn in einer Zweiergruppe Gleichheit festgestellt wird, der zweite Buchstabe dieser Gruppe dann ein X wird und der ehemals zweite Buchstabe dann zum ersten Zwilling der nächsten Gruppe wird? Ein Zwilling in der nächsten Gruppe also, den es ohne das eingefügte X in der Gruppe davor gar nicht gegeben hätte.

Zu kompliziert ...? :nut: :lol:

Kurz: Was müsste bei "ERHATSEINENTEEENDLICH" herauskommen?


Zuletzt bearbeitet von IngoD7 am Do 13.01.05 15:07, insgesamt 1-mal bearbeitet
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Do 13.01.05 15:00 
Der gesamte Payrfair-Algorithmus ist nicht wirklich reversibel - schon allein wegen der Doppelfeldbelegung i/j und der Nutzung des X als Füllzeichen oder dem Weglassen der Spaces.

Ich hab mir einen PayrFair+ gedacht, welcher mit normalen Sätzen arbeitet und statt einer 2-Dim-Matrix eine 4-Dim-Matrix nutzt. Füllzeichen ist ein #, welches dann nicht genutzt werden darf, wobei ich mir nicht sicher bin, ob das nachteilig ist, oder irrelevant. :?

gegrüßt!
MitschL

[edit]@IngoD7: Du hast ein E in der Abschlußfrage vergessen. :P
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 15:19 
MitschL hat folgendes geschrieben:

[edit]@IngoD7: Du hast ein E in der Abschlußfrage vergessen. :P

:?:
Nö.
"ER HAT SEINEN TEE ENDLICH"
Die beiden e von "TEE" werden als gleiches Paar erkannt. Dadurch rutscht das zweite e in die nächste Gruppe und bildet mit dem e von "ENDLICH" wieder ein Zwillingspaar. Die Frage ist, ob der Code das erkennen muss oder nicht?

Das, was ich zuletzt gepostet hatte, erkennt das nicht. Ist das in Ordnung?
MitschL
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 211

Win 98 SE, Win 2000
D5 Pers, D6 Pers und D7 Pro
BeitragVerfasst: Do 13.01.05 15:55 
Das ist ein Beispiel dafür, daß ich nicht lesen kann, weil ich was ganz anderes las:

ERHATSEINENTEEENDLICH
er hat seinE ente endlich :shock: :rofl:

Wenn man Fehler finden will, kann man sie auch finden, wenn man Fehler hinzufügt.
(was'n Signature)

gegrüßt!
MitschL

[edit] Laut Payrfair-Algorithmus ist das leider nicht iO.


Zuletzt bearbeitet von MitschL am Do 13.01.05 16:13, insgesamt 1-mal bearbeitet
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 13.01.05 16:12 
MitschL hat folgendes geschrieben:

er hat seinE ente endlich :shock: :rofl:

Hast früher zu oft und zu lange in der Badewanne gesessen, wie? :mrgreen: