# Problem beim umschrieben in Klassen



## Bersacker (24. Nov 2009)

```
import java.io.*;
 public class wuerfelexel
 {
     public static void main(String argv[])
       throws IOException
   {
       double anzahlwuerfe,anzahlwuerfel,w,z;
       int anzahlaugen,x,r,s;

       //yrst;
       //vuqzxw
       String fileName = "würfel.xls" ;

               FileWriter writer = new FileWriter( fileName );


       System.out.println("Anzahl der Würfel");
       String v;
       BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
       v=input.readLine();

       System.out.println("Anzahl der Würfe");
       String u;
       u=input.readLine();

       System.out.println("Anzahl der Augen");
       String q;
       q=input.readLine();


       anzahlwuerfe=Integer.parseInt(u);
       anzahlwuerfel=Integer.parseInt(v);
       anzahlaugen=Integer.parseInt(q);
       s= (int) (anzahlwuerfel);
       r= (int) (anzahlwuerfe);
          for(w=0;w<anzahlwuerfel;w=w+1) {
       for(z=0;z<anzahlwuerfe;z=z+1) {
       x =(int)( anzahlaugen*Math.random()+1);
       System.out.println("Würfel "+s+"  Wurf "+r+"  Augen "+ x);
       System.out.println("");

        r=r-1;
        writer.write(x+ "\n");

                                      }
        r=(int) anzahlwuerfe;
        s=s-1;                            }

      writer.close();


     }
}
```

Ich soll diese Würfel datei in einzelene Klassen umschrieben 

Meine Lehrerin sagt entweder Berechnung, Input und Output jeweils extra oder nur den Input in einen Konstruktur so sagte sie es

Weiß aber nciht was ich machen muss kann mir da jemand helfen


----------



## Gonzo17 (24. Nov 2009)

Also erstmal ein Schritt nach dem anderen.  Wo genau scheiterst du? Weisst du schon, wie du den Code sinnvoll unterteilen kannst oder hängst du da schon? Mach dir erstmal klar, was zum "Input", was zur "Berechnung" und was zum "Output" gehört und dann kannst du dir Gedanken machen, wie du das auslagern kannst. Ich persönlich denke ja, dass es genügen würde, wenn man es in verschiedenen Methoden auslagert, aber wenn du das in Klassen machen sollst, dann machs so.


----------



## Bersacker (24. Nov 2009)

Ja also 

ich soll es unterteilen aber da ich in der Unterrichts Einheit gefehlt hab wo man das mit Klassen und Methoden besprochen hat hab ich keine Ahnung und meine Lehrerin gibt mir nur dumme Antworten . 

Deshalb wende ich mich an euch 

Input ist klar ist ja das ganze mit der Eingabe 

Die Berechnung ist das mit for und math.random 

Output ist ja die Excel Datei schrieben und system out println


----------



## Gonzo17 (25. Nov 2009)

Also, generell schaut der Code ja so aus:


```
public class Wuerfel {
	public static void main(String[] args) {
           // Input
           ...

           // Berechnung
           ...

           // Output
           ...
	}
}
```

Das steht bei dir nun alles in der main-Methode und wird von oben nach unten so aufgerufen, wie es da steht. Die ganze Sache nun in Methoden zu extrahieren ist garnicht so schwer. Eine neue Methode muss nur den Typ des Rückgabewerts wissen (oder void, wenn sie keinen Wert zurückgeben soll), sie muss wissen wie sie heisst und man kann noch Parameter hinzufügen (die stehen dann hinter dem Namen in den normalen Klammern). Ein Beispiel für eine Methode wäre zum Beispiel: 


```
private static void calculate(int beispielParameter){
		// hier passiert dann die Berechnung
	}
```

EDIT: Was "private" und "static" genau bedeuten ist für dich denke ich erstmal nicht so wichtig, statt "private" könntest du auch "public" verwenden oder du lässt es ganz weg. In deinem Beispiel gehts ja eh erstmal darum, dass du eine Methode aus der main-Methode heraus aufrufst (deshalb muss diese Methode aber auch static sein, wenn du sie direkt aufrufen willst). 


