# Kreisumfang/-Fläche vom Kreis berechnen



## AP2000 (8. Apr 2016)

Hallo!

Ich habe folgenden Code geschrieben:


```
import java.util.Scanner;

public class CalculatingAreaAndPerimetreOfACircle {

    Scanner in = new Scanner(System.in);
    double radius = in.nextDouble();
 
    double pi = 3.141592;
 
    double perimetre = 2 * radius * pi;
 
    double area = radius * radius * pi;
 
 
    public void main(String[] args) {
        System.out.print(perimetre);
        System.out.print(area);

    }

}
```


Wie kann ich diese "Anwendung" ausführen? Und ist der Code überhaupt richtig?

Danke

AP2000


----------



## Joose (8. Apr 2016)

Code bitte in Code-Tags posten, danke! 
[java] .. dein code ... [/java]

Zu deiner Frage:
Du musst den Code zuerst kompilieren mit Hilfe eines Compiler. Der Compiler sagt dir dann auch ob das Programm erfolgreich kompiliert werden kann oder nicht (Syntaxfehler).
Sollte der Code kompilieren wird eine Java Umgebung gebraucht um die kompilierte Anwendung auszuführen.


----------



## Xyz1 (9. Apr 2016)

Professionell kannst du das so machen:

```
class Kreis {

    double radius;
    Double umfang = null;
    Double flaeche = null;

    Kreis(double radius) {
        this.radius = radius;
    }

    double getUmfang() {
        if (umfang == null) {
            umfang = 2 * radius * Math.PI;
        }
        return umfang;
    }

    double getFlaeche() {
        if (flaeche == null) {
            flaeche = radius * radius * Math.PI;
        }
        return flaeche;
    }
}
```


```
public static void main(String[] args) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Scanner in = new Scanner(System.in);
        System.out.print("Radius: ");
        String zeile = in.nextLine();
        double radius = Double.parseDouble(zeile);
        Kreis k = new Kreis(radius);
        for (Method m : k.getClass().getDeclaredMethods()) {
            System.out.println(m.invoke(k));
        }
    }
```

Das gibt einmal Umfang und Fläche aus, aber in unterschiedlicher Reihenfolge. Bps.

Radius: 5
31.41592653589793
78.53981633974483

Warum so viele throws? Das weiß ich auch nicht. Warum mal deutsch und englisch? Das ist cool so. Warum nicht Durchmesser? Kann jetzt schnell hinzugefügt werden. Warum Math.PI an 's Ende geschrieben? Das verbessert die Genauigkeit Edit: in manchen Fällen! Ist also schon richtig.

Anmerkungen?!?!


----------



## Meniskusschaden (9. Apr 2016)

AP2000 hat gesagt.:


> Wie kann ich diese "Anwendung" ausführen?


Man benötigt eine statische Main-Methode. Du hast zwar eine Main-Methode, sie ist aber nicht statisch.


----------



## AP2000 (9. Apr 2016)

DerWissende hat gesagt.:


> Professionell kannst du das so machen:
> 
> ```
> class Kreis {
> ...





Danke für den Code. Aber wenn ich den so einfüge, muss ich dann darum noch die Klasse Calculating......OfACircle machen? und wenn ich das infüge, kommt die Meldung ich müsste irgendwie "private static scanner in" schreiben?

Ich bin noch sehr neu bei Java.


----------



## JStein52 (9. Apr 2016)

Ändere einfach die Klasse die du schon hast:


```
class CalculatingAreaAndPerimetreOfACircle {

    private double radius;
    private double umfang = 0.0;
    private double flaeche = 0.0;

    CalculatingAreaAndPerimetreOfACircle (double radius) {
        this.radius = radius;
    }

    double getUmfang() {
            umfang = 2 * radius * Math.PI;        return umfang;
    }

