# Kurvendiskussion durchführen



## fabsen (12. Apr 2011)

Hallo Leute,
ich habe vor ein Programm zu schreiben das eine Kurvendiskussion durchführt.
ich habe es wahrscheinlich etwas umständlich programmiert aber für mich so verständlicher.
Ich habe folgendes Problem:
wenn in der funktion alle Werte positiv sind dann wird in der Konsole nur die Funktion ausgegeben.
und wenn ich beispielsweise -x^3+x^2-x-1 eingebe dann gibt er mir ne komische polynomzahl wieder.
hier ist mein Quellcodeübrigens benutze ich das Programm BlueJ)
	
	
	
	





```
public class Funktion3GradesVol3
{
    private double xHochDrei;
    private double xHochZwei;
    private double xHochEins;
    private double xHochNull;
    private double ergebnis, ergebnis1, ergebnis2, ergebnis3, ergebnis4, ergebnis5, ergebnis6, ergebnis7, ergebnis8, ergebnis9, ergebnis10, ergebnis11, ergebnis12,
                    ergebnis13;
    private int verlauf1, verlauf2;
    private boolean sattelpunkt1, sattelpunkt2;

    public Funktion3GradesVol3(double xHochDrei, double xHochZwei, double xHochEins, double xHochNull)
    {
        this.xHochDrei=xHochDrei;
        this.xHochZwei=xHochZwei;
        this.xHochEins=xHochEins;
        this.xHochNull=xHochNull;
        ergebnis=0;
    }

    public double polynomZahl1()//ermittelt die Zahl dir zur Polynomdivision notwendig ist
    {
        double ergebnisX1=0;
        double ergebnisX2=0;
        double ergebnisX3=0;
        double ergebnisX4=0;
        double ergebnisX5=0;
        double ergebnisX6=0;

        if(xHochDrei>0 && xHochZwei>0 && xHochEins>0 && xHochNull>0)
        {
            for(double a=0; a>=-1000;a-=0.001)
            {
                ergebnisX4=xHochDrei*a*a*a;
                ergebnisX5=xHochZwei*a*a;
                ergebnisX6=xHochEins*a;
                ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                ergebnis = Math.ceil(ergebnis*10)/10.0;
                if(ergebnis==0.0)
                {
                    a = Math.round(a*100)/100.0; 
                    ergebnis=a;
                    return a;
                }        
            }
        }
        else
        {
            if(xHochDrei<0 && xHochZwei<0 && xHochEins<0 && xHochNull<0)
            {
                for(double a=0; a>=-1000;a-=0.001)
                {
                    ergebnisX4=xHochDrei*a*a*a;
                    ergebnisX5=xHochZwei*a*a;
                    ergebnisX6=xHochEins*a;
                    ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                    ergebnis = Math.ceil(ergebnis*10)/10.0;
                    if(ergebnis==0.0)
                    {
                        a = Math.round(a*100)/100.0; 
                        ergebnis=a;
                        return a;
                    }        
                }
            }
            else
            {
                if(xHochDrei!=0)
                {
                    for(double a=0; a<=1000;a+=0.001)
                    {
                        ergebnisX1=xHochDrei*a*a*a;
                        ergebnisX2=xHochZwei*a*a;
                        ergebnisX3=xHochEins*a;
                        ergebnis=ergebnisX1+ergebnisX2+ergebnisX3+xHochNull;
                        ergebnis = Math.floor(ergebnis*10)/10.0;
                        if(ergebnis==0.0)
                        {
                            a = Math.round(a*100)/100.0;
                            ergebnis=a;
                            return a;
                        }        
                    }
                }
                else
                {
                    for(double a=0; a>=-1000;a-=0.001)
                    {
                        ergebnisX4=xHochDrei*a*a*a;
                        ergebnisX5=xHochZwei*a*a;
                        ergebnisX6=xHochEins*a;
                        ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                        ergebnis = Math.ceil(ergebnis*10)/10.0;
                        if(ergebnis==0.0)
                        {
                            a = Math.round(a*100)/100.0;                    
                            ergebnis=a;
                            return a;
                        }      
                    }
                }
            }
        }
        return ergebnis;
    }

    private void nullstellen()
    {
        //Polynomdivision
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2 = xHochDrei;
        xHochEins2 = xHochZwei-(-(xHochZwei2*polynomZahl1()));
        xHochNull2 = xHochEins-(-(xHochEins2*polynomZahl1()));

        //pq-Formel
        double p1, p2, q, wurzel;
        xHochEins2 = xHochEins2/xHochZwei2;
        xHochNull2 = xHochNull2/xHochZwei2;

        p1=-xHochEins2/2;
        p2=p1*p1;
        q=xHochNull2;
        wurzel=Math.sqrt(p2-q);
        ergebnis1=p1+wurzel;
        ergebnis1= Math.round(ergebnis1*100)/100.0;
        ergebnis2=p1-wurzel;
        ergebnis2=Math.round(ergebnis2*100)/100.0;
    }

    private void hochpunktTiefpunkt()
    {
        //Ableitung
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2=xHochDrei*3;
        xHochEins2=xHochZwei*2;
        xHochNull2=xHochEins;
        //pq-Formel
        double p1, p2, q, wurzel;
        xHochEins2 = xHochEins2/xHochZwei2;
        xHochNull2 = xHochNull2/xHochZwei2;
        p1=-xHochEins2/2;
        p2=p1*p1;
        q=xHochNull2;
        wurzel=Math.sqrt(p2-q);
        ergebnis3=p1+wurzel;
        ergebnis3=Math.round(ergebnis3*100)/100.0;
        ergebnis4=p1-wurzel;
        ergebnis4=Math.round(ergebnis4*100)/100.0;
        //Überprüfung Hoch oder Tiefpunkt
        xHochEins2=xHochZwei2*2;
        xHochNull2=xHochEins2;
        ergebnis5=xHochEins2*ergebnis3+xHochNull2;
        ergebnis6=xHochEins2*ergebnis4+xHochNull2;
        if(ergebnis5==0)
        {
            //1. Ableitung 
            double xHochZwei3 = xHochZwei;
            double xHochEins3 = xHochEins;
            double xHochNull3 = xHochNull;
            xHochZwei3=xHochDrei*3;
            xHochEins3=xHochZwei*2;
            xHochNull3=xHochEins;
            //2.Ableitung
            double merker=xHochEins3;
            xHochEins3=xHochZwei3*2;
            xHochNull3=merker;
            //3.Ableitung
            xHochNull3=xHochEins3;
            if(xHochNull3!=0)
                sattelpunkt1=true;
        }
        if(ergebnis6==0)
        {
            //1. Ableitung 
            double xHochZwei3 = xHochZwei;
            double xHochEins3 = xHochEins;
            double xHochNull3 = xHochNull;
            xHochZwei3=xHochDrei*3;
            xHochEins3=xHochZwei*2;
            xHochNull3=xHochEins;
            //2.Ableitung
            double merker=xHochEins3;
            xHochEins3=xHochZwei3*2;
            xHochNull3=merker;
            //3.Ableitung
            xHochNull3=xHochEins3;
            if(xHochNull3!=0)
                sattelpunkt2=true;
        }
        //yWert ausrechnen
        ergebnis7=xHochDrei*ergebnis3*ergebnis3*ergebnis3+xHochZwei*ergebnis3*ergebnis3+xHochEins*ergebnis3+xHochNull;
        ergebnis8=xHochDrei*ergebnis4*ergebnis4*ergebnis4+xHochZwei*ergebnis4*ergebnis4+xHochEins*ergebnis4+xHochNull;
    }

    private void wendepunkt()
    {
        //Ableitung 1
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2=xHochDrei*3;
        xHochEins2=xHochZwei*2;
        xHochNull2=xHochEins;
        //Ableitung 2
        xHochEins2=xHochZwei2*2;
        xHochNull2=xHochEins2;
        //Wendestelle
        xHochNull2=-xHochNull2;
        ergebnis9=xHochNull2/xHochEins2;
        ergebnis9=Math.round(ergebnis9*100)/100.0;
        //Wendepunkt
        ergebnis10=xHochDrei*ergebnis9*ergebnis9*ergebnis9+xHochZwei*ergebnis9*ergebnis9+xHochEins*ergebnis9+xHochNull;
        ergebnis10=Math.round(ergebnis10*100)/100.0;
    }

    private void graphenverlauf()
    {
        ergebnis11=xHochDrei*-1*-1*-1+xHochZwei*-1*-1+xHochEins*-1+xHochNull;
        ergebnis12=xHochDrei+xHochZwei+xHochEins+xHochNull;
        if(ergebnis11<0)
        {
            verlauf1=-1;
        }
        else
        {
            verlauf1=1;
        }
        if(ergebnis12<0)
        {
            verlauf2=2;
        }
        else
        {
            verlauf2=1;
        }
    }

    public void kurvendiskussionDurchfuehren()
    {
        nullstellen();
        hochpunktTiefpunkt();
        wendepunkt();
        graphenverlauf();
    }

    public void ausgeben()
    {
        //Ausgangsfunktion
        if(xHochZwei>=0 && xHochEins>=0 && xHochNull>=0)
        {
            System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² +"+xHochEins+"x +"+xHochNull);
        }
        else
        {
            if(xHochZwei<=0 && xHochEins>=0 && xHochNull>=0)
            {
                System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² +"+xHochEins+"x +"+xHochNull);
            }
            else
            {
                if(xHochZwei>=0 && xHochEins<=0 && xHochNull>=0)
                {
                    System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² "+xHochEins+"x +"+xHochNull);
                }
                else
                {
                    if(xHochZwei>=0 && xHochEins>=0 && xHochNull<=0)
                    {
                        System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² +"+xHochEins+"x "+xHochNull);
                    }
                    else
                    {
                        if(xHochZwei<=0 && xHochEins<=0 && xHochNull>=0)
                        {
                            System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² "+xHochEins+"x +"+xHochNull);
                        }
                        else
                        {
                            if(xHochZwei<=0 && xHochEins<=0 && xHochNull<=0)
                            {
                                System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² "+xHochEins+"x "+xHochNull);
                            }
                            else
                            {
                                if(xHochZwei<=0 && xHochEins>=0 && xHochNull<=0)
                                {
                                    System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² +"+xHochEins+"x "+xHochNull);
                                }
                                else
                                {
                                    if(xHochZwei>=0 && xHochEins<=0 && xHochNull<=0)
                                    {
                                        System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² "+xHochEins+"x "+xHochNull);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            //Ausgangsfunktion

            //Nullstellen
            System.out.println("Nullstellen: "+polynomZahl1()+", "+ergebnis1+", "+ergebnis2);
            //Nullstellen

            //Hochpunkt und Tiefpunkt
            if(ergebnis5<0 && sattelpunkt1==false)
            {
                System.out.println("Hochpunkt: ("+ergebnis3+"/"+ergebnis7+")");
            }
            else
            {
                if(ergebnis5>0 && sattelpunkt1==false)
                {
                    System.out.println("Tiefpunkt: ("+ergebnis3+"/"+ergebnis7+")");
                }
                else
                {
                    if(sattelpunkt1==true)
                    {
                        System.out.println("Dieser Punkt ist ein Sattelpunkt");
                    }
                    else
                    {
                        System.out.println("Es gibt kein Hochpunkt/Tiefpunkt");
                    }
                }
            }
            if(ergebnis6<0 && sattelpunkt2==false)
            {
                System.out.println("Hochpunkt: ("+ergebnis4+"/"+ergebnis8+")");
            }
            else
            {
                if(ergebnis6>0 && sattelpunkt2==false)
                {
                    System.out.println("Tiefpunkt: ("+ergebnis4+"/"+ergebnis8+")");
                }
                else
                {
                    if(sattelpunkt2==true)
                    {
                        System.out.println("Dieser Punkt ist ein Sattelpunkt");
                    }
                }
            }
            //Hochpunkt und Tiefpunkt Oder Sattelpunkt

            //Wendepunkt
            System.out.println("Wendepunkt: ("+ergebnis9+"/"+ergebnis10+")");
            //Wendepunkt

            //Graphenverlauf
            if(verlauf1<0 && verlauf2<0)
            {
                System.out.println("Der Graph kommt aus dem 3. Quadranten und geht in den 4. Quadranten");
            }
            else
            {
                if(verlauf1<0 && verlauf2>0)
                {
                    System.out.println("Der Graph kommt aus dem 3. Quadranten und geht in den 1. Quadranten");
                }
                else
                {
                    if(verlauf1>0 && verlauf2<0)
                    {
                        System.out.println("Der Graph kommt aus dem 2. Quadranten und geht in den 4. Quadranten");
                    }
                    else
                    {
                        if(verlauf1>0 && verlauf2>0)
                        {
                            System.out.println("Der Graph kommt aus dem 2. Quadranten und geht in den 1. Quadranten");
                        }
                    }
                }
            }
            //Graphenverlauf

            //Symmetrie
            if(xHochDrei==0 && xHochEins==0)
            {
                System.out.println("Der Graph ist achsensymetrisch");
            }
            else
            {
                if(xHochZwei==0 && xHochNull==0)
                {
                    System.out.println("Der Graph ist punktsymetrisch");
                }
                else
                {
                    System.out.println("Es ist keine Symmetrie erkennbar");
                }
            }
            //Symmetrie

            //Schnittpunkt y-Achse
            System.out.println("Der Schnittpunkt mit der Y-Achse liegt bei "+xHochNull);
            //Schnittpunkt y-Achse
        }
    }
}
```


