Geldwechselmaschine bis Freitag


schwertmeister

Grünschnabel
Hallo liebe Forenuser/member,

ich bin lebensälterer Student (30 J.) im ersten Semester Wirtschaftsinfo und soll einen Geldwechselautomaten programmieren

vorab hierzu ...ich bin blutjunger anfänger und sitze seit drei wochen jeden tag mehrere stunden am problem...ich bin endgültig am ende mit meinem latein und hoffe jemand kann mir weiterhelfen...wenns geht bitte so dass ich es auch nachvollziehen kann:
.
.
.

"Aufgabe 1 : Klasse Geldwechselautomat

Entwerfen Sie eine Klasse, die einen Geldwechselautomaten darstellt. Dieser soll beliebige Geldbeträge so auf verschiedene Münzen aufteilen, dass die Gesamtzahl der Münzen möglichst klein ist.
Beispiel für einen Programmlauf (Benutzereingaben sind farblich hervorgehoben):

Eingabe: 7,46 €

Ausgabe:
3 Muenze/n zu 2,00 €
1 Muenze/n zu 1,00 €
0 Muenze/n zu 50 Cent
2 Muenze/n zu 20 Cent
0 Muenze/n zu 10 Cent
1 Muenze/n zu 5 Cent
0 Muenze/n zu 2 Cent
1 Muenze/n zu 1 Cent

Weiter?(j/n) j

Die acht Münzwerte (2€, 1€, 50cent, 20cent, 10cent, 5cent, 2cent, 1cent) sind in einem Array der Klasse Geldwechselautomat abzuspeichern.

Definieren Sie für die Klasse Geldwechselautomat folgende Methoden:

Berechnung des einzuwechselnden Betrages in Münzwerte in der Methode umrechnung()



Einlesen der Geldbeträge in der Methode einlesen(). Achten Sie darauf, dass Geldbeträge sowohl in Euro (z.B. 7,46 €) als auch nur in Cent (z.B. 746 cent) eingegeben werden können.



Ausgabe der Münzbeträge in der Methode ausgabe() mit den Angaben:
Ausgabe des zu wechselnden Betrages
Anzahl der Münzen und Münzwerte

Achten Sie darauf, für Geldbeträge 2 Nachkommastellen anzuzeigen.
Versuchen Sie, den Betrag so zu wechseln, dass von jedem der acht Münzen etwas dabei ist..



Sie können weitere Methoden definieren, wenn Sie welche benötigen.



Aufgabe 2 : main-Funktionin der Klasse Geldwechselautomat


Entwerfen Sie eine main-Funktion zum Starten des Geldwechselautomaten. Es wird ein Objekt der Klasse Geldwechselautomaten erzeugt. Dieses fordert nun den Benutzer auf, einen Geldbetrag einzugeben, um ihn in Münzen zu wechseln. Der Geldwechselautomat wechselt solange, bis der Benutzer eine 0 eingibt.
Hinweise:

Bitte keine Umlaute, kein ß und keine Zeichen oberhalb Ascii-Code 128 in Bezeichnern oder Dateinamen verwenden!
Verwenden Sie sprechende Variablennamen , also nicht "i", sondern "idealgewicht".
Bitte Attribute als "private" deklarieren!"

.
.
.
meine Lösung dazu sind zwei Klassen...ich bin schon relativ weit gekommen habe gestern auch mit meinem Tutor geschrieben der hat mir ne kommentierte fassung zurückgeschrieben aber darf nicht mehr sagen weil er die aufgabe auch korrigieren wird.

einmal...

Code:
import java.util.Scanner;

public class berechneWechselgeld

{

