Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi nur eine if-Schleife ausführen (https://www.delphipraxis.net/141132-nur-eine-if-schleife-ausfuehren.html)

Jaegermeister1992 3. Okt 2009 09:32


nur eine if-Schleife ausführen
 
Delphi-Quellcode:
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
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?

[edit=Matze][c]-Tags durch [delphi]-Tags ersetzt. MfG, Matze[/edit]

Matze 3. Okt 2009 09:35

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 Delphi-Referenz durchsuchengoto, was jedoch unsauberer Programmierstil ist.
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

mkinzler 3. Okt 2009 09:36

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

Matze 3. Okt 2009 09:42

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.

Wolfgang Mix 3. Okt 2009 09:43

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

silver-moon-2000 3. Okt 2009 09:43

Re: nur eine if-Schleife ausführen
 
Man könnte z.B. das ganze in ein Case packen, so nach dem Prinzip:
Delphi-Quellcode:
case i of
16: begin end;
8+8: begin end;
end;
nur wird das nicht funktionieren, denn Du läufst hier in ein Problem:
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.

Jaegermeister1992 3. Okt 2009 09:44

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?

Matze 3. Okt 2009 09:46

Re: nur eine if-Schleife ausführen
 
Du mit deinem "etz". :wall:

Schreibe mal deutlich und verständlich was du genau möchtest.

Jaegermeister1992 3. Okt 2009 09:48

Re: nur eine if-Schleife ausführen
 
Delphi-Quellcode:
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;
So das ist der ganze Code auf den ich das anwenden will
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...

Matze 3. Okt 2009 09:49

Re: nur eine if-Schleife ausführen
 
Zitat:

Zitat von Jaegermeister1992
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...

Ist das denn nicht der Fall?

Jaegermeister1992 3. Okt 2009 09:52

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

Jaegermeister1992 3. Okt 2009 09:54

Re: nur eine if-Schleife ausführen
 
oder könnte man die For-Schleife nach erfüllen einer if ANweisung stoppen?

Matze 3. Okt 2009 09:55

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:

Jaegermeister1992 3. Okt 2009 09:58

Re: nur eine if-Schleife ausführen
 
Danke das ist das was cih wissen wollte so müsste es gehen danke!

Matze 3. Okt 2009 10:01

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. ;)

Jaegermeister1992 3. Okt 2009 10:07

Re: nur eine if-Schleife ausführen
 
Geht klar;-)

DeddyH 3. Okt 2009 10:17

Re: nur eine if-Schleife ausführen
 
Echt etz? :mrgreen: (SCNR^^)

haentschman 3. Okt 2009 10:38

Re: nur eine if-Schleife ausführen
 
Hallo Jaegermeister1992,

Zitat:

Showmessage('Sie haben eine Vierziehen');
...was bedeutet das ? Das klingt wie eine elektronische Übersetzung aus dem Cinesischen. Ist das bei dem Spiel so ? :gruebel:

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:

himitsu 3. Okt 2009 10:57

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.

Jaegermeister1992 3. Okt 2009 11:14

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:
  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;
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.

Jürgen Thomas 3. Okt 2009 11:22

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

messie 3. Okt 2009 11:58

Re: nur eine if-Schleife ausführen
 
Ich glaube, Du würdest besser mit einem repeat...until statt mit for klarkommen.

Delphi-Quellcode:

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.
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.

Grüße, Messie

Wolfgang Mix 3. Okt 2009 12:48

Re: nur eine if-Schleife ausführen
 
@ Matze:
Zitat:

erstens gibt es keine if-Schleifen,
Ich weiss, dass folgender Code verpönt ist, aber es scheint sie doch noch zu geben ;-)

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

himitsu 3. Okt 2009 13:01

Re: nur eine if-Schleife ausführen
 
Zitat:

Zitat von Wolfgang Mix
@alle
Das mit dem Goto bitte ganz schnell wieder vergessen, sonst mache ich mich hier unbeliebt :-D

wenn man weiß was man macht, dann ist Goto ein ganz legitimier Befehl.
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)

Lannes 3. Okt 2009 13:27

Re: nur eine if-Schleife ausführen
 
Hallo,

Zitat:

Zitat von Jaegermeister1992
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:
//...
      AnzahlC2:=AnzahlC2-1;
      NachlegenC2;
      break;
    end
    else Showmessage('Hallo');
  end;
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.

dann frag doch ob die Schleife durch ist:
Delphi-Quellcode:
//...
      AnzahlC2:=AnzahlC2-1;
      NachlegenC2;
      break;
    end
    else if i = C2.Items.Count-1 then // das war der letzte Durchgang
      Showmessage('Hallo');
  end;
//Edit: Ich sehe gerade das es im Grunde das gleiche wie der Vorschlag von messie ist.

himitsu 3. Okt 2009 13:33

Re: nur eine if-Schleife ausführen
 
ich mach es immer so ... finde es so jedenfalls verständlicher
Delphi-Quellcode:
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;
(theoretisch könnte man auch das ELSE hier weglassen, da es vom Aufrufpfad her auf's Selbe rauskommt.

Jaegermeister1992 3. Okt 2009 14:45

Re: nur eine if-Schleife ausführen
 
Danke Danke so funktionierts

Rudirabbit 3. Okt 2009 18:32

Re: nur eine if-Schleife ausführen
 
Hallo
Zitat von Wolfgang Mix:
Zitat:

Das mit dem Goto bitte ganz schnell wieder vergessen, sonst mache ich mich hier unbeliebt Very Happy
Ich hatte den "Goto" noch nie vermisst, und noch nie gebraucht.
Erinnert mich auch an den üblen Basic Code (vor ca. 20 Jahren)

Zitat von himitsu:
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
Stimmt - ASM ist auch nur ein Spaghetticode - Letztendlich nur das versteht die Cpu.

Wolfgang Mix 3. Okt 2009 18:46

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. ;-)

himitsu 3. Okt 2009 20:05

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

Wolfgang Mix 3. Okt 2009 20:19

Re: nur eine if-Schleife ausführen
 
Zitat:

Bist ja anscheinend nicht der einzige Lehrer
Ich rede seit 30 Jahren im Unterrricht nie von IF-Schleifen und in meinen Beiträgen wirst Du den Begriff hier in der DP von mir auch nirgends finden, heute allerdings ist es mir unterbewußt passiert. Habe es nach nach einer PN von Matze natürlich gleich korrigiert. Den Grund für "meinen Fehler" habe ich ja schon erlaütert (Post #29).

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