# Probleme mit Wechselgeld (nicht vorhandene Scheine/Münzen?)



## jn**b (27. Dez 2017)

Hallo zusammen,

ich hoffe ihr hattet schöne Feiertage und ihr könnt mir bei einem kleinen Problem helfen. Ich mache eine Ausbildung zur Fachinformatikerin im 1. Lehrjahr, allerdings stehe ich auf Kriegsfuß mit der Programmierung.

Und da wäre ich auch schon bei meinem Problem, dies ist nur eine Teilaufgabe … bzw. nicht mal das. Sagen wir so es ist ein Freiwilliger Teil, den ich noch etwas verkomplizieren musste. Ich bin mir sicher, die Lösung ist super einfach und ich komme nicht drauf.

Dieser Programmteil soll das eingegebene Geld mit den „Kosten“ verrechnen und dann das bestmögliche Wechselgeld ausgeben. Soweit so gut. Das tut mein Programm. Als nächstes Schmankerl, sollten wir dann (wenn wir wollten … Freiwillig) das mögliche Wechselgeld in einer Datei Speichern und bei Aufruf des Programms abfragen … durch den eingeworfenen/ausgegebenen Betrag verändert sich die Anzahl der Scheine/Münzen und wird wieder zurück geschrieben. Gut, nicht berücksichtigt wird nun jedoch was geschieht, wenn z.B. laut Programm 20 Cent ausgegeben werden sollen, diese Münze aber nicht mehr vorhanden ist. Bisher habe ich dafür keine Lösung gefunden.

Mein Code sieht schrecklich aus ... das weiß ich, wirklich vielen Dank für jeden der sich durch meine Qualen quält 


```
import java.io.*;
import java.util.Scanner;

public class wechsel{
 
  private static Scanner scanner = new Scanner(System.in);
  private static final double kosten = 7.1;
 
  public static void einlesen(double[][]geld) throws IOException{
  
    java.lang.String temp;
    int x = 0;
    int y = 0;
    java.io.BufferedReader oReader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(new java.io.File("wechsel.txt"))));
  
    x=0;
    while ((temp = oReader.readLine()) != null) {
      java.util.StringTokenizer stWerte = new java.util.StringTokenizer(temp,",");
      x=0;
    
      while(stWerte.hasMoreTokens()) {
        geld[y][x] = java.lang.Double.parseDouble(stWerte.nextToken());
        x++;
        if (x%2==0) {
            System.out.println("Anzahl "+geld[y][0]+" EURO Scheine/Muenzen: \t"+(int)geld[y][1]);
        }
      }
      y++;
    }
  }
 
  public static void einwurf(double[][]geld)throws IOException{
  
    System.out.print("Wieviel Geld wurde eingeworfen?: ");
    String g = scanner.nextLine();
  
    double einwurf = Double.parseDouble(g.replace(',', '.'));
    double rest = einwurf - kosten;
  
    for (int j=0;j<geld.length;j++){                                                          
      geld[j][1] += einwurf / geld[j][0];
      einwurf =  einwurf % geld[j][0];
      einwurf = Math.round(einwurf*100)/100.00;
      System.out.println("Menge an "+geld[j][0]+" EURO Scheine/Muenzen: \t"+(int)geld[j][1]);
    }
    System.out.println();
    wechselGeld(geld, rest);
  }
 
  public static void wechselGeld(double[][]geld, double rest)throws IOException{
  
    double[][] wechselGeld = new double [9][2];                                                                                                                                                        
    wechselGeld[0][1] = 50.00;                                                      
    wechselGeld[1][1] = 20.00;
    wechselGeld[2][1] = 10.00;
    wechselGeld[3][1] = 5.00;
    wechselGeld[4][1] = 2.00;
    wechselGeld[5][1] = 1.00;
    wechselGeld[6][1] = 0.50;
    wechselGeld[7][1] = 0.20;
    wechselGeld[8][1] = 0.10;
  
    System.out.println();                                                                                      
  
    System.out.println("Dies ist die neue Ausgabe der Textfile:");
  
    for (int i=0;i<wechselGeld.length;i++){                                                          
      wechselGeld[i][0] = rest / wechselGeld[i][1];
      rest =  rest % wechselGeld[i][1];
      rest = Math.round(rest*100)/100.00;
      geld[i][1] -= (int) wechselGeld[i][0];
      System.out.println("Menge an "+geld[i][0]+" EURO Scheine/Muenzen: \t"+(int)geld[i][1]);  
    }
    System.out.println();
    ausgabe(geld);
  }
 
  public static void ausgabe(double[][] geld)throws IOException{
  
    FileWriter fw = new FileWriter("wechsel.txt");
    BufferedWriter bw = new BufferedWriter(fw);
  
    for (int i = 0; i<geld.length; i++) {
      bw.write(geld[i][0] + "," + (int)geld[i][1]);
      bw.newLine();
    }
    bw.close();
    }
 
  public static void main(String[] args) throws IOException{
    double[][] geld= new double [9][2];
  
    System.out.println("Aus der Textfile ausgelesen:");
    einlesen(geld);
    System.out.println();
    einwurf(geld);
  }
}
```

