Delphi-PRAXiS

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

xxsasch4xx 16. Sep 2010 20:27

Delphi-Version: 7

verschachtelte if funktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ich brauche dringend Hilfe bei einem Programm bei mir. Das Programm soll folgendes überprüfen:
Wenn in edit3 eine 0 steht soll das programm herausfinden ob in edit2 und edit 1 entweder eine null steht oder in einem der beiden eine 1 und im anderen eine 0 oder ob das gleiche für edit6 und edit9 zutrifft anstatt für edit2 und edit1.
edit 1, 2 und 3 sollen so überprüft werden. Bei dem edit2 kann ja nur logischer weisse geprüft werden was in edit5 und edit8 steht.


hier das ist mein delphi code:
Delphi-Quellcode:
if form1.edit1.hint='0' then

if (form1.edit4.text='0') and (form1.edit7.text='0') or
   (form1.edit4.text='0') and (form1.edit7.text='1') or
   (form1.edit4.text='1') and (form1.edit7.text='0') or
   (form1.edit2.text='0') and (form1.edit3.text='0') or
   (form1.edit2.text='0') and (form1.edit3.text='1') or
   (form1.edit2.text='1') and (form1.edit3.text='0') then

if form1.edit2.hint='0' then

if (form1.edit5.text='0') and (form1.edit8.text='0') or
   (form1.edit5.text='0') and (form1.edit8.text='1') or
   (form1.edit5.text='1') and (form1.edit8.text='0') then

if form1.edit3.text='0' then
if (form1.edit2.text='0') and (form1.edit1.text='0') or
   (form1.edit2.text='1') and (form1.edit1.text='0') or
   (form1.edit2.text='0') and (form1.edit1.text='1') or
   (form1.edit6.text='0') and (form1.edit9.text='0') or
   (form1.edit6.text='1') and (form1.edit9.text='0') or
   (form1.edit6.text='0') and (form1.edit9.text='1') then
showmessage('Die Bedingungen wurden erfüllt')
else
showmessage('Die Bedingungen wurden erfüllt');

end;
Es ist eine Datei angehängt von dem design des formulars.
Diese Zahlen die jetzt da eingetragen sind müssten zu einer ausgabe führen, weil in edit3 eine null ist und in edit6 und edit9 nicht jeweils eine 1 eingetragen ist sondern eine 1 und eine 0. Und in edit1 und edit2 auch nicht jeweils eine 1 eingetragen ist.

In edit1 eine 1 eingetragen was bedeutet dass edit1 nicht weiter untersucht werden soll.

und in edit2 ist zwar eine null eingetragen aber in edit5 fehlt die 1.

ich hoffe ich konnte mit diesem beispiel mein programm näher erklären.
Ich danke schon einmal im Voraus.:thumb:

Satty67 16. Sep 2010 20:45

AW: verschachtelte if funktion
 
Als ich versuchte, der Beschreibung zu folgen, hat mein Gehirn ein paar Extra-Windungen bekommen. Ich hoffe das macht mich auch klüger.

Willst Du prüfen, ob ein Tick-Tack-Toe Sieg erfolgt ist?

Ich kann dem ganzen Bedingungs-Wirrwarr anhand der Beschreibung noch nicht ganz folgen, versuche es aber gleich nochmal.

PS: ...und wieso manchmal Edit.hint statt Edit.text?

Delphi-Quellcode:
if form1.edit1.hint='0' then

  if (form1.edit4.text='0') and (form1.edit7.text='0') or
     (form1.edit4.text='0') and (form1.edit7.text='1') or
     (form1.edit4.text='1') and (form1.edit7.text='0') or
     (form1.edit2.text='0') and (form1.edit3.text='0') or
     (form1.edit2.text='0') and (form1.edit3.text='1') or
     (form1.edit2.text='1') and (form1.edit3.text='0') then

        if form1.edit2.hint='0' then

          if (form1.edit5.text='0') and (form1.edit8.text='0') or
             (form1.edit5.text='0') and (form1.edit8.text='1') or
             (form1.edit5.text='1') and (form1.edit8.text='0') then

               if form1.edit3.text='0' then
                 
                 if (form1.edit2.text='0') and (form1.edit1.text='0') or
                    (form1.edit2.text='1') and (form1.edit1.text='0') or
                    (form1.edit2.text='0') and (form1.edit1.text='1') or
                    (form1.edit6.text='0') and (form1.edit9.text='0') or
                    (form1.edit6.text='1') and (form1.edit9.text='0') or
                    (form1.edit6.text='0') and (form1.edit9.text='1') then
                     
                      showmessage('Die Bedingungen wurden erfüllt')
else

  showmessage('Die Bedingungen wurden erfüllt');
.
Mit Einrückung sieht man, das hier eine ganze Menge erfüllt sein muss, wenn Edit1.hint <> '0'. Kann es sein, das Du garnicht alle Bedingungen voneinander abhängig haben wolltest?

jfheins 16. Sep 2010 20:49

AW: verschachtelte if funktion
 
Du hast keine Fehlerbeschreibung gepostet.

Aber vielleicht hilft schon eine passende Einrückung:
Delphi-Quellcode:
if form1.edit1.hint='0' then
begin
   if (form1.edit4.text='0') and (form1.edit7.text='0') or
      (form1.edit4.text='0') and (form1.edit7.text='1') or
      (form1.edit4.text='1') and (form1.edit7.text='0') or
      (form1.edit2.text='0') and (form1.edit3.text='0') or
      (form1.edit2.text='0') and (form1.edit3.text='1') or
      (form1.edit2.text='1') and (form1.edit3.text='0') then
   begin
      if form1.edit2.hint='0' then
      begin
         if (form1.edit5.text='0') and (form1.edit8.text='0') or
            (form1.edit5.text='0') and (form1.edit8.text='1') or
            (form1.edit5.text='1') and (form1.edit8.text='0') then
         begin
            if form1.edit3.text='0' then
            begin
               if (form1.edit2.text='0') and (form1.edit1.text='0') or
                  (form1.edit2.text='1') and (form1.edit1.text='0') or
                  (form1.edit2.text='0') and (form1.edit1.text='1') or
                  (form1.edit6.text='0') and (form1.edit9.text='0') or
                  (form1.edit6.text='1') and (form1.edit9.text='0') or
                  (form1.edit6.text='0') and (form1.edit9.text='1') then
               begin
                  showmessage('Die Bedingungen wurden erfüllt');
               end
               else
               begin
                  showmessage('Die Bedingungen wurden erfüllt');
               end;
            end;
         end;
      end;
   end;
end;
P.S.: Du fragst zweimal einen Hint ab. Ist das gewollt?

xxsasch4xx 16. Sep 2010 20:52

AW: verschachtelte if funktion
 
es soll später mal für ein spiel dienen das prüft ob an diesen stellen keine möglichkeiten mehr sind für das "springen"

das spiel heisst solitäre (brettspiel)
http://bilder.german-toyshop.de/Bilder/200022162.jpg
hier ist ein bild ich habe die ersten 9 felder als edit felder dargstellt
1 steht für "steinchen da"
und 0 steht für "leer"
aber ich wollte nicht direkt meine spiele version hier erläutern sondern nur vom prinzip her das mit den editfeldern.
ich hoffe es ist klarer jetzt.

xxsasch4xx 16. Sep 2010 20:58

AW: verschachtelte if funktion
 
ne das mit den hints ist nicht gewollt gewessen dass soll eigentlcih .text sein aber ich hab es wohl vergessen zu ändern.

Satty67 16. Sep 2010 21:13

AW: verschachtelte if funktion
 
Ich glaube Du prüfst grundsätzlich zuviel auf einmal und aus der falschen Perspektive.

Weniger auf einmal prüfen prüfen geht durch ein Helferlein in Form einer kleinen Boolean Variable:
Delphi-Quellcode:
var
  ZugGueltig : Boolean;
begin
  ZugGueltig := true; // Erstmal gültig annehmen

  // Jetzt jede Reihe einzeln prüfen und Zug bei Bedarf ungültig machen
  if Edit3.Text = '0' then
  begin
    if (Edit1.Text = '0') or (Edit2.Text = '0') then
      ZugGueltig := false;

    if (Edit6.Text = '0') or (Edit9.Text = '0') then
      ZugGueltig := false;
  end;

  // Am Ende auswerten
  if ZugGueltig then
    showmessage('Die Bedingungen wurden erfüllt');
.
So ist das zwar ein klein wenig mehr Schreibarbeit, aber erstmal wesentlich leichter zu kontrollieren. Ganz am Schluss (wenn es richtig funktioniert) kann man die Einzelbedingungen immer noch klammern und mit einem and verbinden.

Interessant wäre auch die Kontrolle aus Sicht des Steines, statt des Ziele, aber das muss nicht sein.

xxsasch4xx 16. Sep 2010 21:18

AW: verschachtelte if funktion
 
wenn ich nur ein edit feld überprüfen müsste und nicht 3 oder mehrere dann wär es ja einfacher aber später muss ich mindestens für 30 bilder.hints die gleiche prüfung ablegen und deswegn wollte ich das erstmal theoretisch für 3 edit felder machen dass ich das dann für die bilder umsetzen kann

Luckie 16. Sep 2010 21:43

AW: verschachtelte if funktion
 
Falscher Ansatz. Überlege doch mal. Du hast jetzt schon so einen Wust an if-Abfragen, wie soll denn das erst bei 30 Eingabefeldern aussehen?

Du musst dein Konzept überarbeiten. Ich würde erst mal für jedes Loch ein ein Objekt erstellen. das Loch weiß, ob ein Stift in ihm steckt oder nicht. Des weiteren kennt ein Loch-Objekt seine Nachbarlöcher, die einen gültigen Zug ermöglichen. Dann die Objekte in einen Container packen. Der Container ist das Spielfeld. Bei einem Zug, muss, das Spielfeld nur prüfen, ob ein Stift im Loch ist oder nicht und ob das Zielloch zu den gültigen Nachbarlöchern gehört.

Das war mal so schnell aus dem Kopf.