----------



## Marcinek (12. Apr 2011)

Ich glaube kaum, dass dir hier jemand helfen kann.

Der Code ziemlich lang und die Variablen ergebnis1...100.

Grenze es ein au die Stelle, die den Fehler erzeugt und poste diese hier.


----------



## fabsen (12. Apr 2011)

Der Fehler liegt in der methode polynomZahl1()
wenn ich in BlueJ ein objekt erzeuge und bei der ersten variable -1 der zweiten 1 und der dritten und vierten -1 eingebe gibt die methode eine falsche zahl zurück!! 
es müsste als ergebnis  gerundet -0.54 rauskommen 
er gibt mir aber -9.99001001E8 zurück.


----------



## Marco13 (12. Apr 2011)

Sowas wie
for(double a=0; a>=-1000;a-=0.001)
sieht auch SEHR gewagt aus... Versuch' mal, durch ein Paar 
System.out.println("Mache jetzt dies und das...");
System.out.println("dies-und-das ist "+diesUndDas);
den Fehler einzugrenzen (also wo zum ersten mal ein unerwartetes Ergebnis auftaucht)


----------



## fabsen (13. Apr 2011)

Danke für die Hilfe 
ich habe beide Probleme jetzt rausgefunden... die System.out.println's haben nicht wirklich weiter geholfen... aber bei dem reinschreiben der System.out.println's habe ich rausgefunden das ich ein Fehler bei ner If-Verzweigung hatte...
Vielen Dank schon mal bis jetzt hoffe ich das alle Probleme beseitigt habe aber ich denke es wird bald ein nächstes Folgen


