# Methode als Parameter übergeben



## minipom (22. Jan 2013)

Hi,

ich bin den ganzen Tag schon am Java Lernen und langsam geht es bergauf, ich habe jetzt aber eine Frage zu dieser Aufgabenstellung:







Ich habe das ganze so gelöst, aber ich weiß nicht genau was der Prof mit dem "...werden der Methode als double Parameter übergeben" meint.

Hier meine Lösung:

[Java]
import java.util.Scanner;

public class berechneKegelvolumen {

	public static void main(String[]args) {

		System.out.println("Geben Sie die Höhe ein");
double h = new Scanner(System.in).nextDouble();
		System.out.println("Geben Sie den Radius ein");
double r = new Scanner(System.in).nextDouble();

if ((r < 0) || (h < 0))
{
System.out.println(Double.NaN);	
}
else
	{
	double volumen;
 volumen = ((r*r*Math.PI*h)*1/3);
System.out.println("Das Volumen ist: " +volumen);

	}
}
}
[/Java]


----------



## SlaterB (22. Jan 2013)

du solltest mehr über das 'schreiben Sie eine Methode berechneKegelvolumen()' nachdenken, statt eine derartige Klasse zu schreiben,
wenn es erstmal eine Methode gibt, dann sind auch Parameter zu übergeben, falls dir diese Begriffe etwas sagen


----------



## minipom (22. Jan 2013)

SlaterB hat gesagt.:


> du solltest mehr über das 'schreiben Sie eine Methode berechneKegelvolumen()' nachdenken, statt eine derartige Klasse zu schreiben,
> wenn es erstmal eine Methode gibt, dann sind auch Parameter zu übergeben, falls dir diese Begriffe etwas sagen




Ich habe es mal angepasst, aber bekomme leider einen Fehler:
[Java]
import java.util.Scanner;

public class uebung11 {

	public static void main(String[]args) 
	{

		System.out.println("Geben Sie die Höhe ein");
double h = new Scanner(System.in).nextDouble();
		System.out.println("Geben Sie den Radius ein");
double r = new Scanner(System.in).nextDouble();

	berechneKegelvolumen(h,r);
	}

public static double berechneKegelvolumen(double zahl1, double zahl2) // hier ist der Fehler in der Zeile Eclipse unterstreicht es mir, was ist da falsch?

{

if ((zahl1 < 0) || (zahl2 < 0))
{
System.out.println(Double.NaN);	
}
else
	{
	double volumen;
 volumen = ((zahl2*zahl2*Math.PI*zahl1)*1/3);
 System.out.println("Das Volumen ist: " +volumen);

	}
}
}
[/Java]


----------



## ARadauer (22. Jan 2013)

du hast als rückgabe typ double gibst aber nix zurück...

das ist eigenltich genau das was eclipse sagt



> This method must return a result of type double



also statt der ausgabe in der methode machst du ein return volumen und gibst es beim aufrufer aus

drück mal strg+shift+F


----------



## minipom (22. Jan 2013)

ARadauer hat gesagt.:


> du hast als rückgabe typ double gibst aber nix zurück...
> 
> das ist eigenltich genau das was eclipse sagt
> 
> ...


:toll:
OK stimmt, aber welchen return Befehl muss ich jetzt geben und warum?

return zahl1;

oder

return zahl2;

Will das Ganze jetzt richtig verstehen, fand Java am Anfang echt doof, aber umso mehr ich damit mache umso mehr mag ich es.


----------



## SlaterB (22. Jan 2013)

das hat weniger mit Java zu tun als mit Intelligenz

Chef gibt Mitarbeiter X zwei Zahlen zahl1 und zahl2 , und sagt ihm, er soll ein Volumen berechnen,
was muss X am nächsten Tag zurückgeben, zahl1, vielleicht, die der Chef schon kennt? oder zahl2? oder doch das berechnete Volumen?

interessant wird natürlich noch was im if-Fall zurückzugeben ist..


----------



## minipom (22. Jan 2013)

