Quadratische Gleichung

Java20134

Bekanntes Mitglied
Kann mir jemand sagen, warum bei diesem Code kein Error bei der if-else-Schleife ausgegeben wird?
Java:
import java.util.Scanner;

public class Quadratische_Gleichung {

	public static void main(String[] args){
		double p;
		double q; 
		double wurzel, inhalt; 
		double erg1; 
		double erg2; 
		
		Scanner sc = new Scanner(System.in); 
		
		System.out.println("Quadratische Gleichung x² + px + q");
		System.out.println("");
		
		System.out.println("Geben sie einen Wert für p ein:");
		p = sc.nextDouble();
		
		System.out.println("Geben sie einen Wert für q ein:");
		q = sc.nextDouble(); 
		
		inhalt = (p/2)*(p/2)-q;
		wurzel = Math.sqrt(inhalt);
		
		if (wurzel < 0){
			System.out.println("Error"); 
		}
		else {
		erg1 = -(p/2)+wurzel;
		erg2 = -(p/2)-wurzel;
		
		System.out.println(""); 
		System.out.println("Die zwei x-Werte lauten " +erg1+ " und " +erg2+ ".");
		}
	}
}
 

Java20134

Bekanntes Mitglied
Ich arbeite mit Eclipse und wenn ich dann unten in die Konsole meine Werte für p und q eingebe werden die eingelesen. Dann muss man die Lösungsformel für die Quadratische Gleichung wissen, also -(p/2) + oder - die Wurzel aus p/2 ins Quadrat -q. Die Die Wurzel berechne ich mit inhalt und wurzel. Und danach soll überprüft werden, ob wurzel kleiner als 0 ist und wenn das ein tritt soll Error rauskommen.
 

Java20134

Bekanntes Mitglied
Ich habe das Problem gelöst. Ich habe in der Schleife if und else getauscht und in der Bedingung wurzel >= 0 hingeschrieben. Warum das jetzt funktioniert weiß ich aber nicht wirklich, wer das erklären kann, könnte mal bitte schreiben.
 

TheSorm

Bekanntes Mitglied
Du machst doch schon den fehler das du versuchst Theretischn in manchen fällen die Wurzel einer Negative zahl zu zihen! also packst einfach eine try catch schleife rein so:
Java:
try {
        wurzel  =  Math.sqrt(inhalt)

        }
catch (Exception e) {
       System.out.println("error");
}

und dann dann mit dem rest weiter!
 

Java20134

Bekanntes Mitglied
Das es keine negative Wurzel gibt ist ja klar und deshalb habe ich ja if und else getauscht und als Bedingung wurzel >= o genommen!
 

TheSorm

Bekanntes Mitglied
das problem ist nur das du schon einen fehler erzuegst wenn du die rechnung durchfürst, weil du dann ja schon die wurzel nimmst, so guckst du nur ob das ergebnis negativ ist.
 

Java20134

Bekanntes Mitglied
Was spricht dagegen? Und man bewacht dann mit dem try-Block, dass die wurzel gleich der wurzel aus dem inhalt ist. Was macht das für einen Sinn.
 

TheSorm

Bekanntes Mitglied
dein name "wurzel" ist nur eine Variable, wenn jetzt jemand p und q so eingiebt das der "inhalt" negativ ist bekommst du einen fehler, wenn du das in einen try catch block packst passirt der fehler und anstad das das programm hängen bleibt kanst darauf mit einer ausgabe reagieren.
 

TheSorm

Bekanntes Mitglied
es geht ja darum das du den teil:
Java:
   wurzel = Math.sqrt(inhalt);

sqrt

public static double sqrt(double a)

Returns the correctly rounded positive square root of a double value. Special cases:

If the argument is NaN or less than zero, then the result is NaN.
If the argument is positive infinity, then the result is positive infinity.
If the argument is positive zero or negative zero, then the result is the same as the argument.

Otherwise, the result is the double value closest to the true mathematical square root of the argument value.

Parameters:
a - a value.
Returns:
the positive square root of a. If the argument is NaN or less than zero, the result is NaN.

