# [Java] Code um quadratische Gleichungen zu erstellen:



## Sustaince (5. November 2010)

Hallo,

bevor das geschrei losgeht: ich habe schon einige Lösungen gefunden, aber leider funktioniert meine nicht:

Ausgangssituation:

Programm: Netbeans (aktuelle Version)

Code:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication5;

import java.io.*;

/**
 *
 * @author Benutzer
 */
public class quadratischeGleichung {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {

        /* Vorgaben
         * quadratische Gleichung: ax²+bx+c
         * Eingabe der KOeffizienten a,b,c
         */

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bReader = new BufferedReader(isr);

        int d;

        //Einlesen der Koeffizienten
        System.out.println("Hiermit können sie die Lösungen iner quadratischen Lösung bestimmen");

        System.out.println("Bitte geben sie einen Wert für a an: ");
        int a = bReader.read();

        System.out.println("Bitte geben sie einen Wert für b an: ");
        int b = bReader.read();

        System.out.println("Bitte geben sie einen Wert für c an: ");
        int c = bReader.read();

        System.out.println("Die zu lösende Gleichung lautet:\n " + a + "x²" + b + "x" + c);

        d = b * b - 4 * a * c;
        double l1 = (b-d)/(2*a);
        double l2 = (b+d)/(2*a);

        if (d < 0) {
            System.out.println("Es gibt keine Lösung");
        }