Aber noch ein paar Worte zu anderen Dingen, die mir aufgefallen sind. Erst einmal hast du sehr viele Variablen, die teilweise garnicht richtig benötigt werden. Ich würde das allein schon wegen der Übersichtlichkeit so weit wie möglich reduzieren. Dazu gehört übrigens auch, dass Variablen aussagekräftige Namen haben. Bei x, r, s, usw weiss man später nicht mehr wirklich, was das sollte. Ich sehe auch keinen Grund irgendeine dieser Variablen als double zu deklarieren. Eine Variable vom Typ double enthält soweit ich weiss eine Gleitkommazahl, ein int hingegen nur Ganzzahlen. Da weder die Anzahl der Würfel, noch der Würfe oder die Anzahl der Augen wohl jemals etwas anderes wie eine ganze Zahl ergeben werden, benötigt man nur int.  
Und noch ein Wort zu deinen for-Schleifen. Ich zeig dir erst den Vergleich zu dem, was du gemacht hast und dem, wie ich es tun würde:


```
for (w = 0; w < anzahlwuerfel; w = w + 1) {
// deine for-Schleife
}

for (int i = 0; i < anzahlwuerfel; i++) {
// meine for-Schleife
}
```

Du deklarierst w als lokale Variable schon zu Beginn deiner Methode. Das würde ich nicht unbedingt so machen, weil du diese lokale Variable ja normalerweise nur für diese for-Schleife verwendest. Du kannst also die Variable direkt innerhalb der for-Schleife deklarieren. Ob man nun w oder i als Namen für die Variable nimmt ist wohl ziemlich egal denke ich, ich habs mit i gelernt.  Und wie du siehst kann man ein "w = w + 1" abkürzen durch "w++", was so viel bedeutet wie "benutze w und erhöhe es danach um 1". Es gibt auch "++w", was dann bedeutet "erhöhe w um 1 und benutze es dann". 

Ich hoffe mal ich lieg auch soweit richtig mit meinen Erklärungen und konnte dir helfen.


----------



## Bersacker (25. Nov 2009)

Ich muss sagen sehr sehr Hilfreich dann werd ich mich mal an die Arbeit machen und versuchen alles richtig umzusetzen danke erst ein mal


----------



## Bersacker (30. Nov 2009)

```
import java.io.*;
 public class versuch
{
     public static  Input (String argv[])
       throws IOException
   {
       int anzahlwuerfe,anzahlwuerfel,anzahlaugen;
       String fileName = "würfel.xls" ;

               FileWriter writer = new FileWriter( fileName );


       System.out.println("Anzahl der Würfel");
       String v;
       BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
       v=input.readLine();

       System.out.println("Anzahl der Würfe");
       String u;
       u=input.readLine();

       System.out.println("Anzahl der Augen");
       String q;
       q=input.readLine();


       anzahlwuerfe=Integer.parseInt(u);
       anzahlwuerfel=Integer.parseInt(v);
       anzahlaugen=Integer.parseInt(q);
     }
  }

public static calculate (int anzahlwuerfel, anzahlwuerfe, anzahlaugen)
{    int wuerfel,r,Wurf;
    wuerfel= (int) (anzahlwuerfel);
       r= (int) (anzahlwuerfe);
          for (int i = 0; i < anzahlwuerfel; i++) {
          for (int w = 0; w < anzahlwuerfe; w++) {


       wurf =(int)( anzahlaugen*Math.random()+1);
         r=r-1;
        writer.write(x+ "\n");
        r=(int) anzahlwuerfe;                     }
        wuerfel=s-1;                                     }

      writer.close();
  }
    
    
 public static Output (int wuerfel,x,wurf)
  {
      System.out.println("Würfel "+wuerfel+"  Wurf "+wurf+"  Augen "+ x);
       System.out.println("");


   }
```

