Mathematik für Anfänger



  • HuHu,

    kann mir mal jemand bei den folgenden Aufgaben helfen? Nein, ich tue es nicht für die Schule, sondern weil ich es lernen möchte und für ein eventuelles Studium:

    int a, b=5, c, d;
    
    a = b / 2; //Ergebnis ist 2
    c = b % 2; //Ergebnis ist 1
    d = b << a; //Wofür stehen die <<?
    b = 1 - --b; // B ist 5 und das dekrementieren wir ja, also ist es 4 und das dann -1 ist 3. Kommt aber -3 raus. Warum -3?
    
    b *= -3; //-3*5 ist -15 warum kommt 9 raus?
    d %= 3; //Wir wissen doch garnicht was d ist, wie sollen wir da dann den Rest rausbekommen?
    c += b * d + 4; //Hier wissen wir nicht was d ist, vllt. auf die vorherige Aufgabe bezogen? Ergebnis ist 23...
    a = --b + d++; //Was ist d? Wenn ich das wüsste, würde ich es ja inkrementieren. und b müssen wir ja dekrementieren und die beiden zahlen dann summieren, sodass wir a erhalten
    
    a=0; b=2; c=3; d=4;
    
    a = (b + 2) * 2 * c + 1; //hier hab ich 25 raus, was auch richtig ist
    a = ++b * d++ * ++c * (-1); //b inkrementieren, d inkrementieren, c inkrementieren. b * c rechnen, c * (-1) und die beiden zahlen dann summieren. Da habe ich -60 raus. Ergebnis muss aber -48 lauten.
    

    So, bevor ich das nicht verstanden habe, möchte ich ungern in dem Tutorial weiter arbeiten. Bringt mir ja nichts. Hätte jemand von Euch vielleicht weitere Aufgaben dazu, oder kennt eine Seite im Netz, damit sich das mathematische Grundverständnis auf dieser Ebene festigt?

    Ich danke Euch 🙂



  • 5: Das ist ein Shiftoperator. Steht in jedem Lehrbuch, wie sie benutzt werden. Wenn Du keines hast, kaufe eins.
    6: Das ist Mathematik Grundschule: 1 - 4 = -3
    8: In Zeile 6 wurde es auf -3 gesetzt. -3 * -3 ist Neun. (5. Klasse)
    17: Hab's nicht geprüft, aber wahrscheinlich hast du den Unterschied zw. Post- und Pre-inkrement nicht verstanden. Steht in jedem Lehrbuch.

    mfg Martin



  • int a, b=5, c, d;
    
    a = b / 2; //Ergebnis ist 2 und das steht jetzt in a. Also a = 2.
    c = b % 2; //Ergebnis ist 1, und das steht jetzt in c. Also c=1.
    d = b << a; //Wofür stehen die <<? Bitshift (google). a war zwei, also d = b * (2^2) = 5*4
    b = 1 - --b; // 1 - 4 ??? (= -3. Und das ergebnis steht in b. Also b=-3!!!)
    b *= -3; // b ist -3 (siehe oben). b *= -3 ist also (-3)*(-3) = 9. UND DAS ERGEBNIS STEHT JETZT IN b. Also b = 9.
    d %= 3; // d war b << a. siehe  oben 
    
    // usw ... usw ... usw.
    


  • ...



  • Danke für die Antworten, so ein bisschen kann ich es auch nachvollziehen. Mir kommt es aber so vor, als ob der Code manchmal von links und dann von rechts gelesen wird. Wie ists denn nun richtig?



  • Swordfish schrieb:

    Windassel schrieb:

    d = b << a; //Wofür stehen die <<?
    

    Bitshift. d ist und bleibt undefiniert, da a uninitialisiert.

    Windassel schrieb:

    a = b / 2; //Ergebnis ist 2
    

    :p



  • ...



  • Ok Ok. Danke Euch. Ja, ich werde mir selber was ausdenken, was fällt mir auch ein, danach zu fragen. 😃

    Trotzdem danke, ich schaue es mir gerade nochmal an. 🙂

    Aber was ich irgendwie nicht so richtig kapiere bzw. den Sinn nicht erkenne, warum man folgendes schreibt:

    b * = -3

    warum nicht
    b = -3 * b? Weil´s einfacher ist?

    Ja, ich denke schon.

    Wir könnten ja auch

    b * = c * 5 schreiben anstatt
    b = c * 5 * b

    oder?



  • Wie erstelle ich denn nun einen Logarithmus in c?
    hierbei arbeite ich ja mit double log (double x)

    int x = 5;
    double log (double x);
    getchar();
    

    aber wie gebe ich den logarithmus jetzt aus? Ich weiß nicht wie ich das in den printf-Befehl einbinde.

    int x = 25;
    double log(double x);
    printf("%e\n", x);
    getchar();
    

    Das habe ich auch noch raus. Zwar gibt er mir dann einen Logarithmus an, aber der verändert sich jedes mal, wenn ich das Programm starte.



  • Du rufst die Funktion log nicht auf. Es wird also kein Logarithmus berechnet. Du erstellst lediglich einen Funktionsprototypen. Guck in deinen Unterlagen mal nach, wie Funktionen mit Parametern denn aufgerufen werden.
    Der Formatspezifizierer ist ebenso falsch, da x vom Typ int ist. Bei %e muss x (oder eine andere Variable) aber z.B. double sein. Du musst also nur eine Variable mit den richtigen Datentyp übergeben, denn %e zur Ausgabe des Logarithmus zu verwenden, ist okay.





  • Swordfish schrieb:

    Windassel schrieb:

    int a, b=5, c, d;
    

    Windassel schrieb:

    a = b / 2; //Ergebnis ist 2
    

    2 geht in 5 zweimal. Check.

    Windassel schrieb:

    c = b % 2; //Ergebnis ist 1
    

    5 modulo 2 ist 1. Check.

    Windassel schrieb:

    d = b << a; //Wofür stehen die <<?
    

    Bitshift. d ist und bleibt undefiniert, da a uninitialisiert.

    Windassel schrieb:

    b = 1 - --b; // B ist 5 und das dekrementieren wir ja, also ist es 4 und das dann -1 ist 3. Kommt aber -3 raus. Warum -3?
    

    1 - 4 == -3, oder?!

    Windassel schrieb:

    b *= -3; //-3*5 ist -15 warum kommt 9 raus?
    

    -3 * -3 == 9;

    Windassel schrieb:

    d %= 3; //Wir wissen doch garnicht was d ist, wie sollen wir da dann den Rest rausbekommen?
    

    Undefiniert.

    Windassel schrieb:

    c += b * d + 4; //Hier wissen wir nicht was d ist, vllt. auf die vorherige Aufgabe bezogen? Ergebnis ist 23...
    a = --b + d++; //Was ist d? [...]
    

    Undefiniert.

    Windassel schrieb:

    a=0; b=2; c=3; d=4;
    
    a = (b + 2) * 2 * c + 1; //hier hab ich 25 raus, was auch richtig ist
    a = ++b * d++ * ++c * (-1); //b inkrementieren, d inkrementieren, c inkrementieren. b * c rechnen, c * (-1) und die beiden zahlen dann summieren. Da habe ich -60 raus. Ergebnis muss aber -48 lauten.
    

    Reihenfolge beachten: b inkrementieren * d * c inkrementieren * -1; . Dann d inkrementieren.
    ++2 * 4++ * ++3 * -1 == -48
    3 * 4 * 4 * -1 == -48
    , dann d inkrementieren;

    a wurde berechnet mit a = b / 2
    a = 2
    d = b << a
    d = b << 2
    d = 32

    d %= 3 ; da d = 32
    d %= 3
    d = d % 3 //andere Schreibweise für d %= 3
    d = 2 //d = 32 / 3 = 10 Rest 2

    Grundsatz: a, b, c und d sind als Integervariablen deklariert.
    bei a = b / 2 bleibt der Nachkommaanteil außer Betracht, daher ist a = 2
    bei c = b % 2 kommt der Modula-Operator ins Spiel. Dieser liefert den Nachkommaanteil einer Integerdivision, daher c = 1



  • Bonni4355 schrieb:

    ... bei c = b % 2 kommt der Modula-Operator ins Spiel. Dieser liefert den Nachkommaanteil einer Integerdivision, daher c = 1

    Das ist der Divisionsrest, nix mit Komma.
    Wie in der Grundschule.



  • DirkB schrieb:

    Bonni4355 schrieb:

    ... bei c = b % 2 kommt der Modula-Operator ins Spiel. Dieser liefert den Nachkommaanteil einer Integerdivision, daher c = 1

    Das ist der Divisionsrest, nix mit Komma.
    Wie in der Grundschule.

    Mein Fehler, timmt!


Anmelden zum Antworten