---
tags: 21_22 Assignments
---
<style>
td {
font-size: 14px
}
th {
font-size: 14px
}
</style>
# Assignment 1: <br/> Grundlegende Programmierkonzepte <br/> (13 Punkte)
Das Ziel dieses Assignments ist es, erste Grundlagen der Python-Programmierung zu üben (Variablen, Datentypen, if-else Statements, for-Loops, und Funktionen). Dabei sollen sowohl das selbstständige Erarbeiten von Code-Beispielen, als auch das eigenständige Testen geübt werden.
## Abgabetermin
Der spätestmögliche Abgabetermin für diese Aufgabe ist der **05.11.2021** (Freitag) um **23:59:59**. Verspätete Abgaben werden **nicht** akzeptiert.
Sie reichen Ihre Abgabe im TeachCenter ein. Mehrfache Abgaben sind erlaubt, Sie können Ihren Code also so oft abgeben, wie Sie möchten. Die letzte Abgabe vor dem Abgabetermin wird benotet; wir haben keinen Zugriff auf frühere Versionen.
## Abgabedatei
Geben Sie folgende `.ipynb`-Datei für Assignment 1 im TeachCenter ab:
* `assignment1.ipynb`: Diese Datei enthält den gesamten Code, den Sie für die Aufgaben 1 bis 4 geschrieben haben. Verwenden Sie als Startpunkt am besten die speziell hierfür bereitgestellte Template-Datei.
Reichen Sie keine anderen Dateien ein. Stellen Sie sicher, dass Sie Python Version ≥3.9 verwenden.
## Comment Header
Jede eingereichte Datei muss einen Comment Header mit den folgenden Informationen am Anfang enthalten:
```python
################################################################################
# Author: Firstname Lastname
# MatNr: 01234567
# File: assignmentX.ipynb
# Description: ... short description of the file ...
# Comments: ... comments for the tutors ...
# ... can be multiline ...
################################################################################
```
## Automatisiertes Testen und Feedback
Zur Bewertung durchläuft Ihr Code ein automatisches Testsystem. Um eine allgemeine Funktionalität Ihres Codes zu garantieren, wird die Möglichkeit von Testruns angeboten. Das Testsystem wird jeden Dienstag für all jene Abgaben ausgeführt, die **jeden Montag bis 18:00 Uhr**, in das TeachCenter hochgeladen wurden. Sie erhalten dann bis Dienstagfrüh (~09:00 Uhr) einen automatisch genierten Testreport per Mail. Eine Anleitung wie man den Testreport im Detail interpretiert, finden Sie unter [diesem Link](https://hackmd.io/@info-tug/Skd-6JUHF).
Für diesen Testreport werden nur jene Funktionen berücksichtigt, die im Assignment gefordert sind, nicht die Funktionen, die Sie gegebenenfalls selbst hinzugefügt haben. Insbesondere ist zu beachten, dass in diesem Test-Run nicht alle Testcases enthalten sind, welche zur finalen Benotung herangezogen werden. Wenn ihr Code diese simplen Tests besteht, heißt das nicht, dass Sie auch alle Punkte auf das Assignment erreichen würden. **Daher ist zu beachten, dass Sie Ihren Code trotzdem selbst testen müssen!** Im zur Verfügung gestellten Template-Notebook gibt es dafür vorgesehene Testzellen.
## Coding Style
Befolgen Sie die in [diesem Dokument](https://hackmd.io/@info/21_style) dargelegten Regeln und Richtlinien.
Für jeden Verstoß gegen den Style Guide werden **0,75 Punkte** von den in den Aufgaben erreichten Punkten abgezogen, bis zu einem **Maximum von 8 Punkten**.
## Erlaubte Module und Python Packages
Für dieses Assignment ist es nicht erlaubt, zusätzliche Module (oder Python-Packages) zu verwenden oder zu importieren.
----
# Aufgaben
## 1. Funktionen (1,5 Punkte)
Funktionen:
https://docs.python.org/3/tutorial/controlflow.html#defining-functions
Numerische Typen (`int`, `float`):
https://docs.python.org/3/library/stdtypes.html#built-in-types
https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex
### 1.1 Eine einfache Funktion
#### Erforderliche Funktion: `say_hello`
* Funktionalität:
Die Funktion gibt Ihren Namen und Ihre Matrikelnummer in folgendem Format aus: `Hello, my name is <name>, and my matriculation number is <matriculation_number>.`
Achten Sie darauf, dass Sie den gleichen Namen und die gleiche Matrikelnummer wie in Ihrem Comment Header verwenden.
Diese Funktion hat keine Parameter oder Rückgabewerte.
### 1.2 Verbrannte Kalorien berechnen
#### Erforderliche Funktion: `met_to_burned_calories_per_minute`
* Funktionalität:
Diese Funktion soll die Menge an Kalorien pro Minute berechnen, die eine Person bei der Ausübung einer bestimmten körperlichen Aktivität verbrennt. Dazu wird das MET (metabolic equivalent of task) verwendet. MET ist das Verhältnis Ihres Energieumsatzes während der Ausübung einer bestimmten körperlichen Aktivität zu Ihrem Ruheumsatz. Um die verbrannten Kalorien pro Minute bei einem bestimmten MET zu berechnen, können Sie folgende Formel verwenden:
$$ calories\_per\_minute = {MET \cdot 3.5 \cdot weight \over 200}$$
* Parameter:
| Name | Datentyp | Beschreibung |
| -------- | -------- | -------- |
| `met` | `float` | Metabolic equivalent of task (MET) |
| `weight` | `float` | Gewicht der Person |
* Return:
| Datentyp | Beschreibung
| -------- | --------
| `float` | Der Kalorienverbrauch pro Minute hängt vom MET der körperlichen Aktivität und dem Gewicht der Person ab.|
## 2. Bedingte Anweisungen (2,5 Punkte)
`if` Statement:
https://docs.python.org/3/tutorial/controlflow.html#if-statements
### 2.1 Informatik BW Note berechnen
Schreiben Sie eine Funktion, die die Informatik BW-Note berechnet und zurückgibt.
#### Erforderliche Funktion: `calculate_informatics_grade`
* Funktionalität:
Diese Funktion berechnet die Note für die Informatik BW Lehrveranstaltung auf der Grundlage der erreichten Punkte und der Aktivitäten eines/einer Studierenden während der Lehrveranstaltung. Wenn Assignment 0 nicht abgegeben wurde, wird der/die Studierende vom Kurs abgemeldet und erhält keine Note. In diesem Fall gibt die Funktion aus: `As you didn't submit Assignment 0, you were deregistered from the course and receive no grade.` und gibt `None` zurück.
Wenn der/die Studierende Assignment 0 abgegeben hat, werden Assignment 1-3 als ernstzunehmender Versuch angenommen und die Note wie folgt berechnet: Zunächst werden die Punkte für den praktischen Teil des Kurses ermittelt. Dazu werden die Punkte der vier Assignments und der Vorprogrammieren-Session addiert. Die Gesamtpunktzahl für den Kurs wird dann durch Addition der Punkte des praktischen Teils und der Punkte der Vorlesungsprüfung berechnet. Die Note ergibt sich dann aus der Gesamtzahl der erreichten Punkte:
| Punkte | Note |
| -------- | -------- |
| > 89 | 1 |
| > 79 | 2 |
| > 63 | 3 |
| > 50 | 4 |
| ≤ 50 | 5 |
Um eine positive Note zu erhalten, muss der/die Studierende zusätzlich **mindestens die Hälfte der Punkte des praktischen Teils der LV als auch der Vorlesungsprüfung** erreichen. Das bedeutet, dass ein/e Studierende mindestens 37,5 Punkte im praktischen Teil der LV **und** mindestens 12,5 Punkte bei der Vorlesungsprüfung erreichen muss, um den Kurs zu bestehen. Wenn der/die Studierende weniger als die Hälfte der Punkte in einem der beiden Teile der Lehrveranstaltung erreicht hat, erhält er/sie die Note "5".
Wenn der/die Studierende eine Note erhalten hat, gibt die Funktion aus: "`You have <total points> total points, and your "Informatik BW" grade is <the grade>!`" und gibt die Note zurück, zum Beispiel: `You have 85 total points, and your "Informatik BW" grade is 2!`
**Anmerkung**: Zur Erinnerung: Die maximale Punktzahl für den praktischen Teil beträgt 75 (davon können 25 in der Vorprogrammieren-Session erreicht werden), die maximale Punktzahl für die Vorlesungsprüfung beträgt 25.
* Parameter:
| Name | Datentyp | Beschreibung |
| -------- | -------- | -------- |
| `is_ass0_submitted` | `bool` | `True` wenn Assignment 0 abgegeben wurde, ansonsten `False`. |
| `ass0_points` | `float` | Die für Assignment 0 erhaltenen Punkte. |
| `ass1_points` | `float` | Die für Assignment 1 erhaltenen Punkte. |
| `ass2_points` | `float` | Die für Assignment 2 erhaltenen Punkte. |
| `ass3_points` | `float` | Die für Assignment 3 erhaltenen Punkte. |
| `vp_points` | `float` | Die in der Vorprogrammieren-Session erhaltenen Punkte. |
| `exam_points` | `float` | Die in der Vorlesungsprüfung erhaltenen Punkte. |
* Return:
| Datentyp | Beschreibung |
| -------- | --------
| `int` or `None` | Die berechnete Note, wenn eine Note vergeben wurde; `None`, wenn der/die Studierende von der Lehrveranstaltung abgemeldet wurde und keine Note erhalten hat.|
## 3. Lists und Schleifen (6 Punkte)
Sequentielle Datentypen (`list`):
https://docs.python.org/3/tutorial/introduction.html#lists
https://docs.python.org/3/tutorial/datastructures.html#more-on-lists
`for` Statement:
https://docs.python.org/3/tutorial/controlflow.html#for-statements
https://docs.python.org/3/reference/compound_stmts.html#the-for-statement
Einige Hinweise zu Schleifen:
https://docs.python.org/3/tutorial/datastructures.html#looping-techniques
Für die folgenden Aufgaben benötigen Sie auch zusätzliche Datentypen:
Text-Sequenztypen (`str`):
https://docs.python.org/3/tutorial/introduction.html#strings
https://docs.python.org/3/library/stdtypes.html#string-methods
### 3.1 Einen Sport in einer Liste ersetzen
<!-- :::warning
Warum kommt hier eine Sportart in der Liste mehrmals vor? Ich hab kein Problem damit, dass wir hier noch Listen (und nicht Sets) nehmen, aber trotzdem versteh ich es nicht ganz hier.
:::
:::warning
Warum genau verbieten wir "for"?
::: -->
Spencer Sportser mag Sport. Er liebt die Vielfalt aller Sportarten sehr, weshalb er jedes Jahr eine Lieblingssportart auswählt und sie in einer `list` speichert.
Leider ist eine Sportart, `old_sport`, aufgrund eines politischen Skandals sehr unbeliebt geworden.
Spencer, der sehr auf seinen Ruf bedacht ist, wagt es nicht, zuzugeben, dass diese Sportart in den letzten Jahren vielleicht einmal seine Lieblingssportart gewesen ist.
Aber Spencer kann die `list` nicht einfach wegwerfen, da sie ihm ein so schöner Begleiter war. So beschließt er, den alten Sport einfach durch einen neuen zu ersetzen.
#### Erforderliche Funktion: `replace_sports`
* Funktionalität:
Schreiben Sie eine Funktion `replace_sports`, die als Parameter Spencers Liste, den Namen der alten Sportart und den Namen der neuen Sportart erhält. Die Funktion soll dann jedes Vorkommen der alten Sportart durch die neue ersetzen. Außerdem soll die neue Liste alphabetisch sortiert werden.
<!-- Spencer entscheidet auch, dass es einfacher ist, jedes Vorkommen einer Sportart zu zählen, wenn er die Liste einfach alphabetisch sortiert. -->
Wenn Spencers Liste zum Beispiel wie folgt aussieht
```python3.9
['soccer',
'baseball',
'baseball',
'soccer',
'basketball',
'baseball',
'soccer']
```
und`"soccer"` der `old_sport` und `"curling"` der `new_sport` ist, soll die zurückgegebende Liste wie folgt aussehen:
```python3.9
['baseball',
'baseball',
'baseball',
'basketball',
'curling',
'curling',
'curling']
```
<!-- **Wichtig:** Sie dürfen keine Schleifen (wie `for`- oder `while`-Schleifen) oder rekursive Funktionsaufrufe verwenden. Sehen Sie sich die `list`-Methoden in der Python-Dokumentation an. Sortieren Sie Spencers `list` außerdem alphabetisch! -->
* Parameter:
| Name | Datentyp | Beschreibung |
| -------- | -------- | -------- |
| `sports` | `list` | Eine Liste mit Sportarten. |
| `old_sport` | `str` | Die alte Sportart. |
| `new_sport` | `str` | Die neue Sportart, die die alte Sportart ersetzen soll. |
* Return:
| Datentyp | Beschreibung |
| -------- | --------
| `list` | Eine aktualisierte und alphabetisch sortierte Liste, in der die alte Sportart (`old_sport`) durch die neue Sportart (`new_sport`) ersetzt wurde.|
### 3.2 Formel-1 Team buchstabieren
Margaretha, eine Kollegin von Ihnen, prahlt mit ihrem Wissen über den Motorsport, insbesondere damit, dass sie sich für die Formel 1 begeistert. Sie nennt alle Motorsportteams, die sie kennt, aber es gibt noch viele mehr! Wenn es ein Team gibt, welches sie nicht kennt, buchstabieren Sie es ihr, damit sie sich beim nächsten Mal daran erinnern kann.
#### Erforderliche Funktion: `spell_formula_one_teams`
* Funktionsweise:
Schreiben Sie eine Funktion `spell_formula_one_teams`, die alle für Margaretha bekannten und unbekannten Teams ausgibt.
Wenn ein Team nicht bekannt ist, sollte die Ausgabe wie folgt aussehen:
```
Team 1 is called Williams, which is spelled:
W
i
l
l
i
a
m
s
Team 2 is called Haas, which is spelled:
H
a
a
s
```
Wenn sie ein Team kennt, sollte es wie folgt aussehen:
```
Team 3 is McLaren and Margaretha knows this team.
```
Vergessen Sie nicht, den Schleifenindex für die Nummerierung der Teams hinzuzufügen!
* Parameter
|Name |Datentyp |Beschreibung|
| -------- | -------- | -------- |
|`known_teams` |`list`|Eine Liste der Formel 1-Teams, die Margaretha kennt.
|`formula_one_teams` |`list` |Eine Liste aller Formel-1-Teams, die es gibt.|
Diese Funktion hat keine Rückgabewerte.
## 4. String Operationen (3 Punkte)
Text Sequence Type (`str`):
https://docs.python.org/3/tutorial/introduction.html#strings
https://docs.python.org/3/library/stdtypes.html#string-methods
### 4.1 Schwimmabzeichen in Bronze
Um das Jugendschwimmabzeichen in Bronze zu bestehen, müssen Schwimmer\*innen eine Strecke von `200` Metern in weniger als`15` Minuten schwimmen. Im Sommer waren Sie als Schwimmlehrer\*in tätig und haben die 200-Meter-Zeiten von Teilnehmenden eines Schwimmkurses gemessen. Leider konnten Sie sich während der Zeitmessung nur kurze, schlecht formatierte Notizen machen. Jetzt möchten Sie diese Notizen weiterverarbeiten und den Teilnehmenden mitteilen, ob sie das Jugendschwimmabzeichen in Bronze erhalten oder nicht.
#### Erforderliche Funktion: `swimming_bronze_badge`
* Funktionalität
Schreiben Sie eine Funktion `swimming_bronze_badge`, welche die unformatierten Notizen zu den Zeitmessungen verarbeitet und als formatierte Informationen ausgibt.
Die unformatierten Notizen über die 200-Meter-Zeiten der Teilnehmenden werden bereits im Notebook als String im folgenden Format bereitgestellt: `<Vorname>_<Nachname>(<Minuten>:<Sekunden>), ... `. Die Schwimmer\*innen werden durch ein Komma gefolgt von einem Leerzeichen getrennt.
Wenn die Zeit der Teilnehmenden unter der 15-Minuten-Marke liegt, sollen die Ausgaben **genau** folgendem Format entsprechen (achten Sie außerdem darauf, **am Ende einen Zeilenumbruch hinzuzufügen!**):
```
CONGRATULATIONS to
<first_name> <surname>
for earning the junior's swimming badge in bronze with an unbelievable time of
<minutes> minutes and <seconds> seconds in the 200 metres swim!
```
Sollten Schwimmer\*innen mehr als die vorgegebenen `15`Minuten benötigen, sollen die Ausgaben **genau** folgendem Format entsprechen (auch hier **soll am Ende ein Zeilenumbruch stehen**):
```
Thank you <first_name> <surname>
for participating in the 200 metres swim with a time of
<minutes> minutes and <seconds> seconds! Good luck next time!
```
Vornamen müssen mit einem **großen** Anfangsbuchstaben geschrieben werden, gefolgt von **Kleinbuchstaben**, z. B. `Caroline`.
Nachnamen müssen in **Großbuchstaben** geschrieben werden, z. B. `ILLGOUTZ`.
Wenn alles wie beabsichtigt funktioniert, soll mit dem folgenden Beispielstring (welcher den erwähnten unformatierten Notizen entspricht):
```python=3.9
participants = "caroline_illgoutz(15:04), jurin_Smurli(12:45)"
```
... folgender formatierter Output erzeugt werden:
```
Thank you Caroline ILLGOUTZ
for participating in the 200 metres swim with a time of
15 minutes and 04 seconds! Good luck next time!
CONGRATULATIONS to
Jurin SMURLI
for earning the junior's swimming badge in bronze with an unbelievable time of
12 minutes and 45 seconds in the 200 metres swim!
```
* Parameter:
| Name | Datentyp | Beschreibung |
| -------- | -------- | -------- |
| `participants` | `str` | Alle Schwimmer\*innen, die am Bronzeabzeichen teilnehmen. |
Diese Funktion hat keine Rückgabewerte.