Java, programmieren

Hallo, es geht um folgende Aufgabe:

Schreiben Sie eine Applikation LogUndRunden. Die Applikation soll zwei Methoden enthalten.
Die erste Methode soll den Logarithmus einer Zahl zu einer beliebigen Basis, die der Methode als Parameter zu übergeben sind, berechnen.
Die zweite Methode soll eine beliebige Gleitkommazahl auf eine gewünschte
Anzahl Nachkommastellen runden. Die Gleitkommazahl und die Anzahl der Nachkommastellen sollen der Methode als Parameter übergeben werden.
a) Berechnen Sie log10 13, log2 10 und loge 25!
b) Runden Sie 13,0 / 3,5 = 3,7142857 … auf 2, 3 und 4
Nachkommastellen!
Wählen Sie für Ihre Variablen geeignete Datentypen.
Lesen Sie die Werte mit JOptionPane ein.
Hinweis 1: Die Berechnung des Logarithmus einer beliebigen Zahl zu einer
beliebigen Basis lässt sich wie folgt realisieren:
Logarithmus der Zahl / Logarithmus der beliebigen Basis!
Hinweis 2: Die Zahl e lautet 2,718281828…!
Hinweis 3: Nutzen Sie zum Runden die Methoden round() und pow() der Klasse Math.

Ich habe das Programm soweit fertig, jedoch bekomme ich unverständliche Ausgaben und ich weiß nicht aus welchem Grund. ich hoffe ihr könnt mir weiterhelfen.

public static void main(String[] args) {
String eingabe1, eingabe2, eingabe3, eingabe4;
double zahl, basis, ergebnis, ergebnis1, rund;
char zeichen = ‚e‘;
int nkstelle;

eingabe1 = JOptionPane.showInputDialog(„Bitte geben Sie die Zahl des Logarithmus an!“);
zahl = Double.parseDouble(eingabe1);
eingabe2 = JOptionPane.showInputDialog(„Bitte geben Sie die Basis des Logarithmus an!“);
basis = Double.parseDouble(eingabe1);
if (basis == ‚e‘) {
basis = 2.718281828;
}

eingabe3 = JOptionPane.showInputDialog(„Bitte geben Sie die zu rundende Zahl ein!“);
rund = Double.parseDouble(eingabe3);

eingabe4 = JOptionPane.showInputDialog(„Bitte geben Sie an, auf wieviel Nachkommastellen gerundet werden soll!“);
nkstelle = Integer.parseInt(eingabe4);

ergebnis = berechneLogarithmus(zahl, basis);
System.out.println("Der Logarithmus der Zahl beträgt: " + ergebnis);

ergebnis1 = runde(rund, nkstelle);
System.out.println("Die gerundete Zahl lautet: " + ergebnis1);

}

public static double berechneLogarithmus(double zahl, double basis) {

return Math.log(zahl) / Math.log(basis);

}

public static double runde(double rund, int nkstelle) {

return Math.round(rund * nkstelle);

}
}

public static double runde(double rund, int nkstelle) {

return Math.round(rund * nkstelle);

}

Da ist der Fehler offensichtlich, behaupte ich. (Unterschied zwischen der Zahl z*n und z*10^n ?)
Außerdem musst du danach natürlich auch wieder dadurch teilen, sonst bekommst du nicht die gerundete Zahl, sondern eine entsprechend größere.

Und dann solltest du nochmal einen genauen Blick darauf werfen:
eingabe1 = JOptionPane.showInputDialog(„Bitte geben Sie die Zahl des Logarithmus an!“);
zahl = Double.parseDouble(eingabe1);
eingabe2 = JOptionPane.showInputDialog(„Bitte geben Sie die Basis des Logarithmus an!“);
basis = Double.parseDouble(eingabe1);
if (basis == ‚e‘) {
basis = 2.718281828;
}
(vor allem, welche Eingabe du für welche Wert parst :wink: )
Übrigens wird das mit e so nicht funktionieren, das gibt ne Exception, die du mit nem try/catch-Block abfangen musst, oder eben vorher testen, obs e ist oder ne Zahl.

public static double runde(double rund, int nkstelle) {

return Math.round(rund * Math.pow(double) 10.0,(double)nkstelle);

Das klappt leider nicht wegen des Datentyps.

public static double runde(double rund, int nkstelle) {
return Math.round(rund * Math.pow(10,nkstelle))/Math.pow(10,nkstelle);
}

funktioniert so. Vielleicht eine Klammer auf vergessen? Der Cast auf double ist davon abgesehen eh unnötig, das macht java automatisch. (int->double geht automatisch, nur nicht andersrum, wegen loss of precision)

Okay jetzt hat’s geklappt :smile:
Wie bekomm ich das jetzt noch hin, dass ich den Logarithmus zur Basis e bestimmen kann. Dabei bekomme ich noch eine Fehlermeldung.

public static void main(String[] args) {
String eingabe1, eingabe2, eingabe3, eingabe4;
double zahl, basis, ergebnis, ergebnis1, rund;
char zeichen = ‚e‘;
int nkstelle;

eingabe1 = JOptionPane.showInputDialog(„Bitte geben Sie die Zahl des Logarithmus an!“);
zahl = Double.parseDouble(eingabe1);
eingabe2 = JOptionPane.showInputDialog(„Bitte geben Sie die Basis des Logarithmus an!“);
basis = Double.parseDouble(eingabe2);
if (basis == ‚e‘) {
basis = 2.718281828;
}

eingabe3 = JOptionPane.showInputDialog(„Bitte geben Sie die zu rundende Zahl ein!“);
rund = Double.parseDouble(eingabe3);

eingabe4 = JOptionPane.showInputDialog(„Bitte geben Sie an, auf wieviel Nachkommastellen gerundet werden soll!“);
nkstelle = Integer.parseInt(eingabe4);

ergebnis = berechneLogarithmus(zahl, basis);
System.out.println("Der Logarithmus der Zahl beträgt: " + ergebnis);

ergebnis1 = runde(rund, nkstelle);
System.out.println("Die gerundete Zahl lautet: " + ergebnis1);

}

public static double berechneLogarithmus(double zahl, double basis) {

return Math.log(zahl) / Math.log(basis);

}

public static double runde(double rund, int nkstelle) {
return Math.round(rund * Math.pow(10, nkstelle)) / Math.pow(10, nkstelle);
}
}