----------



## fabsen (16. Apr 2011)

Ich hab mal ne Frage... 
ich will dafür noch nen Applet machen... hab aber en problem... 
und zwar ich will noch ne Funktion 4. Grades anzeigen lassen...
wir krieg ich das hin das in dem Applet das zu sehen ist?
ich mach es mit g.drawString() und hab die hoch 4 aus der Zeichentabelle aber wenn ich das Applet ausführe zeigt er mir nen Fragezeichen an....
kann mir jemand helfen?


----------



## Marco13 (16. Apr 2011)

Geht es um einen kleinen, hochgestellten String "4" über einem x? ???:L


----------



## fabsen (17. Apr 2011)

ja genau darum geht es


----------



## Landei (17. Apr 2011)

Viele Swing-Komponenten unterstützen HTML. Wenn ich in einem Label z.B. "<html>x<sup>4</sup></html>" angebe, sollte es x mit einer hochgestellten 4 zeigen.


----------



## Marco13 (17. Apr 2011)

Das geht dann halt nicht mehr direkt mit g.drawString. Für so ein einzelnes, gochgestelltes Zeichen könnte man sich zwar noch irgendwelche würgarounds auf Basis von drawString überlegen, aber die Empfehlung wäre schon, die Formel, wie Landei beschrieben hat, von einem JLabel anzeigen zu lassen. (Und selbst wenn die Formel "irgendwo innerhalb eines JPanels" hingeschrieben werden soll, könnte es einfacher (ein bißchen frickelig, aber einfacher) sein, sie _von einem JLabel_ dort hinzeichnen zu lassen...)


