www.mikrocontroller.net

Forum: PC-Programmierung C, Kommandozeile, Fragen


Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich befasse mich grade mit C und der Kommandozeile.

Compilieren mache ich mit MinGW 3.

Es soll ein Kaffeautomat Simulator werden.
So weit, so Gut, bis auf Folgendes:

Ich habe eine bestimmte Menge an Wechselgeld,
einzeln nach Münzen sortiert, 10cnt, 20cnt, 50cnt, 1Eur, 2 Eur.

Im Programmablauf errechne ich nach Münzeinwurf das Wechselgeld.

Wie kann ich nun logisch bestimmen, welche Münzen als Wechselgeld 
ausgegeben werden?

Sagen wir mal, ich habe 2 Euro eingeworfen,
der Kaufpreis beträgt 50 Cent.
Dann errechne ich das Wechselgeld, in Höhe von 1,50 Eur.

Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden 
sind,
und es sollen erst die größt mögliche Münze ausgegeben werden.
Nicht das nur 10 Cent Münzen ausgegeben werden, obwohl noch 20 und 50 
Cent Münzen vorhanden sind.

Ich danke schon mal für die Hilfe.

Gruß Toby

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt irgendwie nach Hausaufgabe. Ansonsten nach netter Spielerei, eine 
Uebungsaufgabe, die man am besten selbst loest.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden
> sind,
> und es sollen erst die größt mögliche Münze ausgegeben werden.
der letzte Teilsatz gibt doch schon die lösung vor

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias Tetzlaff schrieb:

> Sagen wir mal, ich habe 2 Euro eingeworfen,
> der Kaufpreis beträgt 50 Cent.
> Dann errechne ich das Wechselgeld, in Höhe von 1,50 Eur.
>
> Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden
> sind,
> und es sollen erst die größt mögliche Münze ausgegeben werden.
> Nicht das nur 10 Cent Münzen ausgegeben werden, obwohl noch 20 und 50
> Cent Münzen vorhanden sind.


Wie würdest du das denn im realen Leben machen?
Nach welcher Strategie gehst du denn vor?

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Hausaufgabe, na ja, nicht für mich! ;-)

> Nun soll erstens geprüft werden, ob die jeweiligen Münzen vorhanden
> sind,
> und es sollen erst die größt mögliche Münze ausgegeben werden.
der letzte Teilsatz gibt doch schon die lösung vor

Ja, weiß ich ja auch schon, wie es machbar wäre, nur wie ich es 
schreiben soll, weiß ich noch nicht!

Also, prüfen ob 50 Cent Münzen da sind, wenn ja, Ausgeben.
Wenn Nein, dann prüfen ob 20 Cent da sind, wenn ja, sooft ausgeben, bis 
Rest kleiner ist, als 20 Cent. Ist dann ja 10 Cent.
Prüfen ob 10 Cent da sind, wenn ja, Ausgeben, wenn Nein, hätte ich 
keinen Kaffee ausgeben dürfen! ;-)

Gruß Toby

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,

ich nehm immer erst das Klüngelgeld, damit ich nicht so ein dickes 
Porimone
habe! ;-)

Im Ernst, einen höher habe ich das schon geschrieben.
Hat sich Zeitlich überschritten.

Gruß Toby

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Portemonnaie meinte ich ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias Tetzlaff schrieb:

> Also, prüfen ob 50 Cent Münzen da sind, wenn ja, Ausgeben.
> Wenn Nein, dann prüfen ob 20 Cent da sind, wenn ja, sooft ausgeben, bis
> Rest kleiner ist, als 20 Cent.

Das lässt sich auch alles in einem Rutsch erledigen.
die while-Schleife mit mehreren Bedingungen ist schon erfunden :-)
Und der Rest sind dann einfach nur ein paar Subtraktionen, Additionen 
und Ausgabeanweisungen.

Also nochmal die Frage: Wie steuerst du zb. ob und wieviele 20 Cent 
Münzen ausgegeben werden.

Antwort: Du gibst solange 20 Cent Münzen her, solange (while)
  * noch Münzen im Vorrat sind   UND
  * der auszugebende Betrag größer als 20 Cent ist

oder in C
   Anzahl20Cent = 0;
   while( Nr20Cent > 0 && Betrag >= 0.20 ) {
     Nr20Cent--;      // Jetzt ist eine Münze weniger im Vorrat
     Anzahl20Cent++;  // Dafür wird eine 20 Cent Münze mehr ausgegeben
     Betrag -= 0.20;  // und der auszugebende Betrag verringert sich um 20 Cent
   }


