Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Bedingungen mit Boolean und Listbox ausgeben (https://www.delphipraxis.net/179396-bedingungen-mit-boolean-und-listbox-ausgeben.html)

MrSGcustom 4. Mär 2014 18:21

Bedingungen mit Boolean und Listbox ausgeben
 
Heyho,
Hab erst seit ein paar Monaten Informatik, nun haben wir eine Aufgabe bekommen, bei der wir mithilfe von Boolean Variablen arbeiten sollen.
In der Aufgabe ging es um die Einladung von 3 Personen, bei denen alle 3 Bedingungen erfüllt sein müssen.
Mit einer Listbox sollen wir alle 8 Ergebnisse in 3 Spalten ( Bsp.: true false false ) etc. ausgeben.
Leider habe ich keinen Plan wie man das so ausgeben kann.
Für die Meisten hier sicherlich ein Kinderspiel.
Hoffe ihr könnt mir schnell helfen, das Projekt wird eventuell am Donnerstag schon eingesammelt und benotet ...

Hier der Quelltextausschnitt (weiß nich ob auch da schon alles korrekt ist ...) :


procedure TForm1.B_StartClick(Sender: TObject);
var A, B, C, BB : boolean;
begin

A := false;
B := false;
C := false;

FOR A := false TO true DO
FOR B := false TO true DO
FOR C := false TO true DO
begin

BB := (A AND C) OR (NOT A AND NOT C)
AND (B OR C) OR (B AND C)
AND (A OR B) OR (NOT A AND NOT B);

end;

end;

end.

Perlsau 4. Mär 2014 18:29

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Habt ihr denn nicht in der Schule gelernt, was eine Boolean-Variable ist? Offenbar nicht, denn sonst würdest du nicht versuchen, damit eine Schleife zu basteln.

Was soll denn da passieren, wenn du auf den Button klickst? Von welchen drei Bedingungen schreibst du da?

Der schöne Günther 4. Mär 2014 18:37

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Die Bedingungen sind wohl einfach irgendwelche ja/nein-Kriterien die erfüllt sein müssen, damit die Person auch eingeladen wird. Also beispielsweise:
  • ist attraktiv
  • bringt Essen/Trinken mit
  • hat mir noch nie in den Keller gekotzt und ich habe es erst drei Tage später gemerkt

Richtig?

Ich verstehe ein paar Punkte daran nicht:
  1. Wie kommt eine TListBox ins Spiel? Eine TListBox hat keine Spalten, damit kannst du eigentlich nur Text untereinander (als Liste halt) ausgeben
  2. Zwei mögliche Zustände (ja/nein) bei drei solcher Bedingungen ergibt acht Permutationen. Was soll damit jetzt geschehen? Ich dachte zu jeder Person soll man anklicken können, ob sie die Bedidngung erfüllt. Das bedeutet 3 mal 3 = 9 CheckBoxen. Aber wen interessieren hier die acht verschiedenen möglichen Kombinationen?

PS: Gewöhn dir an, Variablen NICHT
Delphi-Quellcode:
A,B,C
zu nennen sondern
Delphi-Quellcode:
istAttraktiv
oder ähnlich. Das macht es für alle einfacher. Auch dich 8-)
Kein Mensch kann sehen, was
Delphi-Quellcode:
(A AND C) OR (NOT A AND NOT C)
bedeutet. Und du auch nicht, wenn du zwei Stunden später nochmal draufschaust.

MrSGcustom 4. Mär 2014 18:39

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Im Grunde haben wir nicht besonders viel erklährt bekommen, haben ur die 3 FOR Schleifen angeschrieben bekommen:
"
FOR A := false TO true DO
FOR B := false TO true DO
FOR C := false TO true DO
begin
.
.
.
Ausgabe der Kombi A,B,C
END
"
Durch Klicken des Buttons sollen einfach alle 8 möglichen Kombinationen (wie oben im Beispiel) untereinander in der Listbox ausgegeben werden.
Die Drei Bedingungen sind:
1. (A AND C) XOR (NOT A AND NOT C)
2. (B OR C)
3. (A XOR B)
(Ich weiß, im Quelltext etwas komplizierter dargestellt)

MrSGcustom 4. Mär 2014 18:42

AW: Bedingungen mit Boolean und Listbox ausgeben
 
mit Spalten war einfach nur die Darstellung aller Ergebnisse der Bedingung nebeneinander, sodass bei mehrerern Zeilen optisch 3 Spalten entstehen.
Es soll nichts selber ausgewählt oder eingegeben werden, es sollen im Grunde nur die 2 möglichen Kombinationen ermittelt werden, was in dem fall in der listbox zu sehen sein soll.

