Problem mit Geldautomat in C

Christi88

Ensign
Registriert
Juni 2005
Beiträge
201
Hi Leute,

ich werd grad zum Tier mit dieser Geldautomatensteuerung in C....

Und zwar geht es darum:

1. er soll die kontonummer abfragen (tut)

2. er soll den auszahlenden betrag abfragen (tut)

diesen betrag soll er überprüfen, dass es eine zahl zwischen 10 und 1000 ist (in 10 er Schritten) (also ob die zahl durch 10 teilbar ist tut schon) --> die anderen punkte sind mir ein Rätsel

3. Abfrage der Geheimnummer (tut)

4. Ausgabe einer Stückelung in 100er, 50er, 20er und 10er (z.B. 2*100, 1*50 usw.) --> ich weis nicht wie ich das realisieren soll

Ich hoffe einer von euch hat ein wenig mehr Ahnung wie ich. Vlt. kann mir ja einer ein Beispiel programmieren.


Danke schonmal
Christi88
 
Definier einfach ne neue Bibliothek, die in 10er Schritten von 10 bis 1000 geht. Und Frag einfach nach Valid ab.

Ui, hab das auch falsch verstanden :D
 
Du solltest dein problem anders formulieren!

Ich weis nicht worum es geht!
 
Einfach mit ner Abfrage würd ich sagen, man fragt halt immer ab wie oft das größte Stück ausgegeben werden kann in dem man abzählt, in ner Schleife halt, wie oft er in den Betrag passt, das gleichem it den kleineres... usw.
 
Ne so einfach ist das nicht. Dann gibt er ja einfach 5x100 aus bei 500 ...

Musst gleichzeitig limitieren. Hm.. da fällt mir aber direkt auch kein Lösungsansatz ein.
 
Da es sehr nach einer Hausaufgabe aussieht gebe ich dir nur mal ein Denkanstoß.
Du nimmst den Betrag der Abgebucht werden soll und läufst in einer Schleife durch bis der Betrag auf 0 ist.
Im Schleifenrumpf machst du für jeden Wert eines Scheins eine Abfrage ob dieser Wert noch größer als der Betrag ist. Ist dies der Fall wird für den Schein ein Counter erhöht und der Wert des Scheins vom Betrag abgehoben.
Nach der Schleife weißt du dann wie viele er von welchem Schein bekommt.

Grüße
 
Auch doof oder? Dann bekommst du bei 500 Euro 4x 100 und 1x 50 etc...
 
Na, dieses "Geldautomat-Problem" ist doch Standard in der IT-Lernphase ;)

Wichtigster Begleiter ist wohl der Modulo-Operator. Dann noch ein winziges Stück Mathematik um deinen Ausgangswert um die jeweils bekannte Menge (500, 100, 50, 20, ...) zu reduzieren und das Stück für Stück mit dem Restbetrag durchgehen... fertig.
 
Ich würde mal ganz klar sagen, dass hier einfach die Bedingungen nicht genau geklärt sind.

Soll immer "gestückelt" werden, selbst wenn es mit 5*100 realisierbar wäre? Oder sollen halt wirklich nur die größt-möglichen Scheine ausgegeben werden?
Bei ersterem bräuchte man wahrscheinlich eine Art kleine Datenbank, die den Bestand der vorhandenen Geldscheine beinhaltet. Ohne diese wäre eine Stückelung eigentlich nur willkürlich durchführbar.
Bei letzterem mach das was AndrewPoison gesagt hat, und erkundige dich mal nach dem Modulo Operator in Verbindung mit Schleifen.
 
@AkShen: Warum sollen nur 4 x Hundert Euro scheine und 1x Fünfzig Euro Schein ausgegeben werden?
So wie ich es erklärt habe würden bei 500 Euro auch ein 500€ schein ausgegeben werden.
 
also, erstmal danke für eure tipps.

die Stückelung des betrages ist erstmal zweitrangig, d.h. bei 500 euro können es auch 5 mal 100 euro scheine sein. Eine Datenbank ist nicht nötig, es wird von ausreichendem Vorrat ausgegangen

wenn ich die schleife durchlaufe wie eskrizzelfix gemeint habe, dann muss ich quasi für jeden schein einen speicherplatz anlegen, in dem ich die scheinzahl speichern kann. die zahl kann ich dann später auslesen.

ich versuch mal mein glück

Edit:

es stehen nur 100er, 50er 20er und 10 er zur verfügung
 
div_t d;
int val, i;
int scheine[6] = {500,100,50,20,10,5};

i = 0;
while(val) {
d = div( val, scheine );
if(d.quot) {
printf("%d mal %d\n", d.quot, scheine);
}
val = d.rem;
++i;
}

edit: hoffe hab keinen fehler drinn. so sollte es die stückelung ausgeben. ggf. im array was weglassen. zu beachten ist noch, dass in val ein wert sein muss, der aufjedenfall durch die scheine im array "scheine" aufteilbar sit, sonst wird er irgendwann über das array "scheine" hinausgehen. in dem beispiel geht das gut, solange "val" durch 5 teilbar ist.

edit2: gibts eigentlich 200 euro scheine?^^
 
Zuletzt bearbeitet:
int a=0,b=0,c=0,d=0,i=0,x=0, y=0;

//Betrag einlesen auf x

if((x<10) || (x>1000)) {*Irgendeine Fehlermessage;}
if((x%10)!= 0) {*Fehler, keine 10er Betrag*}

y=x;
Do{
if(y>=10) {a++; y=y-10;}
if(y>=20) {b++; y=y-20;}
if(y>=50) {c++; y=y-50;}
if(y>=100) {d++; y=y-100;}
}
Until(y=0);

geht das nicht in etwa so? billige lösung, aber könnte tun :p hab bei der arbeit leider kein programm zum testen ; ;

*edit nee, warte... dann hab ich ja bei... 300€... 1*100, 2*50, 3*20 und 4*10...
 
Zuletzt bearbeitet:
die lösung von merle würde auch gehen, hat aber eine furchtbare laufzeit. vom stadnpunkt eines informatikers und oder mathematikers ne katastrophe (verzeih, ist nicht böse gemeint ;) ).

das hat ne laufzeit von der größenordnung des zu stückelnden wertes. meines hat ne laufzeit von max. der anzahl der zur verfügung stehenden scheinen, d.h. in meinem fall max. 6 runden (also konstant) und deines in etwa WERT/10 runden.

als informatiker tut mir das in der seele weh ;(

edit: ich seh grad, die lösung sit auch noch falsch, da die if-abfragen nciht exklusive sind und auch noch in der falschen reihenfolge wird IMMER (wenn möglich) gleichzeitig eni 10 euro schein, wie ein 20 euro schein etc. veranschlagt.

meine lösung oben sollte die optimale sein. pass sie für deine ausgaben ggf. an, d.h. zähler statt printf evtl.
 
Zuletzt bearbeitet:
Bläh ich bin Systemelektroniker - im 2. Lehrjahr, und bin auch bester bei uns :p Ich würde das wahrscheinlich auch anders regeln, aber nicht ausm Kopf und bei der Arbeit. Ne einfache Lösung isses dennoch, aber wenn du meinen edit oben liest, weisst du, dass es auch von der Stückelung nicht sauber ist.

*edit: was zur Hölle ist div_t ?
 
das edit war da noch nciht da. da die stückelung möglichst große scheine zu bevorzugen hat ist es schlcihtweg falsch :P aber hast ja dein studium noch vor dir :D

div_t ist ein datentyp in c / c++. google mal. wird benötigt zur ausgabe der funktion div(). im grunde verbindet es die division und den modulo, damit man um beides zu erhalten (quotient und rest) nicht wzeimal dividieren muss (d.h. 1x / und 1x % ), da die cpu natürlcih mit einer division beides ausspuckt.
 
Ja stopp mal. ich hab das div_t gegoogelt.
Dass man möglichst große Scheine haben soll, stand da nirgends.
Deins hat den Nachteil, dass, wenn er 500 abheben will, auch nur 1 500er rauskommt.
Ich habs schon verstanden, also den code, ist ja einfach wenn man die Funktion kennt.
Aber so ... isses auch ne blöde Stückelung.
*edit: Zeugs entfernt
 
Zuletzt bearbeitet:
was wieso? das ist ne korrekte stückelung. man kann auch die 500 aus dem array entfernen. wenn man einen schein erst ntuzen will, wenn er mindestens 2 mal vorkommt, dann ist das nur ne einfache erweiterung meines codes - einfach ne abfrage ob d.quot>1 ist (oder>2 jeh nach geschmack).

aber bei deiner stückelung ist ansich überhaupt kein system und vor allem keines, dass man von geldautomaten gewohnt ist. aber ist auch egal, die idee deines beispiels würde funktionieren, zwar mit einer sehr sehr schelchten laufzeit, aber da man eh nicht große werte abheben will, voin jedem pc verkraftbar. aber, da unser TE sciher was lernen will, sollte er leiber lernen, wie man sowas nicht mit einer unnötigen hohen laufzeit programmiert (bei mir konstant, bei dir linear).

edit: ohne div_t macht man statt der funktion "div" einfach / und dann unten statt "val = d.rem" einfach "val = val%schein" oder "val -= val * "wert aus val/schein". dann ist es genau so gut, bis auf den umstand, dass jetzt zwei divisionen bzw eine division, eine multiplikation und eine addition benutzt wird, statt einer division vorher.

ist nur ein gutes beispiel mal den leuten die funktion div() vorzustellen, damit sie nicht immer unnötig zwei mal dividieren. wer assembler etwas kennt hätte auch so auf die funktion kommen können ;)
 
Zuletzt bearbeitet:
fühl ich mcih nicht ;)

fast, was soll das d.quot-1 im printf? da muss weiter hin d.quot stehen. und du darfst das natürlich nciht für jeden schein so machen, da sonst bei 10 euro nix ausgegeben wird.

also z.b. so:

div_t d;
int val, i;
int scheine[6] = {500,100,50,20,10,5};

i = 0;
while(val) {
d = div( val, scheine );
if( (d.quot>1 && i<5) || (d.quot>0) ) { // 5 ist der index des kleinsten scheins im scheine array. nach geschmack kannst auch was anderes nehmen.
printf("%d mal %d\n", d.quot, scheine);

val = d.rem;
}
++i;
}


edit: erklärung, somit werden scheine größer 5 nur genommen, wenn man mindestens 2 davon nehmen kann. p.s. das "val = d.rem]" muss natürlich mit in die if-abfrage, da nur dann der val wert verändert werden darf, wenn auch der schein benutzt wird. und anders als vorher kann es sein, dass er auch dann cniht genutzt wird obowhl d.quot != 0 ist.

edit2: warum hast an das d.rem noch scheine dazu addiert. habs grad gesehen und weggemacht.
 
Zuletzt bearbeitet:
Zurück
Oben