QuadratischeGleichung.java

import java.io.*;

public class QuadratischeGleichung {
  // beschreibt a*x^2 + b*x + c = 0
  
  double a;
  double b;
  double c;
  
  public QuadratischeGleichung(double a1, double b1, double c1) {
    // erzeuge neue Gleichung mit gegebenen Koeffizienten
    a = a1;
    b = b1;
    c = c1;
  }

  private String toSignedString(double d) {
    // erzeugt String mit explizitem Vorzeichen
    if (d >= 0) {
      return("+ " + d);
    } else {
      return("- " + (-d));
    }
  }
  
  public String toString() {
    // erzeugt Textdarstellung der quadratischen Gleichung
    String s = a + "*x^2 "+ toSignedString(b) + "*x "
                + toSignedString(c);
    return s;
  }
  
  private double discriminant() {
    // die Diskriminante der Gleichung
    return(b*b/(4*a*a) - c/a);
  }
  
  
  private double[] getLinearSolution() {
    // gib die Lösung der linearen Gleichung zurück
    double[] result;
    
    if (b != 0.0) {
      // Normalfall der linearen Gleichung
      result = new double[1];
      result[0] = -c/b;
    } else if (c != 0) {
      // Gleichung lautet einfach c = 0, aber c != 0
      // Widerspruch, also keine Lösungen
      result = new double[0];
    } else {
      // b und c sind 0, die Gleichung lautet 0*x = 0
      // alle Zahlen sind Lösung
      // man kann aber nicht alle Zahlen zurückgeben!
      // Notlösung: eine Lösung ausgeben und Warnungsmeldung dazu
      
      System.out.println("WARNUNG: Gleichung 0*x = 0, alle x sind Lösung!");
      result = new double[1];
      result[0] = 1.0;
    }
    return result;
  }
  
  public double[] getSolution() {
    // gibt Vektor mit den Lösungen zurueck
    // berücksichtigt auch a = 0
    
    if (a == 0.0) {
      // lineare Gleichung, verwende entsprechende Lösungsroutine
      return getLinearSolution();
    }
    
    // hier ist klar: a != 0
    double a1 = -b/(2*a);
    double d = discriminant();
    double[] result;
    
    if (d > 0) {
      result = new double[2];
      double dRoot = Math.sqrt(d);
      result[0] = a1 + dRoot;
      result[1] = a1 - dRoot;
    } else if (d == 0) {
      result = new double[1];
      result[0] = a1;
    } else {
      // d < 0: es gibt keine (reelle) Lösung
      result = new double[0];
    }
    
    return(result);
  }
  
  public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(
                          new InputStreamReader(System.in));
    
    QuadratischeGleichung qe1 = null;
    
    // hole die Koeffizienten vom Benutzer
    String s;    // String für eingegebene Zeile
    System.out.println("Koeffizient von x^2 eingeben:");
    s = in.readLine();
    double a1 = Double.parseDouble(s);
    System.out.println("Koeffizient von x eingeben:");
    s = in.readLine();
    double b1 = Double.parseDouble(s);
    System.out.println("Konstante eingeben:");
    s = in.readLine();
    double c1 = Double.parseDouble(s);
    
    qe1 = new QuadratischeGleichung(a1, b1, c1);
  
    System.out.println("Die quadratische Gleichung " + qe1);
    
    double[] result = qe1.getSolution();
    int      count =  result.length;
    System.out.println("hat " + count + " Lösungen");
    
    if (count > 0) {
      System.out.println(result[0]);
    }
    if (count > 1) {
      System.out.println(result[1]);
    }
  }
}