SlaterB hat gesagt.:


> oder doch das berechnete Volumen?



hatte ich mir auch gedacht, dass es das ist, habe das auch umgesetzt, aber eclipse unterstreicht mir dann das return volumen;

----> volumen can not be resolved to a variable

aber ich habe doch oben dran mit 

double volumen;
 volumen = ((zahl2*zahl2*Math.PI*zahl1)*1/3);

volumen bestimmt?


----------



## SlaterB (22. Jan 2013)

außerhalb des else-Blocks ist die Variable nicht sichtbar,

wenn du nur 
> double volumen;
davor ziehst, dann muss noch ein Wert hin, sonst nicht initialisiert im if-Fall,
(edit: ach, da gibts ja auch einen Wert, ich dachte eben nur eine Ausgabe)

die Auswertung sollte generell eher in die main-Methode, etwas zurückgeben was dort nicht verwendet wird ist unschön


----------



## minipom (22. Jan 2013)

vielen Dank erstmal für die Hilfe, ich habe das jetzt mit der Methode verstanden, aber ich verstehe einfach nicht, wo ich jetzt genau den return Befehl einbauen muss, kannst du mir zeigen wo im folgenden Code der "return volumen;" Befehl hin muss, ich komm einfach nichtmehr weiter :/


```
import java.util.Scanner;

public class uebung11 {

	public static void main(String[]args) 
	{		
		System.out.println("Geben Sie die Höhe ein");
double h = new Scanner(System.in).nextDouble();
		System.out.println("Geben Sie den Radius ein");
double r = new Scanner(System.in).nextDouble();

	berechneKegelvolumen(h,r);
	}
public static double berechneKegelvolumen(double zahl1, double zahl2)
{
if ((zahl1 < 0) || (zahl2 < 0))
{
System.out.println(Double.NaN);	
}
else
	{
	double volumen;
 volumen = ((zahl2*zahl2*Math.PI*zahl1)*1/3);
 System.out.println("Das Volumen ist: " +volumen);
	}
}

}
```


----------



## JCODA (22. Jan 2013)

Spoiler





```
import java.util.Scanner;

public class Uebung11 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Geben Sie die Höhe ein");
		double h = input.nextDouble();
		System.out.println("Geben Sie den Radius ein");
		double r = input.nextDouble();

		double volumen = berechneKegelvolumen(h, r);
		
		System.out.println("Bei einem Radius von " + r + " und einer Höhe von "
				+ h + " besitzt der Kegel ein Volumen von " + volumen + ".");
		input.close();
	}

	public static double berechneKegelvolumen(double h, double r) {
		double volumen;
		if (h < 0 || r < 0) {
			volumen = Double.NaN;
		} else {
			volumen = r * r * h * Math.PI / 3.0;
		}
		return volumen;
	}

}
```



oder 


Spoiler





```
public static double berechneKegelvolumen(double h, double r) {		
		if (h < 0 || r < 0) {
			return Double.NaN;
		} 
		return r * r * h * Math.PI / 3.0;		
	}
```


----------



## mrbela (22. Jan 2013)

Hey Minipom!

Also, so sieht das am besten aus. Da Du frustriert klingst und das viele vom Programmieren abschrekct, will ich Dir jetzt mal helfen:


```
public class uebung11 {

	public static void main(String[] args) {
		System.out.println("Geben Sie die Höhe ein");
		double h = new Scanner(System.in).nextDouble();
		System.out.println("Geben Sie den Radius ein");
		double r = new Scanner(System.in).nextDouble();

		double ergebnis = berechneKegelvolumen(h, r);
		if (ergebnis == Double.NaN) {
			System.out.println("Ups! Du hast ungültige Werte eingegeben!");
		} else {
			System.out.println("Das Ergebnis ist: " + ergebnis);
		}
	}

	public static double berechneKegelvolumen(double zahl1, double zahl2) {
		if ((zahl1 < 0) || (zahl2 < 0)) {

			return Double.NaN;

		} else {
			double volumen;
			volumen = ((zahl2 * zahl2 * Math.PI * zahl1) * 1 / 3);

			return volumen;
		}
	}

}
```