   public static void main(String[] args) {
     @SuppressWarnings("resource")
     Scanner sc = new Scanner(System.in);

     /**
      * Deine Abbruchkriterien sind falsch, eine Eingabe ohne Zeichen ist
      * nicht zugelassen, eine EIngabe mit ',' liefert auch Fehler. cent wird
      * nicht erkannt, man MUSS Cent schreiben und in jedem Fall wird eine
      * Endlosschleife produziert
      */
     String geldbetrag;
                                 // Warum nicht gleich geldbetrag was zuweisen?
     geldbetrag = sc.nextLine();

     System.out.println("Eingabe in €:");
                                 // while (!(geldbetrag = Scanner.nextLine()).equals(0))
                                 // erst Initialisieren, dann klappt das auch mit Vergleichen
                                 // und wenn du etwas in einem String suchst, dann entweder " " oder
                                 // einzelnen Buchstabe ' '
     while (!(geldbetrag.equals("0"))) {            // solange die Eingabe nicht 0 ist
       float wert = umrechnung(geldbetrag);

       Geldwechsel_automat ga = new Geldwechsel_automat();
                                 // ga.umrechnung(geldbetrag); //-> Der Fehler sagt: du hast für
                                 // deine Methode den Falschen Datentyp genommen
                                 // ga.umrechnung(FLOAT!!!!)
       ga.umrechnung(geldbetrag);
       System.out.println(ga);

     }
   }

   private static float umrechnung(String geldbetrag) {
     if (geldbetrag.contains("€")) {              // Falls das Euro Zeichen vorkommt
       geldbetrag = geldbetrag.replace("€", "").trim();    // Zeichen
                                 // entfernen und
                                 // leerzeichen
                                 // entfernen
       return Float.parseFloat(geldbetrag);
     } else if (geldbetrag.contains("Cent")) {          // Falls das Wort "Cent"
                                 // vorkommt
       geldbetrag = geldbetrag.replace("Cent", "").trim(); // Wort entfernen und leerzeichen entfernen
       return Float.parseFloat(geldbetrag) / 100f;      // Wert anpassen
     } else {                          // Ansonsten
       System.out.println("Ungültige Eingabe");
       return 0;
     }
   }
}

und dazu passend

Code:
public class Geldwechsel_automat

{
  private int[] wechselgeld = new int[8];         
   
  public int[] umrechnung(float geldbetrag)
  {
  int[] wechselgeld = new int[8];
  int iwechselgeld = Math.round(geldbetrag * 100);
  // Für 2€
  wechselgeld[0] = iwechselgeld / 200;
  iwechselgeld = iwechselgeld % 200;
  // Für 1€
  wechselgeld[1] = iwechselgeld / 100;
  iwechselgeld = iwechselgeld % 100;
  // Für 0,50€
  wechselgeld[2] = iwechselgeld / 50;
  iwechselgeld = iwechselgeld % 50;
  // Für 0,20€
  wechselgeld[3] = iwechselgeld / 20;
  iwechselgeld = iwechselgeld % 20;
  // Für 0,10€
  wechselgeld[4] = iwechselgeld / 10;
  iwechselgeld = iwechselgeld % 10;
  // Für 0,05€
  wechselgeld[5] = iwechselgeld / 5;
  iwechselgeld = iwechselgeld % 5;
  // Für 0,02€
  wechselgeld[6] = iwechselgeld / 2;
  iwechselgeld = iwechselgeld % 2;
  // Für 0,01€
  wechselgeld[7] = iwechselgeld / 1;
  iwechselgeld = iwechselgeld % 1;
  this.wechselgeld = wechselgeld;
  return wechselgeld;
  }
  public String toString()
  {
  {   
  String ausgabe = "Ausgabe: ";
  for (int eingabe = 0; eingabe < wechselgeld.length; eingabe++)
  {
  switch (eingabe)
  {
  case 0:
  ausgabe += "\n Muenze/n zu 2,00 €:";
  break;
  case 1:
  ausgabe += "\n Muenze/n zu 1,00 €:";
  break;
  case 2:
  ausgabe += "\n Muenze/n zu 0,50 Euro:";
  break;
  case 3:
  ausgabe += "\n Muenze/n zu 0,20 Euro:";
  break;
  case 4:
  ausgabe += "\n Muenze/n zu 0,10 Euro:";
  break;
  case 5:
  ausgabe += "\n Muenze/n zu 0,05 Euro:";
  break;
  case 6:
  ausgabe += "\n Muenze/n zu 0,02 Euro:";
  break;
  case 7:
  ausgabe += "\n Muenze/n zu 0,01 Euro:";
  break;
  default:
  ausgabe += "\n Fehler ";
  break;
  }
  ausgabe += wechselgeld[eingabe];
  ausgabe += " ";
  }
  return ausgabe;
  }
  }   
}

beide klassen liegen im selben package was meinen namen trägt...

