# [Frage] GeldWechsel-Methode erweitert (problem.)



## offtake (15. Jan 2005)

Hi Java-Progger...

ich programmiere seid einigen Wochen nun schon Java und habe jetzt aber seid Tagen nen riesen Problem. ich darf fürs Studium sone blöde Methode erweiter, verstehe aber nicht so ganz wie. Klar, ist bestimmt ganz einfach, aber ich habe nicht so die Ahnung von Rekursion und so, bitte helft mir... Ich erkläre mal die Aufgabe.

Ein Teil der Methode ist vorgegeben, diese Berechnet aus einem BETRAG und einem Array aus den verfügbaren Münsorten (hier EURO) mit wievielen Kombinationene der Münzen sich der Betrag zerstückeln lässt. Also der Code:


```
class Wechsel{
  static int[] w = {1,2,5,10,120,50,100,200};

  static int wechsel(int b, int k) {
    if (b < 0) return 0; //Restbetrag negativ
      if (b == 0){
        System.out.println("Letzte Muenze Der jeweiligen Kombination: " + w[k-1]);
        return 1; //Restbetrag ist null
      }
    if (k == 0) return 0; //Keine Münzen mehr
    return wechsel(b, k-1) + wechsel(b-w[k-1], k);
  }

  public static void main(String[] args){
    int betrag = 10;
    System.out.println("Der Betrag " + betrag + " laesst sich in " +
    wechsel(betrag,w.length-1) + " Kombinationen darstellen.");
  }
}
```

So... es wird Momentan also ausgegeben wie oft sich der Betrag aufteilen lässt, inklusive dem Eigenwert (betrag). Außerdem habe ich bereits hinzugefügt, dass er den letzten Münzwert ausgibt (das konnte ich noch... ). Mein Problem ist aber das ich natürlich die komplette Kombination sehen will.

Für eine Betrag von 10 sollte z.B. das hier herauskommen:

1,1,1,1,1,1,1,1,1, 1
2,1,1,1,1,1,1,1, 1
2,2,1,1,1,1,1, 1
2,2,2,1,1,1, 1
2,2,2,2,1, 1
2,2,2,2, 2
5,1,1,1,1, 1
5,2,1,1, 1
5,2,2, 1
5, 5
10

Wenn man in der bisherige Prog also "10" als Betrag einträgt (bzw. es so lässt) erhällt man bloss die letzte Stelle der Kombination (s.o.).

Ich bin echt am verzweifeln und hoffe, dass hier irgendwer das Prob blick und ne Lösung für mich hat. ich weiss nciht wo das weitere System.out hinsoll, hab auch schon viel probiert, ging alles nicht...

Tut mir leid, dass mein erster Post hier ein Request ist, aber ich kannte das coole Forum hier vorher nicht und bin nur jetzt auf meiner schier ewigene Suche nach einem Lösungsansatz auf die Seite hier gestoßen.

Ich bin euch jetzt schon 1000 dankbar, dass ich euch mit dem Problemchen beschäftigt... Laut Prof soll es nur ne kleine erweiterung sein... hmm, nur wo und wie ?!

So, ich hoffe, dass es Replys gibt...

Greets,
offtake

P.S. 
Bei denen, die noch in dem BuHa-Board unterwegs sind, endschuldige ich mich, aber das gleich was in diesem und euren Post steht, triff auch für beide Foren zu... bin halt Java-Newbie... Nur das keiner sagt ich spamme in Foren *g*


----------



## meez (15. Jan 2005)

Willst du den nicht was lernen? 
Warun studierst du überhaupt. Hör lieber auf damit, wenn du ehh andere deine Aufgaben machen lässt...


----------



## Beni (15. Jan 2005)

Ich kenne zwar das BuHa-Board nicht, aber alleine die Tatsache dass du dein Crossposting nicht verschweigst (wie viele andere) ist  :toll: 

Also, keine Lösung (das wäre doch übertrieben), aber ein Ansatz (als dank für deine Ehrlichkeit) wie es gehen könnte.
Ich geh einfach mal davon aus, dass nur 1, 2, 5, und 10 er -Münzen existieren.

Dann könnte deine Methode etwa so aussehen:

```
public static void start( int money ){
  fill( new int[ money ], 0, 10, money ); // Die Rekursion starten
}

public static void fill( int[] coins, int offset, int max, int money ){
  // coins sind die bereits gesetzten Münzen
  // offset ist der nächste freie Platz im coins-Array
  // max ist die höchste Münze die gesetzt werden darf
  // money ist das Geld, das noch ausbezahlt werden muss

  if( money == 0 ){
    print( coins, offset );  // das ist eine Lösung, ausdrucken!
  }
  else if( money > 0 ){  // Falls money < 0 ist, wird das nichts gutes mehr
    for( int i = 0; i < anzahlVerschiedenerCoins; i++ ){
       int coin = getCoin( i );  // von irgendwoher kommt eine Münze daher

       if( coin <= max ){
          coins[ offset ] = coin;
          fill( coins, offset+1, coin, money - coin );
       }
    }
  }
}
```


----------



## offtake (15. Jan 2005)

Danke beni,