Ich denk mal das ich es jetzt um geschrieben hab weiß aber nciht genau ob des stimmt bzw. mir werden 18 errors angezeigt was hab ich falsch gemacht versteh des auch nicht ganz mit in eine Klasse eingeben bzw. ausgeben.

Danke schon mal 

PS: Hof jeamdn kann mir weiter helfen (voll verzweifelt)


----------



## Gonzo17 (30. Nov 2009)

Da sind leider sehr viele Dinge noch falsch. Ich zähls jetzt einfach mal in der Reihenfolge auf, wie die Fehler mich angesprungen haben.

Zuerst einmal hatte keine deiner Methoden eine Rückgabewert. Du musst dir das so vorstellen: Eine Methode ist ein kleiner Apparat, der irgendwas tut. Entweder er gibt dir was tolles zurück oder er tut nur irgendwas mit dem, was du ihm gegeben hast. Deswegen musst du auf jeden Fall IMMER definieren, was passieren soll. "void" bedeutet, dass kein Wert zurückgegeben wird. Soll ein Wert zurückgegeben werden, dann musst du den Typ dieses Wertes angeben. Beispielsweise "int" oder "double". 

Ein Beispiel, um das vielleicht anschaulich zu machen. Du hast zwei Apparate vor dir, links ne Jukebox, rechts nen Geldwechsler. Wirfst du jetzt nen Euro in die Jukebox, dann passiert etwas (es läuft Musik), aber die Jukebox gibt dir nix zurück. Wirfst du den Euro in den Geldwechsler, dann passiert auch was (das Geld wird gewechselt) und du kriegst am Ende etwas zurück (das Wechselgeld eben). So kann man sich das denke ich ganz gut vorstellen.

Was soll das jetzt also mit diesem Rückgabewert? Ja, also das kann in bestimmten Fällen sehr nützlich sein. Stell dir mal vor du hast ne Rechnung, die mehrere Zeilen lang ist. Diese Berechnung verrechnet zwei, vielleicht auch drei Werte auf bestimmte Art und Weise miteinander. Um die Rechnung aus deinem wichtigen Quellcode fernzuhalten (damits auch schön übersichtlich und verständlich bleibt), definierst du eine Methode, die genau das tut, was deine Rechnung auch macht. Sprich: Du brauchst ne Methode mit entsprechend vielen Methodenparamtern und als Rückgabetyp den entsprechenden Typ. Kleines Beispiel: 


```
public static void main(String[] args) {
		double d = calculate(500, 1000, 3);
	}

	static double calculate(int i, int j, int k) {
		i = i * k;
		j = j * k;
		double result = (i + j + k) / k;
		return result;
	}
```

Ist ne vollkommen willkürliche Rechnung, die ich jetzt genommen hab, soll aber einfach mal zeigen, wie das aussieht. Der weitaus wichtigere Aspekt dahinter ist sogar noch, dass die Methode wiederverwendet werden kann. Brauchst du diese Rechnung an anderer Stelle im Code mit anderen Parametern, dann musst du nur die Methode aufrufen und schon bekommst du den Wert zurück, den du brauchst.


Was mir noch aufgefallen ist ist die Klammersetzung. Die war falsch, weil du (wenn ich das noch richtig in Erinnerung habe) deine beiden neuen Methoden außerhalb der letzten geschweiften Klammer definiert hast. Du musst dir im Klaren drüber werden, dass jede geschweifte Klammer einen bestimmten Block umfasst. Die erste geschweifte Klammer (nach "public class versuch") umfasst alles, was zur Klasse gehört, sprich alle Variablen und Methoden. Die gschweiften Klammern nach Methoden umfassen alles, was innerhalb der Methode geschehen soll. Und innerhalb von Methoden gibt es auch geschweifte Klammern, zum Beispiel bei Schleifen. 

Da kommen dann noch im Endeffekt viele andere Dinge dazu (zum Beispiel, dass Klassennamen groß geschrieben werden und Methodennamen klein), die aber erst dann ne Rolle spielen, wenn du die Grundlagen verstanden hast.