ich saß die ganze nacht über noch dran habe bestimmt zehn kaffe schon intus und sehe den wald vor bäumen nicht mir...

könnt ihr mir sagen wo jetzt der entscheidene fehler liegt...möglichst nachvollziehbar und step by step...

zu mir : ich hatte vorher noch nie progerfahrung...ist also mein erstes semester mit meiner ersten sprache java ...bitte seid gnädig mit mir

und danke allen die hilfreiches posten im voraus
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hoi schwertmeister und Willkommen hier im Forum.

Keine Angst, wir beissen nicht, vorallem wenn du schon einiges selbst versucht hast und hier nicht einfach nur jemanden deine Hausaufgaben machen lassen willst :)

Deinen Code habe ich mal kurz überflogen, sieht an und für sich für einen Anfänger gar nicht mal so schlecht aus. Du bist eh relativ weit gekommen, hast dich aber dann etwas verrannt. Ich denke manche Kommentare sind von deinem Professor?

Vorallem bei Anfängern ist es meiner Meinung nach sinnvoll, das geforderte erst einmal Schritt für Schritt durchzugehen, verstehen und in einem strukturiertem Plan aufs Papier zu bringen. Das hört sich zwar in erster Linie nach mehr Arbeit an, hilft dir aber im Endeffekt das geforderte schneller zu programmieren und auch zu verstehen, was du da machst. Falls ihr den PAP noch nicht gelernt habt hier eine kleine Einführung in Wikipedia. Von daher: Hast du den Programmablauf mal in einen Programmablauf-Plan übertragen?

Wie du siehst ist der Artikel nicht sehr lange und bietet einen guten Einstieg so dass du das Diagram schnell erstellen kannst. Wenn du das Diagram dann hast, dann hast du auch das Programm komplett verstanden und die Umsetzung sollte innerhalb kürzester Zeit möglich sein.

Zum Einlesen der Benutzereingaben kannst du zum Beispiel folgenden Ablauf nehmen (reine Textform):
- Erstelle einen Scanner über System.in
- Gib eine Nachricht aus, so dass der Benutzer weiss dass er etwas eingeben muss
- START Schleife einlesen
-- Lese eine Zeile
-- Ist die Zeile "0", dann führe ein "continue" aus und überspring somit folgenden Teil
--- Endet die Zeile mit einem "€"?
---- Wenn ja, dann entferne die letzen beiden Zeichen
---- Wandle den Rest in eine Zahl um und rechne diese in Cent um
--- Endet die Zeile mit "Cent" (ignoriere Gross- und Kleinschreibung)
---- Wenn ja, dann entferne das Wort
---- Wandle den Rest in eine Zahl um
--- Endet die Zeile mit keinem der beiden Worte, dann wandle die Zahl direkt um und gehe davon aus, dass dies ein Betrag in Euro ist
-- Führe die Umrechnung aus (2)
-- Gib das Ergebnis aus (3)
- ENDE Schleife einlesen, Bedingung: Solange Zeile nicht "0" ist
- Schliesse den oben erstellten Scanner wieder

Den zweiten (2) und dritten (3) Teil kannst du dann selbst beschreiben ;)
Ich hoffe der erste Teil hilft dir das grobe Vorgehen bei solchen Aufgaben besser zu verstehen und den zweiten Teil aus eigenen Stücken abzuschliessen :)

Grüsse,
BK
 
Zuletzt bearbeitet:

schwertmeister

Grünschnabel
ja alsp pap (flussdiagramm) kennen wir in form von einfachen schleifen...if...if else...while etc. mehr hatten wir dazu noch nicht

ich habe in drei wochen prüfungen und muss für 6 fächer lernen und die proghausaufgabe muss bis freitag abgegeben werden...

(mal nebenbei ich bin als 30 jähriger mann auch kein single mehr sondern papa einer dreijährigen tochter)...mein zeitplan ist extrem stark begrenzt ...darum schreibe ich hier rein

wie du schon sagst ich komme ja nicht mit lehren händen und erwarte die perfekte lösung...ich habe ja ein fast funktonierendes prog und hoffe dass mir jemand mal das puzzle ordnen kann und mir mal ne korrektur ...am besten mit nachvollziehbaren kommentaren schickt...ich bin son bissel mit meinem latein am ende...wenn ich einen fehler beseitige tut sich wieder woanders einer auf :-((
 

sheel

I love Asm
Teilweise obsolet, weil vor einer Stunde geschrieben und jetzt erst gepostet,
aber vielleicht hilfts ja doch noch:

Hi,

bei der Angabe (Angabe, nicht deinem Code) bekomm ich Bauchweh. Der Schreiber widerspricht sich mehrmals, fördert schlechte Angewohnheiten und hat offensichtlich keine Ahnung, das ein kleiner unscheinbarer Teil die ganze Aufgabe gleich zehnmal schwieriger macht.


Naja, zum Code.

a) Kein @SuppressWarnings verwenden, wenn es auch anders geht. Compilerfehler müssen sowieso ausgebessert werden, aber auch Warnungen zu beachten ist sehr hilfreich. Oft sind es Sachen, die zwar theoretisch erlaubt sind, aber trotzdem nicht das was man wollte => Man findet (semantische) Fehler leichter.

b) Das Hauptproblem, das ich da sehe, ist die Struktur (wo welche Klassen/Methoden/Codeteile herum sind), und dass über die Hälfte der ANgabe einfach ignoriert ist (gemeint sind nicht die noch fehlenden Sachen, sondern die, die schonf alsch implementiert wurden)
zB.
Kein Array der Münzwerte vorhanden.
Du hast zwei "umrechung"-Methoden.
Das soll "eine" Klasse werden. Bzw. das Main kann, wenn man will, auch in eine andere, aber du teilst deine Methoden irgendwie auf.
Keine toString-Methode gefragt.
usw.usw.

Ich denke, dir ist am Meisten geholfen, wenn ich dir ein Gerüst einfach einmal hinschreibe. Siehe unten. Versuch das nachzuvollziehen und bei den Kommentaren auszufüllen. Sollte mit dem Wissen vom bisher vorhandenen Code kein großes Problem sein. Dann gehts weiter zu den kleineren Details...

PS: Eine konsequentere Codeeinrückung hilft allen, auch dir.

Java:
//imports und package

class Geldwechselautomat {
	private static String[] muenzwerte = {
		"2.00 €",
		"1.00 €",
		"50 cent",
		"20 cent",
		"10 cent",
		"5 cent",
		"2 cent",
		"1 cent"
	};

	private static int stringtocent(String s) {
		/*
		Als kleine Hilfsmethode:
		Wenn s==null dann -1 returnen, als Fehlerwert
		Wenn s leer ist (oder zumindest getrimmt leer ist) dann auch -1 returnen
		Wenn s nicht mit "cent" oder "Cent" endet (also "€" oder gar keine Angabe)
			"€" abschneiden und trimmen
			Dann versuchen als Double zu parsen (besser als Float)
			Wenn das Parsen funktioniert hat, mit 100 multiplizieren (damit es Cent sind) und returnen
			Wenn es nicht funktioniert hat, -1 returnen
		Sonst:
			"cent"/"Cent" abschneiden und trimmen
			Dann versuchen als Double zu parsen (besser als Float)
			Wenn das Parsen funktioniert hat: returnen
			Wenn es nicht funktioniert hat, -1 returnen
		*/
	}

	private int eingelesen = 0;
	private int[] muenzanzahl = null;

	public boolean einlesen() {
		String s;
		int wert;
		//Scanner machen
		while(true) {
			//Ausgaben dass man was eingeben soll
			//Eingabe in s einlesen
			wert = stringtocent(s);
			if(wert == -1) {
				//Ausgaben dass die Eingabe ungültig war
			}
			else if(wert == 0) return false;
			else {
				eingelesen = wert;
				return true;
			} 
		}
	}

	public void umrechnung() {
		int ctr;
		if(muenzanzahl == null)
			muenzanzahl = new int[muenzwerte.length];
		for(ctr = 0; ctr < muenzwerte.length; ctr++)
			muenzanzahl[ctr] = 0;

		//Jetzt eben die muenzanzahl´s füllen, aber im Gegensatz zum alten Code
		// a) mit einer Schleife und
		// b) die Münzwerte nicht mehr fix, sondern aus muenzwerte genommen
		//	"stringtocent(muenzwerte[ctr])" ist hilfreich...
	}

