Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi verschachtelte schleifen (https://www.delphipraxis.net/84425-verschachtelte-schleifen.html)

baala 16. Jan 2007 19:08


verschachtelte schleifen
 
Hallo ihr,
ich habe ein kleines Problem. und zwar: ich schreibe morgen eine Arbeit über Delphi.
Ich befürchte, dass in der Arbeit verschachtelte for schleifen zu einsatz kommen, nur habe ich leider
nicht viel ahnung, wie ich eine solche schreiben kann.
Ich habe die Aufgabe einmal eingescannt: http://img413.imageshack.us/img413/2603/fragebj3.jpg

Es gibt noch ein paar lustige sachen!
1. das mit stringreplace zu machen, sollen wir nicht, so wollte ich das zu erst machen
2. Ich habe das ganz programm schon geschrieben, nur halt nicht mit der verschachtelung:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
buh,dat:string;
begin
dat:='';
for i:=1 to length(edit1.text) do
begin
buh:=copy(edit1.text,i,1);
if buh=edit2.text then
dat:=dat+edit3.text
else dat:=dat+copy(edit1.Text,i,1) ;
end;
edit1.text:=dat;
end;
//ich hatte das programm etwas erweitert:in edit1 kommt das wort rein, in edit2,dass gesuchte zeichen und in edit3, dass zeichen welche für das zeichen aus edit2 eingesetzt werden soll

Geht auch gut, nur solle ich das so nicht machen.

3. Das mit der verschachtelung geht nicht richtig!
Der Lehrer hat das uns gezeigt und bei langen wörtern, bzw vielen ö's,
hat das Programm nicht richtig funktioniert, nur sollen wir das trotzdem so machen...

Ich hoffe ihr hab eine Idee, wie das funktionieren kann :)

Grüß
Baal


//upps, hatte das bild vergessen :(

3_of_8 16. Jan 2007 19:13

Re: verschachtelte schleifen
 
1. Schreib dir ne eigene Replace-Funktion, geh per For-Schleife durch und ersetze alle Zeichen oder such sie dir mit PosEx raus.

2. Wozu Verschachtelung?

3. Alle Standard-Stringroutinen sind auf ASCII ausgelegt, wenn du Umlaute brauchst, musst du schauen ob es die Routine auch für ANSI gibt.

baala 16. Jan 2007 19:17

Re: verschachtelte schleifen
 
das ist ja das problem, ich muss diese verschachtelung haben.
ich würde das auch gerne ohne machen, nur brauch ich das ganze für die arbeit und wenn ich das da nicht habe, hab ich ein problem.
das hauptproblem ist, ich kann mir nicht wirklich vorstellen wie das mit einer verschachtelung gehen soll. bzw wie so eine überhaupt aussieht :(

3_of_8 16. Jan 2007 19:18

Re: verschachtelte schleifen
 
Das ist doch Unsinn.

Soll man jetzt da wirklich sinnloserweise eine zweite Schleife reinbauen, obwohl es absolut nichts bringt? Versteh einer die Lehrer... :gruebel:

EDIT: Mein Ansatz wäre so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var I:integer;
    str: String;
    oldchar, newchar: Char;
begin
str:=edit1.text;
oldchar:=edit2.text[1];
newchar:=edit3.text[1];
for I:=1 to length(str) do
  if AnsiCompareText(str[I], oldchar)=0 then str[I]:=newchar;
edit1.text:=str;
end;

Tormentor32 16. Jan 2007 19:19

Re: verschachtelte schleifen
 
Also aussehen kann ein verschachtelte schleife zum Beispiel so:
Delphi-Quellcode:
var i,j: integer;
begin
  for i := 1 to 10 do
    for j := 1 to 20 do
      begin
        //...irgendwas
      end;
end;

baala 16. Jan 2007 19:24

Re: verschachtelte schleifen
 
Zitat:

Zitat von 3_of_8
Das ist doch Unsinn.

Soll man jetzt da wirklich sinnloserweise eine zweite Schleife reinbauen, obwohl es absolut nichts bringt? Versteh einer die Lehrer... :gruebel:

ja, dass ist komplett schwachsinnig, zumal diese doppelte schleife beim lehrer selbst nicht funktioniert.

@Tormentor32, vielen dank, damit werde ich es mal versuchen, halt mal schauen, wie ich das in die aufgabe ein bauen kann :gruebel:

3_of_8 16. Jan 2007 19:36

Re: verschachtelte schleifen
 
Ich persönlich würde das ohne mit der Wimper zu zucken ohne verschachtelte Schleife machen.

Klaus01 16. Jan 2007 20:45

Re: verschachtelte schleifen
 
In Deiner Aufgabenstellung (jpg Bild) steht aber auch kein Wort von Verschachtelung.
Nur etwas von for Schleifen.

Delphi-Quellcode:
function replace(Quelle,suche,ersetze:string):String
var
  i:Byte;
begin
  result:='';
  for i:=1 to length(quelle) do
    if quelle[i] = suche then
      result:=result+ersetze
    else
      result:=result+quelle[i];
end;
Grüße
Klaus

baala 16. Jan 2007 21:00

Re: verschachtelte schleifen
 
@Klaus01,
stimmt schon, dass in der aufgabe nichts von einer verschachtelung steht. Nur meinte der lehrer das zusätzlich, dass wir das damit machen sollen. Als ich ihm, meine ganz oben gepostet lösung zeigte, meine er gut, nur habe ich mich erfolgreich um den einsatz der verschachtelung gedrückt, was eingentlich wir eingentlich in dieser aufgane übenen sollte.
Vielen dank auf für deine lösung, ich werde sie ebenfalls studieren :thumb:
vll kann ich sie auch in der arbeiten benutzen, da wird der lehrer aber schauen, da wir noch nie mit funktionen gearbeitet haben... :mrgreen:

Ich habe selbst etwas weiter an der verschachtelung geschrieben, es gibt zwar noch einen fehler, den werde ich aber auch bestimmt noch finden, wenn einer von euch einmal drauf schauen möchte ;) :
ich nehme an, dass ich einfach noch den orginal string brauche um dann von ihm weiter auszulesen


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
stra:string;
begin
stra:=edit1.text;
for I := 1 to length(stra) do

if stra[i] = 'ö' then begin
   stra[i]:= 'o'  ;
   stra[i+1]:='e'   ;
   for j := i+1 to length(stra) do
   stra[j]:= stra[j-1];
end;
edit1.Text:=stra;  
end;

Flare 16. Jan 2007 21:03

Re: verschachtelte schleifen
 
Zitat:

Zitat von Klaus01
Delphi-Quellcode:
function replace(Quelle,suche,ersetze:string):String
var
  i:Byte;
begin
  result:='';
  for i:=1 to length(quelle) do
    if quelle[i] = suche then
      result:=result+ersetze
    else
      result:=result+quelle[i];
end;

Dein Funktionsheader macht wenig Sinn :gruebel:
Man kann einen String als suche übergeben, du erlaubst aber bei dem Vergleich nur ein Zeichen von Quelle...

Ich finde das hier sinnvoller:
Delphi-Quellcode:
function replace(Quelle: String; suche,ersetze:char):String
Wobei das natürlich nur für ein Zeichen geht, für das Problem ö zu oe müsste man das dann eben ein bisschen komplizierter machen.
Delphi-Quellcode:
function replace(Quelle,suche,ersetze:string):String
var
  i:Byte;
begin
  result:='';
  for i:=1 to length(Quelle)-length(suche)+1 do
  begin
    if Copy(Quelle, i, length(suche))=suche then
    begin
      result:=result + ersetze + Copy(Quelle, i+1, length(Quelle));
      replace(result, suche, ersetze); // mir viel gerade nix besseres ein als eine Rekursion, darf ruhig korrigiert werden
      break;
    end
    else
      result:=result+quelle[i];
  end;
