# Matryoshka



## chillerStudent (23. Jan 2011)

Hallo,

ich muss folgende Hausaufgabe abgeben:
Schreiben Sie eine Klasse Matryoshka.java, so dass das folgende Programm
StartMatryoshka.java ausgeführt werden kann und die unten angegebene Ausgabe
liefert. Die Klasse StartMatryoshka.java darf nicht verändert werden.

```
class StartMatryoshka {
static final int N = 5;
public static void main(String[] args) {
Matryoshka m1 = new Matryoshka();
for (int i = 0; i < N; ++i) {
new Matryoshka((int) (Math.random() * 10) + 1);
}
Matryoshka m2 = new Matryoshka(5, "gelb");
Matryoshka m3 = new Matryoshka("rot");
m2.showMe();
Matryoshka.showSummary();
}
}
```

Bezüglich der Funktionalität soll folgendes gelten:
• Wenn eine Matroschka der Größe size erzeugt wird, so sollen automatisch auch alle
Kinder der Matroschka erzeugt werden. Ein Kind ist dabei je 2 cm kleiner als seine Mutter,
wobei die kleinsten Matroschkas 1 cm groß sind. Beim Erzeugen einer Matroschka der
Größe 5 cm sollen also automatisch auch Matroschkas der Größen 3 cm und 1 cm mit
angelegt werden. Kinder haben stets die gleiche Farbe wie ihre Mutter.
• Wenn beim Konstruktoraufruf keine Größe angegeben ist, so wird eine Matroschka der
Größe 1 cm erzeugt.
• Wenn beim Konstruktoraufruf keine Farbe angegeben ist, so wird eine zufällige Farbe
gewählt.
Verwenden Sie this und this(), soweit dies sinnvoll ist, und vermeiden Sie auch darüber
hinaus Code-Wiederholung. Achten Sie auf den sinnvollen Einsatz von Klassen- vs. Instanzvariablen
bzw. -methoden.


Mein Problem: Ich kann das leider nicht umsetzten. Ich finde kein Anfang. Ich weiß grad nicht mal welche variablen ich nehmen soll und wie ich die deklarieren soll.


----------



## maki (23. Jan 2011)

*verschoben*



> Mein Problem: Ich kann das leider nicht umsetzten. Ich finde kein Anfang. Ich weiß grad nicht mal welche variablen ich nehmen soll und wie ich die deklarieren soll.


Das ist Schade, denn dann ohne Eigeninitiative wirst du hier keine Hilfe bekommen.


----------



## Murray (24. Jan 2011)

Allein aus dem Quelltext der StartMatryoshka-Klasse siehst Du doch schon eine ganze Menge:
a) die Klasse Matryoshka braucht einen Default-Konstruktor
b) die Klasse Matryoshka braucht einen Konstruktor mit einem int-Parameter
c) die Klasse Matryoshka braucht einen Konstruktor mit einem String-Parameter
d) die Klasse Matryoshka braucht einen Konstruktor mit einem int- und einem String-Parameter
e) die Klasse Matryoshka braucht eine Instanzmethode showMe()
f) die Klasse Matryoshka braucht eine Klassenmethode showSummary()

Lt. Aufgabenstellung sollen die Konstruktoren a)-c) bestimmte Werte für die fehlenden Paramter annehmen.

In der Aufgabenstellung wird sich dann noch auf eine Ausgabe bezogen, die Du noch nicht gepostet hast - aber das ist auch gut so, sonst macht dir noch jemand die Aufgabe einfach so fertig, ohne dass du selbst irgendwelche Initiative zeigst


----------



## chillerStudent (24. Jan 2011)

Danke Murray! Hat mir erstmal sehr viel geholfen.


----------



## chillerStudent (24. Jan 2011)

wie kann ich denn in einem StandardKonstruktor eine zufällige farbe ausgeben?


----------



## SlaterB (24. Jan 2011)

was machst du denn wenn "rot" übergeben wird oder fehlt das auch noch?
du musst die Farben ja irgendwo haben, in einer Liste oder Map, dann eben per zufälligen Index wählen,
bzw. wenn es nur um Strings geht dann musst jetzt eben eine solche Liste anlegen


----------



## chillerStudent (24. Jan 2011)

Habe grad nachgefragt...
Es sollen nur drei Faben sein. So weit sind wir noch nicht

Hab das mit einer zufallszahl hinbekommen und ein paar if anweisungen geschrieben, thx


----------



## chillerStudent (24. Jan 2011)

Ich  komm grad nicht weiter. 
Wenn ich jetzt diesen Kontruktor geschrieben hab: 

```
public Matryoshka(int size, String farbe){
        this.size=size;
        this.farbe=farbe;
        
        int a= (int)(Math.random()*3)+1;
        
        if(a==1){
            farbe="Blau";
            
        }
        else{
            if(a==2){
                farbe="Grün";
            }
            else{
                farbe="Gelb";
            }
        }
        System.out.println("Matroshka mit Groesse "+size+" cm und Farbe "+farbe+" erzeugt.");
        
    }
```

Wie kann ich denn jetzt diese zufällige farbe in einem standard konstruktor aufrufen?

```
public Matryoshka(){
        
        this(1, ???);
        
    }
```


----------



## SlaterB (24. Jan 2011)

