# Warm-ups (freiwillig)

Quelle: https://dev.inf.zone/exercises/10/warm-ups/

**Wozu das Ganze?**

Die Warm-ups führen die neuen Sprachmittel aus der Vorlesung „6. Python“ in kleinen Schritten ein. Sie sind freiwillig, zählen nicht für die Bonuspunkte und sind nicht prüfungsrelevant. Nutzen Sie sie, wenn Sie bei einer Aufgabe nicht wissen, wie Sie anfangen sollen. Wenn Sie direkt loslegen können, fangen Sie mit den Aufgaben an.

Sie müssen nicht alle Warm-ups machen. Suchen Sie sich in der Tabelle das heraus, was Ihnen für eine Aufgabe fehlt:

| | Übt | Hilft bei |
|---|---|---|
| [Warm-up 1](#warm-up-1) | Ein- und Ausgabe in Python | Lesbarkeit, Veraltet |
| [Warm-up 2](#warm-up-2) | Zahlen einlesen: Bargeld in Python | Veraltet (bei ungültiger Eingabe erneut fragen) |

Legen Sie für die Warm-ups eine eigene Datei an, zum Beispiel `warmup_aufgaben_10.py`, im selben Ordner wie Ihre Übungsaufgaben. Lösungen gibt es für die Warm-ups nicht. Unter „Wo zu finden?“ steht jeweils, wo das Thema in Vorlesung und Shorts vorkommt. Mehr dazu im [FAQ zu den Warm-ups](https://dev.inf.zone/faq/uebung-warm-up/).

Als Gerüst können Sie dieses Snippet in Ihre Datei kopieren:
```python
from cs50 import get_string

if __name__ == "__main__":
    pass  # Ersetzen Sie pass durch Ihren Code
```

`from cs50 import get_string` macht die Funktion `get_string` aus der CS50-Bibliothek verfügbar. Was die Zeile `if __name__ == "__main__":` bewirkt, erklärt das [Short zu Kontrollfluss, Funktionen und Strings](https://dev.inf.zone/lectures/6-python/short-6-2-kontrollfluss-funktionen-strings/).

Die Warm-ups kommen Ihnen bekannt vor: Dieselben Programme haben Sie in [Übung 1](https://dev.inf.zone/exercises/01/) und [Übung 2](https://dev.inf.zone/exercises/02/) schon in C geschrieben.

## Warm-up 1: Ein- und Ausgabe in Python

Erinnern Sie sich noch an die **Hello, It's Me** Aufgabe von [Übung 1](https://dev.inf.zone/exercises/01/hello-me/)?

In dieser Aufgabe implementieren wir dieses Programm in Python. Wie auch in dem C-Programm aus [Übung 1](https://dev.inf.zone/exercises/01/hello-me/) wird der Benutzer nach seinem _Namen_ gefragt und dann eine Begrüßung ausgegeben. Wenn der Name des Benutzers zum Beispiel _Adele_ ist, sollte Ihr Programm `hello, Adele` ausgeben. In Python müssen Sie keinen `\n` am Ende einer Zeile hinzufügen, da die print-Funktion automatisch einen Zeilenumbruch erzeugt.

Nutzen Sie dazu die `get_string`-Funktion der `cs50`-Bibliothek. Mit dieser Funktion können Sie einen `str` von einem Benutzer abfragen. Nutzen Sie anschließend `print`, um einen `str` auszugeben.

Denken Sie daran, dass Sie formatierte Zeichenfolgen in Python erstellen können, indem Sie einer Zeichenfolge `f` voranstellen. Beispielsweise setzt („interpoliert“) `f"{name}"` den Wert der Variable `name` dort ein, wo Sie `{name}` geschrieben haben.

**Schritt für Schritt**

Öffnen Sie VS Code entsprechend Ihrem [Setup](https://dev.inf.zone/extras/setup/).

Führen Sie `cd` in Ihrem Terminalfenster aus. Die Eingabeaufforderung Ihres Terminalfensters sollte wie folgt aussehen:

```bash
$
```

Sie können nun Folgendes ausführen:

```bash
code warmup_aufgaben_10.py
```

um eine Datei namens `warmup_aufgaben_10.py` zu erstellen, in die Sie Ihren Code schreiben können. Achten Sie darauf, dass diese Datei mit `.py` endet und nicht mehr mit `.c`.

**Ausführen des Python-Programms**

Wenn Sie mit dem Programm fertig sind, können Sie es mit folgendem Befehl ausführen:

```bash
python warmup_aufgaben_10.py
```

**Wo zu finden?**

Sollten Sie noch Verständnisprobleme haben, was bei einer solchen Aufgabenstellung generell zu tun ist, kann es hilfreich sein [Übung 1](https://dev.inf.zone/exercises/01/hello-me/) zu wiederholen.
Bei Problemen und Unklarheiten bezüglich der Python Syntax, schauen Sie sich am besten die Notizen aus der [Vorlesung](https://dev.inf.zone/lectures/6-python/) an.

## Warm-up 2: Zahlen einlesen: Bargeld in Python

Mit der `get_string`-Funktion der `cs50`-Bibliothek kann man also einen `str` vom Benutzer abfragen. Nun wollen wir aber einen `float` erhalten. Das ist mit der `get_float`-Funktion, welche ebenfalls aus der `cs50`-Bibliothek stammt, möglich. Im Folgenden wollen wir diese Funktion nutzen. Wir orientieren uns hierfür wieder an einer C-Aufgabe von [Übung 2](https://dev.inf.zone/exercises/02/cash/).

Erinnern Sie sich noch an die **Bargeld** Aufgabe von [Übung 2](https://dev.inf.zone/exercises/02/cash/)? Schauen Sie sich Ihren Code zu dieser Aufgabe am besten nochmal an, bevor Sie fortfahren.

Implementieren Sie nun ein Python-Programm, das den Benutzer fragt, wie viel Wechselgeld er hat, und dann die Mindestmenge an Münzen ausgibt, mit denen das Wechselgeld herausgegeben werden kann. Sie können genauso vorgehen wie in [Übung 2](https://dev.inf.zone/exercises/02/cash/), außer dass Ihr Programm diesmal in Python geschrieben sein soll. Gehen Sie davon aus, dass der Benutzer sein Wechselgeld in Dollar einwirft (z.B. 0.50 Dollar statt 50 Cent).

Gehen Sie dafür wie folgt vor:

1. **Eingabe mit `get_float`:**
    - Verwenden Sie die Funktion `get_float` aus der `cs50`-Bibliothek, um die Eingabe des Benutzers zu erhalten.
    - Die Eingabe soll einen Betrag in Dollar und Cent repräsentieren. Dabei:
      - Muss das Dollarzeichen (`$`) **nicht** eingegeben werden.
      - Beispiele für gültige Eingaben:
        - `9.75` für 9 Dollar und 75 Cent
        - `9` oder `9.00` für genau 9 Dollar
      - Eingaben wie `$9.75` oder `975$` lehnt `get_float` von selbst ab und fragt erneut.
2. **Verarbeitung der Eingabe:**
    - Ihr Programm sollte sicherstellen, dass der Benutzer einen **positiven Betrag** eingibt:
    - Falls der Benutzer einen negativen oder ungültigen Wert eingibt, soll er wiederholt zur Eingabe eines gültigen Betrags aufgefordert werden.
3. **Verwendung von Münzen:**
    - Nehmen Sie an, dass folgende Münzen zur Verfügung stehen:
      - Vierteldollarmünzen (25 ¢)
      - Zehncentstücke (10 ¢)
      - Fünfcentstücke (5 ¢)
      - Eincentstücke (1 ¢)
    - Ihr Programm soll den eingegebenen Betrag so aufteilen, dass die **geringstmögliche Anzahl an Münzen** verwendet wird.

**Testen**

Führen Sie Ihr Programm aus (etwa mit `python warmup_aufgaben_10.py`) und warten Sie auf eine Eingabeaufforderung. Geben Sie nun die folgenden Eingaben ein und prüfen Sie, wie sich Ihr Programm verhält:

- **Test 1**
    - Eingabe: `0.41`
    - Erwartetes Verhalten: `4`
- **Test 2**
    - Eingabe: `0.01`
    - Erwartetes Verhalten: `1`
- **Test 3**
    - Eingabe: `0.15`
    - Erwartetes Verhalten: `2`
- **Test 4**
    - Eingabe: `1.60`
    - Erwartetes Verhalten: `7`
- **Test 5**
    - Eingabe: `23`
    - Erwartetes Verhalten: `92`
- **Test 6**
    - Eingabe: `4.2`
    - Erwartetes Verhalten: `18`
- **Test 7**
    - Eingabe: `-1`
    - Erwartetes Verhalten: Die Eingabe sollte als ungültig abgelehnt werden, und das Programm sollte den Benutzer auffordern, einen anderen Betrag einzugeben.
- **Test 8**
    - Eingabe: `foo`
    - Erwartetes Verhalten: Die Eingabe sollte als ungültig abgelehnt werden, und das Programm sollte den Benutzer auffordern, einen anderen Betrag einzugeben.
- **Test 9**
    - Eingabe: _nichts_ (nur Drücken der Eingabetaste)
    - Erwartetes Verhalten: Die Eingabe sollte als ungültig abgelehnt werden, und das Programm sollte den Benutzer auffordern, einen anderen Betrag einzugeben.

**Wo zu finden?**

Sollten Sie noch Verständnisprobleme haben, was bei einer solchen Aufgabenstellung generell zu tun ist, kann es hilfreich sein [Übung 2](https://dev.inf.zone/exercises/02/cash/) zu wiederholen.
Bei Problemen und Unklarheiten bezüglich der Python Syntax, schauen Sie sich am besten die Notizen aus der [Vorlesung](https://dev.inf.zone/lectures/6-python/) an.
