# Pyramidenberechnung



## AndreasBaum (22. Apr 2008)

Hallo,

ich habe heute morgen eine Dreiecksberechnung in Java geschrieben und die funktioniert auch soweit ganz gut, allerdings hab ich beim Scripten ein wenig improvisiert:


```
/*Problem: Berechne die Grundfläche und das Volumen einer
geraden quadratischen Pyramide mit der Grundkantenlänge a
und der Höhe h (a und h sind ganze Zahlen)

Wir fassen das Programm so ab, dass uns der Computer-nicht
wie im ersten Beispiel-nur die Zahlen auf dem Bildschirm an-
zeigt, sondern auch einer erklärenden Text dazu ausgibt. Der
Benutzer unseres Programmes soll wissen, welche Daten er
eingeben muss.*/

public class Pyramide{

  public static void main(String[] args){
       new Pyramide();
  }

    public int a = 14;
    public int h = 20;
    
//Ausführung der Berechnungen

  public Pyramide(){
  
       Problematik();
       PyramideGrundflaeche();
       PyramideVolumen();
       PyramideErgebnis();
  }
    
//Problematik der Aufgabe

  public void Problematik(){

    System.out.println("* Aufgabenproblematik");
    System.out.println("");
    System.out.println("Gegeben: a=" +a +"m; h=" +h +"m");
    System.out.println("Gesucht: g; v");
    System.out.println("");
    System.out.println("");
  }
    
//Berechnung der Gründfläche

  public void PyramideGrundflaeche(){
  
    System.out.println("* Berechnung der Grundfläche");
    System.out.println("");
    System.out.println("g=a*a");
    System.out.println("g=" +a +"*" +a);
    System.out.println("g=" +(a*a) +"m^2");
    System.out.println("");
    System.out.println("Die Grundfläche der Pyramide beträgt "+(a*a) +"m^2");
    System.out.println("");
    System.out.println("");
  }

    public int g = 196;

//Berechnung des Volumens

  public void PyramideVolumen(){

    System.out.println("* Berechnung des Volumens");
    System.out.println("");
    System.out.println("v=g*h/3");
    System.out.println("v=" +g +"*" +h +"/3");
    System.out.println("v=" +(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("Das Volumen der Pyramide beträgt "+(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("");
  }
  
//Ergebnis

  public void PyramideErgebnis(){

    System.out.println("* Ergebnis");
    System.out.println("");
    System.out.println("g=" +(a*a) +"m^2");
    System.out.println("v=" +(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("----------");
    System.out.println("");
    System.out.println("* Pyramiden Berechnung erfolgreich beendet..");
    System.out.println("");
    System.out.println("# Pyramiden Berechnung by Andreas Baum");
    System.out.println("# Changed 04-22-2008 02:59 PM");
    System.out.println("");
    System.out.println("----------");
  }
}
```

Wie man sieht, wird zuerst die Grundfläche (g) ausgerechnet. Um das Volumen auszurechnen braucht man die Grundfläche, deswegen hätte ich gerne bei der Berechnung von g, den Wert auf die Variable g zugewiesen und nicht selbstdefiniert, denn das Programm soll ja rechnen und zuweisen. Also soll a*a = g ergeben. Wie man sieht, habe ich in Zeile 57 public int g = 196; geschrieben, da ich nicht weiß, wie ich g sonst zuweisen kann. Versteht ihr was ich meine? Ist schwer zu beschreiben.

Und ich hätte noch eine bitte: Wie stelle ich es an, dass der Anwender die Werte a und h selbst angeben muss? Also mit so einer Eingabeaufforderung, damit das Programm später mit diesen Werten rechnet? Kann mir jemand erklären wie ich das einbaue? Habe im Netz irgendwas mit BufferedReader oder sowas gelesen, aber leider den Zusammenhang nicht verstanden.

Mit freundlichen Grüßen
A. Baum


----------



## Java_IRL (23. Apr 2008)

Hallo...

beschäftige mich zwar auch noch nicht so lange mit Java, versuche mich aber dennoch mal an einer Antwort.

Du könntest beispielsweise bei deiner ersten Berechnung einen Int-Wert zurückgeben lassen.

Also z.B.


```
public int PyramideGrundflaeche(){

...

return g;

}
```

Dann entweder in deiner PyramideVolumen()-Berechnung anstelle (a*a) einfach PyramideVolumen() aufrufen, oder in deinem Pyramide()-Teil folgendes tun:


```
int g = PyramideGrundflaeche();
PyramideVolumen(g); // dementsprechend natürlich noch die Methode anpassen
...
```

Für dein zweites Problem würde ich mal folgendes CodeFragment betrachten:


