Parabel zeichnen + nullstelle ?



  • Also wie kann man es in c++ so programmieren, das zu der funktion
    ƒx = ax²+bx+c
    wenn a; b; c vom benutzer eingegeben werden, grafisch die parabel gezeichnet wird und die nullstellen gezeigt werden?
    VEry big thx im voraus 🙄
    p.s.
    http://websnaker.de/parabel.jpg hab bei google das gefunden, wie kann man so was machen, also das ist so weit ich weiß in vb gemacht 😉



  • Also zeichnen kannst Du folgendermaßen:

    Du gehst in regelmäßigen Schritten durch ein Intervall, z.B.:

    [-5,5] und machst alle 0.1 eine Auswertung. Dann kriegst Du lauter Punkte, die auf der Parabel liegen. Jetzt verbindest Du einfach je zwei aufeinanderfolgende Punkte . Und schon hast Du, wenn Du die Schrittweite (hier 0.1) klein genug gewählt hast ne schöne Parabel.

    Zu den Nullstellen:

    Du nimmst die Lösungsformel Deiner Wahl (pq oder abc) und setzt die Zahlen dort ein. Falls Du keine komplexen Lösungen haben willst mußt Du zunächst die Zahl unter der Wurzel auf >=0 abprüfen.

    MfG Jester



  • Also folgendes:
    ich habe ausm inet folgenden code gefunden und ihn ein wenig modifizieren, nur klappt das mit der 0 stelle noch nicht ganz o_0
    und dem graphen zeichen, vielleicht könnte man das programm auch in eine windows app packen, nur bin ich nicht wirklich gut in c++, aber ich brauche diese proggie 😞

    #include <iostream.h>
    #include <math.h>
    
    struct Funktion{
            float a;
            float b;
            float c;
    }funk;
    
    float f_von(float x, Funktion f){
            float y;
            y = f.a * (x * x) + f.b * x + f.c;
            return y;
    }
    
    float abl_von (float x, Funktion f){        // ableitung von...
            float y;
            y = 2 * f.a * x + f.b;
            return y;
    }
    
    void main (void){
            count << " Bitte a eingeben: ";
            cin >>funk.a;
            count << "Bitte b eingeben: ";
            cin >>funk.b;
            count << "Bitte c eingeben: ";
            cin >>funk.c;
            float X, Xk;
            const float G = 0.001f;                        // Genauigkeit
    
            cout << "Geschaetzter Wert eingeben" << endl;
            cin >> X;
            cout << "\n";
            Xk = X;                // damit X zwei Zeilen tiefer den Anfangswert behält
            do{
            X = Xk;
            Xk = X - (f_von(X, funk)/abl_von(X, funk));
            cout << "X:  " << X << "\t\t";
            cout << "Xk: " << Xk << endl;
            }
            while (fabs(Xk - X) > G);                // abs = absoluter Wert
    }
    


  • Also ich denke "count << "Bitte a eingeben" " sollte wohl eher cout heissen.
    Aber nimm doch eine Formel um die NST zu berechnen, wie Jester gesagt hat.
    Ich schreibe dir mal die abc Formel hin (heisst glaube ich Mitternachtsformel):
    x1,2=(-b+-√b^2-4ac)/2
    Da du die Funktion zeichnen willst, solltest du auch eine Windows anwendung anstelle einer Konsolenanwendung schreiben.
    Wo genau liegt denn das Problem? Beim Programmieren? Wie man eine Windowsanwendung schreibt und zeichnet? Oder beim mathematischen Teil?
    Ach ja, es wäre wahrscheinlich eleganter hier eine Klasste Funktion anstelle einer Struktur zu benutzen...



  • und wie würde ich die dann zeichenen?
    @formel
    wie bekomm ich beide raus, also das ist ja nur für eine, udn was bedeutet der strich oben drüber?



  • Hi,

    Der Strich darüber ist der Wurzelstrich. 😉
    Die Formel heißt Mitternachts- oder abc-Formel.
    Bei der Formel gibt es 2 Lösungen, da dort +- √ steht.

    So, das zum mathematischen, und jetzt allgemein:

    Eigne dir erstmal ein wenig Wissen an. Es bringt nichts Code zu übernehmen, wenn du ihn nicht verstehst. Wozu machst du dieses Projekt?
    Hausaufgabe?
    Hier werden keine Hausaufgaben erledigt, denn Hausaufgaben sind eigentlich nie zu schwer gestellt, sie sind zum Nachdenken und/oder zur Anwendung gedacht.
    Hobbyprojekt?
    Was bringt es dir, wenn du ein Hobbyprojekt machst und nicht verstehst, was du da machst?
    Gute Note für Sonderleistung?
    Das finde ich immer noch das Dreisteste: Nichts können, aber belohnt werden.

    Beziehe die Aussagen nur auf dich, wenn du hinter der jeweiligen Frage ein ,,Ja'' schreiben kannst.

    Auf alle Fälle: Lern erst einmal C++, wenn du es mit C++ programmieren willst, und wenn du es grafisch darstellen willst, dann lern für Windows WinAPI (MFC, VCL etc. geht auch); das alles sind nicht einfach nur 3 Befehle, die man hintippt, sodass man ein fertiges Programm raushat, daher bringt es auch nichts, hier nach nicht-konkreten Problemen zu fragen.

    MfG Eisflamme



  • hab das irgendwann mal gemacht, sollte alle fälle für die nullstellen abdecken. funktion is zwar etwas vollgepackt & sieht nich alzu elegant aus aber die errechneten werte sollten stimmen.

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    void nullstellen_scheitel(float a, float b, float c);
    
    float a;
    float b;
    float c;
    
    int main (void)
    {
        cout<<"a eingeben: ";
        cin>>a;
        cout<<"b eingeben: ";
        cin>>b;
        cout<<"c eingeben: ";
        cin>>c;
    
    	nullstellen_scheitel(a,b,c);
    }
    
    void nullstellen_scheitel(float a, float b, float c)
    {
    if(sqrt(b*b-4*(a*c)) > 0)
    { 
    cout<<endl<<"Es gibt 2 Nullstellen"<<endl;
    cout<<"x1 = "<<((b*-1)+(sqrt(b*b-4*(a*c))))/2*a<<endl;
    cout<<"x2 = "<<((b*-1)-(sqrt(b*b-4*(a*c))))/2*a<<endl;
    }
    else if(sqrt(b*b-4*(a*c)) == 0)
    {
    cout<<endl<<"Es gibt genau eine Loesung: "<<endl;
    cout<<"x1 = "<<((b*-1)/2*a)<<endl;
    }
    else
    cout<<"\nEs gibt keine Loesungen im reelen, da die Diskriminante < 0"<<endl<<endl;
    // scheitel
    cout<<endl<<"Scheitel liegt bei ("<<((b*-1)/(2*a))<<"/"<<(c-((b*b)/4*a))<<")"<<endl;
    }
    


  • ich bracuh das für die hausaufgaben die wir immer in mathe aufbekommen, da haben wir ein blatt mit milionen an aufgaben bekommen, da dachte ich mir machste sowas, weil angefangen hab ich mit c++ schon, aber halt nicht visual c++ o.ä. 😃
    thhhhxxxxxxxxxx an fasti, bist der beste
    Aber ich glaub da ist ein fehler folgender zeile:

    else if(sqrt(b*b-4*(a*c)) == 0)
    

    weil wenn b kleiner als 4 ist stützt das programm immer ab:
    sqrt: DOMAIN error
    kann man das noch irgendwie fixen?
    nochmal thhhhxxxxxx



  • Hi,

    logisch:

    void nullstellen_scheitel(float a, float b, float c)
    {
    if(b*b-4*(a*c) > 0) // nicht die Wurzel prüfen, sondern die Diskriminante
    {
    cout<<endl<<"Es gibt 2 Nullstellen"<<endl;
    cout<<"x1 = "<<((b*-1)+(sqrt(b*b-4*(a*c))))/2*a<<endl;
    cout<<"x2 = "<<((b*-1)-(sqrt(b*b-4*(a*c))))/2*a<<endl;
    }
    else if(b*b-4*(a*c) == 0) // dito
    {
    cout<<endl<<"Es gibt genau eine Loesung: "<<endl;
    cout<<"x1 = "<<((b*-1)/2*a)<<endl;
    }
    else
    cout<<"\nEs gibt keine Loesungen im reelen, da die Diskriminante < 0"<<endl<<endl;
    // scheitel
    cout<<endl<<"Scheitel liegt bei ("<<((b*-1)/(2*a))<<"/"<<(c-((b*b)/4*a))<<")"<<endl;
    }
    

    MfG Eisflamme

    PS: Hättest du dir den Code angesehen und mal überlebt, wärest du da aber auch selbst drauf gekommen, die Überprüfung auf die Anzahl der Nullstellen wird in der Schule nämlich durchgenommen.



  • Jetzt ist gut, kleiner Michi!



  • omg... habs vorhin nur für eine parabel schnell probiert obs stimmt und nich den code durchgeschaut, aber wie ich auf die idee komm die wurzel von D zu ziehen is mir n rätsel... und sollt mir eigentlich auch aufgefallen sein... naja schon ewig her als ich das mal geschrieben hab

    aber im prinzip hat mis2com recht, die "berechnung" für eine vordefinierte formel die immer das richtige ergebnis ausspuckt sollte man mit minimalsten programmierkenntnissen auf die reihe bringen. ausserdem hab ich deinen 1. post leider zu spät gesehen sonst haet ich nich den ganzen code gepostet...

    mfg & thx



  • hrhr ich lern c++ erst 2 wochen 😃
    nachdem mir jmd den tipp gegeben hat dass ich doch anstelle von php lieber c++ lernen solle.
    ABer was soll ich nu machen?
    hab das nicht ganz verstanden 🙄
    thx nochmal für eure hilfe, ihr rettet mir das wochenende 😉



  • hrrh sry das ich doppelpsote aber der pc spinnt 👎
    aber da ich ja wieso noch eine farge habe ^^
    @lustig, was steht über dem bruchstrcih?



  • Jetzt ist gut, kleiner Michi!

    Na ja, wenn du meinst ihm damit jetzt geholfen zu haben, dann will ich dir mal nicht deinen Glauben ausreden.

    Also, Programmierkenntnisse sind hier echt nicht erforderlich. Man schaut eigentlich nur auf das, was bei if in den Klammern steht; vielleicht war ja nicht klar, dass sqrt() die Wurzelfunktion darstellt, anderenfalls: im Matheunterricht lernt man auch, dass bei keinem Ergebnis die Diskrimante < 0 sein muss, nicht die daraus gezogene Wurzel.
    Hm, du willst den Code jetzt also wirklich verstehen und nicht nur die Hausaufgaben machen?
    Bringt es dir etwas, wenn man ihn dir erklärt? Du sollst ja die ganze Sprache verstehen, und nicht nur dieses überaus triviale Programm, und ein Tutorial oder Buch zu dem Thema ist auf alle Fälle angebracht.
    Auch das Anzeigen von Pixeln in WinAPI ist nicht so leicht, wie es klingt, da man sich erst einmal die Oberfläche schaffen muss, um dann darauf zu zeichnen. Wie gesagt hier hilft ein Tutorial zum Thema ,,WinAPI'' unter Windows; wenn du MS Visual C++ nutzt, kannst du die WinAPI verwenden etc.
    Jedenfalls ist der Code unheimleich simpel, im programmiertechnischen Sinne, wenn du den nicht verstehst, hast du dich mit C++ anscheinend noch nicht beschäftigt.

    Wie gesagt: Kaufe dir ein Buch!
    Entweder du kannst kein bisschen C++ oder du hast in Mathe nicht aufgepasst. Falls es an Mathe liegt, kann man dir hier helfen, ansonsten ist das Forum falsch gewählt, aber in fachspezifischen Foren zur Programmierung wird man dir kaum helfen, da dir grundlegende Kenntnisse fehlen, die durch Bücher oder Tutorials zu erlangen sind.

    Nichts für ungut,

    MfG Eisflamme 🙂

    EDIT: Rechtschreib- Zeichensetzungs- Grammatik- und inhaltliche Fehler korrigiert.



  • hrhrh mathe hab ich 1 bin aber erst in der neunten, hab folgendes buch
    Go to C++ Programmierung | ISBN: 3827321409
    aber wäre trotzdem nett wenn es jmd probiert^^



  • Was probiert; es dir zu erklären?
    Bist du am Anfang der 9 oder am Ende?
    Wurzeln sollte man eigentlich schon durchgenommen haben, ebenso die pq- oder Mitternachtsformel...
    Wenn dies nicht der Fall ist, kannst du damit natürlich wenig anfangen...
    Wie auch immer, erstmal dies hier:

    void nullstellen_scheitel(float a, float b, float c) // Starte (Definition der) Funktion mit 3 Parametern vom Typ float
    {
    if(b*b-4*(a*c) > 0) // wenn die Diskriminate (das, was unter der Wurzel steht) > 0 ist, dann... (alles was zwischen { und } steht)
    {
    cout<<endl<<"Es gibt 2 Nullstellen"<<endl; // cout ist eine Instanz der Klasse ostream, merke dir zuerst, dass du mit cout<< Text ausgeben kannst, endl ist praktisch ein Zeilenumsprung
    cout<<"x1 = "<<((b*-1)+(sqrt(b*b-4*(a*c))))/2*a<<endl; // Wenn die Diskriminante > 0 ist, dann gibt es zwei Lösungen, zeige hier die positive an
    cout<<"x2 = "<<((b*-1)-(sqrt(b*b-4*(a*c))))/2*a<<endl; // Hier wird die negative angezeigt
    }
    else if(b*b-4*(a*c) == 0) // Ist die Diskriminante 0, so ergibt die Gleichung für + und - das gleiche Ergebnis, daher:
    {
    cout<<endl<<"Es gibt genau eine Loesung: "<<endl;
    cout<<"x1 = "<<((b*-1)/2*a)<<endl;
    }
    else
    {
    cout<<"\nEs gibt keine Loesungen im reelen, da die Diskriminante < 0"<<endl<<endl;
    // scheitel
    cout<<endl<<"Scheitel liegt bei" <<((b*-1)/(2*a))<<"/"<<(c-((b*b)/4*a))<<")"<<endl;
    } // Else-Teil zu Ende
    } // Funktion zu Ende
    

    Aber wie gesagt, das sind die grundlegensten C++ Kenntnisse und du scheinst auch in Termen mit Variablen, sowie in Programmierung in irgendeiner Sprache keine Erfahrung zu haben, daher würde ich dir für's erste von C++ abraten, die Sprache ist meiner Meinung nicht zu schwer für Anfänger, eher zu trocken, aber die Entscheidung liegt bei dir, jedenfalls solltest du dir den Code mal anschauen, überlegen und dann sagen, was du genau nicht kapierst.
    Ansonsten: Kauf dir ein Buch oder lies ein Tutorial
    So etwas supereinfaches wird dir niemand erklären.

    MfG Eisflamme



  • Wini schrieb:

    * Hi! I'm a signature virus! Copy me into your ~/.signature to help me spread! *

    Elender Nachmacher! 😉



  • Mis2com schrieb:

    b*-1

    Schreibst du das auch so???



  • fang jez ja nich an meinen code zu bemängeln fritzi :>
    uralt das ding und ich will ihn mir garnich genauer ansehen weil mir dann mit sicherheit schlecht wird.

    ich sagte ja bereits nich gerade elegant gelöst, was man an dem "b*-1" sieht, aber die richtigen werte kommen raus

    - b*b könnte man mit z.b auch mit pow(b,2)

    normal macht ma inna 9. zunächst quadratische gleichungen u. anschließend parabeln

    bevor man php oder c++ lernt, wäre vllt. c keine schlechte sprache zum anfangen da der umstieg auf c++ leichter fällt & die syntax in php oder auch java ähnlich ist.



  • fasti schrieb:

    - b*b könnte man mit z.b auch mit pow(b,2)

    Ich denke nicht, dass das einen Unterschied macht.



  • Also danke erstmal an alle, auch an mis2com, mit hilfe deiner funktion hab ich das ding jetzt gecodet 🙂
    @webfritzi, ich hab die schon länger 😛
    @mis2com
    werde mir gleich mal deine erklärung durchlesem, bin mitte der acht, wurzeln ja, mitternachtsformel, nein
    nur kannst du mir kutz nochmal das kürtzel sqrt erklären, wenn ihr wollt kann ich euch mal den quellcode von dem script schicen 🙄


Anmelden zum Antworten