            else  {
            System.out.println("Es gibt eine Lösung");
            System.out.println("Die Lösungsmenge ist: " + l1 + " und " + l2);


Ich habe Probleme mit dem einlesen. Habe zuerst mit java editor und console gearbeitet (Console.in.ReadInt(); ] aber leider funktioniert das bei nedbean nicht. wo liegt der fehler?


----------



## vfl_freak (5. November 2010)

Moin,

versuch' es mal so :

```
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("Gib was ein: ");
String eingabe = br.readLine();
System.out.println("Du hast " + eingabe + " eingegeben.");
```
Quelle : http://www.javaschubla.de/2007/javaerst0100.html

Und nutze bitte die Code-Tags für leserlicheren Code  - Danke 

Gruß
Klaus


----------



## Sustaince (5. November 2010)

aber dann kann er die Eingabe ja nicht als Integer verwenden?

Ich hätte ja gerne, dass er direkt Integer verwenden würde.


----------



## genodeftest (5. November 2010)

Dann musst du den String nur noch per Integer.parseInt(String) in eine Zahl konvertieren:

```
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("Gib was ein: ");
String eingabe = br.readLine();
int eingabeInt = Integer.parseInt(eingabe);
```


----------



## Sustaince (5. November 2010)

danke, hat auch funktioniert, sodass die ausgabe klappt. aber wenn ich negative zahlen einlese erhalte ich falsche ergebnisse


```
public static void main(String[] args) throws IOException {

        /* Vorgaben
         * quadratische Gleichung: ax²+bx+c
         * Eingabe der KOeffizienten a,b,c
         */

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bReader = new BufferedReader(isr);

        int d;

        //Einlesen der Koeffizienten
        System.out.println("Hiermit können sie die Lösungen iner quadratischen Lösung bestimmen");

        System.out.println("Bitte geben sie einen Wert für a an: ");
        String a = bReader.readLine();

        System.out.println("Bitte geben sie einen Wert für b an: ");
        String b = bReader.readLine();

        System.out.println("Bitte geben sie einen Wert für c an: ");
        String c = bReader.readLine();

        int ea = Integer.parseInt(a);
        int eb = Integer.parseInt(b);
        int ec = Integer.parseInt(c);
        //int ed = Integer.parseInt(d);

        System.out.println("Die zu lösende Gleichung lautet:\n " + a + "x² + " + b + "x + " + c);

        d = eb * eb - 4 * ea * ec;
        int l1 = (eb-d)/(2*ea);
        int l2 = (eb+d)/(2*ea);

        if (d < 0) {
            System.out.println("Es gibt keine Lösung");
        }
               
            else  {
            System.out.println("Es gibt eine Lösung");
            System.out.println("Die Lösungsmenge ist: " + l1 + " und " + l2);
```


----------



## fasswas (14. Februar 2014)

Hallo,

mir ist aufgefallen, dass bei vielen Programmcodes der quadratischen Gleichung, das Wurzel ziehen der Diskriminante bei der Mitternachtsformel ausblieb.
Hab jetzt selber ein Programm geschrieben, dass die richtigen Werte ausspuckt und sogar noch eine Wertetabelle zweier Intervalle automatisch erstellt.
Allerdings hab ich es nicht geschafft (da noch Java-Programmierer-Anfänger), eine schleife einzufügen, die einen vom Benutzer eingegeben beliebigen x-Wert jeweils um + 0,5  erhöht und somit dreißig abhängige Y-Werte ausspuckt. Ich wusste mir nur zu helfen, indem ich einen fixen Wert für x festgelegt hab und von diesem Grundwert an die Wertetabelle starten lies.

Wäre nett, wenn mir jemand helfen könnte, wie ich eine Wertetabelle erstellen kann, die erst vom eingegeben x-Wert des Benutzer losgeht.
Aber hier erstmal mein Mitternachtsformel-Programm:
__________________________________________________________-


```
import static java.lang.Math.sqrt;
import java.util.Scanner;
 public class Mitternachtsformel {
  public static void main (String[] args  ) {
   Scanner sc = new Scanner(System.in);
        System.out.println("Gib eine Zahl für den Koeffizienten a ein: ");
        double a = sc.nextDouble();
        System.out.println("Gib eine Zahl für den Koeffizienten b ein: ");
        double b = sc.nextDouble();
        System.out.println("Gib eine Zahl für den Koeffizienten c ein: ");
        double c = sc.nextDouble();
        System.out.println("Die zu lösende Gleichung lautet:\n y = " + a + "x² + " + b + "x + " + c+ "\n       a      b       c");
        // Diskriminante unter Wurzelzeichen
	double d = ((b*b)-(4*(a*c)));        
        double x1 = ((-b)-sqrt(d))/(2*a);
        double x2 = ((-b)+sqrt(d))/(2*a);
        while (d < 0) {
            System.out.println("Die Funktion hat keine Nullstellen, da die Diskriminate negativ ist!\n=> Diskriminate = "+d );
        break;
        } while (d > 0) { 
System.out.println("Die Nullstellen der quadratischen Gleichung sind: \n x1 = " + x1 + "   x2 = " + x2);
        break;}
System.out.println(); 
      System.out.println("Wertetabelle für das Intervall: x[1;8] Schrittfolge: x+0,5");
System.out.println();        
        double x = 1;
        while (x <= 8) {       
         double Y = (a*(x*x))+(b*x)+c;
        System.out.println("Y("+x+")= "+Y);
    x= x + 0.5;}
System.out.println();
        System.out.println("Wertetabelle für das Intervall: x[-8;0] Schrittfolge: x+0,5");
System.out.println();
        double xNegativ = -8;
        while (xNegativ <= 0) {       
         double Y = (a*(xNegativ*xNegativ))+(b*xNegativ)+c;
        System.out.println("Y("+xNegativ+")= "+Y);
    xNegativ= xNegativ + 0.5;}
}
}
```


----------



## youza (17. Februar 2014)

Hallo fasswas,

Es sind einige Fehler drin die du nicht machen solltest.
Das geht auf keinen Fall:

```
while (d > 0) { 
System.out.println("Die Nullstellen der quadratischen Gleichung sind: \n x1 = " + x1 + "   x2 = " + x2);
        break;
}
```

Hier kann eine einfache if-Verzweigung verwendet werden.


```
if (d < 0) {
	System.out.println("Die Funktion hat keine Nullstellen, da die Diskriminate negativ ist!\n=> Diskriminate = "+ d);
}else if (d > 0) {
	System.out.println("Die Nullstellen der quadratischen Gleichung sind: \n x1 = "+ x1 + "   x2 = " + x2);
}else{
	System.out.println("d ergab 0!");
}
```

Möchteste du genau 30 Schleifendurchgänge so kannst du eine For-Schleife(Zählschleife) verwenden.


```
for (int i = 0; i < 30; i++) {
	double Y = (a * (x * x)) + (b * x) + c;
	System.out.println("Y(" + x + ")= " + Y);
	x = x + 0.5;
}
```

Das letzte was noch wichtig ist, wenn du eine Resource verwendest, in diesem Fall einen Scanner, muss dieser am Ende wieder geschlossen werden.


```
sc.close();
```

möchtest du nach einem system.out.println(...) eine leere Zeile erhalten verwende einfache ein \n am Ende. Mit \t kannst du tabs einfügen um die Ausgabe zu formatieren.


Hier ist der "bereinigte" Sourcecoe:


```
import static java.lang.Math.sqrt;
import java.util.Scanner;

public class Mitternachtsformel {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("Gib eine Zahl für den Koeffizienten a ein: ");
		double a = sc.nextDouble();
		System.out.println("Gib eine Zahl für den Koeffizienten b ein: ");
		double b = sc.nextDouble();
		System.out.println("Gib eine Zahl für den Koeffizienten c ein: ");
		double c = sc.nextDouble();
		System.out.println("Die zu lösende Gleichung lautet:\n y = \t" + a + "x² +\t" + b + "x + \t" + c + "\n\ta\tb\tc\n");
		
		// Diskriminante unter Wurzelzeichen
		double d = ((b * b) - (4 * (a * c)));
		double x1 = ((-b) - sqrt(d)) / (2 * a);
		double x2 = ((-b) + sqrt(d)) / (2 * a);
		if (d < 0) {
			System.out.println("Die Funktion hat keine Nullstellen, da die Diskriminate negativ ist!\n=> Diskriminate = "+ d);
		}else if (d > 0) {
			System.out.println("Die Nullstellen der quadratischen Gleichung sind: \n x1 = "+ x1 + "   x2 = " + x2);
		}else{
			System.out.println("d ergab 0!");
		}

		
		
		System.out.println("\nGib einen Wert für x ein");
		double x = sc.nextDouble();
		double xNegativ = -x;
		System.out.println("\nWertetabelle für das Intervall: x["  + x +";" + String.valueOf(x +15)+ "] Schrittfolge: x+0,5");
		
		for (int i = 0; i < 30; i++) {
			double Y = (a * (x * x)) + (b * x) + c;
			System.out.println("Y(" + x + ")= " + Y);
			x = x + 0.5;
		}
		System.out.println("\nWertetabelle für das Intervall: x[" + xNegativ + ";0] Schrittfolge: x+0,5");
		
		while (xNegativ <= 0) {
			double Y = (a * (xNegativ * xNegativ)) + (b * xNegativ) + c;
		System.out.println("Y(" + xNegativ + ")= " + Y);
			xNegativ = xNegativ + 0.5;
		}
		sc.close();
	}
}
```

Hier noch was zum einlesen in Java:
http://openbook.galileocomputing.de/javainsel/

Viele Grüße und viel Spaß beim erlernen von Java
Youza


----------



## fasswas (17. Februar 2014)

danke, dass du nochmal drübergeschaut hast.... Jetzt hab ich mich wohl als Java-Anfänger entlarvt.

Das mit dem "Scanner(System.in)" und dem Schließen "sc.close();" hab ich so nicht gewusst. Hatte noch ein veraltetes Java-Learning Buch, in dem noch mit dem packages IQ-Tools und den read-Befehlen gearbeitet wurde, daher hab ich mir die verbesserten Scanner-Befehle einfach schnell zusammengelesen und nie was erfahren, dass man das auch wieder schließen muss, sonst Ressourcen-Leak.
Zu den if-else Bedingungen: Interessant ist doch, dass man nur mit if arbeiten kann und die  "else if, else" Befehle komplett weglassen kann, oder? Hab es jetzt zumindest so gelöst.
Aber mein Problem stellt sich mir immer noch, dass die Schleife erst 30 Werte ausgeben soll von einem x-Wert an, den der Benutzer eingelesen hat. Also nicht wie bei mir erst mit x=1  oder x= -8 beginnt, sondern wahlweise vom User abhängig ist, z.B.: x= -123  und nun von dort aus die 30 Y-Werte berechnen lassen. Aber ich krieg das schon irgendwie hin.
Generell finde ich es nervig, dass es ständig neue Versionen von JDK und Befehlen gibt. Dadurch ist der Nachhaltigkeitseffekt von gerade erlernten Befehlen nur von kurzer Dauer, man wird ständig verwirrt, da im Netz noch Lösungscodes mit alten Befehlen rumgeistern und hat so ständig mit fehlermeldungen zu kämpfen ohne sich bewusst zu sein was falsch gemacht zu habe. Ist besonders als Anfänger sehr frustrierend. Aber gut ist wohl der Lauf der Entwicklungsgeschichte.


----------



## fasswas (17. Februar 2014)

Ok, das mit dem eigenen Wert einlesen, war nun wirklich nicht so schwer. ,-)


__________________________________________________
System.out.println("Gib nun einen beliebigen x-Wert ein, zur Berechnung einer Wertetabelle.\nVon diesem Wert an, werden 15 Y-Werte in Schrittfolge: x+0,5 berechnet:"); 
      double xNEU = sc.nextDouble();
    System.out.println();        
        for (int i = 0; i<15; i++) {       
        double Y = (a*(xNEU*xNEU))+(b*xNEU)+c;
        System.out.println("Y("+xNEU+")= "+Y);
        xNEU = xNEU + 0.5;}
______________________________________________________
Aber wie bekomme ich es hin, dass ich das Programme für einen kurzen Hinweis stoppe und dann per beliebiger Taste weiterlaufen lasse?

Hab mit "sc.next();" gearbeitet und dann " if(WEITER != null)"  Das überprüft aber nur, ob ein Wert, also Zahl oder Buchstabe vorhanden ist. Wie kann ich es aber wirklich mit JEDER beliebigen Taste (auch Enter, TAB, Backspace oder Space) weiterlaufen lassen? Weil dadurch wird ja kein Wert, sondern nur ein "char" betätigt....


----------