aber der code hilft mir kein bißchen weiter... "offset" ist ja genau die Stelle die ich suche... ich versuche es weiter 

@meez: Was hat der Kommentar jetzt gebracht - gibt's du etwa immer gleich auf, wenn de mal wo festhängst?
Jaja, ich frage einmal und es heisst dann gleich, dass ich IMMER andere meine (Achtung Plural) Aufgaben machen lasse... tzz... Sorry, aber das find ich nicht fair, deshalb der flame...

bye


----------



## Beni (15. Jan 2005)

offtake hat gesagt.:
			
		

> ... "offset" ist ja genau die Stelle die ich suche... ich versuche es weiter


Hms, guck dir mal die Methode start an... (ich sag dazu nichts mehr, die Methode funktioniert, ich hab sie ausprobiert).



			
				offtake hat gesagt.:
			
		

> @meez: Was hat der Kommentar jetzt gebracht - gibt's du etwa immer gleich auf, wenn de mal wo festhängst?
> Jaja, ich frage einmal und es heisst dann gleich, dass ich IMMER andere meine (Achtung Plural) Aufgaben machen lasse... tzz... Sorry, aber das find ich nicht fair, deshalb der flame...


Hier treiben sich zurzeit soviele faule Studenten (und andere) rum... die nerven ziemlich, deshalb die aggressive Stimmung. Ich glaube nicht, dass meez länger als eine Minute für diese Aufgabe benötigt, nur hat er keine Lust die Arbeit anderer Leute zu machen.


----------



## offtake (15. Jan 2005)

Hmm... ne echt, du kriegst die gleiche Ausgabe wie ich se oeben als Bsp hatte... hmm... merkwürdig.
Na ja, das mit den nervigene Studenten verstehe ich, aber ich sitze echt seid Tagen schon dran und bis scheinbar echt zu blöde dazu... na ja, will euch nicht weiter stören... ich hoffe der nimmt es mir jetzt nicht zu übel...

Grüße


----------



## offtake (15. Jan 2005)

Also beni, ich habe dein prog jetzt mal nochmal durchgearbeitet, aber ich kriege da auch nur die ausgabe der letzten spalte hin, an die vorigene zahlen komme ich nicht, gib mir doch nochmal nen Ratschlag... ich kriege immer nur son datenmüll zusammen oder haufenweise  den (mittlerweile nackenhaar-aufstellenden) ArrayIndexOutOfBounds-Fehler, wenn ich denke, dass die Werte so richitg sind... tja... aber sind se wohl nicht, weiss ja der Fehler herkommt, aber weiss nicht was ich alternativ schreiben soll... Danke, dass du überhuapt geantwortet hast, bist ja ein wohl auch Java-Meister...
Was auf deiner Page zu sehen ist hat mich umgehauen... Kein Geschleime jetzt, finde deine Programme echt genial...

Offtake


----------



## Beni (15. Jan 2005)

Kompilieren und laufen lassen.

```
public class Test{
	public static final int[] COINS = { 1, 2, 5, 10, 50, 100, 200 };

	public static void main( String[] args ) {
		start( 10 );
	}

	public static void start( int money ) {
		// Die Rekursion starten
		fill( new int[money], 0, Integer.MAX_VALUE, money );
	}

	public static void fill( int[] coins, int offset, int max, int money ) {
		// coins sind die bereits gesetzten Münzen
		// offset ist der nächste freie Platz im coins-Array
		// max ist die höchste Münze die gesetzt werden darf
		// money ist das Geld, das noch ausbezahlt werden muss

		if( money == 0 ){
			print( coins, offset ); // das ist eine Lösung, ausdrucken!
		}
		else if( money > 0 ){ // Falls money < 0 ist, wird das nichts gutes
								// mehr
			for( int i = 0; i < COINS.length; i++ ){
				int coin = COINS[i]; // von irgendwoher kommt eine Münze
										// daher
				// (ob von einem Array oder einer Methode ist ja egal)
				// Wichtig ist: die kleinste Münze hat die Grösse 1

				if( coin <= max ){
					coins[offset] = coin;
					fill( coins, offset + 1, coin, money - coin );
				}
			}
		}
	}

	public static void print( int[] a, int offset ) {
		for( int i = 0; i < offset; i++ )
			System.out.print( a[i] + " " );

		System.out.println();
	}
}
```


----------



## offtake (15. Jan 2005)

Vielen Dank, 

ich muss ehrlich zugeben das mich meine fehlende Kenntnis des Java-Syntax abgehalten hat... das mit den coins habe noch gerafft, habe da mein w-array verwandt (und w.lenght), aber die Zeile "print( coins, offset );" habe ich irgendwie nicht als methoden-aufruf erkannt... oh mann, ehrlich dumm von mir...  und es war gar nicht so schwer... 

Tut mir echt Leid, dass ich dich damit genervt habe, desto mehr will ich dir danken, jetzt kann ich alleine weiter machen, das war ja ein teilproblem der ganzen Lösung. Aber den rest verstehe ich bereits...

Super Forum hier... ich werde öfter man reingucken um was zu lernen, nicht bloss um blöde fragen zu stellen!

bye, offtake


----------

