etwas anderen Graphen zeichnen



  • Hallo alle zusammen.
    Ich hab erst mit c angefangen und soll nun ein c-Programm schreiben, welches den Graphen der Funktion f(x)=1/2sin(4x)(PI-x)(2PI-x) für x Element von [PI,2PI] auf der Text-Konsole ausgibt. Nun soll aber die x-Achse vertikal verlaufen und die y-Achse horizontal und die Funktionsauswertungen sollen in Schritten von PI/40 vorgenommen werden, wobei die Punkte des Graphen als '*', die Nullstellen '0' und die x-Achse durch vertikale Striche '|' dargestellt werden soll.
    Außerdem soll zwischen einem Stern, der den gerundeten y-Wert 1 hat, und dem vertikalen Strich für die x-Achse 20 Leerzeichen liegen.
    Ermittlung der x-Werte soll durch eine for-Schleife mit einem int-Zähler laufen und x soll veränderbar sein.

    Zu den Problemen:
    Bereits bei der Berechnung von y kommt bei mir immer 0 raus. o.o .. was wo der schlimmste meiner Fehler ist... aber warum rechnet er falsch?

    #include<stdlib.h>
    #include<stdio.h>
    #include<math.h>
    #include<conio.h>
    
    int main(){
    double x, y;
    int i;
    printf("f(x)=1/2sin(4x)*(PI-x)*(2PI-x) soll für x Element von [PI,2PI] berechnet werden!\n\nEingabe des x-Wertes:");
    scanf("%lf",&x);
    y=(1/2)*(sin(4*x))*(M_PI-x)*(2*M_PI-x);
    
    //hier steht dann der Algoritmus der unten beschrieben ist das erste if ist
    //aber eig. zw. Zeile 10 und 11
    
    getch();
    return (0);}
    

    Desweiteren wollte ich wissen wie ich den y-Wert so runden kann, dass er ab ,6 aufrundet und bei ,4 abrundet. ,5 soll er lassen (den fall bau ich noch ein dass er mir dann nen Stern gibt). mit floor und ceil hatte ich da ein paar Probleme... gibt es eine Möglichkeit nur die Nachkommastellen auslesen zu lassen? Dann könnte ich eine Fallunterscheidung treffen ab wann er wie rundet.

    & letzteres baut mein Algorithmus (sobald y richtig berechnet wird) den Graphen von oben nach unten auf... wodurch oben der kleinere x-Wert wäre und unten dann die gößeren...
    ich brauch es aber nun genau andersrum. ich könnte vom eingegebenen x-Wert runterrechnen dann würde es wieder stimmen, aber ich soll ja raufrechnen.

    if(x>=M_PI && x<=2*M_PI){
    for (i=0; i<40; i++){
     if (x<=2*M_PI){
     y=(1/2)*(sin(4*x))*(M_PI-x)*(2*M_PI-x);
     y=floor(y);
     x=x+M_PI/40;
     if(y<0 && y>=-1){printf("                    *                    |\n");}
     //20 Leerzeichen am Anfang um etwas Platz zum Konsolenrand zu bekommen weitere 20 wegen dem Abstand zum | 
     else if(y>0 && y<=1) {printf("                                        |                    *\n");}
     //40 leerzeichen am Anfang dann 20 weitere nach '|'
     else if(y==0){printf("                                        0\n");} //40 Leerzeichen dann '0'
    }}
    printf("                                        x");
    
    } else printf("x liegt nicht im Intervall.");
    

    Ich weiß es ist viel, aber ich weiß nicht weiter v.v Helft mir.
    & wenn ihr eine bessere Variante habt den Graph unter den Bedingungen ohne printf zu zeichnen, postet ruhig. Ich bin über jeden Gedanken dankbar.^^

    Lg nanashi



  • Der Sinus für Vielfache von Pi ist 0, ein Produkt wird dann auch immer 0.
    Es kommt also drauf an, was du für x eingegeben hast.


  • Mod

    Außerdem ist 1/2 nicht 0.5 sondern 0. Stichwort: Integerdivision.



  • http://ideone.com/nFGtg

    Für eine brauchbare horizontale Skalierung benötigst du den abs. Max.wert als 3. Parameter, skaly bedeutet die max. Ausdehnung in Konsolezeichen für maxy, jeweils für + und - Richtung, also 2mal. Deine Aufgabe, nur 1 Wert darzustellen, sollte wohl jetzt ziemlich einfach sein.

    Für einfachen Test mit bekannter sin-Funktion von 0..2Pi einfach nur die Parameter ändern:
    http://ideone.com/xKkDS

    Weitere Fragen zum Code beantworte ich jetzt nicht, du sollst ja auch noch selbst was machen, debugge dich durch und schaue dir die printf-Formatstrings an.
    M_PI als Inhalt von math.h ist übrigens kein ANSI C.

    Ich habe den Parameter OFFSETACHSE hinzugefügt, welcher angibt, in welchem Abstand die vertikale Achse positioniert wird. Jetzt kann man rumspielen um die Anzeigen besser zu gestalten:
    http://ideone.com/McRlv



  • Der Fehler waren die 1/2. Ich hab es jetzt verbessert und das Programm rechnet das richtige aus. Danke.^^

    @Wutz:
    ui super 🙂 DANKE. Ich arbeite mich dann mal durch deine links.
    Wenn ich noch Fragen haben sollte, melde ich mich nochmal. (aber hoffen wir mal das referenz guides soviel hergeben, dass ich keine Fragen mehr stelle ;P)

    Ansonsten VIELEN DANK!! 😃



  • Es tut mir Leid, aber ich muss doch nochmal stören.
    Ich habe es jetzt hinbekommen, dass x veränderbar ist und der Abstand x-Achse und y-Wert ebenfalls stimmt.
    Nun habe ich aber noch das Problem das xn = (xn-1)+PI/40 sein soll.

    Du berechnest x ja mit xvon+((xbis-xvon)i/skalx, wobei
    skalx = 24
    xbis = 2PI
    und xvon = PI ist. Ergibt für mich auch Sinn (also xvon und xbis). Aber ich verstehe skalx nicht. o.o
    Wie kann ich darin den Abstand auf meine x-Berechnung umformen?
    Ich habe jetzt schon zimlich viel probiert, aber dann spielt mein Graph verrückt. (z.b. bei skalx=40 oder xvon+((xbis-xvon)+i
    (PI/skalx))

    skalx wird bei mir nur noch an dieser Stelle verwendet. Meine Schleife läuft jetz über eine Variable a an Stelle von skalx, um x veränderbar zu halten. Ich habe also nur das Intervall flexibel gemacht.
    Sieht bei mir so aus:

    a=((2*M_PI-xeing)/M_PI)*25-1;
    for( i=0; i<=a; i++ )
    

    a ist integer und xeing ist double
    xeing ist dabei mein x-Wert, den ich vom User eingeben lasse (also mein Startwert x0)

    Kannst du mir erklären wie du dir das mit der Abstandberechnung gedacht hattest? oder mit skalx?

    Danke schonmal im voraus^^

    Lg nanashi

    Edit:
    Ich nehm die Frage zurück. Ich habs raus. hab skalx auf 40 gestellt und meine Formel für das veränderbare Intervall (je nach x-Wert) dem entsprechend nochmal verändert und jetzt läufts.^^
    Danke trotzdem nochmal für die Hilfe. 🙂


Anmelden zum Antworten