verstehst du?
 

Highchiller

Bekanntes Mitglied
Oh man -.-

Noch mal von vorne...

Das Problem ist, dass du ERST rechnest, und dann fragst ob das überhaupt geht. Eine negative Wurzel gibt es nicht! Das hast du ja schön erkannt.

Deshalb ist deine If-Else-Abfrage völliger quatsch! Wie soll er denn zu dem Fall gelangen, dass wurzel < 0 ist? Du hast doch selbst gesagt das geht nicht!

Um dein "Problem" zu beheben, will dir TheSorm nur sagen, du musst BEVOR du die Wurzel ziehst, schauen ob das was du gleich in die Wurzel rein steckst, positiv oder negativ ist.
Wenn es negativ ist, handelst du das am Besten mit einer Ausgabe ab. Denn was ist die Wurzel aus einer negativen Zahl??? Siehste!
Und wenn das was du rein wirfst positiv ist, kannst du damit rechnen und entsprechend das Ergebnis auswerten, dass dann selbstverständlich auch NUR POSITIV sein kann.

Jetzt verstanden?
 

Java20134

Bekanntes Mitglied
Ja, aber ich bestimme das doch nicht mit wurzel = Math.sqrt(inhalt);. Der try-Block überwacht ja dann nur, dass die wurzel gleich der Wurzel des Wertes inhalt ist. Damit bezwecke ich doch nichts, DAS ist eher mein Problem!
 

Java20134

Bekanntes Mitglied
Ich könnte doch aber auch vor der Variablen inhalt eine if-else-Verwzeigung reinbringen, wo ich überprüfe, ob denn inhalt < 0 ist und wenn ja wird Error ausgegeben.
 

Highchiller

Bekanntes Mitglied
uhhh... outsch! Das ist völliger Quatsch. Try ist englisch und heißt versuchen. Das überprüft nix, das versucht einfach den Code auszuführen. Wenn du dir nicht sicher bist ob dieser Code (im Try-Block) einen Fehler verursacht, eben genau dann wenn du eine negative wurzel ziehst, dann setzt du ihn in einen try-catch-block. Um eventuelle Fehler abzufangen.

Es gibt 2 Möglichkeiten deinen Code zu "reparieren".
The Sorm hat dir den Try-Catch-Block vorgeschlagen. Das geht aber nicht so leicht, weil beim Rechnen gar kein Fehler fliegt sondern nur ein Wert Double.NaN raus kommt. Dann funktioniert der Code zwar, er gibt dir am Ende allerdings NaN aus.

Die bessere Variante wäre einfach vorher aufzupassen, damit erst gar kein Fehler vorkommt.

Java:
import java.util.Scanner;

public class Quadratische_Gleichung {

	public static void main(String[] args){
		double p;
		double q; 
		double wurzel, inhalt; 
		double erg1; 
		double erg2; 
		
		Scanner sc = new Scanner(System.in); 
		
		System.out.println("Quadratische Gleichung x² + px + q");
		System.out.println("");
		
		System.out.println("Geben sie einen Wert für p ein:");
		p = sc.nextDouble();
		
		System.out.println("Geben sie einen Wert für q ein:");
		q = sc.nextDouble(); 
		
		inhalt = (p/2)*(p/2)-q;
		if ( inhalt < 0 ){
			System.out.println("Es kann keine Wurzel aus einer negativen Zahl gezogen werden.");
			return;
		}

		wurzel = Math.sqrt(inhalt);

		erg1 = -(p/2)+wurzel;
		erg2 = -(p/2)-wurzel;
		
		System.out.println(""); 
		System.out.println("Die zwei x-Werte lauten " +erg1+ " und " +erg2+ ".");
	}
}

Fertig. Einfach vorher den Sonderfall abfangen. Danach einfach rechnen. Nix weiter...
 

Java20134

Bekanntes Mitglied
So hatte ich es am Ende auch gemacht. Habe aber den Rest noch in eine if-else-Verzweigung gebracht. Dies ist für' s erste erstmal einfacher zum verstehen.
 

Neue Themen


Oben