    double getFlaeche() {
            flaeche = radius * radius * Math.PI;        return flaeche;
    }

    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double radius = in.nextDouble();
    CalculatingAreaAndPerimetreOfACircle k = new CalculatingAreaAndPerimetreOfACircle (radius);
    double perimetre = k.getUmfang();

    double area = k.getFlaeche();


        System.out.print(perimetre);
        System.out.print(area);

    }
}
```


----------



## Meniskusschaden (9. Apr 2016)

Es gibt grundsätzlich zwei Möglichkeiten. Man kann es wie DerWissende und JStein52 über Objektmethoden lösen. Zur Berechnung erzeugt man dann ein Kreisobjekt und ruft darauf die entsprechenden Methoden auf. Hier ist meine Implementierung dazu:
	
	
	
	





```
import java.util.Scanner;

public class KreisMitObjektmethoden {
    private double radius;

    public KreisMitObjektmethoden(double radius) {
        this.radius = radius;
    }

    private double getFlaeche() {
        return radius * radius * Math.PI;
    }

    private double getUmfang() {
        return 2 * radius * Math.PI;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Radius eingeben: ");
        double radius = in.nextDouble();
        KreisMitObjektmethoden kreis = new KreisMitObjektmethoden(radius);
        System.out.println("Umfang: " + kreis.getUmfang());
        System.out.println("Fläche: " + kreis.getFlaeche());
    }

}
```
Alternativ kann man auch mit Klassenmethoden (statische Methoden) arbeiten und sich so dass Erzeugen der Objekte sparen. Ich denke, in den meisten Fällen ist es besser, mit Objekten zu arbeiten, aber für den Aufbau einer mathematischen Formelsammlung finde ich Klassenmethoden eigentlich besser geeignet:
	
	
	
	





```
import java.util.Scanner;

public class KreisMitKlassenmethoden {

    private static double berechneKreisumfang(double radius) {
        return 2 * radius * Math.PI;
    }

    private static double berechneKreisflaeche(double radius) {
        return radius * radius * Math.PI;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Radius eingeben: ");
        double radius = in.nextDouble();
        System.out.println("Umfang: " + berechneKreisumfang(radius));
        System.out.println("Fläche: " + berechneKreisflaeche(radius));
    }

}
```


----------



## JStein52 (9. Apr 2016)

Meniskusschaden hat gesagt.:


> für den Aufbau einer mathematischen Formelsammlung finde ich Klassenmethoden eigentlich besser geeignet


Ja, sehe ich genau so. Ich wollte ihm nur zeigen wie er den Beitrag vom @DerWissende zum laufen kriegt. Der war ja mal wieder ein bisschen krass formuliert.


----------



## AP2000 (9. Apr 2016)

JStein52 hat gesagt.:


> private double radius;
> private double umfang = 0.0;
> private double flaeche = 0.0;
> 
> ...




Hey! Danke erstmal für den Code. Eine Frage hätte ich noch: bei mir wird das "in" bei Scanner in = new .... gelb unterstrichen und eclipse meint ich müsste da private static vorne dran stehen haben, woran liegt das?

Danke


----------



## Kababär (9. Apr 2016)

Private weil du vergessen hast, die Sichtbarkeit der Variable anzugeben und static ist ein Vorschlag, da dein bisheriger Gebrauch des Scanners auch "nur" mit static ausführbar wäre.


----------



## JStein52 (9. Apr 2016)

AP2000 hat gesagt.:


> bei mir wird das "in" bei Scanner in = new .... gelb unterstrichen und eclipse meint ich müsste da private static vorne dran stehen haben


Aber nicht bei dem Code den ich gepostet habe !!  bei deinem ursprünglichen Code ganz oben, da war das so.


----------



## Kababär (10. Apr 2016)

Naja, dann wäre aber "private" falsch an der Stelle, oder nicht?
Aber mit dem static dürfte das trotzdem hinhauen, wenn ich mich nicht irre. Kann aber auch gut sein, dass ich mich irre.


----------



## JStein52 (10. Apr 2016)

Kababär hat gesagt.:


> Naja, dann wäre aber "private" falsch an der Stelle, oder nicht


Ja, wenn du den von mir geposteten Code meinst wäre sowohl private als auch static an der Stelle falsch. Da ist "Scanner in = ..." lediglich eine lokale Variable innerhalb von main.
Im ursprünglichen Code des TE war es ja eine Instanz- bzw. Klassenvariable, je nachdem ob er static dazu schreibt oder nicht. Wobei er das vielleicht auch nicht wirklich wollte. Der Code war ja nicht wirklich richtig den er ursprünglich hatte.


----------



## AP2000 (10. Apr 2016)

JStein52 hat gesagt.:


> Aber nicht bei dem Code den ich gepostet habe !!  bei deinem ursprünglichen Code ganz oben, da war das so.


Bei dem den ich zitiert habe schon, genauso wie bei meinem ursprünglichen code.


----------



## mrBrown (10. Apr 2016)

AP2000 hat gesagt.:


> Bei dem den ich zitiert habe schon, genauso wie bei meinem ursprünglichen code.


Der Code den du zitiert hast funktioniert, zumindest wenn du die erste Zeile aus dem Original drin lässt und imports anpasst.


----------



## Xyz1 (10. Apr 2016)

Stimmt etwas verwirrend. Das funktioniert bei mir:

```
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

