![]() |
nur eine if-Schleife ausführen
Delphi-Quellcode:
wenn man, dass etz ausführt trifft natürlich alles zu ist ja klar aber ich will das das Programm wenn die erste schleife ausgeführt wurde nicht noch die nächste ausgeführt wird .. gibt es so einen befehl wie goto zeile sowieso in delphi? oder wie mache ich das?
i:= 16
if i=16 then begin end else if i=8+8 then begin end else if i=4*4 then begin end else if i=2+2+2+2+2+2+2+2 end [edit=Matze][c]-Tags durch [delphi]-Tags ersetzt. MfG, Matze[/edit] |
Re: nur eine if-Schleife ausführen
Hallo,
erstens gibt es keine if-Schleifen, sondern if-Anweisungen. Eine Schleife ist etwas ganz anderes. Zweitens gibt es in Delphi auch ![]() Drittens: Was möchtest du genau realisieren? Ich habe es noch nicht ganz verstanden. In deinem Fall sollte die 2. Schleife nicht ausgeführt werden, da die erste bereits zutrifft, hätte ich gesagt. Grüße, Matze |
Re: nur eine if-Schleife ausführen
Ich werde aus deinem Beitrag absolut nicht schlau.
Ich sehe keine Schleifen und die If Bedingugen sind alle identisch |
Re: nur eine if-Schleife ausführen
Etwas OT:
In fast jedem deiner Beiträge ist das Wort "etz" zu finden. Ich weiß nicht ob das bei dir Mode ist oder generell, aber wenn du "jetzt" meinst, dann schreibe es doch bitte auch so. Das liest sich viel angenehmer und wirkt sachlicher. Zumindest geht es mir so. Ich möchte dir nicht vorschreiben, was du wie schreiben sollst, aber ich denke, andere werden es dir danken, da deine Beiträge dann besser zu verstehen sind. Und die Verwendung von Punkt und Komma wäre auch sehr sinnvoll. Ich musste deinen Satz mindestens 2 x lesen um ihn zu verstehen. |
Re: nur eine if-Schleife ausführen
Da die If-Anweisungen alle identisch sind, sehe ich keinen Sinn in Deinem Vorhaben.
Schau Dir auch mal die Case-Struktur an Gruß Wolfgang |
Re: nur eine if-Schleife ausführen
Man könnte z.B. das ganze in ein Case packen, so nach dem Prinzip:
Delphi-Quellcode:
nur wird das nicht funktionieren, denn Du läufst hier in ein Problem:
case i of
16: begin end; 8+8: begin end; end; Für den Compiler macht es keinen Unterschied, ob Du schreibst 16, 8+8, 4*4 oder sonstwas. Die rechten Seiten dieser Vergleiche werden immer ausgewertet, bevor verglichen wird, und da auf der Rechten Seite eine Berechnung steht, wird das Ergbnis ermittelt, und das ist bei allen Rechnungen immer 16. Also fragst Du praktisch 4mal dieselbe Bedingung ab. Du willst vermutlich wissen, auf welchem Weg das Ergebnis von 16 erreicht wurde, also ob gerechnet wurde 8+8 oder 4*4, aber so wirst Du das nicht erfahren können. |
Re: nur eine if-Schleife ausführen
An Matze:
Also eigt. sollte doch nur die erste Anweisung ausgeführt werden oder? wenn ich das aber auf mein Programm umschreibe dann führt er alle aus also dann gibt er mir wenn man etz beispielsweise für den inhalt der if anweisung ne showmessagemeldung ausgeben lässt für jedes if und else if ne Shoemessage aus? |
Re: nur eine if-Schleife ausführen
Du mit deinem "etz". :wall:
Schreibe mal deutlich und verständlich was du genau möchtest. |
Re: nur eine if-Schleife ausführen
Delphi-Quellcode:
So das ist der ganze Code auf den ich das anwenden will
procedure TForm1.Computer1Legen;
Var ArtA, FarbeA, FarbeC1, ArtC1, AblegenC1 : string; i : integer; begin ArtA:=Copy(Aktuell.Items[0],3,1); FarbeA:=Copy(Aktuell.Items[0],0,1); for i:= 0 to C1.Items.Count-1 do begin FarbeC1:=Copy(C1.Items[i],0,1); ArtC1:=Copy(C1.Items[i],3,1); AblegenC1:= C1.Items[i]; if (FarbeC1 = 'V') and (ArtC1 = 'Z') then begin Showmessage('Sie haben eine Vierziehen'); Computer2Legen; end else if (FarbeC1 = 'F') and (ArtC1 = 'W') then begin Showmessage('Sie haben eine Farbwahl'); Computer2Legen; end else if (FarbeC1 = FarbeA) and (ArtC1 = 'A') then begin Showmessage('Sie haben ein Aussetzen'); Computer2Legen; end else if (FarbeC1 = FarbeA) and (ArtC1 = 'Z') then begin Showmessage('Sie haben ein Zweiziehen'); Computer2Legen; end else if (FarbeC1 = FarbeA) and (ArtC1 = 'R') then begin Showmessage('Sie haben ein Richtungswechsel'); Computer2Legen; end else if (FarbeC1 = FarbeA) or (ArtC1 = ArtA) then begin Showmessage('Hallo ' + inttostr(i)); Computer2Legen; end; end; end; die Showmessage sind nur zum Test da werden nohc ersetz später. Es handelt sich um das Spiel UNO des Feld C1.ITems sind die aktuellen Karten des ComputerSpieler1 Das Feld Aktuell.Items ist die aktuell gelegte karte vom spieler zuvor. Nun soll aber von diesen If-Anweisungen immer nur eine ausgeführt werden udn zwar von oben nach unten wenn die erste zutrifft sollen alle danach ignoriert werden oder wenn die 2. dann alle danach ignoriert werden... |
Re: nur eine if-Schleife ausführen
Zitat:
|
Re: nur eine if-Schleife ausführen
Nein mal ein Beispiel für den INhalt von C1.Items:
F-W V-Z G-5 B-7 Y-7 R-6 R-1 So sind natürlich mehrere If-Anweisungen erfüllt aber ich will das nur die erste die erfüllt wird aus ausgeführt wird die danach nicht mehr |
Re: nur eine if-Schleife ausführen
oder könnte man die For-Schleife nach erfüllen einer if ANweisung stoppen?
|
Re: nur eine if-Schleife ausführen
Also du gehst in deinem Fall diese Liste durch und prüft für jede Zeile ob etwas zutrifft. Hier wäre das erste, was wahr ist "F-W" und somit der 2. if-Zweig.
Anschließend arbeitest du die Liste weiter ab. Ist das vielleicht deine Problem? Wenn du die Schleife verlassen möchtest, falls eine Bedingung zutrifft, dann müsstest du in den if-Anweisungen mit "break" die Schleife verlassen. Wenn ich dich immer noch falsch verstanden habe tut's mir Leid. Grüße, Matze Edit: Dein "Push-Beitrag" sagt mir, dass ich dich dieses mal verstanden habe. :firejump: |
Re: nur eine if-Schleife ausführen
Danke das ist das was cih wissen wollte so müsste es gehen danke!
|
Re: nur eine if-Schleife ausführen
Und für die Zukunft wäre es neben dem Versuch, die Grammatik etwas aufzupeppeln sinnvoll, wenn du gleich den richtigen Quellcode zeigen würdest. Der aus deinem Ausgangsbeitrag hatte mit deinem Problem nichts zu tun, da zum einen die Schleife fehlte und zum anderen alle Bedingungen gleich waren und somit für unnötige Verwirrung sorgten.
Also bevor du etwas falsch zu vereinfachen versuchst, zeige lieber gleich den richtigen Code. ;) |
Re: nur eine if-Schleife ausführen
Geht klar;-)
|
Re: nur eine if-Schleife ausführen
Echt etz? :mrgreen: (SCNR^^)
|
Re: nur eine if-Schleife ausführen
Hallo Jaegermeister1992,
Zitat:
zum Thema: verschachtelte if Anweisungen funktionieren zwar bringen aber mit steigender Komplexität Unübersicht mit sich. Versuche das ganze mal mit case Anweisungen umzusetzen. Du bist dir später dankbar. :thumb: |
Re: nur eine if-Schleife ausführen
CASE geht mit gleichen Werten nicht
und auch bei verschachtelten IF-Anweisung ist es recht "sinnlos" 16, 8+8, 4*4 usw. ergibt alles das Selbe CASE läßt aber nur unterschiedliche Werte zu (Fehlermeldungen wie doppeltes Case-Label wären die Folge) und beim IF würde es zwar kompiliert werden, aber da die folgenden Bedingungen nie erreicht werden, sind sie doch eigentlich vollkommen unnütz. |
Re: nur eine if-Schleife ausführen
Also das funktioniert mitlerweile recht gut nun noch eine Frage:
die selbe For.Schleife wie vorhin. Wenn nun aber keine if Anweisung in der Schleife erfüllt wird, dann soll ... passieren
Delphi-Quellcode:
So habe ich mir das gedacht, aber dann macht er es nach jederm SChleifendurchlauf aber er soll es nur machen wenn die schleife durch ist und nichts passiert ist.
for i:= 0 to C2.Items.Count-1 do begin
FarbeC2:=Copy(C2.Items[i],0,1); ArtC2:=Copy(C2.Items[i],3,1); AblegenC2:= C2.Items[i]; if (FarbeC2 = 'V') and (ArtC2 = 'Z') then begin Showmessage('Sie haben eine Vierzehn'); break; end else if (FarbeC2 = 'F') and (ArtC2 = 'W') then begin Showmessage('Sie haben eine Farbwahl'); break; end else if (FarbeC2 = FarbeA) and (ArtC2 = 'A') then begin Showmessage('Sie haben ein Aussetzen'); break; end else if (FarbeC2 = FarbeA) and (ArtC2 = 'Z') then begin Showmessage('Sie haben ein Zweiziehen'); break; end else if (FarbeC2 = FarbeA) and (ArtC2 = 'R') then begin Showmessage('Sie haben ein Richtungswechsel'); break; end else if (FarbeC2 = FarbeA) or (ArtC2 = ArtA) then begin Ablegen.Picture.Loadfromfile('Karten/' + C2.Items[i] + '.bmp'); Aktuell.Items.Insert(0, C2.Items[i]); C2.Items.Delete(i); AnzahlC2:=AnzahlC2-1; NachlegenC2; break; end else Showmessage('Hallo'); end; |
Re: nur eine if-Schleife ausführen
Dann brauchst du eine zusätzliche boolesche Variable, die vor der for-Schleife auf false gesetzt wird und bei jedem Treffer (ähnlich dem bisherigen ShowMessage) auf true geändert wird; wenn sie nach der for-Schleife immer noch false ist, dann kommt einmalig die gewünschte Schlussmeldung.
Merke: Wenn etwas bei einer Schleife nur einmal gemacht werden soll, gehört es nur selten in die Schleife. Jürgen |
Re: nur eine if-Schleife ausführen
Ich glaube, Du würdest besser mit einem repeat...until statt mit for klarkommen.
Delphi-Quellcode:
Ungetestet, aber so wäre es evtl. übersichtlicher und Du würdest das break sparen, was von den Verfechtern der reinen Lehre gerne angemeckert wird.var bExit : boolean; i : integer; begin bExit := false; i := 0; repeat if dieses then begin //Anweisung bExit := true; end else if jenes then begin //Anweisung bExit := true; end //....weiter so bis else if i = C2.Items.Count-1 then begin //hier wolltest Du noch was machen weil keine Bedingung erfüllt wurde... bExit := true; end; inc(i); until bExit; end. Grüße, Messie |
Re: nur eine if-Schleife ausführen
@ Matze:
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; label hier; begin i:=0; hier: inc (i); if i < 10 then goto hier; edit1.Text:=IntToStr(i); end; @alle Das mit dem Goto bitte ganz schnell wieder vergessen, sonst mache ich mich hier unbeliebt :-D Gruß Wolfgang |
Re: nur eine if-Schleife ausführen
Zitat:
Immerhin baut While-Do, Repeat-Unit, Case, If-Then-(Else) und sogar Try-Except/Finally intern auch nur auf Goto auf ... also auf Jump-Befehlen (ASM) |
Re: nur eine if-Schleife ausführen
Hallo,
Zitat:
Delphi-Quellcode:
//Edit: Ich sehe gerade das es im Grunde das gleiche wie der Vorschlag von messie ist.
//...
AnzahlC2:=AnzahlC2-1; NachlegenC2; break; end else if i = C2.Items.Count-1 then // das war der letzte Durchgang Showmessage('Hallo'); end; |
Re: nur eine if-Schleife ausführen
ich mach es immer so ... finde es so jedenfalls verständlicher
Delphi-Quellcode:
(theoretisch könnte man auch das ELSE hier weglassen, da es vom Aufrufpfad her auf's Selbe rauskommt.
i := 0;
while i < C2.Items.Count do begin if dieses then begin // Anweisung Break; end else if jenes then begin // Anweisung Break; end Inc(i); end; if i = C2.Items.Count then begin // Anweisung, wenn nichts zutraf end; |
Re: nur eine if-Schleife ausführen
Danke Danke so funktionierts
|
Re: nur eine if-Schleife ausführen
Hallo
Zitat von Wolfgang Mix: Zitat:
Erinnert mich auch an den üblen Basic Code (vor ca. 20 Jahren) Zitat von himitsu: Zitat:
|
Re: nur eine if-Schleife ausführen
Der Code von mir stammt noch aus den 70er Jahren unter FORTRAN77.
Der wurde uns damals tatsächlich als IF-Schleife verkauft. Übrigens: Zum Testen musste man die Befehle einzeln auf Lochkarten stanzen, beim Uni-Computerzentrum eine Testzeit beantragen usw. Wenn ich dann gelegentlich nicht über den Begriff IF-Schleife stolpere, so bitte ich um Nachsehen. Gruß Wolfgang P.S.:Ich hoffe, Matze ist von mir als Pauker nicht mehr so ganz enttäuscht. ;-) |
Re: nur eine if-Schleife ausführen
Bist ja anscheinend nicht der einzige Lehrer, welcher von IF-Schleifen redet,
jedenfalls, wenn man betrachtet, wieviele Schüle hier so vorbeikommen und auch davon reden (es sei denn die waren rein zufällig alle bei dir :lol: ) also keine Sorge |
Re: nur eine if-Schleife ausführen
Zitat:
Es wird mir in Zukunft hoffentlich auch nicht mehr passieren, es sei denn, ich verweise auf das Codebeispiel von heute von mir (Post #23). Matze nannte das nett und zutreffend IF-Goto-Schleife:-D Damit schließe ich das Thema. Gruß Wolfgang [edit=Matze]Inhalt durch den des folgenden Beitrags ersetzt, da du deinen Beitrag statt zu editieren zitiert (und bearbeitet) hast. MfG, Matze[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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