in 
> public Matryoshka(int size, String farbe){
brauchst du keinen Zufall,

ansonsten z.B. diesen Zufall-Farben Code in eine Methode getZufallFarbe() stecken und dann

```
public Matryoshka(){
        this(1, getZufallFarbe());
}
```


----------



## chillerStudent (26. Jan 2011)

ich bin jetzt fast schon fertig mit der aufgabe. Ich hänge grad nur an der showSummary methode.
ich hab das folgendermaßen geschrieben:

```
public static void showSummary(){
		if(a==1){
			blauzÃ¤hler=blauzÃ¤hler++;
		}
		else{
			if(a==2){
				rotzÃ¤hler=rotzÃ¤hler++;
			}
			else{
				gelbzÃ¤hler=gelbzÃ¤hler++;
			}
		}
		System.out.println("Es wurden "+blauzÃ¤hler+" und "+rotzÃ¤hler+" und "+gelbzÃ¤hler);
	
	}
```

Er zählt leider nur einmal. Kann mir jemand weiterhelfen?


----------



## fjord (26. Jan 2011)

guck dir nochmal an wie ++ funktioniert


----------



## chillerStudent (26. Jan 2011)

Hab da schon ein paar varianten versucht, trotzdem nichts.
z.b.
zähler=zähler+1
oder
nur zähler++


----------



## XHelp (26. Jan 2011)

Die showSummary sollte ja auch nur das machen: anzeigen. Die Zählen solltest du z.B. im Konstruktor hochzählen, sonst ist es ja murks. Außerdem solltest du keine öäü in den Variablen verwenden.


----------



## chillerStudent (26. Jan 2011)

Hab das jetzt in dem Konstruktor eingefügt:

```
public Matryoshka(int size, String farbe) {
		this.size=size;
		this.farbe=farbe;
		System.out.println("Matroshka mit Groesse "+size+" cm und Farbe "+farbe+" erzeugt");
			
		for(int i=0; i<size; i++) {
			size=size-2;
			if(size<=0) {
				size=1;
			}
			else {
				System.out.println("Matroshka mit Groesse "+size+" cm und Farbe "+farbe+" erzeugt");
			}
		}
		if(a==1) {
			blauzaehler++;	
		}
		else {
			if(a==2) {
				rotzaehler++;
			}
			else {
				gelbzaehler++;
			}
		}	
	}
```

Und hab in der summary nur ein Out.println... geschrieben. trotzdem zählt er nur acht und nur in einer farbe. bei anderen farben ist 0


----------



## XHelp (26. Jan 2011)

Was ist a? Warum steht da, dass etwas erzeugt wurde, obwohl es gar nichts erzeugt wurde? Aber mindestens geld sollte sich erhöhen. Der Fehler muss also woanders liegen


----------



## chillerStudent (26. Jan 2011)

a habe ich oben so deklariert:


```
public static int a= (int)(Math.random()*3)+1;
```
Die variable hilft mir mit den farben zufällig auszuwählen(in einer methode)


----------



## XHelp (26. Jan 2011)

Die ist aber fehl am Platz bei der Farbauswertung. Außerdem bezweifle ich, dass du die überhaupt brauchst. Ansonsten mach dir jede Menge Sysouts rein und such den Fehler.


----------



## chillerStudent (26. Jan 2011)

```
class Matryoshka{

	public static int size;
	public static String farbe;
	public static int a= (int)(Math.random()*3)+1;
	static int rotzaehler=0, blauzaehler=0, gelbzaehler=0;

	public static void showMe() {
		String s = new String();
		s = "\n"+"Matroshka "+size+" cm in Farbe "+farbe+" mit Kind.";
		Out.println(s);
	}
	public Matryoshka() {
		this(1, getZufallsfarbe());
	}
	public Matryoshka(int size) {
		this(size, getZufallsfarbe());
	}
	public Matryoshka(String farbe) {
		this(1,farbe);
	}
	public Matryoshka(int size, String farbe) {
		this.size=size;
		this.farbe=farbe;
		System.out.println("Matroshka mit Groesse "+size+" cm und Farbe "+farbe+" erzeugt");
			
		for(int i=0; i<size; i++) {
			size=size-2;
			if(size<=0) {
				size=1;
			}
			else {
				System.out.println("Matroshka mit Groesse "+size+" cm und Farbe "+farbe+" erzeugt");
			}
		}
		if(a==1) {
			blauzaehler++;	
		}
		else {
			if(a==2) {
				rotzaehler++;
			}
			else {
				gelbzaehler++;
			}
		}	
	}
	public static String getZufallsfarbe() {
		String farbe;
		if(a==1) {
			farbe="Blau";
		}
		else {
			if(a==2) {
				farbe="rot";
			}
			else {
				farbe="Gelb";
			}
		}
		return farbe;
	}
	
	static void showSummary() {
		System.out.println("Es wurden "+rotzaehler+" rote "+gelbzaehler+" gelbe "+
blauzaehler+" blaue Matroschkas erzeugt.");
	}		
}
```
Bitte schön. Das ist meine Komplette klasse


----------



## XHelp (26. Jan 2011)

Die Farbe ist nicht zufällig, sondern immer wieder die gleiche. Es ist recht offensichtlich, dass du bei get*Zufall*sfarbe eine Zufallszahl erzeugen musst. Ansonsten gilt weiterhin: 1) a hat nichts im Konstruktor verloren 2) Sysouts (oder eben Debug-Funktion benutzen)


----------

