Interpreter-Fehler boolean nur eins darf wahr sein

wolf454

Mitglied
wahrscheinlich ne super einfache, doofe und nicht in das forum gehörende frage(hausaufgabe.-.)
ich habe genau 3 boolean werte und wenn GENAU einer false ist soll true rauskommen. hab jetzt mit super vielen möglichkeiten getestet.-. aber schlussendlich bin ich mit einzel abfragen und xor rausgekommen🙁
und jetzt würde ich halt gerne wissen ob es nen besseren/einfacheren weg gäbe.-. habe schonversucht ohne true und false hinzuschreiben mit negation und ==/&& dem einfachen d^e^f etc hat alles nicht funtioniert
Code:
boolean d,e,f;
  d= false;
  e= true;
  f= true;

 if((d==false && e==true && f==true)^(d==true && e== false && f==true)^(d==true && e==true && f==false)){

  System.out.println ("true eine von d e oder f ist false");
  }

  else {
  System.out.println("false mehr als eine oder keine ist false");
  }
 
Hallo,
zunächst solltest du statt
Java:
(d==false && e==true && f==true)
besser schreiben:
Java:
(!d && e && f)
Und dann kannst du die drei Fälle mit "oder" verknüpfen.
 
Hallo,
zunächst solltest du statt
Java:
(d==false && e==true && f==true)
besser schreiben:
Java:
(!d && e && f)
Und dann kannst du die drei Fälle mit "oder" verknüpfen.
yeah danke sehr^^ sieht jetzt wenigstens etwas proffesioneller aus.-. aber trotzdem soviel arbeit für so ne einfache aufgabe:/ warum funkt (!(e^f^d) nicht? xors aufgabe ist es doch bei zwei wenn beide verschieden sind true rauszugeben. aber könnte man das nicht im falle von meheren interpretieren als: wenn einer anders ist (f/t/t) gebe true raus.
 
Hier ist zum Spaß noch eine alternative Lösung, die einfach die true-Werte zählt:
Java:
(d?1:0) + (e?1:0) + (f?1:0) == 2


aber könnte man das nicht im falle von meheren interpretieren als: wenn einer anders ist (f/t/t) gebe true raus.
Das kann man schlecht machen, weil es mathematisch falsch wäre. Beispielsweise gilt für false, true, true folgendes:
Code:
false ^ true ^ true ==
(false ^ true) ^ true ==
true ^ true ==
false
Das wäre also vergleichbar mit der Forderung, dass 0 + 1 + 1 = 1 sein soll. Wenn man die Abfrage mehrfach benötigt, kann man ja einfach eine Methode dafür programmieren.
 
Die Tabelle für e^f^d sieht wie folgt aus.
e f d q
0 0 0 0
1 0 0 1
0 1 0 1
1 1 0 0
0 0 1 1
1 0 1 0
0 1 1 0
1 1 1 1
Und die letzte Zeile ist einfach zu erklären, da e^f hier 0 ergibt und das dann mit einer weiteren 1 exclusiv ist. Somit erhält man zum Schluss eine 1.

Soweit ist XOR aber schon gut, man muss dann einfach noch den letzten Fall extra behandeln.
Java:
if(!((e ^ f ^ d && !(e && f && d)))) {
...
 
je true werte/false werte zählen wäre wohl die einfachste möglichkeit aber hatte ich noch net ^^

sasche super antwort vielen dank😀 versteh jetzt warum das nicht geklappt hat
HALT STOP ich habe es doch noch mal getestet und (f/f/f) bringt wieder true raus.-.
und (true/true/true) gibt ebenfalls wieder true raus.-.
 
Zuletzt bearbeitet:
Folgend die Tabelle für !(e ^ f ^ d &&!(e && f && d))
e | f | d || q
--------------
0 | 0 | 0 || 1
1 | 0 | 0 || 0
0 | 1 | 0 || 0
1 | 1 | 0 || 1
0 | 0 | 1 || 0
1 | 0 | 1 || 1
0 | 1 | 1 || 1
1 | 1 | 1 || 1

Ich dachte Du willst auf false Abfragen. Wenn du die Negation am Ende weg lässt ergibt sich die folgende Tabelle.
e ^ f ^ d && !(e && f && d)
e | f | d || q
--------------
0 | 0 | 0 || 0
1 | 0 | 0 || 1
0 | 1 | 0 || 1
1 | 1 | 0 || 0
0 | 0 | 1 || 1
1 | 0 | 1 || 0
0 | 1 | 1 || 0
1 | 1 | 1 || 0
 
Hier ist ein anderer Ansatz.
Java:
private boolean test(boolean a, boolean b, boolean c) {
    if (a) {
        if (b) {
            return false;
        }
        return !c;
    }
    if (b) {
        return !c;
    }
    return c;
}
Vorteil: Viel weniger Prüfungen notwendig
Nachteil: Sehr speziell für genau diesen einen Fall.
 

Zurück
Oben