---------------------[ die klasse money2 ]------------------------ -------[ i] inhalt 0. [ aufbau dieses textes ] 1. [ das programmkonzept ] 1.1 < parsen der eingabe > 1.2 < fehlerhafte eingabe > 1.3 < die ausgabe berechnen > 2. [ beschreibung des sourcecodes ] 2.1 < zeile 11 bis 14 > 2.2 < zeile 23 > 2.3 < zeile 22 und 26 > 2.4 < zeile 41 > 2.5 < zeile 42 und 56 > 2.6 < zeile 45, 46 und 50 > 2.7 < zeile 68 > appendix a: spezifikation -------[ 0.] aufbau dieses textes im ersten teil dieses textes wird nur die "idee" hinter dem sourcecode behandelt. es wird wimmer wieder auf bestimmte zeilen im code verwiesen, die dann im zweiten teil naeher betrachtet werden. der rest ist, so denke ich aus dem kommentierten sourcecode selbst ersichtlich. -------[ 1.] das programmkonzept die spezifikation verlangt ein programm, dass einen string einlieszt, daraus einen geldbetrag und eine waehrung erkennen kann, berechnet wieviel scheine und muenzen zum ausgeben benoetigt werden und schliezlich diese information (oder eine fehlermeldung, bei falschen eingaben) ausgibt. dieses kapitel beschreibt jeweils den ansatz fuer diese ziele. zahlen in eckigen klammern verweisen auf eine zeile im sourcecode die gerade beschrieben wurde. ---< 1.1> parsen der eingabe da ja nur das letzte zeichen im eingelesenen string keine zahl ist (es ist das waehrungssymbol) braucht auch nur dieses "weggeschnitten" zu werden. ich loese also mit substring() alles, bis auf das letzte zeichen heraus und uebergebe das an parseInt() [23]. ---< 1.2> fehlerhafte eingabe da, das parsen der eingabe innerhalb eines try {} blockes [22] steht, werden alle eingaben abgefangen, die mehr als ein nicht-ziffern-zeichen enthalten. dann liefert naemlich parseInt() keinen wert zurueck und der betrag bleibt auf 0 und in den folgenden if-anweisungen wird das dann als fehlerhaft interpretiert [26]. ---< 1.3> berechnen die verschiedenen muenzen und scheine einer waehrung habe ich je einem array von ganzzahligen typen gespeichert. der erste eintrag jedes arrays ist die anzahl der scheine bzw. muenzen der jeweiligen waehrung, die restlichen eintraege sind die wertigkeiten der geldstuecke [11-14]. als erstes wird nun ueberprueft ob ueberhaupt scheine auszugeben sind. das ist nur der fall wenn der eingelesene betrag groeszer oder gleich dem kleinsten schein der waehrung ist [41]. wurde das ueberprueft, wird zuerst festgehalten, dass nicht nur muenzen gebraucht werden [42]. dann tritt das programm in eine for schleife ein, von 1 bis zum ende des arrays. als erstes wird in der schleife festgestellt wie oft der derzeitig behandelte schein gebraucht wird [45] und falls das oefter als null ist [46] wird, es ausgegeben. danach wird ermittelt wieviel geld noch auszugeben ist indem der restbetrag mit der modulo funktion ausgerechnet wird [50]. nachdem alle scheine durchgearbeitet wurden, werden nach dem selben prinzip die muenzen ausgegeben. der einzige unterschied ist, dass zuerst ueberprueft wird, ob nur muenzen, oder auch scheine auszugeben sind [56]. die unterscheidung (und damit die variable nurMuenzen) ob nur muenzen, oder auch scheine ausgegeben werden, ist wichtig um entscheiden, ob vor dem 'M' ein leerzeichen gehoert (um es von den scheinen zu trennen), oder nicht. als letztes wird nun der so erstellte string zurueck an die main() methode geliefert [68]. denn obwohl wenn ich hier immer von ausgeben gesprochen habe, wird in der methode berechnen nicht wirklich etwas ausgegeben, sondern nur der auszugebende string immer erweitert, bis alles drinn steht. dieser wird dann an main() gegeben, die in dann auf den bildschirm ausgibt. -------[ 2.] beschreibung des sourcecodes hier werden nur noch einmal die im ersten teil erwaehnten zeilen genauer behandelt. ---< 2.1> zeile 11 bis 14 in diesen arrays werden die werte der scheine und muenzen gespeichert. die muenzen und scheine arrays habe deshalb unterschiedliche typen, weil fuer die muenzwerte der datentyp "byte" voellig ausreichend ist. der erste eintrag in jedem array ist kein wert eines scheins, sondern die anzahl der scheine bzw. muenzen. dadurch, dass diese daten auf diese weise gespeichert werden, kann man besser mit dem array arbeiten. in den for-schleifen zum beispiel wird der wert scheine[0], bzw. muenzen[0] benutzt um festzustellen wie oft die schleife durchlaufen werden muss um alle stellen des arrays durchzuarbeiten. und in der zeile 41 wird dieser wert benutzt um auf die letzte stelle im array zuzugreifen. ---< 2.2> zeile 23 die methode eingabe.length() liefert die laenge des strings. also liefert eingabe.substring(0, eingabe.lenght() - 1) den gesamten string bis auf das lette zeichen, also das waehrungssymbol. dieser string der jetzt nur noch ziffern enthaelt wird an Integer.parseInt() uebergeben, welche dann den dargestellten wert im typ int zurueckliefert. dieser wert kann nun endlich in der int variable betrag gespeichert werden. ---< 2.3> zeile 22 und 26 die try - catch anweisung faengt eine fehlermeldung des interpreters ab, falls der benutzer falsche eingaben macht. zum beispiel, wenn etwa dieser string eingegeben wird 123AC. durch substring() wird das letzte zeichen abgeschnitten, aber dann bleibt 123A uebrig und das kann von parseInt() nicht umgewandelt werden. wie gesagt faengt die try - catch anweisung die fehlermeldung NumberFormatException ab und die variable betrag bleicbt auf dem wert auf den sie initialisiert wurde, naemlich 0. in zeile 26 steht nun eine if-anweisung die eine fehlermeldung ausgibt, falls der wert von betrag kleiner als null oder groeszer als 10000000 ist. ---< 2.4> zeile 41 scheine muessen (bzw. koennen) nur ausgegeben werden, wenn der auszugebende betrag mindestens so grosz ist wie der wert des kleinsten scheines. da die indizes bei arrays bei null beginnen liegt der wert, der angibt wieviele scheine bzw. muenzen im array sind an der stelle scheine[0] bzw. muenzen[0]. die tatsaechlichen werte der scheine beginnen ab dem index eins. darum kannman mit dem wert in scheine[0] auf den letzten eintrag im array zugreiffen. am beispiel von c_scheine[] sieht das so aus: c_scheine[0] == 6, c_scheine[c_scheine[0]] == c_scheine[6] == 2. ---< 2.5> zeile 42 und 56 wenn scheine benutzt werden werden nicht nur muenzen benutzt, also setzte ich die varieble nurMunzen auf false. ist diese variable auf false wird in zeile 56 ein leerzeichen an den ausgabestring angehaengt, weil ja vorher schon scheine ausgegeben wurden und das einleitende 'M' der muenzen gehoert von den schienen getrennt. wurden keine scheine ausgegeben steht das 'M' ganz links am bildschirmrand ---< 2.6> zeile 45, 46 und 50 um festzustellen wieviele von den gerade untersuchten scheinen ich ausgeben muss dividiere ich den betrag durch den wert eben dieses scheins. die variable betragNeu ist ein ganzahliger typ, das heiszt, der rest wird abgeschnitten. in der zeile 50 wird dann der betrag auf eben diesen rest gesetzt. die if-anweisung in zeile 46 bewirkt, dass nur dann eine ausgabe erfolgt, wenn von dem gerade untersuchten wert auch scheine auszugeben sind. ---< 2.7> zeile 68 die methode berechnen gibst selbst nichts auf den bildschirm aus, sondern erwitert nur den string "ausgabe" bis darin alle informationen enthalten sind. dieser string wird dann an main() zurueckgeiefert und dann auch von main() ausgegeben. appendix a: spezifikation hier eine kurze zusammenfassung der spezifikation. das programm soll einen string einlesen der einen geldbetrag und eines der (fiktiven) waehrungssymbole 'C' oder 'D' enthaelt. ist der betrag kleiner als 0 oder groeszer als zehn millionen soll die meldung "FALSCHE EINGABE" gefolgt von einem zeilenvorschub ausgegeben werden. genauso, wenn der buchstabe am ende der zahl nicht 'C' oder 'D' ist (grosz- und kleinschreibung wird unterschieden). ebenso soll auf alle anderen falschen eingaben des benutzers (z.b.: mehrere buchstaben) reagiert werden. die waehrung 'C' hat die scheine (800, 500, 100, 50, 10, 2) und die muenzen (5, 1). die waehrung 'D' hat die scheine (400, 100, 50, 20, 4) und die muenzen (10, 5, 2, 1). es sollen moeglichst wenige scheine ausgegeben werden. muenzen duerfen erst verwendet werden, wenn keine scheine mehr moeglich sind, auch hier sollen es moeglichst wenig sein. ausgeben soll das programm die scheine und muenzen die fuer diesen betrag benoetigt werden gefolgt von einem zeilenvorsprung. die ausgabe soll folgendes format haben: zuerst ein 'S' gefolgt von einem leerzeichen, dann der wert des scheins, wieder ein leerzeichen und dann die anzahl der scheine. falls nochmehr scheine auszugeben sind sind diese genauso und wieder von einem leerzeichen getrennt auszugeben. scheine die nicht benoetigt werden sollen auch nicht ausgegeben werden. fuer die muenzen gilt das gleiche. hinzu kommt, dass vor denn muenzen ein 'M' gefolgt von einem leerzeichen stehen muss. wenn keine scheine bzw. keine muenzen ausgegeben werden soll auch kein 'S' bzw. 'M' ausgegeben werden. beispiel fuer eine eingabe: 1253D und hier die dazugehoerige ausgabe: S 400 3 50 1 M 2 1 1 1 das wars dann. ich wuensche noch viel erfolg. -->patrick -- klaffenboeck patrick /"\ patrick.k@rocketmail.com \ / ASCII Ribbon Campaign ICQ# 55690660 X against HTML in email & vCards / \