Geld­au­to­mat

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Ein Kon­to ver­fügt über einen Betrag von 5000 €. Bei einem Minus-Zei­chen vor dem ein­ge­ge­be­nen Betrag wird der Betrag vom Kon­to­stand abge­zo­gen, steht vor dem Betrag ein Plus-Zei­chen wird der Betrag auf das Kon­to eingezahlt.

Das Pro­gramm stellt fest:

  • ob es sich um eine Ein- oder Aus­zah­lung han­delt, fehlt die Infor­ma­ti­on, wird eine Feh­ler­mel­dung angezeigt. 
  • ob sich das Kon­to durch den aus­zu­zah­len­den Betrag im Soll befin­det
    in die­sem Fall wird kein Geld ausgezahlt
  • wie vie­le Schei­ne im Wert von 50 €, 20 € und 10 € aus­ge­ge­ben wer­den müssen 

So sieht es aus:

Lege im Kopf des Pro­gramms die glo­ba­len Varia­blen fest.

int Kontostand = 5000;

// Scheine, die eingezahlt/ausgegeben werden
int Fuenfziger;
int Zwanziger;
int Zehner;

Im set­up-Teil wird der Seri­el­le Moni­tor gestar­tet und die ➨Funk­ti­on Kon­to­An­zei­gen() auf­ge­ru­fen. Der Funk­ti­on wird der aktu­el­le Kon­to­stand als Varia­ble über­ge­ben. Außer­dem dient sie als Infor­ma­ti­on über den Ablauf des Programms.

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // Startbildschjirm
  KontostandAnzeigen(Kontostand);
}
void KontostandAnzeigen(int Kontostand)
{
  // Kontostand anzeigen
  // \u20ac = €
  Serial.println("Neuer Kontostand: " + String(Kontostand) + " \u20ac");
  Serial.println("-------------------------------------------------------");

  Serial.println("Wie viel m\u00f6chtest du einzahlen oder abheben?");
  Serial.println("Der Betrag muss durch 10 teilbar sein!");
  Serial.println("Auszahlung -> dem Betrag ein - Zeichen voranstellen");
  Serial.println("Einzahlung -> dem Betrag ein + Zeichen voranstellen");
  Serial.println("-------------------------------------------------------");
}

Der loop-Teil fragt die Ein­ga­be ab. Dem Betrag muss ein Minus-Zei­chen oder ein Plus-Zei­chen vor­an­ge­stellt wer­den. Beach­te die Kommentare.

void loop()
{
  // abgehobener/eingezahlter Betrag
  int Betrag;

  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor bis zum return lesen
    String Eingabe = Serial.readStringUntil'\n');

    // return entfernen
    Eingabe = Eingabe.substring(0, Eingabe.length());

    // Testen, ob das erste Zeichen + char(43) oder - char(45) ist
    if (Eingabe.charAt(0) == char(43) || Eingabe.charAt(0) == char(45))
    {
      // Auszahlung
      if (Eingabe.startsWith("-"))
      {
        Betrag = Eingabe.toInt() * -1;

        // Betrag muss durch 10 teilbar sein
        if (Betrag % 10 == 0) BetragAuszahlen(Betrag);
      }

      // Einzahlung
      if (Eingabe.startsWith("+"))
      {
        Betrag = Eingabe.toInt();

        // Betrag muss durch 10 teilbar sein
        if (Betrag % 10 == 0) BetragEinzahlen(Betrag);
      }
    }
  }
}

Die Funk­tio­nen Betrag­Aus­zah­len() und Betra­gEin­zah­len() sor­gen für die Berech­nung des Kon­to­stan­des. Außer­dem wird hier die Funk­ti­on Anzahl­Schei­ne() auf­ge­ru­fen. Sie berech­net mit Hil­fe von ➨modu­lo die Anzahl der 50er, 20er und 10er. Beach­te die Kommentare.

void BetragEinzahlen(int Betrag)
{
  Kontostand = Kontostand + Betrag;

  // \u00f6 = ö, \u20ac = €
  Serial.println("Du m\u00f6chtest " + String(Betrag) + " \u20ac einzahlen.");

  // Anzahl der Scheine (50, 20 und 10) feststellen
  AnzahlScheine(Betrag);

  // Kontostand und Info anzeigen
  KontostandAnzeigen(Kontostand);
}

void BetragAuszahlen(int Betrag)
{
  // der auszuzahlende Betrag ist zu hoch, das Konto ist im Soll
  // \u00f6 = ö, \u20ac = €
  if (Kontostand - Betrag < 0)
  {
    Serial.println("Auszahlung nicht m\u00f6glich!");
    Serial.println("Kontostand ist im Soll: " + String(Kontostand - Betrag) + " \u20ac");
    Serial.println("Bitte gib einen kleineren Betrag ein!");
    Serial.println("----------------------------------------");
  }

  // Betrag auszahlen
  else
  {
    Kontostand = Kontostand - Betrag;
    Serial.println("Du m\u00f6chtest " + String(Betrag) + " \u20ac abheben.");

    Serial.println("Du bekommst:");

    // Anzahl der Scheine (50, 20 und 10) feststellen
    AnzahlScheine(Betrag);

    // Kontostand und Info anzeigen
    KontostandAnzeigen(Kontostand);
  }
}
void AnzahlScheine(int Betrag)
{
  // Anzahl der 50er
  int Rest = Betrag % 50;
  /*
    vom Betrag den Rest abziehen
    Beispiel:
    130 % 50 ergibt Rest 30
    130 - 30 = 100
    100 ist durch 50 teilbar
  */
  Fuenfziger = (Betrag - Rest) / 50;

  /*
    Rest berechnen
    wenn nicht durch 20 teilbar, kann neuerRest nur 10er sein
    30 % 20 ergibt Rest 10
  */
  int neuerRest = Rest % 20;
  /*
    Anzahl der 20er
    der neueRest muss von Rest abgezogen werden
    -> ergibt die 20er
  */
  Zwanziger = (Rest - neuerRest) / 20;

  // Anzahl der 10er
  Zehner = neuerRest / 10;

  // Anzahl der Geldscheine anzeigen
  if (Fuenfziger > 0) Serial.println(String(Fuenfziger) + " F\u00fcnfziger");
  if (Zwanziger > 0) Serial.println(String(Zwanziger) + " Zwanziger");
  if (Zehner > 0) Serial.println(String(Zehner) + " Zehner");
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 4. Okt 2023 @ 19:25