/**
  *  Klasse.
  *  Fragt nach dem Radius und berechnet den Umfang und die Flaeche.
  */
class Kreis {
    double radius;
    Double umfang = null;
    Double flaeche = null;

    Kreis(double radius) {
        this.radius = radius;
    }

    double getUmfang() {
        if (umfang == null) {
            umfang = 2 * radius * Math.PI;
        }
        return umfang;
    }

    double getFlaeche() {
        if (flaeche == null) {
            flaeche = radius * radius * Math.PI;
        }
        return flaeche;
    }

    public static void main(String[] args) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Scanner in = new Scanner(System.in);
        System.out.print("Radius: ");
        String zeile = in.nextLine();
        double radius = Double.parseDouble(zeile);
        Kreis kreis = new Kreis(radius);
        for (Method m : kreis.getClass().getDeclaredMethods()) {
            if (m.getParameterCount() == 0) {
                System.out.println(m.invoke(kreis));
            }
        }
    }
}
```


```
C:\Users\BlaBlabla\Desktop>javac Kreis.java

C:\Users\BlaBlabla\Desktop>java Kreis
Radius: 5
31.41592653589793
78.53981633974483

C:\Users\BlaBlabla\Desktop>java Kreis
Radius: 5
78.53981633974483
31.41592653589793

C:\Users\BlaBlabla\Desktop>
```

Musste erst wieder der Kommandozeile anschmeißen. Falls du beim Compilieren Schwierigkeiten hast, kannst du dich ja noch mal melden.

Schönen Sonntag.


----------



## Meniskusschaden (10. Apr 2016)

DerWissende hat gesagt.:


> ```
> C:\Users\BlaBlabla\Desktop>javac Kreis.java
> 
> C:\Users\BlaBlabla\Desktop>java Kreis
> ...


Woher weiß man denn nun, wie groß der Umfang und wie groß die Fläche ist?


----------



## Xyz1 (10. Apr 2016)

Bei Fläche hast du doch, wenn man so will, x^2, und bei Umfang x^1. Fläche muss also etwas größer sein Umfang (größerer(er) Wert). Ein Handwerker, der das Programm hauptsächlich verwenden soll, weiß doch schon Bescheid. 

Edit: Das mit dem größer stimmt aber auch nur limitisiert/limestisiert. Also ab x > € mit € E irrational>0 gilt das.

http://www.wolframalpha.com/input/?i=2*x*pi+=+x*x*pi

Also mal vereinfacht gesagt, wenn der Radius größer 2 ist, dann weiß der Handwerker, was Umfang und Fläche ist.