----------



## Bersacker (1. Dez 2009)

Compiliere U:\versuch.java mit Java-Compiler
versuch.java:4:20: invalid method declaration; return type required
     public static Input (String argv[])
                   ^
versuch.java:33:15: invalid method declaration; return type required
public static calculate (int anzahlwuerfel,int anzahlwuerfe,int anzahlaugen)
              ^
versuch.java:51:18: invalid method declaration; return type required
   public static Output (int wuerfel,int x,int wurf)
                 ^
3 errors

Das sind jetzt noch mein Fehler was hab ich falsch gemacht hab jetzt üüberall das int vor die Variable eingefügt und die 3 Errors bleiben übrig langsam verstehe ich auch wie java funktioniert danke für diese sehr ausführliche Erklärung


----------



## Gonzo17 (7. Dez 2009)

Hey,

tschuldige, dass ich erst jetzt antworte, ich war letzte Woche krank und selten am PC. 

Der Fehler, den du jetzt bekommst, ist recht einfach. Die Meldung "return type required" kommt, weil JEDE Methode einen solchen "return type" braucht. Und der kann, wie oben schonmal beschrieben, auch "void" sein, was eben bedeutet, dass es keinen Rückgabewert gibt. Also:


```
public static [B][I]void[/I][/B] calculate (int anzahlwuerfel,int anzahlwuerfe,int anzahlaugen)
```

Das wäre korrekt.


```
public static [B][I]int[/I][/B] calculate (int anzahlwuerfel,int anzahlwuerfe,int anzahlaugen)
```

Das ebenso. Hier der Rückgabewert vom Typ int. 


```
public static [B][I]double[/I][/B] calculate (int anzahlwuerfel,int anzahlwuerfe,int anzahlaugen)
```

Und auch das wäre korrekt. An diese Stelle MUSS eben entweder ein "void" oder ein Typ.

Ich weiss nicht, ob dir das jetzt noch etwas bringt, weil du diese Aufgabe vielleicht schon abgeschlossen hast oder der Abgabetermin letzte Woche war, aber wenn du möchtest, dann kann ich dir auch bei weiteren Probleme bezüglich dieses Programms helfen.


----------



## Bersacker (7. Dez 2009)

[Java]

import java.io.*;
 public class versuch
{
     public static int Input (String argv[])
       throws IOException
   {
       int anzahlwuerfe,anzahlwuerfel,anzahlaugen;
       String fileName = "würfel.xls" ;

               FileWriter writer = new FileWriter( fileName );


       System.out.println("Anzahl der Würfel");
       String v;
       BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
       v=input.readLine();

       System.out.println("Anzahl der Würfe");
       String u;
       u=input.readLine();

       System.out.println("Anzahl der Augen");
       String q;
       q=input.readLine();


       anzahlwuerfe=Integer.parseInt(u);
       anzahlwuerfel=Integer.parseInt(v);
       anzahlaugen=Integer.parseInt(q);
     }


public static int calculate (int anzahlwuerfel,int anzahlwuerfe,int anzahlaugen)
{    int wuerfel,r,wurf;
    wuerfel= (int) (anzahlwuerfel);
       r= (int) (anzahlwuerfe);
          for (int i = 0; i < anzahlwuerfel; i++) {
          for (int w = 0; w < anzahlwuerfe; w++) {


       wurf =(int)( anzahlaugen*Math.random()+1);
         r=r-1;
        writer.write(x+ "\n");
        r=(int) anzahlwuerfe;                     }
        wuerfel=s-1;                                     }

      writer.close();
  }


   public static int Output (int wuerfel,int x,int wurf)
  {
      System.out.println("Würfel "+wuerfel+"  Wurf "+wurf+"  Augen "+ x);
       System.out.println("");


   }

 }

[/Java]

Ausserdem hab ich jetzt wieder 5 Errors




versuch.java:43:22: cannot find symbol
symbol  : variable x
location: class versuch
        writer.write(x+ "\n");
                     ^
versuch.java:43:9: cannot find symbol
symbol  : variable writer
location: class versuch
        writer.write(x+ "\n");
        ^
versuch.java:45:17: cannot find symbol
symbol  : variable s
location: class versuch
        wuerfel=s-1;                                     }
                ^
versuch.java:47:7: cannot find symbol
symbol  : variable writer
location: class versuch
      writer.close();
      ^
5 errors


----------



## Bersacker (7. Dez 2009)

[Java]
import java.io.*;
 public class versuch
{
     public static int Input (String argv[])
       throws IOException
   {
       int anzahlwuerfe,anzahlwuerfel,anzahlaugen;



       System.out.println("Anzahl der Würfel");
       String v;
       BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
       v=input.readLine();

       System.out.println("Anzahl der Würfe");
       String u;
       u=input.readLine();

       System.out.println("Anzahl der Augen");
       String q;
       q=input.readLine();


       anzahlwuerfe=Integer.parseInt(u);
       anzahlwuerfel=Integer.parseInt(v);
       anzahlaugen=Integer.parseInt(q);
      return
     }


public static int calculate (throws IOException, String argv[])
throws IOException
{     int wuerfel,r,wurf;

     String fileName = "würfel.xls" ;

               FileWriter writer = new FileWriter( fileName );


    wuerfel= (int) (anzahlwuerfel);
       r= (int) (anzahlwuerfe);
          for (int i = 0; i < anzahlwuerfel; i++) {
          for (int w = 0; w < anzahlwuerfe; w++) {


       wurf =(int)( anzahlaugen*Math.random()+1);
         r=r-1;
        writer.write(wurf+ "\n");
        r=(int) anzahlwuerfe;                     }
        wuerfel=wuerfel-1;                                     }

      writer.close();
    return

  }


   public static void Output (int wuerfel,int x,int wurf)
  {
      System.out.println("Würfel "+wuerfel+"  Wurf "+wurf+"  Augen "+ wurf);
       System.out.println("");


   }

 }
[/Java]

Also ich glaub mir fehlen jetzt nur noch return werte kan das sein


----------



## Gonzo17 (8. Dez 2009)

Mal eins nach dem andern. Zuerst einmal solltest du bedenken, dass dein Beispiel ja aus einer main-Methode aufgerufen werden soll. Wo ist die denn bei dir hin? Dein Beispiel wäre (auch wenn Syntax usw richtig wären) nicht ausführbar. Schau dir nochmal meinen ersten großen Post an, da is ein Beispiel für die main-Methode und drunter ein Beispiel für ne Methode "calculate". Wichtig ist ja auch, welche Parameter du den Methoden mitgibst, momentan hast du ja einfach das kopiert, was auch eine main-Methode benötigt, nämlich ein String-Array. 

Darüber hinaus solltest du dir erstmal klar machen wie das mit Variablen ist. Wo kann ich auf welche Variable zugreifen? Wie muss man eine Variable definieren, damit man von überall auf sie zugreifen kann? Und wann ist es sinnvoll das zu tun?

Dass die Werte fürs return fehlen stimmt, ist hier allerdings unerheblich, weil deine Methoden nicht aufgerufen werden und sonst auch noch mit Fehlern gespickt sind. Mein Tipp für dich ist: Schau dir erstmal ein paar grundlegende Dinge an, bevor du hiermit weiter machst. Ich weiss ja nicht ob du studierst oder das in der Schule machst oder vielleicht auch in nem Kurs außerhalb der Schule. Auf jeden Fall denke ich mal, dass ihr da nicht mit der Aufgabe angefangen habt, sondern erst ein paar Grundlagen gemacht habt. Schau dir die nochmal an und programmiere ein paar einfache Beispiele, die nicht allzu groß sind, damit du verstehst, wie man Variablen definiert, wie man eine Methode macht und wie der Syntax allgemein bei Java so ist.


----------