DeddyH 4. Mär 2014 19:15

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Was mir nicht klar ist: was soll denn nun in der Listbox ausgegeben werden, alle 8 möglichen Kombinationen oder nur diejenigen, bei denen die 3 Bedingungen zutreffen?

MrSGcustom 4. Mär 2014 19:15

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Alle acht.

DeddyH 4. Mär 2014 19:21

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Dann brauchst Du doch im Grunde nur noch eine Funktion, die Dir aus 3 Boolean-Variablen einen entsprechend aufbereiteten String bastelt. Den fügst Du dann der ListBox hinzu.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Boolean;
begin
  for a := false to true do
    for b := false to true do
      for c := false to true do
        ListBox1.Items.Add(MultiBoolToStr(a, b, c));
end;
D.h., MultiBoolToStr nimmt 3 Booleans entgegen und macht daraus z.B. "True, False, False". Du musst sie nur noch schreiben ;)

himitsu 4. Mär 2014 19:22

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Zitat:

Zitat von Perlsau (Beitrag 1250612)
Habt ihr denn nicht in der Schule gelernt, was eine Boolean-Variable ist? Offenbar nicht, denn sonst würdest du nicht versuchen, damit eine Schleife zu basteln.

Ein Boolean ist ein ordinaler Typ und nur ordinale Typen kann man in For-Schleifen verwenden.

Der schöne Günther 4. Mär 2014 19:24

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, technisch geht das, aber potthässlich ist es trotzdem. Lass den armen nur einmal statt
Delphi-Quellcode:
for variable := False to True
einmal
Delphi-Quellcode:
for variable := True to False
schreiben und sich dann wundern warum nichts mehr geht.


Zitat:

Zitat von DeddyH (Beitrag 1250620)
Dann brauchst Du doch im Grunde nur noch eine Funktion

Nein, er braucht drei. Er hat ja drei verschiedene Bedingungen die nichts miteinander zu tun haben.

Er will sowas wie im Anhang in Listboxen packen.

DeddyH 4. Mär 2014 19:25

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Meine Güte, wenn die Dinger doch vorgegeben wurden...

Popov 4. Mär 2014 19:38

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Ich hab die Aufgabe zwar nicht richtig verstanden, aber egal. Hier zumindest die Tabausgabe. Zwar wird dir dein Lehrer das nicht abnehmen, aber wenn er die Ausgabe in ListBox haben will...

Delphi-Quellcode:
const
  Tabs = 4;
  X: array[Boolean] of String = ('False', 'True');
var
  ListBox: TListBox;
  TabsInLB: array[0..4] of Integer;
  A, B, C, BB : Boolean;
  S: String;
begin
  ListBox := ListBox1;

  TabsInLB[0] := 0;
  TabsInLB[1] := 50;
  TabsInLB[2] := 100;
  TabsInLB[3] := 150;
  Listbox.TabWidth := 1;
  SendMessage(ListBox.Handle, LB_SETTABSTOPS, Tabs, Longint(@TabsInLB));

  A := False;
  B := False;
  C := False;

  FOR A := False TO True DO
    FOR B := False TO True DO
      FOR C := False TO True DO
      begin
        BB := (A AND C) OR (NOT A AND NOT C) //ob das stimmt, glaube ich nicht, aber ich hab es übernommen. Evtl. fehlen da paar Klammern.
              AND (B OR C) OR (B AND C)
              AND (A OR B) OR (NOT A AND NOT B);

        S := X[A] + #9 + X[B] + #9 + X[C] + #9 + X[BB];

        ListBox.Items.Add(S)
      end;
end;

DeddyH 4. Mär 2014 19:44

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Wie soll die Ausgabe denn nun aussehen?

Popov 4. Mär 2014 19:48

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Hier, falls die Annahme vom Schönen Guntar stimmt:

Delphi-Quellcode:
const
  Tabs = 6;
  X: array[Boolean] of String = ('False', 'True');
var
  ListBox: TListBox;
  TabsInLB: array[0..Tabs] of Integer;
  A, B, C, D, E, F : Boolean;
  S: String;