----------



## Meniskusschaden (10. Apr 2016)

Jetzt bin ich aber etwas enttäuscht. Hatte eigentlich erwartet, dass du aus dem Methodennamen eine brauchbare Bezeichnung zimmerst.

Apropos Handwerker: Ich war schon ziemlich beeindruckt, als es bei uns mal darum ging, die Länge eines aufgewickelten Kabels abzuschätzen. Er hat einfach die Ringe gezählt, den Durchmesser gemessen, dann Durchmesser, Anzahl und 3 multipliziert. Die unterschlagenen 0,1415 waren die Sicherheitstoleranz. Klar, ich kannte die Kreisformeln auch, man muß aber auch auf die Idee kommen, sie zu benutzen.


----------



## Xyz1 (10. Apr 2016)

Im Sinne von Usability ist das alles nicht. Denn dann müsste man schon wissen, ob es jetzt die Temperatur oder Windgeschwindigkeit ist, und das nicht per Zufall gewürfelt wird.

Also es sollte gelabelt werden, auch wenn das wieder gegen andere Prinzip "verstößt".

Also ich brauche 100 Probanden und 2 Gruppen, es wird gemessen, wie lange benötigt wird, um zu erkennen, ob Umfang oder Fläche, wenn gelabelt und wenn nicht gelabelt, und wenn Zufall usw.

Welche Schriftart Ziffern usw. auch sehr wichtig. Gibt's Serifen oder nicht?

Welche psychosoziale(n) Entwicklung(en) im sozialen und technischen Umfeld des User habn die User eigentlich gemacht?

Alles könnte wichtig sein beim printen von zwei Werten. 

Wahrscheinlich bewegen wir uns etwas vom Thema weg.


----------



## JStein52 (10. Apr 2016)

seid ihr auf Drogen ? Warum ruft ihr nicht einfach kreis.getUmfang und kreis.getFlaeche auf ?


----------



## Meniskusschaden (10. Apr 2016)

JStein52 hat gesagt.:


> seid ihr auf Drogen ? Warum ruft ihr nicht einfach kreis.getUmfang und kreis.getFlaeche auf ?


Deshalb hatte ich nach den Bezeichnungen gefragt. Ich wollte aufzeigen, dass Reflection bezogen auf die ursprüngliche Aufgabenstellung nicht so sinnvoll ist.

Andererseits:


DerWissende hat gesagt.:


> Warum nicht Durchmesser? Kann jetzt schnell hinzugefügt werden.


Es ging DerWissende ja offenbar darum, eine universelle Methode zu schreiben, die alle Kreisinformationen liefert, inklusive der zukünftig implementierten. Der Gedanke ist ja gar nicht so dumm. Hier ist noch mal der Code von DerWissende mit einer zusätzlichen Methode für den Durchmesser und dem Methodennamen in der Ausgabe:

```
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

/**
  *  Klasse.
  *  Fragt nach dem Radius und berechnet den Umfang und die Flaeche.
  */
class Kreis {
    double radius;
    Double umfang = null;
    Double flaeche = null;

    Kreis(double radius) {
        this.radius = radius;
    }

    double getUmfang() {
        if (umfang == null) {
            umfang = 2 * radius * Math.PI;
        }
        return umfang;
    }

    double getFlaeche() {
        if (flaeche == null) {
            flaeche = radius * radius * Math.PI;
        }
        return flaeche;
    }
  
    double getDurchmesser() {
        return radius * 2;
    }

    public static void main(String[] args) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Scanner in = new Scanner(System.in);
        System.out.print("Radius: ");
        String zeile = in.nextLine();
        double radius = Double.parseDouble(zeile);
        Kreis kreis = new Kreis(radius);
        for (Method m : kreis.getClass().getDeclaredMethods()) {
            if (m.getParameterCount() == 0) {
                System.out.println(m.getName() + "(): " + m.invoke(kreis));
            }
        }
    }
}
```
Unter'm Strich würde ich also sagen: Thema verfehlt, aber interessante Idee.