	public void ausgabe() {
		//Die Anzahlen muenzanzahl[ctr] zusammen mit Wert muenzwerte[ctr] ausgeben.
		//	(Es gibt muenzwerte.length Einträge in den Arrays)
	}

	public static void main(String[] args) {
		Geldwechselautomat gwa = new Geldwechselautomat();
		while(gwa.einlesen()) {
			gwa.umrechnung();
			gwa.ausgabe();
		}
	}
}
(nicht kompiliert, evt. sind Tippfehler drin)
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

da meine Freundin auch studiert weiss ich dass Zeit ein wertvolles Gut ist. Aber ich vertrete auch die Ansicht, dass man sich seine Leistungen verdienen muss. Dazu zählt halt auch, alle Aufgaben selber zu erledigen damit das Studium auch seinen Wert behält. Ich kenne leider viel zu viel "Wirtschaftsinformatiker (Bachelor)", die von Programmieren überhaupt keine Ahnung haben da sie die Aufgaben von Freunden / Bekannten erledigen liesen. Und dass diese dann schon bei der Einstellung mehr verdienen nur weil sie den Titel haben bestärkt mich nur in meiner Meinung. Das ist aber ein anderes Thema und hat mit dem hier nichts tun ;)

Hier kann ich sheel nur zustimmen, die Angaben sind mehr als dürftig und machen die Aufgabe nicht gerade einfach zu verstehen. Von daher hier meine Anmerkungen zu deinem Code:

1. Vom Code-Stil her werden Java-Klassen in KamelHöckerSchreibweise geschrieben und beginnen immer mit einem Grossbuchstaben
2. In der Aufgabe steht, dass die Eingabe in der Klasse "Geldwechselautomat" eingelesen und verarbeitet wird
3. Deine umrechnung()-Methode sieht an sich auf den ersten Blick OK aus
4. In deiner Main-Method liest du einmal eine Eingabe und prüfst dann in einer Schleife ob diese != 0 ist. Da du in der Schleife die Eingabe aber nicht neu liest ist die Bedingung immer true (Endlosschleife)
5. Du überschreibst die toString() Methode deines GeldwechselAutomat. An sich OK, in der Aufgabe wird aber eine ausgabe() Methode des Objects aufgerufen / gefordert.
6. Du hast kein Exception-Handling drin. Die Eingabe einer Nicht-Zahl (zum Beispiel "," oder "abc") führt somit zum Absturz. Behandle zumindest die NumberFormatException der Float.parseFloat().
7. Die Methode Float.parseFloat() ist an sich OK, ich würde aber die Float.valueOf() bevorzugen da diese schon von der JDK-Doku besser beschrieben ist und automatisch führende und abschliessende Leerzeichen ignoriert. (Du sparst dir den Aufruf von trim() auf der Eingabe)
(8.) Hier im Forum kannst du deinen Code über die spezielleren [ code=java ]-Tags besser formatieren

Grüsse,
BK
 

schwertmeister

Grünschnabel
Was haltet ihr davon?

Hab nochmal neu angefangen und versucht es objektorientierter zu verfassen,
aber funktieren tut es immer noch nicht

Code:
import java.util.Scanner;
   
  public class Geldwechselautomat {
   
     private int[] muenzenwerte = new int[8];
   
     public static void main(String[] args)
     
     {
       Geldwechselautomat auto = new Geldwechselautomat();
       String wert = auto.einlesen();
   
   
     }
   
     private void umrechnung(int wert)
     
     {
       int[] wechselgeld = new int[8];
  int iwechselgeld = Math.round(wert * 100);
   
   
  // Für 2€
  wechselgeld[0] = iwechselgeld / 200;
  iwechselgeld = iwechselgeld % 200;
   
  // Für 1€
  wechselgeld[1] = iwechselgeld / 100;
  iwechselgeld = iwechselgeld % 100;
   
  // Für 0,50€
  wechselgeld[2] = iwechselgeld / 50;
  iwechselgeld = iwechselgeld % 50;
   
  // Für 0,20€
  wechselgeld[3] = iwechselgeld / 20;
  iwechselgeld = iwechselgeld % 20;
   
  // Für 0,10€
  wechselgeld[4] = iwechselgeld / 10;
  iwechselgeld = iwechselgeld % 10;
   
  // Für 0,05€
  wechselgeld[5] = iwechselgeld / 5;
  iwechselgeld = iwechselgeld % 5;
   
  // Für 0,02€
  wechselgeld[6] = iwechselgeld / 2;
  iwechselgeld = iwechselgeld % 2;
   
  // Für 0,01€
  wechselgeld[7] = iwechselgeld / 1;
  iwechselgeld = iwechselgeld % 1;
   
  this.muenzenwerte = wechselgeld;
   
   
     }
   
     private String einlesen()
     
     {
       System.out.println("Eingabe: ");
       String gescannt;
       Scanner scanner = new Scanner(System.in);
       while(true)
       {
         gescannt = scanner.nextLine();
         System.out.println(gescannt);
         if(gescannt.equals("0 Cent") | gescannt.equals("0 €"))
         {
           System.out.println("Ohne Geldeinwurf kein weiteres wechseln mehr möglich...");
           break;
         }
         int wert = getWert(gescannt);
         umrechnung(wert);
       }   
   
       scanner.close();
   
       return gescannt;
     }
   
     private void auslesen()
     
     {
       {   
         
  String auslesen = "Ausgabe: ";
  for (int eingabe = 0; eingabe < muenzenwerte.length; eingabe++)
  {
   
  switch (eingabe)
  {
  case 0:
  auslesen += "\n Muenze/n zu 2,00 €:";
  break;
  case 1:
  auslesen += "\n Muenze/n zu 1,00 €:";
  break;
  case 2:
  auslesen += "\n Muenze/n zu 0,50 Euro:";
  break;
  case 3:
  auslesen += "\n Muenze/n zu 0,20 Euro:";
  break;
  case 4:
  auslesen += "\n Muenze/n zu 0,10 Euro:";
  break;
  case 5:
  auslesen += "\n Muenze/n zu 0,05 Euro:";
  break;
  case 6:
  auslesen += "\n Muenze/n zu 0,02 Euro:";
  break;
  case 7:
  auslesen += "\n Muenze/n zu 0,01 Euro:";
  break;
   
  default:
  auslesen += "\n Fehler ";
  break;
  }
   
  auslesen += muenzenwerte[eingabe];
  auslesen += " ";
  }
       }
  }
   
     private int getWert(String wert)
     
     {
       int eingabe = 0;
   
       String[] a = wert.split(" ");
       if(a[1].equals("Cent")){
         eingabe = Integer.parseInt(a[0]);
       } else {
         String b = a[0].replace(",", "");
         eingabe = Integer.parseInt(b);
       }
       return eingabe;
     }
  }
 

schwertmeister

Grünschnabel
Status Quo...lauffähig...aber sind noch etliche schönheitsfehler drin...schaut es euch mal an ...bin für verbesserungen offen...

Code:
import java.util.Scanner;

public class Geldwechselautomat {

   private int[] muenzenwerte = new int[8];

   public static void main(String[] args)

   {
     Geldwechselautomat auto = new Geldwechselautomat();
     String wert = auto.einlesen();

   }

   private void umrechnung(int wert)

   {

     int[] wechselgeld = new int[8];

     // Für 2€
     System.out.println(wert / 200);
     wechselgeld[0] = wert / 200;
     wert = wert % 200;

     // Für 1€
     wechselgeld[1] = wert / 100;
     wert = wert % 100;

     // Für 0,50€
     wechselgeld[2] = wert / 50;
     wert = wert % 50;

     // Für 0,20€
     wechselgeld[3] = wert / 20;
     wert = wert % 20;

     // Für 0,10€
     wechselgeld[4] = wert / 10;
     wert = wert % 10;

     // Für 0,05€
     wechselgeld[5] = wert / 5;
     wert = wert % 5;

     // Für 0,02€
     wechselgeld[6] = wert / 2;
     wert = wert % 2;

     // Für 0,01€
     wechselgeld[7] = wert / 1;
     wert = wert % 1;

     this.muenzenwerte = wechselgeld;

   }

   private String einlesen()

   {
     Scanner scanner = new Scanner(System.in);
     boolean weiter = true;
     String gescannt = null;
     while (weiter) {
       System.out.println("Eingabe: \nAbbruch bei 0 € oder 0 Cent");
       gescannt = scanner.nextLine();
       System.out.println(gescannt);

       if (gescannt.equals("0"))
       
       {
         System.out.println("Ohne Geldeinwurf kein weiteres wechseln mehr möglich...");
         weiter = false;
       }
       
       int wert = getWert(gescannt);
       System.out.println("Berechnung startet...");
       umrechnung(wert);
       ausgabe();
     }

     scanner.close();

     return gescannt;
   }