Kleines Beispiel: http://www.michael-puff.de/Programmi...ainer-Klassen/

xxsasch4xx 17. Sep 2010 14:03

AW: verschachtelte if funktion
 
was für ein objekt?
ich versteh das nicht.

xxsasch4xx 17. Sep 2010 14:05

AW: verschachtelte if funktion
 
okay ich geb es auf das ist zu schwer für mich ich mach einfach einen zusätzlichen button "Aufgeben" ^^
Trodzem danke für die die mir helfen wollten.

xZise 18. Sep 2010 12:14

AW: verschachtelte if funktion
 
Zitat:

Zitat von xxsasch4xx (Beitrag 1050298)
was für ein objekt?
ich versteh das nicht.

Er meint du hast eine Klasse die eine Mulde darstellt. Sie selber speichert, ob darin eine Kugel ist, und wie die Mulden an den Seiten sind. Wenn du jetzt einen Spielstein anklickst, dann nimmst du die passende Mulde (du kannst es ja mit den X/Y Koordinaten herausfinden) und sagst der, dass der Stein bewegt werden soll. Diese Mulde guckt dann: Ist ein Stein drin -> Wenn ja ist daneben ein Stein? Dann sagt er das der benachbarten Mulde, dass dort ein Stein rüber zieht. Diese kennt ja wiederum auch ihre Nachbarmulden und kann gucken ob diese Frei ist. Wenn ja, dann wird der Stein zwischen den beiden Mulden ausgetauscht, und der mittlere gelöscht.

Delphi-Quellcode:
type
  TMulde = class(TObject)
  private
    FLeft, FTop, FRight, FBottom : TMulde;
    FStoneSet : Boolean;

    function MoveOverStoneBottom() : Boolean;
    function MoveOverStoneRight() : Boolean;
    function MoveOverStoneLeft() : Boolean;
    function MoveOverStoneTop() : Boolean;
  public
    function MoveStoneBottom() : Boolean;
    function MoveStoneRight() : Boolean;
    function MoveStoneLeft() : Boolean;
    function MoveStoneTop() : Boolean;
  end;
In MoveStone* wird dann das oben beschriebene gemacht:
Delphi-Quellcode:
if FStoneSet // Stein in der Mulde
   and Assigned(FTop) // Mulde oberhalb vorhanden
   and FTop.FStoneSet // Stein in der oberen Mulde
   then
begin
  Result := FTop.MoveOverStone();
  if (Result) then // Der Stein wurde verschoben
    FStoneSet := False; // Dann den hier entfernen
end else
  Result := False;
In MoveOverStone* wird dann das weiter verarbeitet:
Delphi-Quellcode:
if Assigned(FTop) // Mulde oberhalb vorhanden
   not(FTop.StoneSet) // Mulde oberhalb ist frei
   then
begin
  FTop.StoneSet := True;
  Self.StoneSet := False;
  // Alternativ:
  // FBottom.StoneSet := False;
end else
  Result := False;
Das ist nicht der Weisheit letzter Schluss, aber vielleicht hilft es dir zumindest im Hintergrund zu speichern, was passiert.
Um das noch zu Zeichnen, muss man nicht mehr so viel tun. Du muss halt alle Mulden im Programm abspeichern und dann eine TPaintBox darauf legen. Und im OnPaint der Paintbox kannst du dann die Mulden durchgehen und dann herausfinden wo die Mulde ist (z.B. die Mulde speichert seine Koordinaten) und dann gucken ob die Mulde besetzt ist und z.B. entweder einen nicht ausgefüllten oder einen ausgefüllten Kreis zeichnen.

MfG
Fabian

PS: Nach zwei Minuten schon aufgeben? Wir sind zwar schnell, aber so schnell auch nicht.

Sir Rufo 18. Sep 2010 12:25

AW: verschachtelte if funktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
@xZise

ich befürchte aber, das dem TE die Grundlagen fehlen, um deinen Code zu verstehen bzw. den auf dieser Basis zu vervollständigen. Natürlich schreit die Aufgabenstellen und Delphi nach einer OOP-Lösung (mit Klassen), aber schau dir den Ansatz vom TE an und du wirst festellen, dass der über das Drag'n'Drop von Komponenten auf ein Form noch nicht viel weiter gekommen ist.

Somit wäre ein Verweis auf ein Grundlagen-Tutorial in diesem Falle besser.

Um dieses plain zu lösen sollte der TE mal eine Logik-Tabelle aufzeichnen und dabei alle möglichen Konstellationen eintragen. Damit kann man dann ein Regelwerk erstellen und dieses dann nach Delphi umsetzen.

[EDIT]

So ich hab da mal als Fingerübung ein Solitär zusammengeklopft :mrgreen:
Es ist bestimmt nicht die beste Version, aber eine die funktioniert.
Logik und Ausgabe sind natürlich getrennt.

Im Anhang befinden sich die Quellen und die kompilierte Version (logisch als exe)

HINWEIS Da ich die Generics benutze lässt sich der Code nur mit Delphi 2010 (2009?) compilieren. Mit geübten Fingern kann man die Generics aber auch wegprogrammieren ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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