Anregungen:
1. CTRL + SHIFT + F rückt Dir den ganzen Code mal wieder gerade... Öfter mal machen, dann ist es deutlich übersichtlicher!!!
2. Wenn die Methode double zurückgeben soll, dann bau nicht in die Methode System.out's ein... Sondern lass die Methode wirklich bei ihrer eigentlichen Afugabe sein: Methode soll double zurückgeben, die Ausgabe (mittels System.out) passiert in der main-methode.
3. Für den Fall, dass Zahl1 oder Zahl2 nicht stimmt, arbeitest Du mit Double.NaN


----------



## ARadauer (22. Jan 2013)

mrbela hat gesagt.:


> Da Du frustriert klingst und das viele vom Programmieren abschrekct,


Was auch nicht immer verkehrt ist...


----------



## minipom (22. Jan 2013)

Danke an Jcoda für die Lösungen, wir hatten allerdings den Befehl         input.close(); noch nicht gelernt, deswegen ist die Lösung eher nicht so gut für mich, aber trotzdem vielen Dank!



mrbela hat gesagt.:


> Hey Minipom!
> 
> Also, so sieht das am besten aus. Da Du frustriert klingst und das viele vom Programmieren abschrekct, will ich Dir jetzt mal helfen:
> 
> ...



WOW! Danke für die Hilfe, ich schau mir jetzt mal alles an und versuche es ganz zu verstehen.
:toll: :toll:


----------



## JCODA (22. Jan 2013)

minipom hat gesagt.:


> Danke an Jcoda für die Lösungen, wir hatten allerdings den Befehl         input.close(); noch nicht gelernt, deswegen ist die Lösung eher nicht so gut für mich, aber trotzdem vielen Dank!



Es geht einfach darum, dass du in deinem Code mehrere "anonyme" Scanner verwendest. Ich benutze nur einen und diesen nenne ich input und eigentlich sollte man eben Scanner auch wieder "schließen" das funktioniert eben durch die Methode close() auf der Scanner-Referenz.


----------



## SlaterB (22. Jan 2013)

einen Scanner braucht man nicht wirklich schließen, interessant ist das immer nur in Hinblick auf die Quelle darunter,
einen Scanner auf einen String etwa wird hoffentlich niemand mit close() nerven, 

und die Quelle hier ist System.in, da ist das auch nicht nötig, kann immer offen bleiben

wenn man natürlich rein aus Gewohnheit oder in allgemeinen Code das close() hat, schadet das freilich auch nicht,
aber sollte jedenfalls nicht früh im Programm passieren, einmal System.in geschlossen -> keine Eingabe mehr von der Konsole zu lesen


----------



## hüteüberhüte (22. Jan 2013)

```
return r * r * h * Math.PI / 3.0;
```
 ist super, so sollten am wenigsten double-Ungenauigkeiten auftreten, das lernt man aber erst nach jahrelanger Erfahrung.

Übersichtlich ist (das early return (weis nicht, ob es so heißt)) es auch.

Stichwörter zum Weiterlesen:
- (Methoden)-Parameter,
- Rückgabe einer Methode,
- Auswertungsreihenfolge usw.,
- double-Arithmetik (wenn dir langweilig is),
- Variablen,
- Scanner (API-Beschreibung) und BufferedReader und Double#parseDouble usw.

Grüßle


----------



## Bleiglanz (23. Jan 2013)

rant


> Methode als Parameter übergeben


ist völlig falsch formuliert. Deine Frage ist ganz anders, es geht um Werte, die AN EINE Methode übergeben werden


> Ich habe das ganze so gelöst, aber ich weiß nicht genau was der Prof mit dem "...werden der Methode als double Parameter übergeben" meint.


Wenn du irgendwann mal Erfolg in der IT haben willst, gewöhn dir eine gewisse Präzision an.


----------