----------



## Xyz1 (10. Apr 2016)

JStein52 hat gesagt.:


> seid ihr auf Drogen ? Warum ruft ihr nicht einfach kreis.getUmfang und kreis.getFlaeche auf ?



Ich musste etwas schmunzeln. 

Es ging mir schon darum, was ein Handwerker, der das Programm im Wesentlichen benutzt, wann wie schnell wo erkennt?, und auf wie viele Stellen eigentlich gerundet werden soll und welche Range und so etwas.

Außerdem war mir einfach zwei Methoden aufrufen, zu faul. 

Okay, zurück zum Thema, @ TO : Einfach ein (zwei) soutv reinsetzen/-knallen. Das ist die Ausgabe einer Variablen (Ausdruck) mit einer "Beschriftung" verbunden.

Eine Tabelle böte sich vielleicht auch an.


----------



## JStein52 (10. Apr 2016)

Macht richtig Spass gelle, ich würde aber noch vorschlagen das als Client/Server-Anwendung zu implementieren.


----------



## Xyz1 (10. Apr 2016)

JStein52 hat gesagt.:


> Macht richtig Spass gelle, ich würde aber noch vorschlagen das als Client/Server-Anwendung zu implementieren.



Dann aber bitte mit Hashing, Caching und Trashing der Kreis-Objekte. 

Ne, mal ernsthaft, er/sie soll ja auch hier wieder vorbeischauen mögen...


----------



## AP2000 (13. Apr 2016)

Was sind diese Throws?


----------



## JStein52 (13. Apr 2016)

Meniskusschaden hat gesagt.:


> *public* *static* *void* main(String[] args) *throws* IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException


Die sind eigentlich alle Schmarrn. Rufe einfach deine Methoden getUmfang und getFlaeche ganz stinknormal auf und vergiss diesen Unsinn. Das war irgendwie Jux diese Methoden via Reflection aufzurufen und lenkt nur vom Thema ab.


----------



## AP2000 (13. Apr 2016)

JStein52 hat gesagt.:


> Die sind eigentlich alle Schmarrn. Rufe einfach deine Methoden getUmfang und getFlaeche ganz stinknormal auf und vergiss diesen Unsinn. Das war irgendwie Jux diese Methoden via Reflection aufzurufen und lenkt nur vom Thema ab.


Danke


----------



## Xyz1 (13. Apr 2016)

JStein52 hat gesagt.:


> Schmarrn



Also Humbug sind sie nicht. Man braucht sie, wenn man mit Reflection arbeitet.

Ich hab doch gesagt, ich bin etwas Faul, und wollte Fehler vermeiden, die im Zusammenhang stehen, wenn ich zweimal Denglische Begriffe schreiben muss. So können mir Methodennamen egal sein.^^

Zu Deinem Problem: Das sollte jetzt doch durch ein bisschen "Transferleistung" gelöst sein. Oder nicht?!?!


----------



## JStein52 (13. Apr 2016)

DerWissende hat gesagt.:


> wollte Fehler vermeiden, die im Zusammenhang stehen, wenn ich zweimal Denglische Begriffe schreiben muss


Was kann man denn beim Aufruf von kreis.getUmfang()  und kreis.getFlaeche() für Fehler machen die im Zusammenhang mit dem Namen stehen?? Und wenn er mit den Returnwerten der beiden Methoden noch was anderes machen will als nur ausgeben wird es eh kriminell.  Wollen wir mal kneitzel zum Thema CleanCode befragen ?


----------



## Xyz1 (13. Apr 2016)

get == Englisch
Umfang == Deutsch
getUmfang == Denglisch, oder auch Engleutsch
ae == Ä/ä == nicht benötigte, aber sinnvolle Umlautvermeidung

Schon alleine vier Punkte, bei denen ich bei den Methodenbezeichnern Fehler machen könnte.

