Methoden Übergabe von Werten

PaP

Mitglied
Hallo alle zusammen,

ich habe vor ca 8 Wochen meine schulische IT Ausbildung begonnen und behandle derzeit im Fach Programmieren Java. Da der Lehrer den Unterrichtsstoff meines Erachtens nach viel zu langsam durchkaut, habe ich mich selbst etwas schlau gemacht und schon die eine oder andere Konsolenanwendung geschrieben.

Zurzeit arbeite ich an einer Klasse, die Methoden enthält, über die sich einige Dinge leichter realisieren lassen.

Hier habt ihr mal einen Auszug der Klasse mit der Methode, um die es mir jetzt geht:

Java:
import java.util.*;

public class PatMath
{
  static double[] PQ(double p, double q)
  {
    double ze1, ze2;
    double[] x = new double[3];
    ze1 = (p/2) * (p/2) - q;
    
    if(ze1 > 0)
       {
            ze2 = Math.sqrt((p/2) * (p/2) - q);
            x[1] = -p / 2 + ze2;
            x[2] = -p / 2 - ze2;
       }

    else if(ze1 == 0)
       {
            x[1] = -p / 2;
       }
       
    else if(ze1 < 0)
       {
            
       }
   
    return x;
  }

Hier ein Beispiel, wie die Methode verwendet wird

Java:
    Scanner input = new Scanner(System.in);
    double p,q;
    
    System.out.print("Geben sie P ein: ");
    p = input.nextDouble();
    System.out.print("Geben sie Q ein: ");
    q = input.nextDouble();
    
