# quadratische Gleichung



## Romolus (10. Apr 2012)

Aufgabe:
Implementiere einen Algorithmus zur Lösung einer quadratischen Gleichung ax^2  + bx + c=0 in einer Funktion static void solve(double a, double b, double c) und gib in dieser das Ergebnis aus.
Für die quadratische Gleichung genügt es die reellen Lösungen zu behandeln, aber vergiss keine Sonderfälle (z.B "Komplexe Lösung" oder "Leere Menge" als Rückmeldung zu geben)- NaN als "Lösung" ist nicht erlaubt.

Nachdem ich HalloWelt "programmierte" und mich in mein Skriptum vertieft habe soll ich die Aufgabe lösen und bin maßlos überfordert. Ich habe wirklich kein Plan, wie ich da oben ausführen kann in Java, ich verwende übrigens Netbeans. Hat vielleicht wer Zeit mir die Aufgabe schritt für schritt zu erklären, weil wenn ich die Aufgabe verstehe, wäre ich schon einen großen Schritt weiter.
z.B.Wie soll ich den Programm sagen, dass sie Lösung nicht reell sondern komplex ist?

Die Syntax von einer Funktion:

```
RueckgabeTyp funktionsname(Typ1 param1, Typ2 param2, ...) {
anweisung 1;
...
anweisungN;
}
```


----------



## njans (10. Apr 2012)

Na, wie würdest du das denn von Hand machen, wenn dir jemand sagt, du hast die Funktion ax^2 + bx + c = 0 und du bekommst die Werte a,b und c ?


----------



## Romolus (10. Apr 2012)

DIe große quadratische Lösungsformel.

Aber ich weiß nicht wie ich beginnen soll, wie das alle rundherum aussehen soll..?
MuSS ich a,b,c al erstes mal deklarieren mit double a =..;
Kann ich beliebige Anfangswerte wälen?


----------



## njans (10. Apr 2012)

Nun du würdest eine Methode so aufbauen: 

```
public void solve(double a, double b, double c)
{
  // Solve it here
}
```

Und dann würdest du in der Methode auf a,b und c zugreifen können.
Du kannst natürlich in der main-Methode deines Programms einmal das ganze starten und mit eigenen Werten testen, das mag dir dann sicherlich etwas helfen.


```
public static void main (String[] args)
{
  solve(4,2,0); // Ein Beispiel
}
```

Dir ist aber generell schon klar, wie du die Nullstellen der Quadratischen Funktion berechnest?


----------



## AquaBall (10. Apr 2012)

Romolus hat gesagt.:


> DIe große quadratische Lösungsformel.
> 
> Aber ich weiß nicht wie ich beginnen soll, wie das alle rundherum aussehen soll..?
> MuSS ich a,b,c al erstes mal deklarieren mit double a =..;
> Kann ich beliebige Anfangswerte wälen?



Wenn eine Lösung für die nicht offensichtlich ist, dann beginn immer mit einem Pseudocode.
Das kann auch einfach ganz normaler deutscher Text sein.
Den verfeinerst du dann immer weiter bis dir jeder einzelne Schritt klar ist. Der Programmcode ergibt sich dann meist trivial.
Am Ende kannst du diesen Pseudocode sogar als Programmkommentierung drinlassen.


```
// Ich brauch 3 Variablen (Will ich die eingeben, oder in den  Programmcode tippen?)
// die sollen laut Aufgabe an eine Methode übergeben werden.
// Die Methode muss sich nur um Ausgabe kümmern.
// Zuerst muss ich prüfen, wann die Wurzel Null wird.
// ok: Wie wird der Radikant (Wert unter der Wurzel berechnet)
// Wenn der Radikant 0 ist habe ich einen Sonderfall
// Wenn der Radikant ...
```
Daraus wird dann langsam:

```
main() {
// Ich brauch 3 Variablen (Will ich die eingeben, oder in den  Programmcode tippen?)
  a = 123
  b = 234
  c = 345
// die sollen laut Aufgabe an eine Methode übergeben werden.
  solve(a,b,c)
// fertig, weil ja alles in der Methode passiert.
}

// Die Methode muss sich nur um Ausgabe kümmern.
public void solve(double a, double b, double c) {
// Zuerst muss ich prüfen, wann die Wurzel Null wird.
// ok: Wie wird der Radikant (Wert unter der Wurzel berechnet)
  double radikant= ...
// Wenn der Radikant 0 ist habe ich einen Sonderfall
  if (radikant == 0) {
// melde SOnderfall
    ...
  }
// Wenn der Radikant ...
  if (radikant ... {
// melde ...
  ...
  }
```
Die exakte Grammatik und Schreibweise machst du dann völlig losgelöst von der inhaltlichen Problemlösung, dehalb hab ich sie hier auch absichtlich nicht korrekt eingehalten.

Nach dem der Computer auch alles nur schrittweise macht, musst du nur selbst EXAKT wissen was schittweise zu tun ist.


----------



## Romolus (10. Apr 2012)

Hallo schonmal danke, ich zeig euch mal was ich versucht habe.


```
public void solve(double a, double b, double c)
           double a = 1;
           double b = 8;
           double c = 10;
           double d = b*b-4*a*c;
      switch (d) {
        case d<0: System.out.println("Komplexe Lösung"); break;
        case d==0: System.out.println(-b/(2a)); break;
        default: {
       System.out.println("Lösung:");
       System.out.println("x1=" + ((-b+(d)) / (2*a))); break;
       System.out.println("x2=" + ((-b-(d)) / (2*a))); break;
        }
    }
```

Ich hab gedacht hier ist eine Mehrfachauswahl mit Switch einfacherer.
und break wegen den "fallthrough".
Mir fehlt aber unten natürlich noch die Wurzel. d^(1/2) Aber wie kann ich das eintippen?


----------



## nillehammer (10. Apr 2012)

Suchbegriff bei google: "Java Quadratwurzel", Ergebnis: Math.sqrt( double zahl)


----------



## AquaBall (10. Apr 2012)

double a; wird dir einen Compilerfehler bringen, weil "dieselbe" Variable doppelt definiert wird. Diese Zuweisungen gehören in den Aufruf im main() { solve (1,8,10);}

Eine Variable, die du als Parameter übergibst kannst du (so) nicht zuweisen, zumindest ist es nicht sinnvoll, denn wozu übergibst du dann Werte?