Ne, lass Kneitzel mal aus dem Spiel.


----------



## Meniskusschaden (13. Apr 2016)

Es ist doch nichts falsch daran, deutsche Bezeichnungen zu wählen. Es wäre aber keine gute Idee, getter- und setter deswegen auch in's Deutsche zu übersetzen.


----------



## Xyz1 (13. Apr 2016)

Meniskusschaden hat gesagt.:


> Es ist doch nichts falsch daran, deutsche Bezeichnungen zu wählen. Es wäre aber keine gute Idee, getter- und setter deswegen auch in's Deutsche zu übersetzen.



Damit wäre nun wohl alles gesagt. Aber Leute aus Indien müssen das ja auch noch verstehen können. Deswegen vielleicht doch nicht so eine gute Idee.

Sooooooooooooooooooooooo, ich lenke vom Thema ab. Das nun auch nicht. Ihr habt alle recht. Holt die Gefällt mir's raus.  Auch alle Geschlechtslosen.


----------



## Meniskusschaden (13. Apr 2016)

DerWissende hat gesagt.:


> Aber Leute aus Indien müssen das ja auch noch verstehen können.


Okay, getसीमा() und getक्षेत्र() wäre korrekter gewesen.


----------



## Xyz1 (13. Apr 2016)

Toll, das habt ihr jetzt davon. Wir haben AP2000 vergrault, er schreibt hier nicht mehr, weil wir vom Thema abgekommen sind. Mit Indisch will ich gar nicht anfangen.

AP2000 : Wenn Du es liest, es ist unfreundlich sich nicht mehr zu melden, ich kreide Dir das an.


----------



## AP2000 (13. Apr 2016)

DerWissende hat gesagt.:


> Toll, das habt ihr jetzt davon. Wir haben AP2000 vergrault, er schreibt hier nicht mehr, weil wir vom Thema abgekommen sind. Mit Indisch will ich gar nicht anfangen.
> 
> AP2000 : Wenn Du es liest, es ist unfreundlich sich nicht mehr zu melden, ich kreide Dir das an.




Zuerst muss gesagt werden, dass ich weiblich bin, ja?

Und wie meinst du unfreundlich!?
Ich finde es richtig schön, dass ihr eure Konversationen über was-weiß-ich  habt, aber ich verstehe größtenteils eh kein Wort, weil ich komplette Anfängerin bin .


@alle anderen! Ich finde man sollte doch lieber einfach alles so simpel halten wie möglich und am besten auch englische Begriffe nehmen, weil sie ja jeder versteht!


Seriously....


PS: Indisch will ich auch nicht lernen und erst recht nicht deren Schrift. Hilfe)


----------



## Xyz1 (14. Apr 2016)

Ist ja nett, dass du das schreibst, aber gibt es jetzt noch irgendein Problem? Wenn ja, welches? Wie weit biste?

"so einfach wie möglich" dafür gibt es 10 Argumente dafür und dagegen.

Zum einen, ..., und zum anderen, ....

"was meinst du mit unfreundlich?" Ganz einfach, andere wollen dir helfen, und du meldest dich nicht mehr, das ist den anderen gegenüber unfreundlich.

Nimm's nicht so eng.


----------



## AP2000 (14. Apr 2016)

Es funktioniert alles prima. Vielen Dank an alle


----------



## Meniskusschaden (14. Apr 2016)

AP2000 hat gesagt.:


> Und wie meinst du unfreundlich!?


Da war überhaupt nichts unfreundlich. Ich kenne die Forenregeln zwar nicht auswendig, bin aber sicher, dass es keine Rückmeldepflicht und erst recht keine Rückmeldefrist gibt. Schon gar nicht, wenn sich das Thema vom Ursprungsposting entfernt hat.


----------



## JStein52 (14. Apr 2016)

Ja eben. Sollte sie sich auch noch für den Unsinn bedanken den wir zwischendrin verzapft haben ...


----------