                                      //Hier wird die PatMath.PQ Methode verwendet.
    double x[] = PatMath.PQ(p, q);    //Wir übergeben die Werte p und q an die Methode und schreiben das Ergebnis in den Array x[].
                                      //Erstes Ergebnis ist x[1] zweites ist x[2]
    System.out.println(x[1]);
    System.out.println(x[2]);


So nun zu meinem Problem. Wie ihr sicherlich bemerkt habt, handelt es sich hierbei um eine Methode zur Berechnung einer quadratischen Gleichung der Form x² + px + q mit Hilfe der PQ Formel.

Wenn der Fall eintritt, dass unter der Wurzel eine Zahl > 0 steht, dann haben wir 2 Ergebnisse (x1 und x2)

Wenn der Fall eintritt, dass unter der Wurzel eine 0 steht, kommt nur ein Ergebnis raus und zwar x1 = - p/2
und hier ist das erste Problem. Ich übergebe die Werte x1 und x2 mit Hilfe eines Arrays. Wenn ich jedoch nur ein ergebnis habe möchte ich dass nur x1 übergeben wird oder alternativ x2 entweder einen String beinhaltet oder als NULL Wert übergeben wird.

Wenn der Fall eintritt, dass unter der Wurzel eine Zahl < 0 steht, bekommen wir kein Ergebnis da man von einem negativen Wert keine Wurzel ziehen kann(Not a Number).
In diesem Fall möchte ich entweder dass ebenfalls ein NULL Wert für x1 und x2 übergeben wird oder halt ein String.

Im allgemeinen kann ich mir nicht vorstellen wie ich einen String übermitteln soll denn wenn die Rechnung aufgeht wird 2 mal ein Wert des Datentyps Double an einen Zwischenspeicher des Typs Double übergeben, wie dieser dann jedoch einen String aufnehmen kann ist mir ein Rätsel(#Wahrscheinlich gehts auch gar nicht)

Ich hoffe, dass ich mein Problem verständlich formuliert habe und freue mich über Antworten 🙂

Liebe Grüße

PaP
 
Wenn die Methode ein double[] liefert, dann ist damit doch noch nicht in der Singntur der Methode festgelegt, wieviele Werte darin stehen. Deshlab kannst du es doch in etwa so machen:
Java:
if ( ...) { // zwei Ergebnisse
  double[] ret = new double[2];
  ret[0] = ergebnis1;
  ret[1] = ergebnis2;
  return ret;
} else if ( ... ) { // kein Ergebnis
  double[] ret = new double[1];
  ret[0] = ergebnis;
  return ret;
} else { //
  double[] ret = new double[0];
  return ret;
}
 
Klappt wunderbar nur hab ich jetzt folgendes Problem.
Wenn ich beispielweise nur 1 Ergebnis erhalte dann befindet sich ja im Array nur ein einziger Wert. Im Hauptprogramm jedoch werden 2 Werte ausgegeben

Java:
    double x[] = PatMath.PQ(p, q);    
    System.out.println(x[0]);
    System.out.println(x[1]);

Wenn also die Fälle

Java:
ze1 == 0

oder

Java:
ze1 < 0

eintreten, bekomm ich vom Programm einen Fehler, da x[1] bzw x[0] und x[1] keine Werte beinhalten.
 
Zuletzt bearbeitet:
Du kannst die Länge des Arrays abfragen und greifst nur dann auf die Werte zu, wenn sie definiert sind.
Alternativ kannst du dir auch eine eigene Klasse schreiben, die die Ergebnisse für dich kapselt. (Z.B. über ein Attribut, welches die Anzahl der Lösungen enthält, Zugriff auf die Lösungswerte wird von der Anzahl der Lösungen gesteuert).
 
Zuletzt bearbeitet:
Die Option, bei Nicht-Lösbarkeit irgendwie einen String in den return value zu basteln hast Du leider nicht. Außerdem ist das nur vordergründig eine gute Fehlerbehandlung.

Wenn die Gleichung lösbar ist, wird auf jeden Fall ein Array returned. Manchmal mit zwei Elementen, manchmal nur mit einem. Du musst also eine Ausgabe programmieren, die mit beidem zurecht kommt. Deine fixen Zugriffe kommen da nicht in Frage. Eher eine (zugegeben recht kurze) for-Schleife. Etwa so:
[Java]
System.out.println("Anzahl möglicher Lösungen: " + x.length);
for (double value : x) {
System.out.println(value);
}
[/Java]

Nun zu dem Sonderfall, dass kein Ergebnis vorliegt. Hier sind jetzt eigentlich nur zwei Varianten denkbar:
- Deine Methode liefert null zurück. Dann kann man bei der Ausgabe wenigstens mit if(x!=null) prüfen.
- Du schmeißt innerhalb Deiner PQ-Methode eine RuntimeException mit aussagefähiger Message (etwa: "Gleichung nicht lösbar ze1 kleiner 0!") oder sowas.
Dazu, was der bessere Weg ist, kann man lang und breit diskutieren. Ich präferiere die zweite Methode. Bei der ersteren müsste der Aufrufer Deiner Methode immer berücksichtigen, dass evtl. null zurück kommt. Tut er das nicht, bekommt er eine nichts sagende NullPointerException und darf sich dann durch den Code der PQ-Methode wühlen, um herauszufinden wieso. Bei der zweiten Methode bekommt er zwar auch eine Exception aber wenigstens eine aussagefähige Fehlermeldung. Außerdem hast Du dann auch im Code der PQ-Methode an genau der richtigen Stelle quasi für lau dokumentiert, dass ze1<0 heißt, dass die Gleichung nicht lösbar ist. Das mag zwar für Dich im Moment offensichtlich sein, aber für andere Leser und vielleicht auch für Dich, wenn Du in einem Jahr Deinen Code wieder anschaust, ist es das möglicherweise nicht.

// Edit: Als dritte Option ist mir grad auch noch was eingefallen. Du stellst Deine Methode von Arrays auf List um. Dann kannst Du je nach Gleichung eine leere Liste, eine mit einem Element oder eine mit zwei Elementen zurück liefern. Das nur, falls Dir das mit den Exceptions nicht gefällt.

//Edit2: Wenn ich's mir Recht überlege, gefällt mir die Lösung mit der List am besten. Null zurück geben ist immer anfällig für Fehler (Es gibt sogar Gurus, die sagen: "Never return null"). Das schmeißen einer RuntimeException soll eigentlich einen Fehlerzustand anzeigen. Aber, dass eine Gleichung nicht lösbar ist, ist ja eigentlich kein Fehler sondern ein valides Ergebnis. Deswegen finde ich das mit List am besten.
 
Zuletzt bearbeitet von einem Moderator:
// Edit: Als dritte Option ist mir grad auch noch was eingefallen. Du stellst Deine Methode von Arrays auf List um. Dann kannst Du je nach Gleichung eine leere Liste, eine mit einem Element oder eine mit zwei Elementen zurück liefern. Das nur, falls Dir das mit den Exceptions nicht gefällt.
Das ist dann doch genau wie beim Array; auch dort bekommt man im nichtlösbaren Fall ein leeres Array.
 
Murray hat gesagt.:
Das ist dann doch genau wie beim Array; auch dort bekommt man im nichtlösbaren Fall ein leeres Array.
Soo, schnell mal meinen Blödsinn gelöscht. 😀 Stimmt natürlich. Krass seit 8 Jahren programmier ich Java und ich hab noch nie versucht, "new double[0]" oder einfach "{}" zu machen...
Das ist dann meine neue Lieblingslösung.
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben