Weiß jemand wie man dieses Programm schreibt?

  • Themenstarter Themenstarter Gelöschtes Mitglied 64282
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 64282

Gast
Implementieren Sie in einer Klasse Kohle Münzgeldrückgaben. Dazu sind verschiedene verfügbare Münzwerte vorgegeben.

1. Implementieren Sie eine Methode Wechselgeld , die den auszugebenden Betrag als Parameter vom Typ int übergeben bekommt. Die zur Verfügung stehenden Münzwerte sind 1, 2, 5 und 10. Realisieren Sie die Münzrückgabe als Greedy-Algorithmus, sodass immer die größtmögliche Münze gewählt wird, die den noch auszugebenden Restbetrag nicht übersteigt. Zusätzlich soll die jeweils gewählte Münze auf der Konsole ausgegeben und am Ende soll die Gesamtzahl der ausgegebenen Münzen als Rückgabewert von der Methode zurückgegeben werden.

2. Implementieren Sie eine Methode Wechselgeld2, der im Gegensatz zu giveChange die Münzwerte 1, 3, 6 und 8 zur Verfügung stehen.

3.Implementieren Sie eine main -Methode und rufen Sie beide Methoden nacheinander mit geeigneten Werten auf.

4. Zeigen Sie anhand eines Beispiels, dass die Lösung, die von Wechselgeld2 gefunden wird, nicht unbedingt optimal ist.
 
Hier könnten Dir viele helfen. Voraussetzung ist, dass Du schreibst, was Du schon probiert hast und wo das Problem liegt.
 
Bekommst Du es hin, eine leere Klasse mit dem Namen Kohle zu schreiben? Wenn ja, kannst Du der Klasse eine Methode Wechselgeld hinzufügen, die einen Betrag als Parameter bekommt und eine Ganzzahl zurückgibt?
 
Bekommst Du es hin, eine leere Klasse mit dem Namen Kohle zu schreiben? Wenn ja, kannst Du der Klasse eine Methode Wechselgeld hinzufügen, die einen Betrag als Parameter bekommt und eine Ganzzahl zurückgibt?
public class Kohle {
public static void Wechselgeld (int decimal) {

stimmt das so?
 
public class Kohle {
public static void Wechselgeld (int decimal) {

stimmt das so?
Ich würde das als ersten Anfang durchaus durchgehen lassen. @mihe7 hat zwar aufgeteilt, aber er hat da evtl. etwas zu viel auf einmal genommen.

Also einfach einmal die Aufgabe wirklich Satz für Satz abhaken:

  1. Implementieren Sie in einer Klasse Kohle Münzgeldrückgaben. Dazu sind verschiedene verfügbare Münzwerte vorgegeben.
  2. 1. Implementieren Sie eine Methode Wechselgeld , die den auszugebenden Betrag als Parameter vom Typ int übergeben bekommt.
  3. Die zur Verfügung stehenden Münzwerte sind 1, 2, 5 und 10.
  4. Realisieren Sie die Münzrückgabe als Greedy-Algorithmus, sodass immer die größtmögliche Münze gewählt wird, die den noch auszugebenden Restbetrag nicht übersteigt.
  5. Zusätzlich soll die jeweils gewählte Münze auf der Konsole ausgegeben
  6. und am Ende soll die Gesamtzahl der ausgegebenen Münzen als Rückgabewert von der Methode zurückgegeben werden.
Wenn man das so aufteilt, dann kann man 1. und 2. erst einmal als abgehakt ansehen (So die schließenden Klammern auch da sind und das in einer Datei Kohle.java steht .. Es gibt also Randbedingungen, die wir nicht prüfen können. Aber Du solltest da etwas haben, das du übersetzen kannst (Entweder in einer Entwicklungsumgebung wird nichts angemeckert oder du rufst z.B. javac Kohle.java auf um es auf der Kommandozeile zu übersetzen.)

Da müsste man jetzt nur weiter machen. Die nächste Information ist erst einmal nicht so wirklich hilfreich in Sache Algorithmus. Aber zusammen mit 4. kannst Du evtl. beschreiben, wie Du vorgehen würdest, wenn Du es machen solltest: Du hast unbegrenzt 1, 2, 5 und 10 Cent Münzen und sollst mir 78 Cent geben. Wie gehst Du vor?
 
Check ich nicht 😒

Wenn ich Dir sage, Du musst 98 Cent Wechselgeld geben, dann sollst Du sagen, mit welchen Münzen Du das Wechselgeld gibst. Dabei hast Du beliebig viele 1-, 2-, 5 und 10-Cent-Münzen zur Verfügung.

@mihe7 hat zwar aufgeteilt, aber er hat da evtl. etwas zu viel auf einmal genommen.
Ja, ich wollte wissen, was "Ich weiß nicht wie ich starten soll, das ist das Problem." zu bedeuten hat 🙂
 
Ich würde das als ersten Anfang durchaus durchgehen lassen. @mihe7 hat zwar aufgeteilt, aber er hat da evtl. etwas zu viel auf einmal genommen.

Also einfach einmal die Aufgabe wirklich Satz für Satz abhaken:

  1. Implementieren Sie in einer Klasse Kohle Münzgeldrückgaben. Dazu sind verschiedene verfügbare Münzwerte vorgegeben.
  2. 1. Implementieren Sie eine Methode Wechselgeld , die den auszugebenden Betrag als Parameter vom Typ int übergeben bekommt.
  3. Die zur Verfügung stehenden Münzwerte sind 1, 2, 5 und 10.
  4. Realisieren Sie die Münzrückgabe als Greedy-Algorithmus, sodass immer die größtmögliche Münze gewählt wird, die den noch auszugebenden Restbetrag nicht übersteigt.
  5. Zusätzlich soll die jeweils gewählte Münze auf der Konsole ausgegeben
  6. und am Ende soll die Gesamtzahl der ausgegebenen Münzen als Rückgabewert von der Methode zurückgegeben werden.
Wenn man das so aufteilt, dann kann man 1. und 2. erst einmal als abgehakt ansehen (So die schließenden Klammern auch da sind und das in einer Datei Kohle.java steht .. Es gibt also Randbedingungen, die wir nicht prüfen können. Aber Du solltest da etwas haben, das du übersetzen kannst (Entweder in einer Entwicklungsumgebung wird nichts angemeckert oder du rufst z.B. javac Kohle.java auf um es auf der Kommandozeile zu übersetzen.)

Da müsste man jetzt nur weiter machen. Die nächste Information ist erst einmal nicht so wirklich hilfreich in Sache Algorithmus. Aber zusammen mit 4. kannst Du evtl. beschreiben, wie Du vorgehen würdest, wenn Du es machen solltest: Du hast unbegrenzt 1, 2, 5 und 10 Cent Münzen und sollst mir 78 Cent geben. Wie gehst Du vor?
Danke!! Ich gehe so vor: 7x10 ct, 1x5 ct, 1x2 ct und 1x1ct
Ja ich denke an die Klammern.

public class Kohle {
public static void Wechselgeld (int decimal) {
int i = 78;
 
@LJ0 wird das Programm fehlerfrei übersetzt? Wenn ja, dann nutze hier im Editor das </> in der Toolbar, um den kompletten Inhalt Deiner Kohle.java einzufügen.
 
Check ich nicht 😒
😱 Härtefall.

public class Kohle {
public static void Wechselgeld (int decimal) {
int i = 78;

Ne, die 78 ist der Wert, der in decimal gespeichert sein kann. Welchen wert du tatsächlich übergibst, das definierst du in Aufgabe 3. Stell dir bei Aufgabe einfach vor decimal wäre 78. Ich würde decimal auch eher betrag nennen.

PS.: Wechselgeld ist bei dir immernoch eine void-Methode, du sollst aber am Ende einen Wert zurückliefern
 
Ja ich bin ein absoluter Härtefall 😂
Also den 1. und 2. Punkt habe ich jetzt ja erledigt.
Aber ich verstehe nicht wie ich bei 3. vorgehen muss.
public class Kohle {
public static void Wechselgeld (int decimal) {
int [] currency= {1,2,5,10}; <- so? 😀

public static void main (string [args)) {

system.out.println (
 
😱 Härtefall.



Ne, die 78 ist der Wert, der in decimal gespeichert sein kann. Welchen wert du tatsächlich übergibst, das definierst du in Aufgabe 3. Stell dir bei Aufgabe einfach vor decimal wäre 78. Ich würde decimal auch eher betrag nennen.

PS.: Wechselgeld ist bei dir immernoch eine void-Methode, du sollst aber am Ende einen Wert zurückliefern
also public static int?
 
Also mein Vorschlag ist, dass wir mit der Liste, die ich Dir gegeben habe, weiter machen. Dann ist das Thema Rückgabe auch erst noch nicht relevant und deine Methode soweit richtig.

Aber ja: Wenn Du eine Rückgabe einer Zahl willst, dann wäre das mit dem int statt void richtig. Aber dann musst Du auch in der methode einen Wert zurück geben. Da hast Du aber noch nichts, denn dazu kommen wir erst später. Aber kannst ja ein return 0; an das Ende der Methode setzen...

Ich würde aber gerne bei dem Algorithmus weiter machen:
Danke!! Ich gehe so vor: 7x10 ct, 1x5 ct, 1x2 ct und 1x1ct
Wie bist Du auf diese Werte gekommen? Was hast Du gerechnet oder gemacht?

Wenn Dir klar wird, was Du gemacht hast, dann können wir schauen, dass wir es als Code schreiben können.
 
int [] currency= {1,2,5,10}; <- so? 😀
Das ist eine Möglichkeit, ja
also public static int?
Ja

Bitte setze deinen Code noch in Code-Tag [code=java][/code]

---

Selbst wenn du Schwierigkeiten mit dem Code hast, so kannst du Aufgabe 4 theoretisch dennoch lösen.

4. Zeigen Sie anhand eines Beispiels, dass die Lösung, die von Wechselgeld2 gefunden wird, nicht unbedingt optimal ist.

Nicht optimal heißt hier: Es gibt eine andere Lösung, als die gefundene, welche weniger Münzen verwendet. Das Vorgehen, welches du für 78 angewendet hast, kannst du auch ohne Programmcode auf verschiedene Zahlen anwenden und schaust gleichzeitig, ob eine andere Lösung offensichtlicher wären. Dafür solltest du dir eher Kleine Zahlen überlegen.
 
Also mein Vorschlag ist, dass wir mit der Liste, die ich Dir gegeben habe, weiter machen. Dann ist das Thema Rückgabe auch erst noch nicht relevant und deine Methode soweit richtig.

Aber ja: Wenn Du eine Rückgabe einer Zahl willst, dann wäre das mit dem int statt void richtig. Aber dann musst Du auch in der methode einen Wert zurück geben. Da hast Du aber noch nichts, denn dazu kommen wir erst später. Aber kannst ja ein return 0; an das Ende der Methode setzen...

Ich würde aber gerne bei dem Algorithmus weiter machen:

Wie bist Du auf diese Werte gekommen? Was hast Du gerechnet oder gemacht?

Wenn Dir klar wird, was Du gemacht hast, dann können wir schauen, dass wir es als Code schreiben können.
Ich habe dabei versucht in jedem Schritt möglichst viel zu erreichen. Also erst bei der größten Zahl angefangen und dann nur die 2. größte genommen wenn die größte nicht mehr ging.
 
Das ist eine Möglichkeit, ja

Ja

Bitte setze deinen Code noch in Code-Tag [code=java][/code]

---

Selbst wenn du Schwierigkeiten mit dem Code hast, so kannst du Aufgabe 4 theoretisch dennoch lösen.



Nicht optimal heißt hier: Es gibt eine andere Lösung, als die gefundene, welche weniger Münzen verwendet. Das Vorgehen, welches du für 78 angewendet hast, kannst du auch ohne Programmcode auf verschiedene Zahlen anwenden und schaust gleichzeitig, ob eine andere Lösung offensichtlicher wären. Dafür solltest du dir eher Kleine Zahlen überlegen.
Was bedeutet Code in Code-Tag setzen?
 
public class Kohle {
public static int Wechselgeld (int betrag) {
int [] currency = {1,2,5,10};
return 0;
}

}

so habe ich es bis jetzt
 
Dass er formattiert wird. Wie hier

Java:
public class Kohle {
  public static int Wechselgeld (int betrag) {
    int [] muenzen = {1, 2 ,5 ,10};
    // ....
  }

  public static void main (String[] args) {
    // ...
  }
}
wie hast du das gemacht? sorry für die dummen fragen ich bin ganz neu auf dem gebiet
 
Java:
public class Kohle {
    public static int Wechselgeld (int betrag) {
        int [] currency = {1,2,5,10};
        return 0;
    }

}
 
Ich habe dabei versucht in jedem Schritt möglichst viel zu erreichen. Also erst bei der größten Zahl angefangen und dann nur die 2. größte genommen wenn die größte nicht mehr ging.
Das ist zu ungenau! Du musst dir das im Detail vorstellen und ganz detailliert aufsplitten!

Wie bist Du denn auf das Ergebnis gekommen? Wie kommst Du darauf, dass bei 78 Cent die 7 10Cent Münzen das Maximum sind?

Und dann der Wechsel auf die nächst kleine Münze: Was hast Du da genau gemacht?
 
Wie bist Du denn auf das Ergebnis gekommen? Wie kommst Du darauf, dass bei 78 Cent die 7 10Cent Münzen das Maximum sind?

Und dann der Wechsel auf die nächst kleine Münze: Was hast Du da genau gemacht?

Ich weiß worauf du hinaus willst, ich würde auch eher so machen, aber die Aufgabenstellung sieht vor, dass jede einzelne genommene Münze aufgezeigt wird, also der "lange" Weg, nicht der "kurze" Weg, der uns eher vorschweben würde.
 
Das ist zu ungenau! Du musst dir das im Detail vorstellen und ganz detailliert aufsplitten!

Wie bist Du denn auf das Ergebnis gekommen? Wie kommst Du darauf, dass bei 78 Cent die 7 10Cent Münzen das Maximum sind?

Und dann der Wechsel auf die nächst kleine Münze: Was hast Du da genau gemacht?
Ich verstehe nicht worauf du hinaus möchtest..Ich nehme immer die größte Münze die unterhalb meiner Zielzahl liegt. Der Wert wird abgezogen und weiter gehts.
 
Ich verstehe nicht worauf du hinaus möchtest..Ich nehme immer die größte Münze die unterhalb meiner Zielzahl liegt. Der Wert wird abgezogen und weiter gehts.
Darauf will er hinaus, du musst das nur noch im Programmcode niederbringen. Es ist nichts anderes als das Vorgehen, was du dir bildlich vorstellst, zu automatisieren.

Java:
public static int Wechselgeld(int betrag) {
  int[] muenzen = {10, 5, 2, 1};
  int rest = betrag;
  int anzahl = 0;

  while(rest > 0) {
    // hier passiert die ganz Logik + Ausgabe der gefundenen Münze
  }

  return anzahl;
}
 
Darauf will er hinaus, du musst das nur noch im Programmcode niederbringen. Es ist nichts anderes als das Vorgehen, was du dir bildlich vorstellst, zu automatisieren.

Java:
public static int Wechselgeld(int betrag) {
  int[] muenzen = {10, 5, 2, 1};
  int rest = betrag;
  int anzahl = 0;

  while(rest > 0) {
    // hier passiert die ganz Logik + Ausgabe der gefundenen Münze
  }

  return anzahl;
}
also eine while if schleife?
 
Ich bin soooo verwirrt.
Ich muss dann ja irgendwas mit der vorgegebenen Zahl machen. Aber waas
 
[CODE lang="java" title="Kannst du mir vielleicht erklären was du damit genau ausdrücken willst?"]int rest = betrag;
int anzahl = 0;

while(rest > 0) {[/CODE]
 
Ich verstehe nicht worauf du hinaus möchtest..Ich nehme immer die größte Münze die unterhalb meiner Zielzahl liegt. Der Wert wird abgezogen und weiter gehts.
Das ist schon besser, aber da fehlt immer noch etwas....

So lange, wie der Restbetrag größer ist, als der Wert der Münze, nehme ich eine solche Münze und gebe es aus, erhöhe die Anzahl der benötigten Münzen um 1 und reduziere den Restbetrag um den Wert der Münze .

Worauf ich hinaus will ist: Du musst exakt werden. Im Code musst Du exakt sein. Da geht kein Wischi Waschi und nach meiner Erfahrung scheitert es genau an der Stelle. Du hast Dir das noch nicht exakt durchdacht und daher kann es nicht klappen!

Jetzt hast Du es deutlich formuliert und damit kann es 1:1 übersetzt werden:
a) Solange eine Bedingung erfüllt ist, mache ich etwas -> while (Bedingung) { Mache etwas }
b) Bedingung restbetrag > muenzenwert. -> Kann man also auch gut umsetzen
c) Ausgabe "Nehme Münze ...", anzahlMuenzen++ wäre eine Erhöhung der Anzahl der Münzen. Die Variable muss natürlich deklariert und initialisiert werden ... Restbetrag reduzieren: restbetrag = restwert - muenzwert;

Daher mein Ratschlag: Stell es Dir genau vor. Überleg genau, was Du machst. So ein Weg ist ok.

Du kannst aber auch gerne rechnen. Wenn es das ist, was Du machst, dann hast Du ein restwert / muenzwert als Anzahl der Münzen die du brauchst und restwert = restwert % muenzwert wäre der Rest.

Aber wie gesagt: Der Weg selbst ist mir egal. Nur stell es Dir exakt vor!

Und ein möglicher Zwischenschritt: Arbeite mit Stift und Zettel und du schreibst alles auf. Denn dann merkst Du, was Du alles brauchst / dir merken musst. Im Kopf merken gilt dabei nicht!

Das wird später einfacher werden, wenn Du das einfach "im Kopf machst". Aber wie gesagt: Wenn Du nicht durchdacht hast, was Du genau machen willst, dann wird das im Code scheitern. Das reale vorstellen ist halt in der Regel deutlich einfacher als es abstrakt im Code zu machen.
 
[CODE lang="java" title="Würde ich jetzt so beginnen?:"]while (amount < currency)[/CODE]
 

Zurück
Oben