----------



## fabsen (17. Apr 2011)

wie funktioniert da mit JPanel und das alles davon hab ich leider keine Ahnung...


----------



## Volvagia (18. Apr 2011)

Versuch mal die einzufügen: ⁴
Keine Ahnung, ob das funktioniert.


----------



## fabsen (18. Apr 2011)

ne das funktioniert net das hab ich schon versucht...


----------



## Marco13 (18. Apr 2011)

Grundsätzlich kann man wohl ein JLabel erstellen (mit dem HTML-Text drauf) und dann innerhalb der paintComponent-Methode des JPanels sowas machen wie
label.paintComponent(graphics);

Das Label wird aber nirgends hinzugefügt, sondern nur als "Zeichner" verwendet. Die Größe etc. muss man da selbst anpassen. Wenn's nicht klappt, sag nochmal bescheid (ich selbst hab' das AFAIR noch nicht direkt so verwendet, aber es sollte irgendwie machbar sein).


----------



## fabsen (19. Apr 2011)

@Marco13:
könntest du mir mal eine genauere Erklärung von deiner Idee geben
ich weiß nicht so ganz wie ich das umsetzen soll.... D A N K E


----------



## Marco13 (19. Apr 2011)

Ja, man kann sich da so eine kleiner Hilfsklasse dafür schreiben. Es gibt vielleicht noch eine einfachere/elegantere Möglichkeit, aber ... (jetzt weiß ich nicht, wie ich den Satz beenden soll)

