Quadratische Gleichungen

freshes

Mitglied
Hallo, ich hab hier eine Aufgabe, mit der ich nicht zurecht komme. Es sollen per Tastatureingabe rationale Zahlen für p und q der quadratischen Gleichung x² + p*x + q = 0 eingegeben werden.

Dazu soll im Programm die Diskriminante berechnet werden: D = p² - 4*q

Dann gibt es Fallunterscheidungen für D = 0, D>0 und D<0. Die entsprechenden Funktionen x1 und x2 für jeden Fall hab ich ins Programm geschrieben. Ich weiß jetzt aber nicht wie ich weiter vorgehen soll, soll ich die if-Anweisung verwenden? oder mit case operieren? Im Code ist für euch wohl unschwer zu erkennen, dass das nicht funktioniert, bekomm das Programm einfach nicht zum Laufen. Für Hilfestellungen wäre ich sehr dankbar.



Code:
class A8
{ public static void main(String[] args)
 {int p, q, D, x1, x2, j;
 System.out.println("Quadratische Gleichungen");

  /* Tastatureingabe von p       */
  System.out.println("Bitte rationale Zahl p eingeben");
  p=IO1.einint();

  /* Tastatureingabe von q       */
  System.out.println("Bitte rationale Zahl q eingeben");
  q=IO1.einint();

  
  do
  {D=p*p - 4*q;
   System.out.println(p+" hoch "+2+" - "+4+" * "+q+" = "+D);
   }
   if (D > 0)
   { x1 = -p/2 + (Math.sqrt(D))/2;
     x2 = -p/2 - (Math.sqrt(D))/2;
   }
    if (D = 0)
   { x1 = -p/2;
     x2 = -p/2;
   
   }
   
   if (D < 0)
   { x1 = -p/2 + j * (Math.sqrt(-D))/2;
     x2 = -p/2 - j * (Math.sqrt(-D))/2;
} 
    System.out.println("Ende der Berechnung");
 }
}
 
Ich denke mal, du soltlest mal bei den reellen Zahlen bleiben, wenn die Diskriminante kleiner als Null ist, dann ist die gleichung nicht Lösbar.
Und es hilft ungemein auf sinnvolle Codeeinrückung zu achten... und Variablennamen klein schreiben

Zu dem Programm:
- Was soll das
Code:
do
bewirken?
- Vergliechen wird mit
Code:
==
, das was du machst ist ein Wert zuweisen.
- Du solltest nicht mit ganzen Zahlen arbeiten, sondern mit z.B. double
- Es gibt mind. 2 Fehler, die der Compiler ausspucken sollte. Es könnte durch aus sinnvoll sein, diese Fehler auch bei der Frage anzugeben...
 
- Vergliechen wird mit
Code:
==
, das was du machst ist ein Wert zuweisen.

Wobei man bei reelen Zahlen nicht direkt vergleichen sollte, sondern ein kleines Intervall angeben sollte, etwa [c]if(Math.abs(D) < 0.0000001) {...[/c]

Komplexe Zahlen sind bei Java nicht eingebaut, du musst sie entweder selbst schreiben oder eine geeignete Implementierung irgendwo borgen (z.B. Complex.java ).
 
Zuletzt bearbeitet:
Hallo und danke für die Anmerkungen. Ich hab's jetzt soweit hinbekommen, dass das Programm für die ersten beiden Fälle läuft (also d>0 und d==0). Dass die Determinante negativ ist, macht nichts, weil das nur für den Fall d<0 gilt und sich dadurch wieder ein positiver Wert ergibt.

Code:
class A8
{public static void main(String[] args)
 {double p, q, d, x1, x2, j;
  System.out.println("Quadratische Gleichungen");

  /* Tastatureingabe von p       */
  System.out.println("Bitte rationale Zahl p eingeben");
  p=IO1.einint();

  /* Tastatureingabe von q       */
  System.out.println("Bitte rationale Zahl q eingeben");
  q=IO1.einint();

  
  {d=p*p - 4*q;
   {System.out.println(p+" hoch "+2+" - "+4+" * "+q+" = "+d);
   }
   if (d > 0)
   {x1 = -p/2 + (Math.sqrt(d))/2;
    x2 = -p/2 - (Math.sqrt(d))/2;
    System.out.println("x1= " + x1);
    System.out.println("x2= " + x2);
   }
    if (d == 0)
   { x1 = -p/2;
     x2 = -p/2;
     System.out.println("x1= " + x1);
     System.out.println("x2= " + x2);
   }
   if (d < 0)
   { x1 = -p/2 + j * (Math.sqrt(-d))/2;
     x2 = -p/2 - j * (Math.sqrt(-d))/2;
     System.out.println("x1= " + x1);
     System.out.println("x2= " + x2);
   }
    System.out.println("Ende der Berechnung");
  }
 }
}

Problem ist noch die Zuweisung von j. Ich will dass dann am Ende für den letzten Fall die Variable stehen bleibt, in dieserer Form etwa: x1 = -4 - j * 5; Analog für x2.

Error: A8.java:39:18: variable j might not have been initialized
 
Zuletzt bearbeitet:
So geht das nicht. Die Variablen x1 und x2 erwarten einen double-Wert, und was du da zuweisen willst ist eben keiner und Java kennt auch keine imaginäre Einheit j (gebräuchlicher ist i). Entweder du verwendest komplexe Zahlen, oder du änderst die Ausgabe:

Java:
if (d < 0) { 
     System.out.println("x1= " + (-p/2) + " + " + ((Math.sqrt(-d))/2) + "j");
     System.out.println("x2= " + (-p/2) + " - " + ((Math.sqrt(-d))/2) + "j");
}
 
Zuletzt bearbeitet:
ich hab's jetzt so gemacht, dass ich für (-p/2) a und für ((Math.sqrt(-d)) b eingesetzt habe. Ist da ok so? das Programm läuft jedenfalls.

Code:
class A8
{public static void main(String[] args)
 {double p, q, d, x1, x2, j, a, b;

  System.out.println("Quadratische Gleichungen");

  /* Tastatureingabe von p       */
  System.out.println("Bitte rationale Zahl p eingeben");
  p=IO1.eindouble();

  /* Tastatureingabe von q       */
  System.out.println("Bitte rationale Zahl q eingeben");
  q=IO1.eindouble();

  
  {d=p*p - 4*q;
   {System.out.println(p+" hoch "+2+" - "+4+" * "+q+" = "+d);
   }
   if (d > 0)
   {x1 = -p/2 + (Math.sqrt(d))/2;
    x2 = -p/2 - (Math.sqrt(d))/2;
    System.out.println("x1= " + x1);
    System.out.println("x2= " + x2);
   }
    if (d == 0)
   { x1 = -p/2;
     x2 = -p/2;
     System.out.println("x1= " + x1);
     System.out.println("x2= " + x2);
   }
   if (d < 0)
   {a=-p/2;
    b=(Math.sqrt(d))/2;
    System.out.println("x1= " + a + " + " + b + "j");
    System.out.println("x2= " + a + " - " + b + "j");
   }
    System.out.println("Ende der Berechnung");
  }
 }
}
 
Das ist OK. Nur für den Fall, dass d gleich null ist, würde ich (wie oben beschrieben) gegen einen kleinen Bereich testen, da Fließkommazahlen numerischen Ungenauigkeiten unterliegen.
 

Zurück
Oben