eingabe2 = JOptionPane.showInputDialog(„Bitte geben
Sie die Basis des Logarithmus an!“);
basis = Double.parseDouble(eingabe2);
if (basis == ‚e‘) {
basis = 2.718281828;
}

Das funktioniert so nicht mit ‚e‘ als Eingabe. Warum? Weil du versuchst, ‚e‘ als Double zu parsen. Gibt ne Number Format Exception oder sowas ähnliches. Darum: Erst das mit dem ‚e‘ abchecken:

if(eingabe2.equals(„e“)){ //Ist der String in eingabe2 das e?
basis=2.718281828;
}else{ //nein? Dann wirds wohl ne Zahl sein:
basis = Double.parseDouble(eingabe2);
}

Ja stimmt mit equals geht das echt viel besser.
jetzt hat’s auch endlich geklappt.
vielen Danke für die Hilfe :smile:

Hallo Mathematicus,

in deine Lösung hat sich eine kleine Unaufmerksamkeit eingeschlichen:

eingabe2 = JOptionPane.showInputDialog("…");
basis = Double.parseDouble(eingabe1);

Du wertest also die erste Eingabe (die Zahl) auch als Basis aus…

Beim Sonderfall e gibt es noch einen Fehler:
‚e‘ ist ein char - ein ganz gewöhnlicher Buchstabe wie jeder andere auch. Java erkennt das nicht als Eulersche Zahl. Wenn du double mit char vergleichst, wird der char in double konvertiert - und erhält damit als Wert den für ihn gültigen CodePoint (im Falle von ‚e‘ entspricht das dem ASCII-Wert von 101 (hexadezimal 65)) - als int übrigens genauso.

Du musst also eingabe2 bereits als String vergleichen:

if(„e“.equals(eingabe2))
{
//…
}

Hier kann man dann aber gleich optimieren:
Der Logarithmus der Basis - log_x (x), x > 0 - ist stets gleich 1, das gilt auch für e. Damit ist
Math.log(e) == 1 (wobei zu beachten ist, dass 2,718281828 gerundet ist, also wird damit eine Abweichung eintreten!).

Somit kannst du schreiben:
if(„e“.equals(eingabe2))
{
ergebnis = Math.log(zahl);
}
else
{
basis = Double.parseDouble(eingabe2);
ergebnis = Math.log(zahl) / Math.log(basis);
}

Kleiner Tipp an dieser Stelle: Benutze eine Entwicklungsumgebung, z. B. Eclipse (kostenlos und sehr gut, http://www.eclipse.org). Eine IDE kann dir sehr viel Arbeit abnehmen - im konkreten Fall hat sie mir die Variable ‚eingabe2‘ als niemals gelesen angezeigt - was der direkte Hinweis auf den Fehler war…

Wenn du’s ganz professionell machen willst, dann bau noch eine Prüfung auf fehlerhafte Eingaben ein:

try
{
value = Double.Parse(eingabe);
}
catch(NumberFormatException nfe)
{
System.out.println(„some error message“);
}

Vergiss dann aber auch nicht zu prüfen, ob basis > 0 ist - ist das nicht der Fall, gibt’s in log(basis) eine ArithmeticException.

Gruß und viel Erfolg,
Sandro

Hallo,

also ohne da jetzt einmal compiliert bzw. getestet zu haben:

für die Basis wird eingabe1 statt eingabe2 verarbeitet und es mach keinen Sinn, „basis“ auf ein Zeichen abzufragen. Basis ist ein double, kann also nur numerisch sein.

Ich würde erst eingabe2 auf „e“ prüfen, und bei negativem Ergebnis basis über „parse“ verfüllen.

Freundlichst,

Carsten Rösner

eingabe2 = JOptionPane.showInputDialog(„Bitte geben Sie die Basis des Logarithmus an!“);
basis = Double.parseDouble(eingabe1);
if (basis == ‚e‘) {
basis = 2.718281828;

Vielen Dank für die Hilfe

Vielen Dank für die Hilfe

Bitte, Sorry, fast vergessen:

JOptionPane.showInputDialog() liefert einnen String zurück, der kann nicht mit „==“ verglichen werden.

eingabe2.equalsIgnoreCase(‚e‘) würde da als Bedingung funktionieren

CR

Hallo Mathematikus,

basis ist ein double, das kannst du nicht mit ‚e‘ vergleichen.

Darueber hinaus hilft es immer, den Stacktrace („Fehlermeldung“) mitzuschicken – der mag fuer dich unverstaendlich sein, fuer andere jedoch nicht. Im allgemeinen gibts da die Zeilennummer, wo was schieft laeuft.

Wenn ich dir weiterhelfen soll, waere es auch hilfreich, „unverstaendliche Ausgaben“ naeher zu spezifizieren.

Gruss,

Kai