Laden...

Get-Funktion zieht Wert nicht

Erstellt von Whateverufo vor 2 Jahren Letzter Beitrag vor 2 Jahren 417 Views
W
Whateverufo Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren
Get-Funktion zieht Wert nicht

Hallo zusammen,

für die Schule sollen wir ein Programm erstellen, dass von einer Funktion dritten-Grades die Nullstellen berechnet.

Mein Problem ist das die Ausgabe der berechneten Nullstellen nicht funktioniert. Das Programm ist Aufgeteilt in 2 Klassen mit den Namen Nullstellen.cs und Funktion.cs und eine GUI.
Die Nullstellen werden in der Klasse Funktion.cs berechnet und dann in der Klasse Nullstellen.cs abgelegt in eine SetGet-Funktion, diese soll nun in einem Label der GUI ausgeben werden. Nun ist das Problem das der Wert, welcher in der Klasse Nullstellen.cs abgelegt wurde, nicht zur GUI übernommen wird.

Könnt ihr mir vielleicht weiterhelfen?

Der Code der GUI:


 private void button1_Click(object sender, EventArgs e)
        {
            //hier wird die verbindung zur Klasse Funktion.cs hergestellt
            Funktion k = new Funktion();
            //hier geben wier den TextBoxen die verbionung zu ihrer set-Methode
            k.setA(Convert.ToDouble(tbA.Text));
            k.setB(Convert.ToDouble(tbB.Text));
            k.setC(Convert.ToDouble(tbC.Text));
            k.setD(Convert.ToDouble(tbD.Text));
            k.setXmax(Convert.ToDouble(tbxMax.Text));
            k.setXmin(Convert.ToDouble(tbXMin.Text));

            //Gibt die Wertetabelle wieder
            tbAusagbe.AppendText(k.erzeugeWertetabelle());

            //Gibt die Nullstellen wieder
            Nullstellen u = new Nullstellen();

            k.berechneNullstellen();

            string p = Convert.ToString(u.getX1());

            lbx1.Text = p;

            //Ginbt den yMin- und yMax-Wert wieder
            lbyMin.Text = Convert.ToString(k.berechneYMin());
            lbyMax.Text = Convert.ToString(k.berechneYMax());

        }

Der Code der Funktion Funktion.cs:



        public double f(double x)
        {
            return a * x * x * x + b * x * x + c * x + d;
        } 




        public Nullstellen berechneNullstellen()    
        {
                int z = 0;
            double y;
                Nullstellen n = new Nullstellen();

                for (double x = xmin; x <= xmax; x++)
                {
                    y = f(x);
                    if (y == 0)
                    {
                        z = z + 1;
                       
                        switch (z)
                        {
                            case 1: n.setX1(x); break;
                            case 2: n.setX2(x); break;
                            case 3: n.setX3(x); break;

                        }
                    }
                }
            return n;
        }

      

Der Funktion der Nullstellen.cs:


 class Nullstellen
    {
        private double x1;
        public void setX1(double value)
        {
            x1 = value;
        }

        public double getX1()

        {
            return x1;
        }

        private double x2;
        public void setX2(double value)
        {
            x2 = value;
        }
        public double getX2()
        {
            return x2;
        }

        private double x3;
        public void setX3(double value)
        {
            x3 = value;
        }
        public double getX3()
        {
            return x3;
        }
    }

C
2.121 Beiträge seit 2010
vor 2 Jahren

Bist du sicher dass überhaupt eine Nullstelle berechnet wird?
Zum einen läufst du in Einerschritten über das x. Da muss die Funktion schon passend gewählt sein, um überhaupt Nullstellen zu finden die genau auf diesem Einserraster liegen.

Zum anderen ist die interne Darstellung von Kommazahlen eine komplexe Sache, da gibt es kleine Ungenauigkeiten durch Rundungsfehler, die man bei der gerundeten Ausgabe zwar nicht sieht, die aber trotzdem da sind.
Nehmen wir an du kommst mit dem x wirklich auf eine Nullstelle. Durch die Art und Weise wie ein double dargestellt wird, ist das Ergebnis aber nicht genau 0, sondern vielleicht 0,0000000012345.... Dein Test auf exakt Null findet die exakt-Null daher nicht.

Schau dir mit dem Debugger an was da genau passiert und ob überhaupt eine Nullstelle gefunden wird.
Wenn das der Fall ist, sollten die Werte vom get auch zurückgegeben werden.

C
55 Beiträge seit 2020
vor 2 Jahren

Bist du sicher dass überhaupt eine Nullstelle berechnet wird?

So wie ich das sehe nein, bzw. er erzeugt 2 mal ein Objekt der Klasse Nullstellen. Einmal in der Methode button1_Click (Zeile 17) und dann in der Methode berechneNullstellen (Zeile 13). Dadurch ist auch kein Wunder das in Zeile 21 nichts zurück kommt, da in dieser Intanz alles 0 ist und auch nix gesetzt wurde. Er müsste eigentlich den Rückgabe Wert aus berechneNullstellen nehmen, das in Zeile 19 aufgerufen wird. Ob das dann funktioniert ist dann eine andere Frage.

Grüße

C
2.121 Beiträge seit 2010
vor 2 Jahren

Ja das außerdem! Darauf hab ich gar nicht geachtet.
Wichtig ist also wirklich, debuggen! Anschauen was passiert.
Sonst leitet einen die völlig unbegründete Annahme "alles funktioniert wie es soll, aber ein get funktioniert nicht" in die völlig falsche Richtung.

W
Whateverufo Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren

Danke erstmal für die Antworten.
Tatsächlich wenn ich debugge wird mir eine Nullstelle gefunden bei x = 1 die auch wirklich Null ist. Beim debuggen habe ich auch schon gesehen das der Wert von der Funktion Funktion.cs in die Funktion Nullstelle.cs rüberkommt, aber wie schon gesagt bekomme ich das nicht hin, dass mir der herausgefundene/hinterlegte Wert bei der Funktion Nulstellen.cs zum Button kommt und dort ihn dann bei dem Label wieder ausgibt.

Ich habe es auch schon versucht mit dem Wert der in Zeile 19 aufgerufen wird, aber das klappt auch nicht.

4.939 Beiträge seit 2008
vor 2 Jahren

Überlege mal, was mit dem Wert n bei return n in der Methode berechneNullstellen beim Aufruf von


k.berechneNullstellen();

geschieht?!

Edit: Und zusätzlich zur schon erwähnten Ungenauigkeit bei Fließkommazahlen, findet deine Methode bisher nur Nullstellen von ganzzahligen X-Werten (x++)...

PS: Kommst du von Java, C oder C++?
Deine Klasse Nullstellen sollte Eigenschaften (statt der get- und set-Methoden) verwenden.

16.834 Beiträge seit 2008
vor 2 Jahren

Tatsächlich wenn ich debugge wird mir eine Nullstelle gefunden bei x = 1 die auch wirklich Null ist.

Das kann eigentlich basierend auf dem Code, den Du zeigst, nicht sein.

In Zeile 17 erzeugst Du ein Objekt Nullstellen


Nullstellen u = new Nullstellen();

Daraufhin führst Du die Methode (keine Funktion!) berechneNullstellen
Methoden sind von einem Objekt abhängig, Funktionen sind es nicht.


k.berechneNullstellen();

In dieser Methode erzeugst Du aber ein neues Objekt von Nullstellen und gibst dieses auch zurück; verwirfst es aber, weil Du die Rückgabe nicht annimmst.
Du arbeitest aber weiterhin auf dem ersten Objekt, mit dem aber durch den Codefehler nichts passiert ist - und auch nichts passieren kann.
Das sollte Dir eigentlich auch mit dem Debugger aufgefallen sein, dass das zwei völlig verschiedene Referenzen sind, wenn Du entsprechende Haltepunkte setzt 🙂

Du kannst also das erste erzeugte Objekt von Nullstellen weglassen und die Rückgabe verwenden.


  Nullstellen u = k.berechneNullstellen();

Im Endeffekt fehlen hier alle Basics zum Thema OOP und Referenzen 🙂

Einführung in C# - Leitfaden für C#
Verweistypen – C#-Referenz

Und noch zu dem was Th69 gesagt hat: ja, so schreibt man das in C# wirklich nicht.
Eigenschaften – C#-Programmierhandbuch

W
Whateverufo Themenstarter:in
3 Beiträge seit 2021
vor 2 Jahren

Danke erstmal für eure Antworten.
Ich habe nun jedoch selbst herausgefunden wie es funktioniert.

PS: Kommst du von Java, C oder C++?

Das ist meine erste Sprache, die lernen wir Aktuell so in der Schule.

Hier ist der Code welcher auch funktioniert:


  private void button1_Click(object sender, EventArgs e)
        {
            //hier wird die verbindung zur Klasse Funktion.cs hergestellt
            Funktion k = new Funktion();
            //hier geben wier den TextBoxen die verbionung zu ihrer set-Methode
            k.setA(Convert.ToDouble(tbA.Text));
            k.setB(Convert.ToDouble(tbB.Text));
            k.setC(Convert.ToDouble(tbC.Text));
            k.setD(Convert.ToDouble(tbD.Text));
            k.setXmax(Convert.ToDouble(tbxMax.Text));
            k.setXmin(Convert.ToDouble(tbXMin.Text));

            //Gibt die Wertetabelle wieder
            tbAusagbe.AppendText(k.erzeugeWertetabelle());

            //Gibt die Nullstellen wieder
            lbx1.Text = k.berechneNullstellen().getX1().ToString();
            lbx2.Text = k.berechneNullstellen().getX2().ToString();
            lbx3.Text = k.berechneNullstellen().getX3().ToString();

            //Ginbt den yMin- und yMax-Wert wieder
            lbyMin.Text = Convert.ToString(k.berechneYMin());
            lbyMax.Text = Convert.ToString(k.berechneYMax());
            

        }

Ich danke für die Vorschläge.

16.834 Beiträge seit 2008
vor 2 Jahren

Dein Code funktioniert vielleicht, aber er ist nicht korrekt.
Du startest mehrmals die gleiche Berechnung und holst immer nur einen Wert raus; das ist unnötig.


Nullstellen nullStellen = k.berechneNullstellen(); // nur ein mal berechnen
lbx1.Text = nullStellen.getX1().ToString(); // Referenz nutzen!
lbx2.Text = nullStellen.getX2().ToString();
lbx3.Text = nullStellen.getX3().ToString();

So wäre es zwar immer nich nicht wirklich C#-konform, aber wenigstens strukturell korrekt im Sinne der Operationen.

Korrekt würde man den Code jedoch völlig anders gestalten, und die Werte aus den Text-Boxen beim Erstellen eines Objekts erzeugen.


MyObject myObject = new MyObject(tbA.Text, tbB.Text, tbC.Text, tbD.Text....) // Im Konstruktor[i] kann[/i] die Berechnung erfolgen, oder Du machst ne extra Calcuate() methode, die dann ein Result-Objekt erzeugt.
lbx1.Text = nullStellen.X1.ToString();


PS: Also wenn euch der Lehrer das im Ernst mit Set() und Get() Methoden in C# beibringt, dann braucht euer Lehrer dringend mal Nachhilfe 🙂

T
2.224 Beiträge seit 2008
vor 2 Jahren

@Abt
Das der Code so verwurstet ist, ist für mich keine Überraschung.
Leider mangelt es unseren Lehrkräften sowohl an dem Know-How als auch an der Zeit, sich grundlegend mit den Sprachen zu befassen.
Dort werden stumpf Lehrpläne vorgegeben ohne dass die Lehrkräfte überhaupt selbst großartig die jeweilige Sprache kennen und verstehen was dort genau gemacht werden soll.
Teilweise unterrichten Leute C# die in ihrem Studium irgendwann mal mit Basic oder Java gearbeitet haben und dieses Wissen nun 1:1 auf C# übertragen.
Der Rest vom deutschen Bildungssektor sieht leider nicht besser aus.

Daher sollte man hier auch nachsichtig sein. 🙂
Wenn der TE Spaß an der Sache hat, kann er sich selbst mit der Sprache beschäftigen und es richtig lernen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.834 Beiträge seit 2008
vor 2 Jahren

Ich war selbst mal in der Schule / Studium, und ich kenne durchaus die "Fähigkeiten" einiger Lehrer - und dass hier Nachhilfe notwendig ist.
Die meisten Schüler, die mal 3-4 Monate neben der Schule programmiert haben, haben oft ein besseres Wissens als die Lehrkraft.

Man muss aber auch zugute halten, dass viele Schulen und Universitäten mittlerweile gezielt auf Personen in der Wirtschaft zugehen; entsprechendes sieht man dann auch in den Lehrplänen, dass dort Lehrbeauftragte aus Firmen unterwegs sind.
Gerade aus der Konferenz-Community oder in Beraterfirmen gibt es viele, die auch als Lehrbeauftragte unterwegs sind (vieler meiner Chefs und Ex-Chefs zB); auch Leute bei Microsoft Deutschland bzw. aus Microsoft Redmond, die in Deutschland wohnen, sind in Unis unterwegs.
Soll man also nicht alles über einen Kamm scheren.

T
2.224 Beiträge seit 2008
vor 2 Jahren

Ist aufjeden Fall ein guter Ansatz.
Ich hoffe aber auch, dass wir da irgendwann mal raus kommen und es auch im Bereich der Programmierung in den Schulen gute Kurse gibt.
Wird aber vermutlich noch einige Jahre und vorallem bessere Bedingungen bei den Lehrkräften benötigen. 🙂

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.