Was ist hier falsch? (C)

OP #3329751
Lesenswert?
• ▲
▼
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);
5
            if(summe==1){
6
                continue;
7
            }
8
        }
9

10
    }

Danke und Gruß
OP #3329851
Lesenswert?
• ▲
▼
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?
Gast #3329889
Lesenswert?
• ▲
▼
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.
Persönliche Seite #3330038
Lesenswert?
• ▲
▼
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.
Gast #3330103
Lesenswert?
• ▲
▼
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.
Gast #3330141
Lesenswert?
• ▲
▼
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.
Persönliche Seite #3330248
Lesenswert?
• ▲
▼
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.
OP #3330555
Lesenswert?
• ▲
▼
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ß
Gast #3330605
Lesenswert?
• ▲
▼
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 
...
OP #3330608
Lesenswert?
• ▲
▼
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)
Gast #3330656
Lesenswert?
• ▲
▼
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.
Gast #3330700
Lesenswert?
• ▲
▼
@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.
#3330711
Lesenswert?
• ▲
▼
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
Gast #3330712
Lesenswert?
• ▲
▼
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*
Gast #3330891
Lesenswert?
• ▲
▼
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.
OP #3330987
Lesenswert?
• ▲
▼
Ok, also hier jetzt mal mein neuer ganzer Code:
1
#include <stdio.h>
2

3
int main(){
4
    while(1){
5
float summe=0;
6
int anzahl;
7
int wahl;
8
int kosten_wasser;
9
int kosten_bier;
10
int kosten_fanta;
11
int rueckgeld;
12
float fehlend;
13

14
printf("\nGetreankeautomat---Version 0.1");
15
printf("Sorten:\nWasser:1Euro\nBier:2Euro\nFante:1.50Euro\n");
16
scanf("%d", &wahl);
17

18
if(wahl==1){
19
    printf("Bitte geben sie 1 Euro ein:");
20
    scanf("%f", &summe);
21
    if(summe>1){
22
        rueckgeld=summe-1;
23
        printf("Ihr Rueckgeld: %d Euro", rueckgeld);
24
    }else
25
    if(summe<1){             //Hier ist weniger als 1 also Komma
26
        while(summe==1){
27
            printf("%f",summe);
28
            scanf("%f", &summe);
29
        }
30

31
    }
32
    }else
33
    if(summe==1){
34
        continue;
35
    }
36
    printf("\nBitte entnehmen sie ihr Getreank.\n");
37

38
}
39
}
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ß
#3331020
Lesenswert?
• ▲
▼
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.
Gast #3331189
Lesenswert?
• ▲
▼
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!
Gast #3331195
Lesenswert?
• ▲
▼
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.
OP #3331660
Lesenswert?
• ▲
▼
Also jetzt geht alles außer wenn ich mehr als 1 Euro eingebe kommt als 
Rückgeld 0.
1
#include <stdio.h>
2

3
int main(){
4
    while(1){
5
float summe=0;
6
int anzahl;
7
int wahl;
8
int kosten_wasser;
9
int kosten_bier;
10
int kosten_fanta;
11
float rueckgeld;
12
float fehlend;
13
float counter;
14
float eingabe;
15

16
printf("\nGetreankeautomat---Version 0.1");
17
printf("Sorten:\nWasser:1Euro\nBier:2Euro\nFante:1.50Euro\n");
18
scanf("%d", &wahl);
19

20
if(wahl==1){
21
    printf("Bitte geben sie 1 Euro ein:");
22
    scanf("%f", &summe);
23
    if(summe>1){
24
        rueckgeld=summe-1;
25
        printf("Ihr Rueckgeld: %d Euro", rueckgeld);
26
    }else
27
    if(summe<1){
28
            do{
29
            printf("%f eingegeben:",summe);
30
            scanf("\n%f", &eingabe);
31
            counter=summe+eingabe;
32
            }
33
        while(counter<1);
34

35
            }
36
    }else
37
    if(summe==1){
38
        continue;
39
    }
40
    printf("\nBitte entnehmen sie ihr Getreank.\n");
41

42
}
43
}
Und dass mit dem "mehr als nötig" bei der Eingabe wenn erst zu wenig und 
dann zu viel muss ich noch überlegen wie ich dass mache.
Gruß un Danke
Persönliche Seite #3331773
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren