a && b - Wahrheitstabelle?
-
bandchef schrieb:
Kann man das anders machen?
Ja.
#include <stdio.h> void und (int a, int b) { printf ("%i && %i => %i\n", a, b, a && b); } int main () { int i; for (i = 0; i < 4; i = i + 1) und (i / 2, i % 2); }
Warum das von Paul Müller schlecht ist:
a & b
ist nicht immer gleichbedeutend mita && b
- Zwei Schleifen sind nicht nötig
- return 0 ist nicht nötig.
- die Funktion
und
ist bei dir schon fast zu banal. Entweder macht sie was (Ausgabe) oder sie ist überflüssig.
-
bandchef schrieb:
Ich will ein Programm schreiben, dass mir die Wahrheitstabelle für a && b ausgibt.
Du wolltest ja kein und nachprogrammieren sondern die Tabelle haben.
Und da rechnet der Rechner besser.
-
sorry, aber ich möchte natürlich das und nachprogrammieren. Ich hätte gedacht das wäre klar... Ich möchte aber, besser gesagt, ein und, oder, nicht nachprogrammieren. Und mit diesen selbstgebauten funktionen möchte ich dann die wahrheitstabelle für a AND(b OR c) AND NOT d berechnen lassen...
aber ich seh schon, so, wie ich hier wieder angefangen habe, wird das spätestens bei den 4 variablen (a,b,c,d) in chaos ausarten...
-
progcontest schrieb:
Warum das von Paul Müller schlecht ist:
Warum das von "progcontest" schlecht ist:
progcontest schrieb:
a & b
ist nicht immer gleichbedeutend mita && b
Richtig, aber was bedeutet es denn nun? (Vorsicht rhetorische Frage)
progcontest schrieb:
- Zwei Schleifen sind nicht nötig
Lassen sich aber besser lesen und verstehen.
progcontest schrieb:
- return 0 ist nicht nötig.
Die paar Zeichen haben noch keinem geschadet. Außerdem verwirrt sowas einen Anfänger eher.
progcontest schrieb:
- die Funktion
und
ist bei dir schon fast zu banal. Entweder macht sie was (Ausgabe) oder sie ist überflüssig.
Ich weiß ich hätte sie auch weglassen können. Habe mich aber am Eingangsbeispiel orientieren wollen.
-
Dachte die Aufgabe war, Wahrheitstabelle ausgeben und nicht UND besonders seltsam zu implementieren. Alternativ habe ich noch:
print 0 0 -> 0 print 0 1 -> 0 print 1 0 -> 0 print 1 1 -> 1
Ich hätte gedacht das wäre klar
Zeig mir bitte in deinem Ausgangspunkt wo du das klar gestellt hast. Anscheinend war es nicht klar!
-
Ja und genau das war ja gerade an der Situation das Problem weil ich wieder zu viel gedacht habe... Ich hab gedacht es wäre klar, dass ich das && implementieren will und nicht nur die Wahrheitstabelle mit Verwendung von && erstellen möchte.
Ich hab jetzt zumindestens schon mal einen neuen Ansatz für die benötigte Wahrheitstabelle für a,b,c,d.
int main() { int i, a, b, c, d; for(a=0; a<=1; a=a+1) { for(b=0; b<=1; b=b+1) { for(c=0; c<=1; c=c+1) { for(d=0; d<=1; d=d+1) { printf("%i %i %i %i\n", a, b, c, d); } } } } return 0; }
-
Mein Riecher war schon richtig:
progcontest schrieb:
Und mit diesen selbstgebauten funktionen möchte ich dann die wahrheitstabelle für a AND(b OR c) AND NOT d berechnen lassen...
Mit meiner Struktur lässt sich das einfach erweitern:
#include <stdio.h> void und (int a, int b) { printf ("%i\n", a && b); } void a_and_lpar_b_or_c_rpar_and_not_d(int a, int b, int c, int d) { printf ("%i %i %i %i ", !!a, !!b, !!c, !!d); // Falls du dich überzeugen willst printf ("%i\n", a && (b || c) && !d); } int main () { int i; for (i = 0; i < 4; ++i) und (i&1, i&2); for (i = 0; i < 16; ++i) a_and_lpar_b_or_c_rpar_and_not_d (i&1, i&2, i&4, i&8); }
-
Was ist eigentlich i&1, i&2 in deinem Code?
-
enum {false,true}; printf("false UND false: %s\n", false && false? "true" : "false" ); printf("false UND true : %s\n", false && true ? "true" : "false" ); printf("true UND false: %s\n", true && false? "true" : "false" ); printf("true UND true : %s\n", true && true ? "true" : "false" );
-
@Wutz: das war die zündende Idee:
enum {false,true}; printf("false UND (false ODER false) UND NICHT false\n", (false && (false || false) && !false) ? "true": "false" ); printf("false UND (false ODER false) UND NICHT true \n", (false && (false || false) && !true ) ? "true": "false" ); printf("false UND (false ODER true ) UND NICHT false\n", (false && (false || true ) && !false) ? "true": "false" ); printf("false UND (false ODER true ) UND NICHT true \n", (false && (false || true ) && !true ) ? "true": "false" ); printf("false UND (true ODER false) UND NICHT false\n", (false && (true || false) && !false) ? "true": "false" ); printf("false UND (true ODER false) UND NICHT true \n", (false && (true || false) && !true ) ? "true": "false" ); printf("false UND (true ODER true ) UND NICHT false\n", (false && (true || true ) && !false) ? "true": "false" ); printf("false UND (true ODER true ) UND NICHT true \n", (false && (true || true ) && !true ) ? "true": "false" ); printf("true UND (false ODER false) UND NICHT false\n", (true && (false || false) && !false) ? "true": "false" ); printf("true UND (false ODER false) UND NICHT true \n", (true && (false || false) && !true ) ? "true": "false" ); printf("true UND (false ODER true ) UND NICHT false\n", (true && (false || true ) && !false) ? "true": "false" ); printf("true UND (false ODER true ) UND NICHT true \n", (true && (false || true ) && !true ) ? "true": "false" ); printf("true UND (true ODER false) UND NICHT false\n", (true && (true || false) && !false) ? "true": "false" ); printf("true UND (true ODER false) UND NICHT true \n", (true && (true || false) && !true ) ? "true": "false" ); printf("true UND (true ODER true ) UND NICHT false\n", (true && (true || true ) && !false) ? "true": "false" ); printf("true UND (true ODER true ) UND NICHT true \n", (true && (true || true ) && !true ) ? "true": "false" );
Erweiterbare Codebeispiele gepaart mit reiner englischen Sprachnutzung. Respekt.
-
Ups, ich habe vergessen, bei der Codegenerierung ein
": %s"
im Formatstring einzubauen. Aber egal, testet ja sowieso keiner.
-
Sorry, Leute, aber ich verstehe immer noch nicht, was diese for-Schleife macht:
for (i = 0; i < 16; ++i) a_and_lpar_b_or_c_rpar_and_not_d (i&1, i&2, i&4, i&8);
-
Kennst du dich mit binären Zahlen aus?
`0: 0001: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111`
i&1
ist ungleich 0, wenn die hinterste Stelle 1 ist.
i&2
ist ungleich 0, wenn die zweithinterste Stelle 1 ist.
i&4
ist ungleich 0, wenn die dritthinterste Stelle 1 ist.
i&8
ist ungleich 0, wenn die vierthinterste Stelle 1 ist.
i&(1<<x)
ist ungleich 0, wenn die x-thinterste Stelle 1 ist.1<<x
bedeutet 2 hoch (x-1).Im Prinzip erzeugt man damit alle möglichen Permutationen.
-
Das % ist das bitweise Und. Von der Logik wie && nur das es diesmal auf jedes Bit einzeln wirkt.
6 & 3 = 0b00000110 & 0b00000011 ------------ 0b00000010
Nur da wo in Wert1 und Wert2 die Bits gesetzt sind bleibt das Bit stehen.