   private void ausgabe() {
     String[] tmp = { " Muenze/n zu 2,00 €:", " Muenze/n zu 1,00 €:", " Muenze/n zu 0,50 Euro:",
         " Muenze/n zu 0,20 Euro:", " Muenze/n zu 0,10 Euro:", " Muenze/n zu 0,05 Euro:",
         " Muenze/n zu 0,02 Euro:", " Muenze/n zu 0,01 Euro:" };
     for (int i = 0; i < muenzenwerte.length; i++) {
       System.out.println(muenzenwerte[i] + tmp[i]);
     }

   }

   private int getWert(String wert)

   {
     int eingabe = 0;
     String[] a = wert.split(" ");
     if (a[1].equals("Cent")) {
       eingabe = Integer.parseInt(a[0]);
     } else {
       wert = wert.replace(",", "");
       wert = wert.replace("€", "");
       wert = wert.replace(" ", "");
       System.out.println(wert);
       eingabe = Integer.parseInt(wert);
     }
     return eingabe;
   }
}
 

sheel

I love Asm
Auf jeden Fall schon deutlich schöner. Nur, außer den angesprochenen Schönheitsfehlern
sind noch immer einige Punkte drin, die die Angabe explizit anders verlangt.
In keiner bestimmten Reihenfolge (Angaben- und Schönheitsfehler):

EIniges an sinnlosem Code, zB. die Zuweisung auf Zeile 6, die Variable Wert auf Zeile 12, ...

Die Münzwerte nicht in einem Array, und bei den Codestellen wo die Werte relevant sind
noch immer fix in den achtfachen Code eingetragen, statt sie mit einer Schleife durchzugehen.

Bei einlesen:
Abgebrochen wird entgegen der Infoausgabe nur bei "0", nicht bei "0 €" und so.
Was passiert, wenn man was Ungültiges wie "hallo" eingibt?
Einlesen sollte eigentlich nicht Umrechnung und Ausgabe aufrufen, das gehört ins Main.

Bei getWert:
Man kann Cent auch klein schreiben.
Es soll vermutlich auch ohne Leerzeichen zwischen Zahl und Rest funktionieren.
Integer.parseInt kann eine NumberFormatException erzeugen. Der Compiler sollte sich eig. auch beschweren.
Eingaben wie "1,0000 €" werden bei dir zu 10000 cent statt 100. Als Double parsen, *100 und dann zu int casten hilft.
 
Zuletzt bearbeitet:

schwertmeister

Grünschnabel
Hier mein aktueller Code...sind einige Sachen ausgebessert...

an Schleife für umrechnen beiße ich mir aber die Zähne aus...wie baue ich eine Schleife für nen array?

Code:
import java.util.Scanner;

public class Geldwechselautomat {

   private int[] muenzenwerte = new int[8];

   public static void main(String[] args)

   {
     Geldwechselautomat auto = new Geldwechselautomat();
     String wert = auto.einlesen();

   }

   private void umrechnung(int wert)
   
   {

     int[] wechselgeld = new int[8];

     // Für 2€
     
     wechselgeld[0] = wert / 200;
     wert = wert % 200;

     // Für 1€
     wechselgeld[1] = wert / 100;
     wert = wert % 100;

     // Für 0,50€
     wechselgeld[2] = wert / 50;
     wert = wert % 50;

     // Für 0,20€
     wechselgeld[3] = wert / 20;
     wert = wert % 20;

     // Für 0,10€
     wechselgeld[4] = wert / 10;
     wert = wert % 10;

     // Für 0,05€
     wechselgeld[5] = wert / 5;
     wert = wert % 5;

     // Für 0,02€
     wechselgeld[6] = wert / 2;
     wert = wert % 2;

     // Für 0,01€
     wechselgeld[7] = wert / 1;
     wert = wert % 1;

     this.muenzenwerte = wechselgeld;

   }

   private String einlesen()

