Hi,
ich arbeite aus Langeweile an einem "Getränkeautomaten" Programm.
Nun habe ich bei dem Part, bei dem die Eingabe weniger ist als das was
gefordert wird ein Problem:
Wenn ich weniger als 1 eingebe dann kommt ein ewiges "Gewusel" im
Programm.
Code:
1
if(summe<1){
2
while(summe<1){
3
fehlend=1-summe;
4
printf("Es fehlt: %d Euro. Bitte geben sie diesn Betrag noch ein.",fehlend);
Und noch einmal: In Deinem Programmabschnitt erfolgt keinerlei Eingabe!
Folglich kann auch nicht der Wertebereich der (nicht erfolgten) Eingabe
überprüft werden.
Ok Sven P. hat mich drauf gebracht:
Ich habe in dem Beispiel Wasser für 1 (€) und wenn ich es ausprobiert
habe mit weniger (also muss es eine Kommazahl sein) ging es nicht.
Nun ist jetzt die Frage:
Wie kann ich es auch machen dass ich Kommazahlen eingeben kann und
Ganzzahlen?
Simon Name schrieb:> Wie kann ich es auch machen dass ich Kommazahlen eingeben kann und> Ganzzahlen?
Du bist nicht verpflichtet, ein Komma einzugeben. Lässt du es weg,
bekommst du eben eine Zahl mit 0 hinter dem Komma.
Dein Problem ist aber immer noch, daß du in der Schleife nirgends eine
Eingabe abfragst und sich daher der Wert auch nie mehr ändern kann.
Jetzt mal im Ernst:
Gibt es nicht irgenwie wie "%d" oder "%c" in einem also für Komma und
Ganzzahlen?
Und wie könnte man das machen mit dem while Problem?
Simon Name schrieb:> Gibt es nicht irgenwie wie "%d" oder "%c" in einem also für Komma und> Ganzzahlen?
Lies ein C-Buch. Kein Online-Tutorial, ein richtiges C-Buch.
> Und wie könnte man das machen mit dem while Problem?
Beschäftige Dich mit Algorithmen. Das muss gar nicht in einer richtigen
Programmiersprache sein, das kannst Du mit Zettel und Stift auch von
Hand aufmalen.
Hilfreich sind hier beispielsweise Struktogramme.
Zerlege das Problem in Einzelschritte.
Ich habe das Buch C How to
Und auf diese Frage, wenn es geht, kann man ja eine Antwort geben und
wenn man es nicht weiß dann muss man nicht gleich ein "Buchtipp" geben.
Und danke für den Struktorgramm Tipp
Das war zum Beispiel hilfreich.
Simon Name schrieb:> Ich habe das Buch C How to> Und auf diese Frage, wenn es geht, kann man ja eine Antwort geben und> wenn man es nicht weiß dann muss man nicht gleich ein "Buchtipp" geben.> Und danke für den Struktorgramm Tipp> Das war zum Beispiel hilfreich.
Wenn Du ein Buch hast, warum verstehst Du dann grundlegende Dinge nicht
?
Ein Struktogramm kann helfen bedeutet aber nicht das Du weißt was Du
damit machst.
Ob Du einen Programmablauf visuell oder in einer Beschreibungssprache
oder einer Programmiersprache verfaßt ändert nichts an Deinem
Grundproblem das Du den notwendigen Ablauf aktuell nicht erkennst.
Fang also bei Null an und arbeite Dich langsam bis zu Zustandautomaten
durch.
Dann weißt Du wie es geht und kannst gezielt Verständnissfragen stellen.
Schreibe Dir im Klartext auf was getan werden soll und versuche zu
verstehen wie man das formal umsetzt.
Dazu mußt Du aber die Grundlagen können.
Und wer sagt, das du das Komma in deiner anzeige auch nicht
selbstbestimmt setzen kannst?!
Du kannst ja ansinsten auch die Werte multiplizieren und dividieren...
Simon Name schrieb:> Das kommt aber auch ein bisschen doof wenn ich für zum Beispiel> Bier 250> ct verlange :)
Das ist aber nicht so doof wie Gewusel.
Fang mit ganzen Zahlen an. Wenn es dann läuft, kannst du immer noch auf
floating point umstellen.
Simon Name schrieb:> Jetzt mal im Ernst:> Gibt es nicht irgenwie wie "%d" oder "%c" in einem also für Komma und> Ganzzahlen?
Nochmal: Dich zwingt keiner, bei der Eingabe ein Komma anzugeben. Wieso
glaubst du also, irgendeine Unterscheidung zu brauchen? Eine Zahl ohne
Komma ist für dich einfach eine Kommazahl mit einer 0 hinter dem Komma.
> Und wie könnte man das machen mit dem while Problem?
Ich würde dir vorschlagen, selbst darüber nachzudenken. Wenn dir das
fertig vorgekaut wird, wirst du es nicht besser lernen.
Simon Name schrieb:> Und auf diese Frage, wenn es geht, kann man ja eine Antwort geben und> wenn man es nicht weiß dann muss man nicht gleich ein "Buchtipp" geben.
Du kannst natürlich auch mit dem Fuß aufstampfen und "Ich will aber"
sagen, aber C lernen tust Du auf die Weise nicht. Und Du bist es, der
hier C lernen muss (und hoffentlich auch will).
Und wie man mit printf-Formatspezifierern Zahlen ausgeben kann, was es
für Datentypen für die Speicherung und Verarbeitung von Zahlen gibt, das
steht in einem C-Buch drin.
Natürlich könnte irgendwer, der mehr von C versteht als Du, Dir
irgendwas hinbasteln, was in etwa das macht, was du als Anforderung
beschrieben hast -- aber davon lernst Du nichts.
Der Ansatz, der in diesem Forum aber überwiegend verfolgt wird, ist der
der Hilfe zur Selbsthilfe. Keine vorgefertigte Lösung, sondern Hinweise,
wie Du selbst zur Lösung kommen kannst.
Bei so eklantanten Defiziten, wie ich sie bei Dir feststelle, sehe ich
aber, daß Du Dein Projekt erst mal beiseite legen solltest und Dir einen
Teilaspekt davon herauspicken solltest, wie zum Beispiels die Ein- und
Ausgabe numerischer Werte und deren Speicherung und Verarbeitung.
Grundlage dafür sind die oben schon erwähnten Datentypen.
Ich möchte aber keine Lösungen sondern nur ein Tipp ob es sowas wie für
Komma und Ganzzahlen zusammen gibt.
Ich fordere hier keine Lösungen und für meinen Teil kann ich am Besten
lernen wenn ich eine Frage habe, dass mir die Antwort gesagt wurde und
ich diese Antwort dann ANWENDEN kann.
Wenn ich darauf einfach nicht komme und mir niemand diesen Tipp geben
mag dann kann ich schon mal gar nicht lernen.
Gruß
Simon Name schrieb:> ob es sowas wie für> Komma und Ganzzahlen zusammen gibt.
Und was stellst Du Dir darunter vor?
Versuch das doch mal so zu erklären, daß es auch jemand versteht, der
Dein Programmgewächs da oben sich nicht angesehen hat.
Simon Name schrieb:> Also %d und %f zusammen
Schön,
dann schreibe Dir Deinen eigenen Datentyp in C++.
Das ist möglich wenn Du weißt wie man in C++ Datentypen als eigene
Objekte erzeugt und wie die dazu passenden Operatoren überladen werden,
ein Beispiel dazu z.B. hier:
http://www.cpp-tutor.de/cpp/le12/ueberl_spez.html
Dann kannst Du via << und >> Deinen Datentyp passend lesen und schreiben
...
Also wenn bei mir oben etwas 2 euro kostet und ich nur 1.5 Euro gebe
soll noch die Summe berechnet werden wie viel er raus bekommt.
Es kann aber auch sein dass er genau 2 gibt oder 1 also Ganzzahlen.
Deswegen brauche ich eine deklaration von beidem (Komma und Ganz)
Simon Name schrieb:> Es kann aber auch sein dass er genau 2 gibt oder 1 also Ganzzahlen.> Deswegen brauche ich eine deklaration von beidem (Komma und Ganz)
Nein. Brauchst Du nicht.
Wozu auch?
Was ist der Unterschied zwischen 1 EUR und 1.00 EUR?
Simon Name schrieb:> Das kommt aber auch ein bisschen doof wenn ich für zum Beispiel Bier 250> ct verlange :)
Womit man intern rechnet und was man außen hin ausgibt sind zwei paar
Schuhe. Niemand hindert dich daran, eine Funktion zu schreiben die einen
Wert von 250 übergeben bekommt und die diesen Wert als "2,50 Euro" auf
dem Bildschirm ausgibt.
Bei Verkaufsautomaten wird üblicherweise der gewünschte Betrag
angezeigt. Wirfst Du jetzt 10 Cent ein, so wird der geforderte Betrag
MINUS der 10 Cent angezeigt. Diese Ausgabe erfolgt, bis genügend Geld
eingeworfen wurde. Dann wird allerdings nicht 0,00 angezeigt, sondern
mit der Warenausgabe begonnen.
Höfliche Automaten "sagen" dies auch.
Drei Tipps:
1. Wenn Du mal ein C-Buch schauen würdest, wüstest Du, das es bei
einer Sequenz mit continue kaum etwas Wichtigeres gibt als das WO.
Also ein etwas umfangreicherer Programmauszug nötig wäre.
2. Bei der Währungsrechnung ist es am Sinnvollsten in Cent zu rechnen.
Du ersparst Dir damit den Ganzen Ärger mit Rundungsfehlern und
ähnlichem.
3. Eine Ausgabe mit Komma ist normalerweise eine rein "optische"
Angelegenheit. Behandle sie also auch so. Also Ausgabe alles was
größer als 100 Cent ist, dann ein Komma einfügen, anschließend die
Cent ausgeben. Damit sparst Du die, u.U. recht große
Fließkommabibliothek, die bei kleinen Mikroprozessoren manchmal das
Flash zum Überlaufen bringt.
Darüber hinauswird die Ausgabe in Teuro + Cent verwendet, auch wenn
nur Cent gefordert werden.
Amateur schrieb:> Also Ausgabe alles was größer als 100 Cent ist ...hüstel
Äh >99 Cent ROFL ;-)
Das eigentliche Problem hat der TE aber immer noch nicht erkannt, da
helfen wohl auch keine Pillen mehr ...
@cppler
99 Cent sind 0, für die Euros, ein Komma und 99, für die Cent - nach der
oben vorgeschlagenen Logik.
Null ist das übliche Zeichen in der Mathematik, für nix, falls Dir das
nicht bekannt ist. Üb' einfach nochmal. Soweit mir bekannt kennen
Computer "nix" auch gar nicht, weshalb Dein Problem wohl einzigartig
sein sollte.
Amateur schrieb:> @cppler>> 99 Cent sind 0, für die Euros, ein Komma und 99, für die Cent - nach der> oben vorgeschlagenen Logik.>> Null ist das übliche Zeichen in der Mathematik, für nix, falls Dir das> nicht bekannt ist. Üb' einfach nochmal. Soweit mir bekannt kennen> Computer "nix" auch gar nicht, weshalb Dein Problem wohl einzigartig> sein sollte.
@Amateur: Nomen est omen? Was cppler wohl meinte war >99 anstelle von
>100. Du meintest vermutlich wirlich >=100, was >99 entspricht
Amateur schrieb:> @cppler>> 99 Cent sind 0, für die Euros, ein Komma und 99, für die Cent - nach der> oben vorgeschlagenen Logik.>> Null ist das übliche Zeichen in der Mathematik, für nix, falls Dir das> nicht bekannt ist. Üb' einfach nochmal. Soweit mir bekannt kennen> Computer "nix" auch gar nicht, weshalb Dein Problem wohl einzigartig> sein sollte.><((((º> *remouladereich*
Simon Name schrieb:> Also wenn bei mir oben etwas 2 euro kostet und ich nur 1.5 Euro gebe> soll noch die Summe berechnet werden wie viel er raus bekommt.> Es kann aber auch sein dass er genau 2 gibt oder 1 also Ganzzahlen.> Deswegen brauche ich eine deklaration von beidem (Komma und Ganz)
Ich hab dir jetzt aber schon zweimal geschrieben, daß dich keiner
zwingt, ein Komma einzugeben. Du hast es zweimal ignoriert. Wenn du 2
eingibst, kommt auch eine Kommazahl raus, in der dann eben 2,0 steht.
Wozu solltest du dir also die Mühe machen zu erkennen, ob eine Zahl mit
oder ohne Komma eingegeben wurde, dann unterschiedliche Datentypen dafür
verwenden, Berechnungen etsprechend machen und dann bei der Ausgabe auch
wieder unterscheiden? Ein float ist auch in der Lage, die Zahl 2 zu
speichern.
Nun habe ich, falls weniger als 1 Euro, also 0.99 oder so,
Ich möchte halt so rechnen mit Kommas wegen den Euros.
Ich habe nun das Rückwärts zählen Prinzip genommen also Ich gebe 0.5
Euro ein und dann steht dran wie viel schon eingegeben wurde.
Gruß
spiel einfach mal selber "Computer" und gehe dein Programm händisch
durch (manuelles debuggen)
Vergiss erst mal deine Verständnisblockade mit Ganzzahlen und
Bruchzahlen.
lege dir rechts neben dein Programmcode ein Blatt Papier dran, und
schreibe dir mit Bleistift auf, welchen Wert welche Variable hat. Wenn
du an eine neue Wertzuweisung kommst, dann trage den neuen oder
geänderten Wert in deine Variable ein.
Funktioniert alles wie gewünscht? Prima, dann ist dein Programm ja
soweit "fertig". Dann bring es in den Computer hinein, lass es laufen,
und schaue ob es genau das selbe macht was du grade händisch
durchgesteppt hast.
Simon Name schrieb:> int rueckgeld;
und
> rueckgeld=summe-1;> printf("Ihr Rueckgeld: %d Euro", rueckgeld);
Warum liefert das kein sinnvolles Ergebnis? Überleg' mal.
Ok rufus, ich muss einfach rueckgeld zu float machen dann wäre das auch
geklärt.
Aber nun ist es so dass wenn ich eine Kommazahl eingebe gleich kommt:
"Bitte entnehmen sie ihr Getreank."
Klar kommt gleich die Meldung "Bitte entnehmen sie ihr Getreank.".
1
while(summe==1)
kann unmöglich erfüllt sein. Wenn jemand weniger als 1 eingibt musst du
das ganze sowieso komplett anders aufbauen. Du musst doch die Beträge
immer addieren und prüfen wann er endlich 1 erreicht hat. Zusätzlich,
was passiert, wenn man 90c eingeworfen hat und dann 20c einwirft? Dann
muss ja auch noch Rückgeld kommen.
Also, wie vorhin schon Wegstaben Verbuchsler gesagt hat: Zeichne dir die
Logik hinter deinem Programm zuerst auf und fange dann erst zum
programmieren an!
Helferlein schrieb:> Klar kommt gleich die Meldung "Bitte entnehmen sie ihr> Getreank.".while(summe==1) kann unmöglich erfüllt sein. Wenn jemand> weniger als 1 eingibt musst du> das ganze sowieso komplett anders aufbauen. Du musst doch die Beträge> immer addieren und prüfen wann er endlich 1 erreicht hat. Zusätzlich,> was passiert, wenn man 90c eingeworfen hat und dann 20c einwirft? Dann> muss ja auch noch Rückgeld kommen.>> Also, wie vorhin schon Wegstaben Verbuchsler gesagt hat: Zeichne dir die> Logik hinter deinem Programm zuerst auf und fange dann erst zum> programmieren an!
Blödsinn, wahl ==1 ist der Bock.
Simon Name schrieb:> printf("Ihr Rueckgeld: %d Euro", rueckgeld);
Welchen Datentyp hat "rueckgeld" und für welchen Datentyp ist der
Formatspezifizierer %d da?
Ach ja und neben bei:
Das war nicht der ganze Code.
Dass ist nur der Code mit dem Part Wasser.
Bei Bier und "Fante" muss ich das einfach noch um ändern.
Simon Name schrieb:> Dass ist nur der Code mit dem Part Wasser.> Bei Bier und "Fante" muss ich das einfach noch um ändern.
Du könntest natürlich erkennen, daß der Code der anderen Abschnitte dem
für "Wasser" ziemlich ähnlich ist - genauer, gibt es exakt einen
Unterschied: Den Preis.
Muss man deswegen den Code dreimal hinschreiben? Oder würde es sich
lohnen, den jeweils gewählten Preis in einer Variablen unterzubringen
und die verschiedenen Vergleiche nicht mit konstanten Werten, sondern
eben jener Variablen durchzuführen?
Denk mal drüber nach.
Simon Name schrieb:> Ok Danke nun gehts.> Ich musste aus dem %d einfach nur ein %f machen :)> Gruß und Danke
Naja, so ganz geht das doch noch nicht. Was ist wenn zuerst 50 Cent und
dann 1 Euro eingeworfen werden? Kein Rückgeld?