Logische Operatoren



  • Hallo,

    ich fange in den WIN studium an und dort wird, C im ersten semster unterrichtet.
    Kann jemand mich helfen kann mit diese aufgaben ?

    1. ob der Wert der Variablen a im Intervall [-20,100] liegt:
      (für a = -15)
    2. ob Wert der Variablen x negativ ist, aber zugleich auch
      der Wert der Variablen y im Intervall [5,30] liegt:
      (für x = 1 und y = 7)
    3. ob Wert der ganzzahligen Variablen z ungerade ist und
      zugleich auch durch 3 und 5 teilbar ist:
      (für z = 15)
    4. ob der Wert der ganzzahligen Variablen jahr
    • durch 400 oder
    • durch 4, aber nicht durch 100 teilbar ist (Bedingung für ein Schaltjahr):
      (für jahr = 2100)
    1. ob das Produkt der beiden int-Variablen a und b in den Datentyp unsigned char
      ohne Überlauf untergebracht werden kann:
      (für a = 25 und b = 10)
    2. ob der Wert der char-Variablen antwort
      weder das Zeichen ’j’ noch das Zeichen ’J’ enthält:
      (für antwort = ’A’)
    3. ob der Wert der int-Variablen zaehler nicht im Intervall [5,25] liegt:
      (für zaehler = 30)

    Edit: ich habe schon die Erste und Zweite Ausdruck angefangen

    //Erste Ausdruck
    
    int a;
    
    printf("Enter any number (-20-100): ");
    scanf("%d",&a);
    
    switch(a)
    {
    	case -20 ... 100:
    		printf("a is in between -20 to 100\n");
    		break;;
    }
    
    //Zweiter Ausdruck
    
    int x;
    
    printf("Enter any number : ");
    scanf("%d",&x);
    
    switch (x)
    {
        case -100 ... -1:
        printf("x ist negativ\n");
        break;;
    
        case 1 ... 100:
        printf("x ist positiv\n");
        break;;
    

    Danke


  • Mod

    Switch ist der falsche Ansatz für die Aufgabe. Du sollst if-Bedingungen formulieren.

    Unabhängig davon, falls euer Lehrer das nicht gesagt haben sollte:
    Die switch-Syntax mit den drei Punkten für Wertebereiche ist eine nicht standardisierte Erweiterung der Sprache C. Sie wird zwar von einigen weit verbreiteten Compilern unterstützt, aber du kannst dich nicht darauf verlassen, dass das überall geht.



  • Hallo,

    kann jemand mich helfen kann für diese Ausdruck für if...else ?

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:
    (für x = 1 und y = 7)

    MfG



  • ich habe schon den erster Teil.

     int x;
    
     printf("Geben Sie x ein :");
     scanf("%d" ,&x);
    
     if (x < 0)
     {
    
        printf("x ist ein negativ Zahl.");
    
     }
     else if (x>0)
    

    {

        printf("x ist ein positiv Zahl.");
    

    }
    ;



  • if( bedingung_1 && bedinung_2 )
    {
       // beide erfüllt
    }
    else
    {
       // min. eine nicht erfüllt
    }
    


  • @Mxrvin sagte in Logische Operatoren:

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:

    Schreibs so hin wie Du es gesagt hast?

    if (x < 0 && 5 <= y && y <= 30) {  // ...
    


  • @Swordfish Danke für die Antwort. Bin einen anfänger undziemlich heftig für mich lol
    Soll das so aussehen ? Weil in der Augabe steht Erstellen Sie ein Programm das dieWerte folgender Ausdrücke einer int-Variable wert zuweist
    und diese dann als Dezimalzahl also mit
    printf("n.Wert: %d\n", wert);

     int x;
    
     printf("Geben Sie x ein :");
     scanf("%d" ,&x);
    
     if (x < 0 && 5 <= x && x <= 30) // Der Wert der Variable x ist negativ und zugleich auch der Wert der Variablen y.


  • @Mxrvin sagte in Logische Operatoren:

    Der Wert der Variable x ist negativ und zugleich auch der Wert der Variablen y.

    das sagt nicht dasselbe aus wie auch von Dir weiter oben:

    @Mxrvin sagte in Logische Operatoren:

    ob Wert der Variablen x negativ ist, aber zugleich auch
    der Wert der Variablen y im Intervall [5,30] liegt:



  • ich komme nicht mehr klar bin bei der 6. kann nicht die if Bedingung formulieren

    ob der Wert der char-Variablen antwort
    weder das Zeichen ’j’ noch das Zeichen ’J’ enthält:
    (für antwort = ’A’)


  • Mod

    Wie würdest du es machen, wenn die Frage wäre, ob ein int weder gleich 5 noch gleich 17 wäre?



  • @SeppJ if ( x !=5 ) && ( x != 17)


  • Mod

    Genau. Und wieso hast du nun Angst, bloß weil da char statt int steht und 'j' statt 5?


  • Gesperrt

    @Mxrvin sagte in Logische Operatoren:

    ich komme nicht mehr klar bin bei der 6. kann nicht die if Bedingung formulieren

    ob der Wert der char-Variablen antwort
    weder das Zeichen ’j’ noch das Zeichen ’J’ enthält:
    (für antwort = ’A’)

    Probier mal:
    if ((zeichen | 0x20) == 'j')
    {
    ... J oder j
    }

    müsste für ASCII hinhauen.


  • Mod

    Bloß nicht! In welcher Welt ist das ein guter Tipp? Um eine viertel Nanosekunde zu sparen für den Preis jedweder Wartbarkeit? Falls das denn nach Optimierung überhaupt weniger Aktionen sind als der offensichtliche Weg. Wenn das Programm 50 Trillionen mal diese Entscheidung treffen muss, können wir mal darüber reden.



  • @RBS2 sagte in Logische Operatoren:

    Probier mal:
    if ((zeichen | 0x20) == 'j')
    {
    ... J oder j
    }

    müsste für ASCII hinhauen.

    Nicht gerade eine intuitive Lösung...



  • spart man da überhaupt rechenzeit? also wenn ich schreibe if(zeichen == 'J' || zeichen == 'j') dann wird die zweite bedingung doch gar nicht mehr ausgewertet, wenn die erste erfüllt ist bzw. es wird nur eine vergleichsoperation ausgeführt, während bei if((zeichen | 0x20) == 'j') immer eine rechenoperation und eine vergleichsoperation ausgeführt werden. oder sehe ich das falsch?



  • @Wade1234 Compiler können viele Dinge optimieren. Man weiß in keinem der Fälle, was genau passiert, ohne den Assembleroutput anzuschauen. Man könnte ja auch denken, dass (eingabe == 'j') | (eingabe == 'J') schneller wäre, weil dann beide Vergleiche gleichzeitig passieren können und man das nicht wiw bei || nacheinander machen muss. Aber der Compiler (bzw. der Optimierer) wird hier kann das eh so ändern, dass es für ihn am besten aussieht. Man kann deine Frage also ohne Nennung des Compilers und der Compilerparameter nicht beantworten. Und ob es Zeit spart, ist noch eine andere Frage, die auch vom Zielsystem abhängig ist.



  • ja dass compiler optimieren können, ist mir grundsätzlich klar, aber fakt ist doch, dass bei der einen möglichkeit nur manchmal und bei der anderen immer 2 operationen durchgeführt werden müssen, oder nicht?



  • @Wade1234
    Es kann optimiert werden, wenn die erste Bedingung falsch ist und die zweite überprüft werden muss. Ich habe vorgestern noch den Vortrag Fastware von Alexei Alexandrescu gesehen, wo er sich mit dieser Mikrooptimierung befasst. Er meinte auch, dass die bitweise Verknüpfung schneller sein könnte als die logische, weil das von der CPU parallelisiert werden kann. Er wurde dann vom Compiler (gcc, Version wurde nicht genannt) überrascht, dass der aus beiden Varianten den Assemblercode für die bitweise Verknüpfung erzeugt wurde. Konnte ich im Compiler Explorer aber nicht nachvollziehen.



  • @DocShoe
    ja aber ich wollte ja darauf hinaus, dass die zweite bedingung gar nicht mehr ausgewertet werden muss (und nach meinem wissen auch nicht ausgewertet wird), wenn die erste wahr ist und dass sich eigentlich dadurch schon eine zeitersparnis ergibt. völlig unabhängig von irgendwelchen weiteren optimierungen.



  • @Wade1234
    Ne.
    Wenn die erste Bedingung wahr ist darf die zweite nicht mehr überprüft werden, dann ist die zweite egal. Wenn die erste aber falsch ist muss die zweite überprüft werden, und wenn das erst passiert nachdem die erste überprüft wurde, dauert´s tatsächlich länger. Wenn der Compiler aber Code erzeugt, durch den beide Bedingungen gleichzeitig überprüft werden können, sollte der Code tatsächlich schneller sein, wenn die erste Bedingung falsch ist und das Ergebnis der zweiten schon bestimmt wurde.


Anmelden zum Antworten