```
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class HTMLPainter
{
	private static JLabel label;
	
	static
	{
		label = new JLabel();
		label.setOpaque(false);
	}
	
	public static void drawHTML(String htmlString, int x, int y, Graphics gr)
	{
		label.setText(htmlString);
		label.setForeground(gr.getColor());
		label.setFont(gr.getFont());
		label.setSize(label.getPreferredSize());
		Graphics g = gr.create();
		g.translate(x, y);
		label.paint(g);
		g.dispose();
	}
}

public class TestPaintHTML
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
                f.getContentPane().add(createPanel());
                
                f.setSize(400,300);
                f.setVisible(true);
            }
        });
    }
    
    
    private static JPanel createPanel()
    {
        return new JPanel()
        {
            @Override
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                
                Font font0 = new Font("Monospaced", Font.PLAIN, 16);
                g.setFont(font0);
                g.setColor(Color.RED);
                HTMLPainter.drawHTML(
                	"<html>This <b><u>is just</u> a </b> Test", 10, 20, g);

                Font font1 = new Font("Serif", Font.PLAIN, 15);
                g.setFont(font1);
                g.setColor(Color.BLUE);
                HTMLPainter.drawHTML(
                	"<html>This <b><u><sub>is</sub> just</u> " +
                	"a <sup>small</sup></b> Test", 40, 50, g);
            }
        };
        
    }
    
}
```


----------



## muckelzwerg (19. Apr 2011)

```
AttributedString as1 = new AttributedString("1234567890");
as1.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 5, 7);
g2d.drawString(as1.getIterator(), 15, 60);
```
Geklaut aus dem ersten GoogleTreffer zu 
"java drawstring superscript"
TextAttribute.SUPERSCRIPT: Set SUPERSCRIPT for AttributedString : TextAttribute2D Graphics GUIJava


----------



## Marco13 (19. Apr 2011)

Manchmal bin ich naiv genug, zu glauben, dass jemand eine Websuche macht, bevor er hier eine Frage stellt, und ich das deswegen nicht mehr machen muss  Aber wenn der String etwas komplizierter ist (wie in dem Beispiel) ist HTML schon übersichtlicher...


----------



## muckelzwerg (19. Apr 2011)

Ja, das kann gut sein. Ich schätze aber mal das man die AttributetStrings weitgehend wie normale Strings aneinander anhängen kann.
Dann könnte man eine Funktion "sup(String s)" verwenden und den Text wieder mit "+" zusammensetzen.
Hab ich jedoch noch nicht versucht.


----------



## Samuel72 (20. Apr 2011)

Hallo zusammen,

ich habe mal was mit Unicode probiert.
Müsste für JLabels usw. funktionieren;
für Konsolenausgaben nicht.


```
private static String[] superscript = new String[] {"\u00BA","\u00B9","\u00B2","\u00B3","\u2074","\u2075","\u2076","\u2077","\u2078","\u2079"}; 

public static String exponent(int i) {
  if(i==0) return superscript[0];
  String res = "";
  while(i>0) {
    res = superscript[i-i/10*10] + res;
    i/=10;			
  }
  return res;
}
```


----------



## fabsen (27. Apr 2011)

Danke für die hilfe klappt soweit alles...
ich habe ads mit JPanel auch hinbekommen...
da habe ich jetzt eine frage...
wie kann ich eine jTextField sagen das nur zahlen reingeschrieben werden können nicht nur + zahlen auch -zahlen...
habe schon was gefunden gehabt aber das geht nur mit + zahlen...
außerdem will ich das die max Eingabe in dem Feld auf 3 is wie kann ich das umsetzen...
komm nicht wirklich weiter...


----------