```
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Bitte eine Zahl eingeben: ");
int zahl = Integer.parseInt(br.readLine());
} catch (IOException ioe) {
ioe.printStackTrace();    
}
```

Hierbei wird die eingelesene Zahl in der Variablen "zahl" gespeichert. 

Damit solltest du in der Lage sein, dein Problem zu lösen.  :wink: 

Gruß


----------



## Lulumann6 (23. Apr 2008)

deine globalen variablen musst du immer zu anfang deklarieren, d.h. dass was du in zeile 57 stehen hast muss viel weiter nach vorne. außerdem ist ein es ein schlechter programmierstiel wenn man die variablen public macht, die müssen immer private sein.



> Also soll a*a = g ergeben. Wie man sieht, habe ich in Zeile 57 public int g = 196; geschrieben, da ich nicht weiß, wie ich g sonst zuweisen kann.


du beantwortest deine frage doch schon selbst, dass machst du einfach mit g=a*a (das muss dann auch in einer methode stehen)


----------



## AndreasBaum (23. Apr 2008)

Danke schonmal für die Antworten 

@Java_IRL: Kannst du mir das mit der Eingabe mal einbinden? Ich bekomm es irgendwie nicht hin.

@Lulumann6: Entschuldige die Frage, aber wieso soll ich private verwenden anstatt public?


----------



## Tobias (23. Apr 2008)

Weil das ein Grundprinzip der Objektorientierten Programmierung ist. Attribute sind private und werden über öffentliche (public) Setter gesetzt (Methoden, deren Name set<Attributname>() lautet). Auf diese Weise kann das Objekt selbst entscheiden, ob die Attributänderung zu diesem Zeitpunkt sinnvoll und zulässig ist und sie gegebenenfalls zurückweisen.

mpG
Tobias


----------



## Java_IRL (23. Apr 2008)

Hi...

du könntest es beispielsweise so machen.. aber ist gibt natürlich noch dutzend andere Möglichkeiten:


```
public void PyramideGrundflaeche(){
 
    System.out.println("* Berechnung der Grundfläche");
    System.out.println("");
    System.out.println("g=a*a");

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int a=0;
    try {
    System.out.println("Bitte 'a' eingeben: ");
    a = Integer.parseInt(br.readLine());

    } 
    catch (IOException ioe) {
    ioe.printStackTrace();   
    }

    System.out.println("g=" +a +"*" +a);
    System.out.println("g=" +(a*a) +"m^2");
    System.out.println("");
    System.out.println("Die Grundfläche der Pyramide beträgt "+(a*a) +"m^2");
    System.out.println("");
    System.out.println("");
  }
```

Für h dann analog.


Gruß


----------



## AndreasBaum (24. Apr 2008)

Hallo,

vielen Dank für deine Mühe und entschuldige die späte Antwort. Ich habe nun versucht diese Variante einzubauen, allerdings ohne Erfolg:


```
/*Problem: Berechne die Grundfläche und das Volumen einer
geraden quadratischen Pyramide mit der Grundkantenlänge a
und der Höhe h (a und h sind ganze Zahlen)

Wir fassen das Programm so ab, dass uns der Computer-nicht
wie im ersten Beispiel-nur die Zahlen auf dem Bildschirm an-
zeigt, sondern auch einer erklärenden Text dazu ausgibt. Der
Benutzer unseres Programmes soll wissen, welche Daten er
eingeben muss.*/

public class Pyramide{

  public static void main(String[] args){
       new Pyramide();
  }

//Ausführung der Berechnungen

  public Pyramide(){
  
       Problematik();
       PyramideGrundflaeche();
       PyramideVolumen();
       PyramideErgebnis();
  }
    
//Problematik der Aufgabe

  public void Problematik(){

    System.out.println("* Aufgabenproblematik");
    System.out.println("");
    System.out.println("Gegeben: a=" +a +"m; h=" +h +"m");
    System.out.println("Gesucht: g; v");
    System.out.println("");
    System.out.println("");
  }
    
//Berechnung der Gründfläche

  public void PyramideGrundflaeche(){
  
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int a=0;
    try {
    System.out.println("Bitte 'a' eingeben: ");
    h = Integer.parseInt(br.readLine());

    }
    catch (IOException ioe) {
    ioe.printStackTrace();
    }
  
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int h=0;
    try {
    System.out.println("Bitte 'h' eingeben: ");
    h = Integer.parseInt(br.readLine());

    }
    catch (IOException ioe) {
    ioe.printStackTrace();
    }
  
    System.out.println("* Berechnung der Grundfläche");
    System.out.println("");
    System.out.println("g=a*a");
    System.out.println("g=" +a +"*" +a);
    System.out.println("g=" +(a*a) +"m^2");
    System.out.println("");
    System.out.println("Die Grundfläche der Pyramide beträgt "+(a*a) +"m^2");
    System.out.println("");
    System.out.println("");
  }

    public int g = 196;

//Berechnung des Volumens

  public void PyramideVolumen(){

    System.out.println("* Berechnung des Volumens");
    System.out.println("");
    System.out.println("v=g*h/3");
    System.out.println("v=" +g +"*" +h +"/3");
    System.out.println("v=" +(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("Das Volumen der Pyramide beträgt "+(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("");
  }
  
//Ergebnis

  public void PyramideErgebnis(){

    System.out.println("* Ergebnis");
    System.out.println("");
    System.out.println("g=" +(a*a) +"m^2");
    System.out.println("v=" +(g*h/3) +"m^3");
    System.out.println("");
    System.out.println("----------");
    System.out.println("");
    System.out.println("* Pyramiden Berechnung erfolgreich beendet..");
    System.out.println("");
    System.out.println("# Pyramiden Berechnung by Andreas Baum");
    System.out.println("# Changed 04-22-2008 02:59 PM");
    System.out.println("");
    System.out.println("----------");
  }
}
```

Folgende Error erhalte ich:


```
Compiliere D:\Java\Pyramide.java mit Java-Compiler
Pyramide.java:33:39: cannot find symbol
symbol  : variable a
location: class Pyramide
    System.out.println("Gegeben: a=" +a +"m; h=" +h +"m");
                                      ^
Pyramide.java:33:51: cannot find symbol
symbol  : variable h
location: class Pyramide
    System.out.println("Gegeben: a=" +a +"m; h=" +h +"m");
                                                  ^
Pyramide.java:43:5: cannot find symbol
symbol  : class BufferedReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    ^
Pyramide.java:43:29: cannot find symbol
symbol  : class BufferedReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                            ^
Pyramide.java:43:48: cannot find symbol
symbol  : class InputStreamReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                                               ^
Pyramide.java:48:5: cannot find symbol
symbol  : variable h
location: class Pyramide
    h = Integer.parseInt(br.readLine());
    ^
Pyramide.java:51:12: cannot find symbol
symbol  : class IOException
location: class Pyramide
    catch (IOException ioe) {
           ^
Pyramide.java:55:5: cannot find symbol
symbol  : class BufferedReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    ^
Pyramide.java:55:29: cannot find symbol
symbol  : class BufferedReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                            ^
Pyramide.java:55:48: cannot find symbol
symbol  : class InputStreamReader
location: class Pyramide
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                                               ^
Pyramide.java:63:12: cannot find symbol
symbol  : class IOException
location: class Pyramide
    catch (IOException ioe) {
           ^
Pyramide.java:87:38: cannot find symbol
symbol  : variable h
location: class Pyramide
    System.out.println("v=" +g +"*" +h +"/3");
                                     ^
Pyramide.java:88:33: cannot find symbol
symbol  : variable h
location: class Pyramide
    System.out.println("v=" +(g*h/3) +"m^3");
                                ^
Pyramide.java:90:63: cannot find symbol
symbol  : variable h
location: class Pyramide
    System.out.println("Das Volumen der Pyramide beträgt "+(g*h/3) +"m^3");
                                                              ^
Pyramide.java:101:31: cannot find symbol
symbol  : variable a
location: class Pyramide
    System.out.println("g=" +(a*a) +"m^2");
                              ^
Pyramide.java:101:33: cannot find symbol
symbol  : variable a
location: class Pyramide
    System.out.println("g=" +(a*a) +"m^2");
                                ^
Pyramide.java:102:33: cannot find symbol
symbol  : variable h
location: class Pyramide
    System.out.println("v=" +(g*h/3) +"m^3");
                                ^
17 errors
```

Ich könnte mir vorstellen, dass ich da irgendeine Klammer verwechselt habe oder so, aber mir fällt der Fehler einfach nicht auf.

Gruß


----------



## Leroy42 (24. Apr 2008)

AndreasBaum hat gesagt.:
			
		

> Ich könnte mir vorstellen, dass ich da irgendeine Klammer verwechselt habe oder so, aber mir fällt der Fehler einfach nicht auf.



Wir können das so auch nicht sofort sehen.

Vorschlag: Kopiere dein Programm und verkürze es Schritt für Schritt
(eventuell auch radikal) bis der Fehler leichter zu entdecken ist.


----------



## AndreasBaum (24. Apr 2008)

Hm, habe ja nicht wirklich viel geändert, bis auf die Einlesung von A und B.

Kann mir jemand das Script schreiben, wie es richtig wäre?

1. A und H mit einer Eingabeaufforderung einlesen
2. Grundfläche berechnen (a*a)
3. Volumen berechnen ((g*h)/3)

Ich glaube, dass mein Stil einfach viel zu unübersichtlich ist und keiner wirklich nachverfolgen kann, was ich da gemacht habe. Ist ja nicht so viel Code, wäre sehr nett.

Gruß


----------



## Java_IRL (24. Apr 2008)

Hallo nochmal..

also wenn das genau der Code mit dem du getestet hast sind da noch einige Fehler drin:

Erstens solltest du natürlich zwei BufferReader erstellen, z.B. br1 und br2 ... damit du auch genau weißt, welche Buffer welche Variable enthält.

Dann sollte in Zeile 48 "a" anstelle "h" stehen.

Anscheinend benutzt du keine Entwicklungsumgebung, da diese solche Fehler direkt melden würden. Wenn das der Fall ist, solltest du dir meiner Meinung nach unbedingt eine solche zulegen (Eclipse, NetBeans, ...).

Desweiteren benutzt du in allen Funktionen, die eingelesenen Werte der Methode PyramideGrundfläche(). Diese sind so innerhalb der anderen Funktionen nicht bekannt.


Man könnte das ganze wie folgt retten, es wird sicher nicht schön, tut aber seinen Zweck.

Lese in der main()-Methode die Zahlen a und b ein und gebe deinem Konstruktor die Zahlen mit:

```
public static void main(String[] args){
       
  
   BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));

    int a=0;
    try {
    System.out.println("Bitte 'a' eingeben: ");
    a = Integer.parseInt(br1.readLine());

    }
    catch (IOException ioe) {
    ioe.printStackTrace();
    }
 
    BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

    int h=0;
    try {
    System.out.println("Bitte 'h' eingeben: ");
    h = Integer.parseInt(br2.readLine());

    }
    catch (IOException ioe) {
    ioe.printStackTrace();
    }
       int g = a*a;
       new Pyramide(a,h,g);
}
```

Dann natürlich den EinleseTeil der PyramideGrundfläche()-Funktion streichen 

Da du die Werte nun deinen Methoden übergibst, müssen diese natürlich noch angepasst werden.. also in etwa so:


```
public Test(int a, int h, int g){
 
       Problematik(a,h);
       PyramideGrundflaeche(toDo);
       PyramideVolumen(toDo);
       PyramideErgebnis(toDo);
  }
```


```
public void Problematik(int a, int h){

    System.out.println("* Aufgabenproblematik");
    System.out.println("");
    System.out.println("Gegeben: a=" +a +"m; h=" +h +"m");
    System.out.println("Gesucht: g; v");
    System.out.println("");
    System.out.println("");
  }
```

Die toDo-Stellen und die restlichen Methoden sollen natürlich von dir ersetzt werden 

Gruß


----------



## AndreasBaum (24. Apr 2008)

Danke dir 


```
import java.io.*;

public class Pyramide2 {

       public static void main(String[] args){
              new Pyramide2();
       }
  
       public Pyramide2(){

              EingabeVonAUndH();
       }
       
       public void EingabeVonAUndH(){

              System.out.println("* Script wird vorbereitet..");
              System.out.println("* Pyramidenberechnung by Andreas Baum \n\n");
              
              System.out.println("* Eingabeaufforderung wird vorbereitet..\n\n");

              BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));

              int a=0;
              try {
              System.out.println("Bitte Wert für 'a' eingeben.. \n");
              a = Integer.parseInt(br1.readLine());

              }
               catch (IOException ioe) {
               ioe.printStackTrace();
               }

              BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

              int h=0;
              try {
              System.out.println("\nBitte Wert für 'h' eingeben.. \n");
              h = Integer.parseInt(br2.readLine());

              }
              catch (IOException ioe) {
               ioe.printStackTrace();
               }
               
               int g = a*a;
               
               int v = g*h/3;
               
               System.out.println("\n* Multipliziere Variable 'a' mit Variable 'a'..");
               System.out.println("* Berechne Wert für Variable 'g'..\n");

               System.out.println("Der Wert von Variable 'g' beträgt " +(g) +"m^2\n\n");
               
               System.out.println("* Multipliziere Variable 'g' mit Variable 'h'..");
               System.out.println("* Dividiere den Zwischenwert durch 3..");
               System.out.println("* Berechne Wert für Variable 'v'..\n");
               System.out.println("Der Wert von Variable 'v' beträgt " +(v) +"m^3\n\n");
               
               System.out.println("* Ergebnis: g=" +(g) +"m^2; v=" +(v) +"m^3");
               
       }
       
}
```

So funktioniert das jetzt, habe es nochmal neu geschrieben.

Ist das vom Stil her okay? Oder war das wieder ein Verbrechen?  :lol:


----------

