verdammten logischen operatoren...



  • Hi!

    Haben im C-kurs für Mathematiker folgende aufgabe bekommen:
    Schreibe ein Programm, das eine Wertetabelle ausgibt.Dabei sollen für alle a und b
    zwischen 0 und 3 die Werte von a&&b, a&b, !a||!b und !(a&&b) ausgegeben werden.

    Nun, eine zugegebenermassen blöde frage - wie funktioniert das mit den dämlichen operatoren, hab's ma so versucht:

    #include <stdio.h>
    
    int main(void)
    {
    	int a, b;
    
    	for (a=0; a<=3;a++)
    	{
    		for (b=0; b<=3;b++)
    		{
    			printf("a:%d\tb:%d\ta&&b:%d\ta&b:%d\t!aǀǀ!b:%d\t!(a&&b):%d\n", a, b, a&&b, a&b, !a||!b, !(a&&b));
    		}
    	}
    
    	return 0;
    }
    

    Ist zugegebenermassen sehr direkt übersetzt - und funktioniert natürlich nicht. Ich hab allerdings kA wie das mit den operatoren geht.

    Wäre für jeden tipp dankbar,

    mfg



  • Scheint doch zu funktionieren, wo ist denn das Problem?



  • ^^zu viel schrott im formatierungsstring. versuch mal so:

    printf ("%d %d %d\n", a&&b, !a||!b, !(a&&b));
    

    🙂



  • Erstmal danke für die Antworten,

    Also - ich hab den Verdacht, dass es was mit der pipe | zu tun hat (müssen unter linux/ubuntu programmieren und da will der die pipe nicht mit altgr + < tippen, weswegen ich die aus der Zeichentabelle reinkopiert hab).

    Jedenfalls sagt der gcc "Fehler: verirrtes >\307< im Programm" bzw ">\200<"
    und noch eine Warnung, dass es zu wenig Argumente für Format gibt. 😕

    mfg



  • Also - ich hab den Verdacht, dass es was mit der pipe | zu tun hat (müssen unter linux/ubuntu programmieren und da will der die pipe nicht mit altgr + < tippen, weswegen ich die aus der Zeichentabelle reinkopiert hab).

    Naja, das liegt wohl eher am Texteditor oder am Tastaturlayout. Auf Englisch ist das | irgendwo beim rechten kleinen Finger, wenn mich nicht alles täuscht. Vielleicht Unicode verwendet? Im Zweifel den ASCII-Code verwenden, das Zeichen ist '\x7c' (oder oktal '\174'), und das sollte auch in Stringliteralen gehen. Wenn es aber um ein | ausserhalb eines Literals geht, musst du wohl deine Eingabemethode überarbeiten.

    Jedenfalls sagt der gcc "Fehler: verirrtes >\307< im Programm" bzw ">\200<"
    und noch eine Warnung, dass es zu wenig Argumente für Format gibt. 😕

    Dieses Programm:

    #include <stdio.h>
    
    int main(void)
    {
        int a, b;
    
        for (a=0; a<=3;a++)
            for (b=0; b<=3;b++)
                printf ("%d %d %d\n", a&&b, !a||!b, !(a&&b));
    
        return 0;
    }
    

    Erzeugt bei mir (ubuntu, gcc) diese Ausgabe:

    0 1 1
    0 1 1
    0 1 1
    0 1 1
    0 1 1
    1 0 0
    1 0 0
    1 0 0
    0 1 1
    1 0 0
    1 0 0
    1 0 0
    0 1 1
    1 0 0
    1 0 0
    1 0 0
    


  • Wenn es aber um ein | ausserhalb eines Literals geht, musst du wohl deine Eingabemethode überarbeiten.

    Oder du machst im Notfall ein #include <iso646.h> , damit solltest du dir alle vertikalen Striche ausserhalb von Literalen sparen können. 🙂



  • Und das beste am Schluss: statt

    |
    

    kann man in C auch sagen:

    ??!
    

    weshalb man fricky's Zeile auch so schreiben kann:

    printf ("%d %d %d\n", a&&b, !a??!??!!b, !(a&&b));
    

    🙂



  • Ok, danke für den Tipp mit der ascii-tabelle, das sihet besser aus, aber immernoch "verirrte" sachen drin:
    "
    auf6.c: In Funktion »main«:
    auf6.c:11: Fehler: verirrtes »\« im Programm
    auf6.c:11: Fehler: expected »)« before numeric constant
    auf6.c:11: Fehler: verirrtes »\« im Programm
    auf6.c:11: Warnung: zu wenig Argumente fuer Format
    "

    #include <stdio.h>
    
    int main(void)
    {
    	int a, b;
    
    	for (a=0; a<=3;a++)
    	{
    		for (b=0; b<=3;b++)
    		{
    			printf("%d %d %d %d\n", a&&b, a&b, !a\147\147!b, !(a&&b));
    		}
    	}
    
    	return 0;
    }
    

    mfg



  • Ok mit den trigraphs funktionierts noch besser, aber immernoch nicht...

    jetzt is noch ein verirrtes "\" in zeile 11... 😃

    dass ich nich selber auf ??! gekommen bin...>_<

    mfg



  • Versuch's mal so:

    #include <stdio.h>
    #include <iso646.h>
    
    int main(void)
    {
        int a, b;
    
        for (a=0; a<=3;a++)
            for (b=0; b<=3;b++)
                printf ("%d %d %d\n", a and b, (not a) or (not b), not (a and b));
    
        return 0;
    }
    

    Die Oktal-Angaben sind nämlich nur zwischen jeweils zwei " oder zwei ' sinnvoll.

    Mittelfristig solltest du aber wahrscheinlich deinen Editor so konfigurieren, dass du alle ASCII-Zeichen eingeben kannst.



  • bratgurke schrieb:

    auf6.c:11: Fehler: verirrtes »\« im Programm
    auf6.c:11: Fehler: expected »)« before numeric constant

    schon wieder dieser 'denglish' compiler *fg*
    ist das irgendso'ne gcc-testversion?
    🙂



  • ;fricky schrieb:

    schon wieder dieser 'denglish' compiler *fg*
    ist das irgendso'ne gcc-testversion?
    🙂

    Nein, das ist scheinbar default-mässig so bei Ubuntu, wenn man als "System-Sprache" Deutsch wählt. Die sind scheibar stolz darauf, dass sie schon die Hälfte übersetzt haben... 🙄



  • Ok mit den trigraphs funktionierts noch besser, aber immernoch nicht...

    jetzt is noch ein verirrtes "\" in zeile 11... 😃

    dass ich nich selber auf ??! gekommen bin...>_<

    mfg



  • bratgurke schrieb:

    Ok mit den trigraphs funktionierts noch besser...

    herzlichen glückwunsch. du hast ein programm, das auf 'trigraphs' angewiesen ist. sowas ist wirklich selten.
    🙂



  • nja - is atm egal, muss das zeugs in einer Übung eh auf einem Rechner in der Uni laufen lassen, der ist sogar eingestellt und kann pipes 😉

    das wichtigste ist, dass eben kein fataler fehler drin ist...

    Viele Dank für alle Antworten,

    mfg & gute nacht 🙂


Log in to reply