   {
     Scanner scanner = new Scanner(System.in);
     boolean weiter = true;
     String gescannt = null;
     while (weiter)
     {
       System.out.println("\nEingabe (Abbruch bei 0 € oder 0 Cent):");
       gescannt = scanner.nextLine();
       

       if (gescannt.equals("0"))
       
       {
         System.out.println("Ohne Geldeinwurf kein weiteres wechseln mehr möglich...");
         weiter = false;
       }
       
       try
       
       {
         int wert = this.getWert(gescannt);
         System.out.println("Berechnung startet...\n");
         this.umrechnung(wert);
         this.ausgabe();
         
       } catch(Exception ex)
       
       {
         System.out.println("Falsche Eingabe!");
       }
       
       System.out.println("\nWeiter?(j/n) ");
       String antwort = scanner.nextLine();
       if (antwort.equalsIgnoreCase("n"))
       {
         weiter = false;
       }
     }

     scanner.close();
     
     return gescannt;
   }

   private void ausgabe() {
     String[] tmp = { " Muenze/n zu 2,00 €", " Muenze/n zu 1,00 €", " Muenze/n zu 50 Cent",
         " Muenze/n zu 20 Cent", " Muenze/n zu 10 Cent", " Muenze/n zu 5 Cent",
         " Muenze/n zu 2 Cent", " Muenze/n zu 1 Cent" };
     for (int i = 0; i < muenzenwerte.length; i++) {
       System.out.println(muenzenwerte[i] + tmp[i]);
     }
   }

   private int getWert(String wert)

   {
     int eingabe = 0;
     String[] a = wert.split(" ");
     if (a[1].equalsIgnoreCase("Cent")) {
       eingabe = Integer.parseInt(a[0]);
     } else {
       wert = wert.replace(",", "");
       wert = wert.replace("€", "");
       wert = wert.replace(" ", "");
       
       eingabe = Integer.parseInt(wert);
     }
     return eingabe;
   }
}

und 7 € sowie 7,0 € behandelt er nicht wie 7,00 € sondern wie 7 bzw. 70 Cent ...?!?
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

Zu deiner getWert(String):
- Du greifst auf a[1] zu ohne zu prüfen, ob es überhaupt 2 Elemente gibt (ArrayIndexOutOfBoundsException!)
-- Testfall Eingabe: 8
- Du ersetzt das eingegebene "," durch nichts. Aus "7,00" wird somit "700", aber aus "7,3" wird "73" und aus "7" bleibt "7"
--- Ersetze das "," durch einen "." und verwendet nicht Integer.parseInt() sondern Double.valueOf(). Rechne das Ergebnis * 100 und caste es auf int.

Zu deiner einlesen():
- Wenn du "0" einliest, dann setzt du zwar "weiter" auf false, startest aber trotzdem die Umrechnung
--- Siehe oben, Exception in der getWert!
--- Lösung: anstatt "weiter = false;" ein "break" oder "weiter = false" und "continue"

Zu deiner umrechnung():
Java:
private void umrechnung(final int wert) {
  final int[] werte = {200, 100, 50, 20, 10, 5, 2, 1};
  int temp = wert;

  for(int i = 0; i < werte.length; i++) {
    this.wechselgeld[i] = temp / werte[i];
    temp %= werte[i];
  }
}

Der Code ist ungetestet, schnell runtergeschrieben.

Grüsse,
BK
 

sheel

I love Asm
Die Sache mit der Groß/kleinschreibung von Cent ist ok, sonst seh ich für die genannten Punkte keine Änderungen.
dafür ist jetzt wieder was drin, was eigentlich anders verlangt ist (die Abfrage, ob man weiter machen soll)

und 7 € sowie 7,0 € behandelt er nicht wie 7,00 € sondern wie 7 bzw. 70 Cent ...?!?
Eingaben wie "1,0000 €" werden bei dir zu 10000 cent statt 100. Als Double parsen, *100 und dann zu int casten hilft.
:rolleyes:
Wie schon geschrieben ist das aktuelle Vorgehen (das Komma einfach zu entfernen, falls es eins gibt)
nicht in Ordnung, weil man damit natürlich nicht mehr weiß, wie viel Stelle vor/nach dem Komma waren.
Auch die Lösung steht schon oben.
 

Forum-Statistiken

Themen
272.351
Beiträge
1.558.596
Mitglieder
187.824
Neuestes Mitglied
Danke!