Hilfe bei einer Informatik Praktikumsaufgabe



  • Hallo zusammen,

    ich brauche mal ein wenig Hilfe bei einer Aufgabe. Ich weiß einfach nicht, wie ich die Aufgabe angehen soll.

    Aufgabe:

    Es ist eine Funktion double u(double t) zu programmieren, welche eine periodische "Sägezahnschwingung" mit der Periode 1 darstellt:

    Speziell im Intervall [O,1) ist u(t) = t; für andere t ist u entsprechend zu bestimmen. Verwenden Sie dazu einen geeigneten Cast - Operator, um double in int "umzuwandeln".

    P.S. Ich bin noch C++ Anfänger, da ich erst seit einem Monat C++ programmiere.

    Vielen Dank

    Jet Force 221



  • Also von "Sägezahnschwingung" habe ich keine Ahnung aber casten kannst du so

    double Double=123.456789; //Double==123.456789
    int Integer=static_cast<int>(Double); //Integer==123
    

    Ich hoffe du weist was mit "Sägezahnschwingung" gemeint ist, wenns daran liegt dann eher Matheforum 😉



  • JetForce221 schrieb:

    Speziell im Intervall [O,1) ist u(t) = t; für andere t ist u entsprechend zu bestimmen. Verwenden Sie dazu einen geeigneten Cast - Operator, um double in int "umzuwandeln".

    Ich denke es läuft darauf hinaus, dass du mit einem Cast nach int die Gaußsche Klammer darstellen kannst, also ungefähr t - int(t). Wobei ich eher sagen würde, dass das für negative t nicht hinhaut.

    P.S. Ich bin noch C++ Anfänger, da ich erst seit einem Monat C++ programmiere.

    Logisch, sonst wär die Aufgabe auch witzlos 😉



  • #include <cmath>
    
    double u(double t) {
        return t - std::floor(t);
    }
    

    floor() liefert die nächstniedrigere ganze zehl



  • hallo,

    ich les mir hier gerade mal so den Beitrag durch und dann sehe ich das hier:

    double Double=123.456789; //Double==123.456789 
    int Integer=static_cast<int>(Double); //Integer==123
    

    bedeutet das das die double variable in eine int variable umgewandelt wird ?



  • Fast richtig - nicht die Variable wird umgewandelt (der Typ ist vorgegeben und in "Double" steht weiterhin der Wert 123.456789), sondern der übergebene Wert.



  • Bashar schrieb:

    Wobei ich eher sagen würde, dass das für negative t nicht hinhaut.

    Aber ist das selbe Prinzip:

    double u( double t )
    {
      return (t >= 0.0) ? t - int(t)
                        : 1.0 + (t - int(t));
    }
    


  • @finix das ist keine zägezahnschwingung, sondern es sind nur zwei geraden. 😉

    probiere es mal so:

    double u(double t)
    {
         if (t<0) //klassiker aus der systemtheorie.
            return 0;  //wir nehmen an, dass u(t)*sigma(t) gemeint war.
    
         if ((int(t)%2)==0)  //wir wollen schließlich schwingen
             return 1-(t-int(t));
         else
             return t-int(t);
    }
    

    oder wenn du sauber beide seiten hand haben willst, nimmst du die floor-funktion:

    double u(double t)
    {
         if ((int(floor(t))%2)==0) //<- das floor ist da auch wichtig,
    //sonst klappt der übergang bei 0 nicht. 
    //das int braucht man für den mod operator.
             return t-floor(t);
         else
             return 1-(t-floor(t));
    }
    

    edit: jetzt hatte ich den zägezahn doch glatt flaschrum gebaut gehabt...



  • ghorst schrieb:

    @finix das ist keine zägezahnschwingung, sondern es sind nur zwei geraden. 😉

    Wenn du nicht weißt wovon du sprichst, probier's lieber aus. Deine Vermutung mit den zwei Geraden ist ein Schuss in den Ofen.

    Außerdem: ein Dreieck ist kein Sägezahn.



  • Vielen Dank an alle, ihr habt mir sehr geholfen.


Anmelden zum Antworten