Wobei es allerdings nicht so schalu ist, Geldbeträge in Gleitkomma 
darzustellen. Besser wäre es wenn Betrag nicht in Euro angegeben ist, 
sondern in Cent. Dann kann das eine int Variable sein und man hat keine 
Probleme mit Rechenungenauigkeiten in der 12 Nachkommastelle.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib jemandem eine Loesung, dann hilfst du ihm fuer den Moment. Bring ihn 
dazu die Loesung selbst zu finden, dann hilfst du ihm fuer's ganze 
Leben.

Wirklich Leute, ich weiss ja, es gibt euch ein gutes Gefuehl zu helfen - 
aber manchmal ist die groesste Hilfe, nicht zu helfen.

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
Hallo Karl Heinz,

Mit der while Funktion geht es nicht, da ich auswerten muss,
wenn keine Geldstücke mehr zur Ausgabe bereit stehen.

Das geht nur mit if / else.

Ich klappere nun alle Geldstücke von groß nach klein durch.
Außerden darf ich nicht sofort das Geld ausgeben, da, falls keine 
passenden Münzen vorhanden sind, das eingeworfene Geld wieder ausgeben 
muss. Daher das Wechselgeld_temp.

Soviel zum Thema selbst lernen, Peter.

if ( Cent >= Preis )
{
    Wechselgeld = Cent - Preis;
    Wechselgeld_temp = Cent - Preis;

    if ( (Wechsel_2Euro > 0) && (Wechselgeld_temp >= 200 ) )
    {
      Anzahl_2Euro ++;  // ausgegebene 2 Euro erhöhen
      Wechselgeld_temp -= 200;  // Wechselgeld um 2 Euro verringern
      printf("Ihr Wechselgeld: %dx 2 Euro\n\r", Anzahl_2Euro);
    }
    else
    {
      printf("Fehler: Keine 2 Euro Stuecke Wechselgeld \n\r");
    }

    if ( (Wechsel_1Euro > 0) && (Wechselgeld_temp >= 100 ) )
    {
      Anzahl_1Euro ++;  // ausgegebene 1 Euro erhöhen
      Wechselgeld_temp -= 100;  // Wechselgeld um 1 Euro verringern
      printf("Ihr Wechselgeld: %dx 1 Euro\n\r", Anzahl_1Euro);
    }
    else
    {
      printf("Fehler: Keine 1 Euro Stuecke Wechselgeld \n\r");
    }

    if ( (Wechsel_50cnt > 0) && (Wechselgeld_temp >= 50 ) )
    {
      Anzahl_50Cent ++;  // ausgegebene 50 Cent erhöhen
      Wechselgeld_temp -= 50;  // Wechselgeld um 50 Cent verringern
      printf("Ihr Wechselgeld: %dx 50 Cent\n\r", Anzahl_50Cent);
    }
    else
    {
      printf("Fehler: Keine 50 Cent Stuecke Wechselgeld \n\r");
    }

    if ( (Wechsel_20cnt > 0) && (Wechselgeld_temp >= 20 ) )
    {
      Anzahl_20Cent ++;  // ausgegebene 20 Cent erhöhen
      Wechselgeld_temp -= 20;  // Wechselgeld um 20 Cent verringern
      printf("Ihr Wechselgeld: %dx 20 Cent\n\r", Anzahl_20Cent);
    }
    else
    {
      printf("Fehler: Keine 20 Cent Stuecke Wechselgeld \n\r");
    }

    if ( (Wechsel_10cnt > 0) && (Wechselgeld_temp >= 10 ) )
    {
      Anzahl_10Cent ++;  // ausgegebene 10 Cent erhöhen
      Wechselgeld_temp -= 10;  // Wechselgeld um 10 Cent verringern
      printf("Ihr Wechselgeld: %dx 10 Cent\n\r", Anzahl_10Cent);
    }
    else
    {
      printf("Fehler: Keine 10 Cent Stuecke Wechselgeld \n\r");
    }
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja wirklich schön ist der code nicht.

warum muss es gleich ein fehler sein, wenn keine 2€ stücke vorhanden 
sind, wenn noch genug anderes kleingeld vorhanden ist, ist es ja kein 
Problem.

Dann hast du noch ein problem wenn du mal sehr viel rausgeben musst 
(weil du ebend jetzt keine while schleife mehr ist). Es kann ja sein das 
du 4 2€ stücke rausgeben musst.

Wenn du schon, wie es richtig ist mit Ganzzahlen rechnest, musst du ja 
nicht jedes geldstück einzeln berechnen, dafür gibt es dann div und mod.

bei 9€ Wechselgeld

anzahl an

2€ stücken = wechselgeld / 2 = 4
welchselgeld = wechselgeld % 2 = 1

1€ stücke = wechselgeld / 1 = 1
welchselgeld = wechselgeld % 1

usw.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nachtrag:
es fehlt noch die beachtung ob auch genug kleingeld vorhanden ist

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit der while Funktion geht es nicht,

while ist keine Funktion.

> da ich auswerten muss, wenn keine Geldstücke mehr zur Ausgabe
> bereit stehen. Das geht nur mit if / else.

Warum? Du willst doch so lange Geldstücke ausgeben, wie welche vorhanden 
sind und ihre Summe nicht den Wechselbetrag übersteigt. Das macht man 
mit while, nicht mit if / else.

> Ich klappere nun alle Geldstücke von groß nach klein durch.

Genau.

> Außerden darf ich nicht sofort das Geld ausgeben, da, falls keine
> passenden Münzen vorhanden sind, das eingeworfene Geld wieder
> ausgeben muss.

Richtig.

In deinem Code kommt keine Schleife vor. So klappt der Vorgang immer nur 
dann, wenn von jedem Geldstück-Typ maximal eines ausgegeben werden muß.
Übrigens fehlt noch das Dekrementieren von Wechsel_*, wenn du das 
entsprechende Anzahl* inkrementierst.

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Übrigens fehlt noch das Dekrementieren von Wechsel_*, wenn du das
entsprechende Anzahl* inkrementierst.

Ich dekementiere nicht, da ich ja noch nicht weiß, ob genügend 
Wechselgeld vorhanden ist.
Das wollte ich nach der Prüfung des Wechselgeldes machen.

Mit den ganzen If's gehts aber auch nicht so, wie ich denke.
Außerdem hat Peter recht, mit den Fehlern, die keine sind.

Ich versuche es nun doch wieder mit der while "SCHLEIFE".
Allerdings werden bei folgendem Bestand
2 Euro    10x
1 Euro    10x
50 Cent   0 x
20 Cent   10x
10 Cent   1 x

2 Euro Einwurf und 50 Cent Preis (Wechselgeld = 1,50 Euro) nur
1x 1 Euro
2x 20 Cent
ausgegeben. Ist ja auch klar, da weder 50er noch 10er da sind.
Nur wie und wo bekomme ich es nun in der while Schleife mit, das der 
Bestand bereits null ist?

Hier nochmal die while Schleifen

// Funktion zur Rückgabe von 2 Euro wird nie aufgerufen, da höchstens 2 
Euro eingeworfen werden können
// daher ist diese Funktion überflüssig
while ( (Wechsel_2Euro > 0) && (Wechselgeld >= 200 ) )
{
  Wechsel_2Euro --;
  Anzahl_2Euro ++;
  Wechselgeld -= 200;
}
  printf("Ihr Wechselgeld: %dx 2 Euro\n\r", Anzahl_2Euro);

while ( (Wechsel_1Euro > 0) && (Wechselgeld >= 100 ) )
{
  Wechsel_1Euro --;
  Anzahl_1Euro ++;
  Wechselgeld -= 100;
}
  printf("Ihr Wechselgeld: %dx 1 Euro\n\r", Anzahl_1Euro);

while ( (Wechsel_50cnt > 0) && (Wechselgeld >= 50 ) )
{
  Wechsel_50cnt --;
  Anzahl_50Cent ++;
  Wechselgeld -= 50;
}
  printf("Ihr Wechselgeld: %dx 50 Cent\n\r", Anzahl_50Cent);

while ( (Wechsel_20cnt > 0) && (Wechselgeld >= 20 ) )
{
  Wechsel_20cnt --;
  Anzahl_20Cent ++;
  Wechselgeld -= 20;
}
         printf("Ihr Wechselgeld: %dx 20 Cent\n\r", Anzahl_20Cent);

while ( (Wechsel_10cnt > 0) && (Wechselgeld >= 10 ) )
{
  Wechsel_10cnt --;
  Anzahl_10Cent ++;
  Wechselgeld -= 10;
}
  printf("Ihr Wechselgeld: %dx 10 Cent\n\r", Anzahl_10Cent);


Hmm, habs schon:
Nach den while's schaue ich, ob noch Wechselgeld da ist, also noch 
ausgegeben werden muss. Dadurch kann ich darauf reagieren, und das 
eingeworfene Geld zurück geben, und kein Getränk ausgeben.

...
...
if ( Wechselgeld > 0 )
{
  printf("Fehler: Kein passendes Wechselgeld \n\r");
}

Gruß Toby

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.