a && b - Wahrheitstabelle?



  • 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