begin
  ListBox := ListBox1;

  TabsInLB[0] := 0;
  TabsInLB[1] := 50;
  TabsInLB[2] := 100;
  TabsInLB[3] := 150;
  TabsInLB[4] := 200;
  TabsInLB[5] := 250;

  Listbox.TabWidth := 1;
  SendMessage(ListBox.Handle, LB_SETTABSTOPS, Tabs, Longint(@TabsInLB));

  A := False;
  B := False;
  C := False;

  S := 'A' + #9 + 'B' + #9 + 'C' + #9 + 'D' + #9 + 'E' + #9 + 'F';
  ListBox.Items.Add(S);

  FOR A := False TO True DO
    FOR B := False TO True DO
      FOR C := False TO True DO
      begin
        D := (A AND C) OR (NOT A AND NOT C);
        E := (B OR C) OR (B AND C);
        F := (A OR B) OR (NOT A AND NOT B);

        S := X[A] + #9 + X[B] + #9 + X[C] + #9 + X[D] + #9 + X[E] + #9 + X[F];

        ListBox.Items.Add(S)
      end;
end;
EDIT:

Oder doch nicht. Ich weiß es nicht.

DeddyH 4. Mär 2014 19:50

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Meine Version ist irgendwie simpler, sowohl im Code wie auch in der Darstellung:
Delphi-Quellcode:
function MultiBoolToStr(a, b, c: Boolean): string;
begin
  Result := BoolToStr(a, true) + ', ' +
            BoolToStr(b, true) + ', ' +
            BoolToStr(c, true);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, a1, b1, c1: Boolean;
  s: string;
begin
  for a := false to true do
    for b := false to true do
      for c := false to true do
        begin
          a1 := (A AND C) XOR (NOT A AND NOT C);
          b1 := B OR C;
          c1 := A XOR B;
          s := MultiBoolToStr(a, b, c);
          if a1 and b1 and c1 then
            s := s + ' -> Treffer';
          ListBox1.Items.Add(s);
        end;
end;
Wobei ich auch nur raten kann, wie es denn aussehen soll.

himitsu 4. Mär 2014 19:53

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1250622)
Ja, technisch geht das, aber potthässlich ist es trotzdem. Lass den armen nur einmal statt
Delphi-Quellcode:
for variable := False to True
einmal
Delphi-Quellcode:
for variable := True to False
schreiben und sich dann wundern warum nichts mehr geht.

Dafür gibt es ja den Debugger :zwinker:

Es ist da wie bei den ENUMs, wo man dann ja auch DOWNTO verwendet.

Man muß nur aufpassen, wenn jemand nett war und das True umgeschrieben hat. :lol:
Delphi-Quellcode:
const True = Boolean(255);
Aber das macht man ja nicht.



PS: Ich würde nur eine Schleife verwenden und das dann mathematisch oder binär befüllen.

DeddyH 4. Mär 2014 19:57

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Zitat:

Zitat von himitsu (Beitrag 1250632)
PS: Ich würde nur eine Schleife verwenden und das dann mathematisch oder binär befüllen.

Ich würde das nehmen, was in der Aufgabe vorgegeben wurde. Es muss ja zumindest noch halbwegs verständlich sein, die Variablenbezeichner sind ja schon schlimm genug.

himitsu 4. Mär 2014 20:32

AW: Bedingungen mit Boolean und Listbox ausgeben
 
OK, bei Hausaufgaben ist das ja immer etwas Anderes,
und mit einem guten Kommentar isses auch wieder verstänlich. :mrgreen:

Sir Rufo 5. Mär 2014 07:14

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Also wie man eine aussagekräftige Anzeige von 3 Eingangswerten und einem Ausgangswert mit 3 "Spalten" realisieren soll ist mir schleierhaft.

Entweder hat hier der Lehrkörper geschlampt, oder es handelt sich um das Stille-Post-Syndrom (wieder mal nur die Hälfte gehört und die noch falsch wiedergegeben).

Der direkteste Lösungsweg wäre (wenn ich die Vorgabe mal frei erweitere um der Ausgabe eine Aussagekraft zu verleihen):
Delphi-Quellcode:
procedure TForm1.B_StartClick(Sender: TObject);
var A, B, C, BB : boolean;
begin

  // Listbox für die Ausgabe leeren (steht nicht in der Aufgabe, habe ich mal frei dazugesetzt)
  Ausgabe_Listbox.Clear;

  FOR A := false TO true DO
    FOR B := false TO true DO
      FOR C := false TO true DO
      begin
        BB :=
          {Bedingung 1} ( (A AND C) OR (NOT A AND NOT C) ) AND
          {Bedingung 2} ( (B OR C) OR (B AND C) ) AND
          {Bedingung 3} ( (A OR B) OR (NOT A AND NOT B) );

        // Ausgabe der Werte in der Listbox
        Ausgabe_Listbox.Items.Add( 
          {Eingangswert A} BoolToStr( A, true ) + ' ' + 
          {Eingangswert B} BoolToStr( B, true ) + ' ' +
          {Eingangswert C} BoolToStr( C, true ) + ' ' + 
          {Ausgangswert BB} BoolToStr( BB, true ) );
      end;