end;
(Ist ungetestet und ich glaube auch, dass da irgendwo ein Fehler drin ist...bitte korrigiert mich!)


Flare

Daniel G 16. Jan 2007 21:10

Re: verschachtelte schleifen
 
Delphi-Referenz durchsuchenStringReplace darf sicher nicht benutzt werden, oder? :mrgreen:

baala 16. Jan 2007 21:15

Re: verschachtelte schleifen
 
Zitat:

Zitat von Daniel G
Delphi-Referenz durchsuchenStringReplace darf sicher nicht benutzt werden, oder? :mrgreen:

das war meine erste idee, gleich zum lehrer hin, warum mit for?
stringreplace ist viel einfacher!
=> nein, ihr sollt verschachtelte for schleifen üben

selbst so wie ich's oben gelöst habe, war nicht wirklich richtig...

aber ich denke ich habe nun ein lösungsweg, selbst wenn ich noch nicht fertig bin:

Delphi-Quellcode:
if stra[i] = 'ö' then begin
   stra[i]:= 'o'  ;
   //borse
   stra[i+1]:='e'   ;
   //boese
nun muss ich einfach mit der 2ten for schleife, das s zum r machen usw machen,
also i:=2 stra[2+2]:=strb[j] oder so in der art

3_of_8 16. Jan 2007 21:20

Re: verschachtelte schleifen
 
Aufpassen, das kann eine böse AV geben. Nebenbei geht das ö wie gesagt mit AnsiCompareString sowieso.

Christian18 16. Jan 2007 21:21

Re: verschachtelte schleifen
 
Hallo,

passt jetzt vieleicht nicht so ganz hier rein, aber ich will es trotzdem einmal los werden. Ich habe auch in meiner Schulzeit viel mit Delphi und auch anderen Sprachen arbeiten müssen. Wir haben auch ähnliche Aufgaben bekommen wie Du sie bekommen hast.

Jedoch hat mein Lehrer es auch als richtig Bewertet, wenn man einen anderen Lösngsansatz verwendet hat als den der Lehrer uns in der Schule gezeigt hatte. Ich denke mal es ist nicht falsch wenn du es mit nur einer Schleife machst. Ist meiner Meinung nach auch die eleganteste und schnellste Lösung.

Aber wie schon gesagt: Versteh einer die Leherer!!!

3_of_8 16. Jan 2007 21:23

Re: verschachtelte schleifen
 
An der Uni musste ich mal einen Stringvergleich in Assembler rekursiv durchführen... Das war ma geil... :lol:

Christian18 16. Jan 2007 21:24

Re: verschachtelte schleifen
 
OT: Wie kannst denn du schon an der Uni gewesen sein, wenn du erst 15 bist???

baala 16. Jan 2007 21:31

Re: verschachtelte schleifen
 
Zitat:

Zitat von 3_of_8
Aufpassen, das kann eine böse AV geben. Nebenbei geht das ö wie gesagt mit AnsiCompareString sowieso.

naja, einen AV hatte ich noch nicht, aber mit meinem aktuellen code werden immer zufällige zeichen hinzugefügt. was aber wohl nicht so schlimm ist, da es beim lehrer genau so war ^^
ich habe mir deinen tipp mit dem AnsiCompareString durch gelesen auch die delphi hilfe benutzt,
so wie es schaut, ist das wirklich eine schön lösung :thumb:
Warum ich trotzdem mit der verschachtelung es versuche?
Weil ich gerne sehen möchte, wie das richtig ausschaut, denn ich weiß ja nicht, was ich morgen in der arbeit machen muss. AnsiCompareString hin oder her, wenn ich in der aufgaben stellung mit einer verschachtelung arbeiten muss, es auf die schnelle keine alternative gibt, bin ich aufgeschmißen,
wie soll ich unter arbeitsdruck schnell die verschachtelung hinbekommen, wenn ich es heute in ruhe noch nicht wirklich geschafft habe? :wink: Daher möchte ich auf nummer sicher gehen, dass einmal mit der verschachtelung hinbekommen, damit ich da morgen beruhig rein gehen kann.

@Christian18, da stimme ich dir zu, verstehe einer die lehrer!
Ich glaube auch, dass der lehrer vll alternative lösungen durchgehen lässt. Nur wenn ich gezwungen bin diese verschachtelung zu nutzen, da alles andere zu komplex währe, bin ich auf geschmißen.
Sicher es gubt immer eine alternative, aber so gut bin ich noch nicht, bzw sind wir noch nicht so weit im unterricht.

3_of_8 16. Jan 2007 21:34

Re: verschachtelte schleifen
 
AnsiCompareText meinte ich. ;) sry.

baala 16. Jan 2007 21:47

Re: verschachtelte schleifen
 
Zitat:

Zitat von 3_of_8
AnsiCompareText meinte ich. ;) sry.

macht ja nichts ^^
so ich denke nun, dass ich das habe, ist zwar immer noch etwas buggy, aber im prinzip geht es...
hat vll noch einer einen verbesserung vorschlag? *hoff* sonst muss das für morgen reichen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
stra,strb:string;
begin
stra:=edit1.text;
strb:=stra;
for I := 1 to length(stra) do

if stra[i] = 'ö' then begin
   stra:=stra+'#';
   //börse
   stra[i]:= 'o'  ;
   //borse
   stra[i+1]:='e'   ;
   //boese
   for j:=i+2 to length(stra) do
   stra[j]:= strb[j-1];
end;
edit1.Text:=stra;  
end;

3_of_8 16. Jan 2007 21:51

Re: verschachtelte schleifen
 
Du verwendest Copy. Damit geht das. Vielleicht gibts auch sowas wie Insert, weiß ich jetzt nicht auswendig.

baala 16. Jan 2007 22:11

Re: verschachtelte schleifen
 
Zitat:

Zitat von 3_of_8
Du verwendest Copy. Damit geht das. Vielleicht gibts auch sowas wie Insert, weiß ich jetzt nicht auswendig.

nee einen insert gibt es leider nicht, außer man schreibt sich einen -> zu komplex^^
zu deiner idee mit copy:
Delphi-Quellcode:
c:=length(stra);
for I := 1 to length(stra) do

if stra[i] = 'ö' then begin
   stra[i]:= 'o'  ;
   stra[i+1]:='e'   ;
   Delete(stra,i+2,c) ;
   stra:=stra+copy(strb,i+1,c);
end;
edit1.Text:=stra;  
end;
müsste ja das in etwa sein, geht auch so einigermaßen, nur ist das problem, dass die halt das 2te for fehlt :(
weil das muss ja so gehen: 1. for prüft die zeichen, 2. for verschiebt im falle das im ersten for ein ö aufgetaucht ist, die ganzen zeichen um eine stelle.

3_of_8 16. Jan 2007 22:15

Re: verschachtelte schleifen
 
Das Delete und das Copy könntest du evtl. noch zusammenlegen, muss aber nicht sein.

Silentium 16. Jan 2007 23:15

Re: verschachtelte schleifen
 
Hi, meine Idee war Folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  buffer, output:string;
  laenge, i:integer;
begin
  output := '';

  laenge := Edit1.GetTextLen;
  buffer := Edit1.Text;

  for i := 1 to laenge do begin
    case buffer[i] of
      'Ä':output := output + 'Ae';
      'ä':output := output + 'ae';
      'Ö':output := output + 'Oe';
      'ö':output := output + 'oe';
      'Ü':output := output + 'Ue';
      'ü':output := output + 'ue';
    else
      output := output + buffer[i];
    end;
  end;

  Edit1.Text := output;
end;
Hoffe, du kannst was mit anfangen.

Gruß Sil


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 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-2025 by Thomas Breitkreuz