a && b - Wahrheitstabelle?



  • 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:

    1. a & b ist nicht immer gleichbedeutend mit a && b

    Richtig, aber was bedeutet es denn nun? (Vorsicht rhetorische Frage)

    progcontest schrieb:

    1. Zwei Schleifen sind nicht nötig

    Lassen sich aber besser lesen und verstehen.

    progcontest schrieb:

    1. return 0 ist nicht nötig.

    Die paar Zeichen haben noch keinem geschadet. Außerdem verwirrt sowas einen Anfänger eher.

    progcontest schrieb:

    1. 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: 000

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


Anmelden zum Antworten