end;

DeddyH 5. Mär 2014 07:20

AW: Bedingungen mit Boolean und Listbox ausgeben
 
*Öhm*...
Zitat:

Delphi-Quellcode:
  A := false;
  B := false;
  C := false;

Überflüssig, sind im Anschluss die Schleifenvariablen.
Zitat:

Delphi-Quellcode:
       BB :=
          {Bedingung 1} (A AND C) OR (NOT A AND NOT C) AND
          {Bedingung 2} (B OR C) OR (B AND C) AND
          {Bedingung 3} (A OR B) OR (NOT A AND NOT B);

entspricht
Delphi-Quellcode:
       BB :=
          {Bedingung 1} (A AND C) OR ((NOT A AND NOT C) AND
          {Bedingung 2} (B OR C)) OR ((B AND C) AND
          {Bedingung 3} (A OR B)) OR (NOT A AND NOT B);
es müsste aber wahrscheinlich heißen
Delphi-Quellcode:
       BB :=
          {Bedingung 1} ((A AND C) OR (NOT A AND NOT C)) AND
          {Bedingung 2} ((B OR C) OR (B AND C)) AND
          {Bedingung 3} ((A OR B) OR (NOT A AND NOT B));
Da deklariere ich mir lieber 3 Variablen, das ist übersichtlicher ;)

Sir Rufo 5. Mär 2014 07:48

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Zitat:

Zitat von DeddyH (Beitrag 1250666)
*Öhm*...
Zitat:

Delphi-Quellcode:
  A := false;
  B := false;
  C := false;

Überflüssig, sind im Anschluss die Schleifenvariablen.
Zitat:

Delphi-Quellcode:
       BB :=
          {Bedingung 1} (A AND C) OR (NOT A AND NOT C) AND
          {Bedingung 2} (B OR C) OR (B AND C) AND
          {Bedingung 3} (A OR B) OR (NOT A AND NOT B);

entspricht
Delphi-Quellcode:
       BB :=
          {Bedingung 1} (A AND C) OR ((NOT A AND NOT C) AND
          {Bedingung 2} (B OR C)) OR ((B AND C) AND
          {Bedingung 3} (A OR B)) OR (NOT A AND NOT B);
es müsste aber wahrscheinlich heißen
Delphi-Quellcode:
       BB :=
          {Bedingung 1} ((A AND C) OR (NOT A AND NOT C)) AND
          {Bedingung 2} ((B OR C) OR (B AND C)) AND
          {Bedingung 3} ((A OR B) OR (NOT A AND NOT B));
Da deklariere ich mir lieber 3 Variablen, das ist übersichtlicher ;)

Weiß gar nicht was du hast, steht doch alles so da :mrgreen:

Insgesamt würde ich das schon vom Ansatz her anders umsetzen
  • Berechnung und Darstellung trennen
  • Weder das Eine noch das Andere im OnClick-Handler implementieren, sondern eine Methode aufrufen, die das erledigt
  • Iteration über Boolean-Werte mit
    Delphi-Quellcode:
    for BoolValue := Low(Boolean) to High(Boolean) do
    (nennt mich paranoid, aber mir doch egal in welcher Reihenfolge die definiert sind, Hauptsache ich kriege sie alle und ich muss mir keinen Kopf machen)

DeddyH 5. Mär 2014 07:51

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Ich würde das normalerweise ja auch "schöner" machen, aber da es sich um eine Schulaufgabe handelt, wollte ich keine didaktische Katastrophe abliefern :mrgreen:

Sir Rufo 5. Mär 2014 08:02

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Zitat:

Zitat von DeddyH (Beitrag 1250671)
Ich würde das normalerweise ja auch "schöner" machen, aber da es sich um eine Schulaufgabe handelt, wollte ich keine didaktische Katastrophe abliefern :mrgreen:

;)

Der Kern der Aufgabe ist wohl auch nicht wartungsfreundlichen Code zu produzieren

himitsu 5. Mär 2014 08:22

AW: Bedingungen mit Boolean und Listbox ausgeben
 
Genau, den Code guckt sich ja später eh nie wieder jemand an. :roll:


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