![]() |
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: ![]() 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:
//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
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; 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 :( |
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. |
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 :( |
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; |
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; |
Re: verschachtelte schleifen
Zitat:
@Tormentor32, vielen dank, damit werde ich es mal versuchen, halt mal schauen, wie ich das in die aufgabe ein bauen kann :gruebel: |
Re: verschachtelte schleifen
Ich persönlich würde das ohne mit der Wimper zu zucken ohne verschachtelte Schleife machen.
|
Re: verschachtelte schleifen
In Deiner Aufgabenstellung (jpg Bild) steht aber auch kein Wort von Verschachtelung.
Nur etwas von for Schleifen.
Delphi-Quellcode:
Grüße
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; Klaus |
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; |
Re: verschachtelte schleifen
Zitat:
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:
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.
function replace(Quelle: String; suche,ersetze:char):String
Delphi-Quellcode:
(Ist ungetestet und ich glaube auch, dass da irgendwo ein Fehler drin ist...bitte korrigiert mich!)
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; Flare |
Re: verschachtelte schleifen
![]() |
Re: verschachtelte schleifen
Zitat:
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:
nun muss ich einfach mit der 2ten for schleife, das s zum r machen usw machen,
if stra[i] = 'ö' then begin
stra[i]:= 'o' ; //borse stra[i+1]:='e' ; //boese also i:=2 stra[2+2]:=strb[j] oder so in der art |
Re: verschachtelte schleifen
Aufpassen, das kann eine böse AV geben. Nebenbei geht das ö wie gesagt mit AnsiCompareString sowieso.
|
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!!! |
Re: verschachtelte schleifen
An der Uni musste ich mal einen Stringvergleich in Assembler rekursiv durchführen... Das war ma geil... :lol:
|
Re: verschachtelte schleifen
OT: Wie kannst denn du schon an der Uni gewesen sein, wenn du erst 15 bist???
|
Re: verschachtelte schleifen
Zitat:
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. |
Re: verschachtelte schleifen
AnsiCompareText meinte ich. ;) sry.
|
Re: verschachtelte schleifen
Zitat:
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; |
Re: verschachtelte schleifen
Du verwendest Copy. Damit geht das. Vielleicht gibts auch sowas wie Insert, weiß ich jetzt nicht auswendig.
|
Re: verschachtelte schleifen
Zitat:
zu deiner idee mit copy:
Delphi-Quellcode:
müsste ja das in etwa sein, geht auch so einigermaßen, nur ist das problem, dass die halt das 2te for fehlt :(
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; 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. |
Re: verschachtelte schleifen
Das Delete und das Copy könntest du evtl. noch zusammenlegen, muss aber nicht sein.
|
Re: verschachtelte schleifen
Hi, meine Idee war Folgendes:
Delphi-Quellcode:
Hoffe, du kannst was mit anfangen.
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; 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