Die switch-Anweisung kann auch nur exakte Werte verwenden, kein '>' oder '<'. Deshalb gibt man ja den untersuchten Wert in Klammern an, und nicht beim case nochmal. Ja, ich weiß, andere Sprachen können das, aber Java wird dir einen Compilerfehler bringen. (Hast du's schon mal getestet?)

Und deine Klammern sind auch noch nicht vollständig, default-Zweig falsch,  ...
Aber grundsätzlich bist du auf einem guten Weg.


----------



## Romolus (10. Apr 2012)

ich dachte man muss eine Wurzel selbst programmieren?oder doch nicht?
Ich verwende ungern was aus dem Internet, was wir nicht gelernt haben!

Okay also switch nur für exakte Wert, werde ich mir merken.
Also soll man es mit if machen? Wie kann ich bei if drei verschiedene Fälle unterscheiden?

Wenn ich a,b,c nicht definiere, wie weiß er dann welche Werte a,b,c hat? SOll man das mit dem Scanner machen, dass einer was eingeben kann?


```
public void solve(double a,double b, double c)
    double d = b*b-4*a*c:
    if (d < 0) 
      System.out.println("Komplexe Lösung");
           if(d==0)
               System.out.println(-b/(2a));
    else {
      System.out.println("Lösung:");
      System.out.println("x1=" + ((-b+Math.sqrt(d) / (2*a)));
      System.out.println("x2=" + ((-b-Math.sqrt(d) / (2*a)));
    }
```


----------



## nillehammer (10. Apr 2012)

Romolus hat gesagt.:
			
		

> ich dachte man muss eine Wurzel selbst programmieren?oder doch nicht?
> Ich verwende ungern was aus dem Internet, was wir nicht gelernt haben!


Die Klasse Math ist Bestandteil von Standard-Java. Es ist keine externe Bibliothek oder "was aus dem Internet".


----------



## langhaar! (10. Apr 2012)

Romolus hat gesagt.:


> ich dachte man muss eine Wurzel selbst programmieren?



Weiter oben hast du noch gefragt, wie man ein Wurzel 'eintippen' kann.
Natürlich kannst du die Wurzel auch selber programmieren.
Das wird aber ein wenig aufwändiger als die pq-Formel und ist sicherlich nicht gefordert.

Wie willst du deine Wurzel denn programmieren?
Wie wär's mit dem Newton Verfahren?
Newton Verfahren zur Bestimmung der Quadratwurzel


----------



## Romolus (10. Apr 2012)

Nein, ich will es schon so wie oben versucht machen.

Wie gesagt meine Fragen sind:
> Also soll man es mit if machen? Wie kann ich bei if drei verschiedene Fälle unterscheiden?
d<0
d==0
else

Wenn ich a,b,c nicht definiere, wie weiß er dann welche Werte a,b,c hat? SOll man das mit dem Scanner machen, dass einer was eingeben kann?
public void solve(double a,double b, double c)
und wie soll ich dann wie werte für a,b,c definieren?


----------



## njans (10. Apr 2012)

So macht man das mit if 


```
if (bedingung)
{

}
else if (andere bedingung)
{

}
else if (noch mal was anderes)
{

}
else
{

}
```



> Wenn ich a,b,c nicht definiere, wie weiß er dann welche Werte a,b,c hat? SOll man das mit dem Scanner machen, dass einer was eingeben kann?
> public void solve(double a,double b, double c)
> und wie soll ich dann wie werte für a,b,c definieren?



Die Methode arbeitet nur mit den Variablen, nicht mit den Werten. Du brauchst doch keine speziellen Werte um den Lösungsweg zu formulieren. Nur bei dem Methodenaufruf von Solve werden Werte übergeben. 
Eingaben vom Nutzer entweder über start-parameter oder durch Scanner, als Eingabe des Nutzers. Was deine Aufgabe dazu sagt, weiß ich nicht.


----------



## Romolus (10. Apr 2012)

Dan sagt er mir aber es ist ein Fehler, weil er die Werte nicht findet.
Was ist daran noch alles falsch?


```
static void solve( double a,double b, double c)
    double d = b*b-4*a*c:
if (d<0)
{ System.out.println("Komplexe Lösung");
 
}
else if (d==0)
{System.out.println("Lösung:");
 System.out.println(x=(-b)/(2a));
}
else
{     System.out.println("Lösung:");
      System.out.println("x1=" + ((-b+Math.sqrt(d) / (2*a)));
      System.out.println("x2=" + ((-b-Math.sqrt(d) / (2*a)));
 }
```


----------



## njans (10. Apr 2012)

```
static void solve(double a, double b, double c)
	{
		double d = b * b - 4 * a * c;
		if (d < 0)
		{
			System.out.println("Komplexe Lösung");

		}
		else if (d == 0)
		{
			System.out.println("Lösung:");
			System.out.println((-b) / (2 * a));
		}
		else
		{
			System.out.println("Lösung:");
			System.out.println("x1=" + ((-b + Math.sqrt(d) / (2 * a))));
			System.out.println("x2=" + ((-b - Math.sqrt(d) / (2 * a))));
		}
	}
```

Wenn du da plötzlich x = schreibst, natürlich. X wird nirgends definiert und findet auch sonst keine Anwendung. 
Da fehlte auch noch ein * zwischen 2 und a. und du hast die {} der Methode vergessen. Zudem hast du ein : anstelle von ; verwendet.


----------



## Romolus (10. Apr 2012)

Ich danke dir.
Trotzdem schreibt der PC, dass bei static void solve(double a, double b, double c)
 illegal start of expression.

Und wie kann ich solch eine Funktion aufrufen? 
Dabei werden die formalen Paramter durch konkrete Parameter ersetzt. 

```
double Lösung = solve(a=2,b=3,c=1);
```
Weil so ist ist ein Fehler.


----------



## njans (10. Apr 2012)

```
double Lösung = solve(a=2,b=3,c=1);
```

Das ist auch falsch. Du musst da keine Variablen und Werte binden, das macht Java.


```
double Lösung = solve(2,3,1);
```

Das *wäre!* der richtige Aufruf. Aber du hast als Rückgabewert void genommen. Daher kannst du das nicht machen, denn du gibts nichts zurück. Deine Ausgaben machst du alle über System.out.println, diese werden direkt auf der Konsole ausgegeben.


```
solve(2,3,1);
```

Das reicht aus, dann kriegst du deine Ausgaben.


----------



## Romolus (10. Apr 2012)

Hei, wenn ich deinen Post 15 probiere.
Kommt raus:
java.lang.NoSuchMethodError: main
Exception in thread "main" Java Result: 1

und wenn ich dann noch das mit solve reinschreibe:
quadratischegleichung.QuadratischeGleichung class wasn't found in QUadratischeGleichung project

Weißt du was ich da falsch habe?


----------



## njans (10. Apr 2012)

Okay, java Grundlagen: Um eine Java Programm starten zu können, muss es eine Methode "main" haben, die folgende Signatur hat:

```
public static void main (String[] args)
```
Diese hast du in deinem Code nicht.
In dieser Methode musst du die Methode solve aufrufen^^


----------



## Romolus (10. Apr 2012)

Du denkst sicher ich bin stroh dumm aber


```
public static void main(String[] args) {
 static void solve(double a, double b, double c)
    {
        double d = b * b - 4 * a * c;
        if (d < 0)
        {
            System.out.println("Komplexe Lösung");
 
        }
        else if (d == 0)
        {
            System.out.println("Lösung:");
            System.out.println((-b) / (2 * a));
        }
        else
        {
            System.out.println("Lösung:");
            System.out.println("x1=" + ((-b + Math.sqrt(d) / (2 * a))));
            System.out.println("x2=" + ((-b - Math.sqrt(d) / (2 * a))));
        }
    }
solve(2,3,1);
    }
```
steht noch immer Fehler


----------



## njans (10. Apr 2012)

*hust* Methoden in Methoden kann man nicht machen  
pack die mal hintereinander und dann rufst du solve von der Main methode auf:

```
public static void main(String[] args) {
 
    solve(2,3,1);
    }

static void solve(double a, double b, double c)
    {
        double d = b * b - 4 * a * c;
        if (d < 0)
        {
            System.out.println("Komplexe Lösung");
 
        }
        else if (d == 0)
        {
            System.out.println("Lösung:");
            System.out.println((-b) / (2 * a));
        }
        else
        {
            System.out.println("Lösung:");
            System.out.println("x1=" + ((-b + Math.sqrt(d) / (2 * a))));
            System.out.println("x2=" + ((-b - Math.sqrt(d) / (2 * a))));
        }
    }
```


----------



## AquaBall (10. Apr 2012)

Vielleicht hilft's doch nochmal Post#5 durchzulesen.


----------



## Romolus (10. Apr 2012)

danke jetzt hab ich es 

Liebe Grüße


----------



## Final_Striker (11. Apr 2012)

Romolus hat gesagt.:


> Du denkst sicher ich bin stroh dumm aber
> 
> steht noch immer Fehler



Du kannst nicht einfach in einer Methode eine andere Methode definieren.

Nimm dir bitte ein Java Buch und lese die ersten 100 Seiten durch, du hast nämlich keine Ahnung über die Grundlagen von Java.


----------