Ich steht grad wirklich auf dem Schlauch, also helft mir bitte, aber dreht das Wasser bitte nur langsam auf sonst werd ich nass. 

Nochmals Danke


----------



## jn**b (28. Dez 2017)

Nochmals Hallo,

hat denn niemand einen Tipp für mich?

Wäre wirklich super, wenn mir jemand weiterhelfen könnte.

MfG


----------



## JCODA (29. Dez 2017)

Naja du könntest abfragen, ob noch genügend Scheine/Münzen vorhanden sind und falls nicht, einfach ausgeben, dass kein Verkauf stattgefunden hat. (Und das interne Wechselgeld unverändert lassen)


----------



## Xyz1 (29. Dez 2017)

jn**b hat gesagt.:


> *double*[][] wechselGeld = *new* *double* [9][2];
> wechselGeld[0][1] = 50.00;
> wechselGeld[1][1] = 20.00;
> wechselGeld[2][1] = 10.00;
> ...


Guck mal, die Teilarrays haben eine Länge von zwei. Du befüllst davon aber nur ein Elem.



jn**b hat gesagt.:


> , diese Münze aber nicht mehr vorhanden ist.


Wie werden die zur Verfügung stehenden Münzen denn gespeichert?



jn**b hat gesagt.:


> *for* (*int* i=0;i<wechselGeld.length;i++){


Diese Schleife ist prinzipiell nicht falsch, aber wenn die jeweilige wechselGeld-Münze nicht mehr vorhanden ist, soll mit der nächsten weiter-gemacht werden.

Wo zwickts und zwackts denn?


----------



## jn**b (31. Dez 2017)

Hey,

danke für Eure Hilfe. Auf die Idee, dass dann einfach kein Verkauf stattfindet bin ich gar nicht gekommen … wäre mir aber auch zu einfach weil es ja höchst wahrscheinlich anders möglich wäre das Wechselgeld auszugeben (nur nicht mit der idealen Menge).


In dem 2. Teil des „wechselGeld“ Arrays wird die Anzahl der Münzen/Scheine gespeichert.

Die zur Verfügung stehenden Münzen werden im „geld“ Array gespeichert und aus einer Text File ausgelesen über die Methode „einlesen“ (bin sehr kreativ in der Namensgebung -.-).

Wenn jetzt einfach mit der nächsten Münze weiter gemacht wird wenn eine nicht mehr vorhanden ist, dann ist dies ja nicht mehr optimal. Nehmen wir mal ich muss noch 1€ ausgeben habe aber diese Münze nicht mehr … wenn mir jetzt auch die 50 Cent Münzen ausgehen würden wäre zum Beispiel der 5€ Schein den ich Vorher ausgegeben habe Suboptimal und 3x 2€ wären besser gewesen …lol
Denke ich zu kompliziert?

Ich wünsche euch auf jeden Fall einen guten Rutsch 

MfG


----------



## JCODA (31. Dez 2017)

Achso. Dir geht es nicht darum, den Fall abzufangen, wenn es keine Münzverteilung gibt, sondern du möchtest auch nichtoptimale Münzverteilungen betrachten.
Hier könnte ich mir ein Backtracking Ansatz vorstellen bzw. eine rekursive Methode.


```
function getCoinDistrib(value, usedCoins, availableCoins)
   if value == 0:
       return usedCoins
   if value < 0 or availableCoins.isEmpty():
       return null
   foreach coin in availableCoins:
       coinDist= getCoinDistrib(value-valueOfCoin[coin],usedCoins+coin,availableCoins-coin)
       if coinDist != null:
            return coinDist
    return null
```
(Hierbei sind usedCoins und availableCoins Arrays mit jeweils den Anzahl der jeweiligen Coins.)
Das ist jetzt eine Art Greedy-Ansatz der würde vermutlich (wenn man die 3 Fälle vernachlässigt, die ich gerade übersehe), eine Lösung liefern, aber nicht die optimale. (Wobei, wenn die availableCoins sortiert sind, dann schon...)
Ja, ist ja sowieso PseudeCode und kann beliebig optimiert werden ^^.


----------



## Xyz1 (31. Dez 2017)

Auch Geschlechtslos geworden? 



jn**b hat gesagt.:


> Denke ich zu kompliziert?


Ich werd dir nicht das Nachdenken abnehmen.



jn**b hat gesagt.:


> Nehmen wir mal ich muss noch 1€ ausgeben habe aber diese Münze nicht mehr … wenn mir jetzt auch die 50 Cent Münzen ausgehen würden wäre zum Beispiel der 5€ Schein den ich Vorher ausgegeben habe Suboptimal und 3x 2€ wären besser gewesen


Du willst 1€ ausgeben und 3x 2€ wäre besser?! 

Du sollst evtl mal Nachdenken, wie sich Wechselgeld zusammensetzt und dass nicht jede Summe mit dem Greedy ansatz (an der Stelle kein Danke an @JCODA , der ja doch irgendeine Lösung hinschmeißt) gebildet werden kann.

Spiel das mal auf dem Papier durch und mach den Schreibtischtest, wenn du so ungeduldig bist. Ich bin raus aus dem Thema. Schönes Jahr noch.


----------

