From d59ec6069be4abf8c8df366e5f4641108638aada Mon Sep 17 00:00:00 2001 From: Christopher Arndt Date: Mon, 6 May 2024 00:43:13 +0200 Subject: [PATCH] Add uebungen for day 1 Signed-off-by: Christopher Arndt --- uebungen/dateien.md | 147 +++++++++++++++++++++++++++++++++++ uebungen/dictonaries.md | 93 ++++++++++++++++++++++ uebungen/employee_skills.txt | 8 ++ uebungen/job_skills.txt | 5 ++ uebungen/salaries-errors.txt | 10 +++ uebungen/salaries.txt | 8 ++ uebungen/sets.md | 83 ++++++++++++++++++++ 7 files changed, 354 insertions(+) create mode 100644 uebungen/dateien.md create mode 100644 uebungen/dictonaries.md create mode 100644 uebungen/employee_skills.txt create mode 100644 uebungen/job_skills.txt create mode 100644 uebungen/salaries-errors.txt create mode 100644 uebungen/salaries.txt create mode 100644 uebungen/sets.md diff --git a/uebungen/dateien.md b/uebungen/dateien.md new file mode 100644 index 0000000..19d0588 --- /dev/null +++ b/uebungen/dateien.md @@ -0,0 +1,147 @@ +# Übungen zu Dateine (Teil 1) + + +## Ausgangslage + +Im Ordner `uebungen` sind folgende Textdateien mit Mitarbeiter- und +Planstellendaten vorhanden: + +* `employee_skills.txt` +* `job_skills.txt` +* `salaries.txt` +* `salaries-errors.txt` + +Jede dieser Dateien enthält einen Datensatz pro Zeile. Jede Zeile ist +nach folgendem Schema aufgebaut: + +* Name +* Doppelpunkt +* Whitespace (ein oder mehrere Leerzeichen) +* Daten + +Das Format des Datenfelds unterscheidet sich je nach Datei. + + +Aufgabe 1: + +Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die gesamte +Datei in einen String ein. + +Wieviele Bytes ist der Dateihalt lang? + + +Aufgabe 3: + +Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei +zeilenweise ein. + +Wieviele Zeilen mit Daten enhält die Datei? Zeilen, die *nur* Whitespace +(Leerzeichen, CR, LF, Tabs, etc.) enthalten, werden nicht gezählt. + + +Aufgabe 3: + +Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei +zeilenweise ein. Parsen Sie den Namen des Mitarbeiters aus jeder Datenzeile und +fügen Sie ihn zu einer Liste hinzu. + +Geben Sie die Liste der Namen der Mitarbeiter alphabetisch sortiert, ein Name +pro Zeile, aus. + + +Tipp: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile. + + +Aufgabe 4: + +Öffnen Sie die Datei `salaries.txt` zum Lesen und lesen Sie die Datei +zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus +jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen +des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte +jeweils in einen Integerwert umgewandelt werden. + +Geben Sie das höchste, sowie das niedrigste Gehalt aus. + + +Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und +die Funktion `int()` zum Umwandeln des Gehaltwerts. + +Tipp 2: verwenden Sie die `min()` und `max()` Funktionen und wenden sie jeweils +auf alle Werte des Dictionaries auf einmal an. + + +Aufgabe 5: + +Öffnen Sie die Datei `employee_skills.txt` zum Lesen und lesen Sie die Datei +zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie die Liste der +Skills aus jeder Datenzeile und speichern die Daten in einem Dictionary mit dem +Namen des Mitarbeiters als Key und der Liste der Skills als Wert. Die Liste der +Skills für jeden Mitarbeiter sollte jeweils in eine Liste von Strings (ein +Element pro Skill) umgewandelt werden. + +Tipp 1: verwenden Sie die String-Methode `split()` zum Parsen jeder Zeile und +nochmals zum Parsen der Liste der Skills. Dabei müssen jeweils unterschiedliche +Trennzeichen verwendet werden. + + +Aufgabe 6: + +Kombinieren Sie die Programme aus Aufgabe 4 und 5 und kombinieren Sie die +beiden Dictionaries, die Sie aus den Daten erstellt haben. + +Speichern Sie dabei das Gehalt und die Skills jedes Mitarbeiters jeweils +zusammen in einem Dictionary mit folgendem Format: + +```py +employee_data = { + "salary": ..., # integer + "skills": [...], # list of strings +} +``` + +Speichern Sie alle Daten in einem Dictionary mit dem Namen des Mitarbeiters +als Key und dem `employee_data` Dictionary als Wert. Dadurch ergibt sich +folgende geschachtelte Datenstruktur: + +```py +employees = { + "name 1": { + "salary": ..., + "skills": [...], + }, + "name 2": { + "salary": ..., + "skills": [...], + }, + ... +} +``` + + +Aufgabe 7: + +Diese Aufgabe ist ähnlich wie Aufgabe 4, die einzulesende Datei enthält jedoch +mehrere Fehler, die Sie abfangen und behandeln müssen. + +Öffnen Sie die Datei `salaries-errors.txt` zum Lesen und lesen Sie die Datei +zeilenweise ein. Parsen Sie den Namen des Mitarbeiters sowie das Gehalt aus +jeder Datenzeile und speichern die Daten in einem Dictionary mit dem Namen +des Mitarbeiters als Key und dem Gehalt als Wert. Der Gehaltswert sollte +jeweils in einen Integerwert umgewandelt werden. + +Die Datei enthält folgende Fehler: + +* Manche Zeilen sind auskommentiert (d.h. sie starten mit einem Hash (`#`). + dise Zeilen sollen ignoriert werden, d.h. sie werden nicht in den Daten + gespeichert. +* Bei manchen Zeilen fehlt der trennende Doppelpunkt zwischen dem Namen und + dem Gehalt. Fangen Sie diesen Fehler beim Parsen der Zeile ab und + ignorieren Sie entweder die Zeile oder versuchen Sie sie erneut mit einer + anderen Methode zu parsen. +* Bei manchen Mitarbeitern ist das Gehalt mit einem Währungssymbol angegeben. + Fangen Sie den Fehler beim Umwandeln des Gehaltwerts in einen Integer ab und + ignorieren Sie entweder die Zeile oder entfernen Sie das Währungssymbol vor + dem Parsen. + + +Geben Sie das höchste, sowie das niedrigste Gehalt aus. diff --git a/uebungen/dictonaries.md b/uebungen/dictonaries.md new file mode 100644 index 0000000..fe15a95 --- /dev/null +++ b/uebungen/dictonaries.md @@ -0,0 +1,93 @@ +# Übungen zu Dictionaries + + +## Ausgangslage + +Sie haben zwei Tabellen mit Personallisten jeweils mit Namen und Monatsgehältern +als ein Python-Dictionary. Die Keys sind die Namen der Angestellten (strings), +die Werte das jeweilige Monatsgehalt (integer): + +```py +salaries_1 = {'Anna': 2000, 'Mark': 3000, 'Judith': 3500, 'Thomas': 2500} +salaries_2 = {'Barbara': 3000, 'Elke': 3300, 'Michael': 2800, 'Johann': 2000} +``` + + +## Aufgabe 1: + +Schreiben Sie ein Programm, das die beiden Dictionaries in einem neuen +Dictionary (`salaries_all`) zusammenführt und die Namen aller Mitarbeiter +als Liste ausgibt. + +Tipp: Machen Sie zunächst eine Kopie des ersten Dictionaries (`dict.copy()`) +und fügen Sie dann die Einträge des zweiten Dictionaries der Kopie hinzu +(`dict.update()`). + + +## Aufgabe 2: + +Schreiben Sie ein Programm, das den Namen und das Gehalt des Mitarbeiters mit +dem höchsten Gehalt aus den gesamten Daten ermittelt und diese ausgibt (mit +`print`). + + +## Aufgabe 3: + +Schreiben Sie ein Programm, das die Gesamtsumme aller monatlichen Gehälter +ermittelt und diese ausgibt. + + +## Aufgabe 4: + +Schreiben Sie ein Programm, das das Gehalt aller Mitarbeiter um 10% erhöht und +diese Daten in einem *neuen* Dictionary mit der selben Struktur speichert. Das +ursprüngliche Dictionary soll nicht verändert werden. + + +## Aufgabe 5: + +Lassen Sie das Program dieses neue Dictionary in folgendem Format ausgeben: + +``` +Name Gehalt +-------------- +Anna ??? +Mark ??? +... +``` + +Tipp: verwenden Sie die Escape-Sequenz für Tabulatoren `\t`. + + +## Aufgabe 6: + + +Lassen Sie das Programm die alten Gehälter in der gleichen Form ausgeben, +um zu zeigen, dass das ursprüngliche Dictionary nicht verändert wurde. + + +## Bonusaufgaben: + +1. Sortieren Sie die Liste nach Höhe des Gehalts (absteigend). + + Tipp: verwenden Sie die Funktion `sorted()` zum Sortieren. + +2. Nummerieren Sie die Listeneinträge in der Ausgabe, startend mit 1. + +3. Ermitteln Sie das durchschnittliche Gehalt nach der Erhöhung. + +4. Berechnen Sie, wieviel Prozent des durchschnitlichen Gehalts jeder Mitarbeiter + verdient und geben diese Prozentzahl in einer zusätzlichen Spalte aus. + + Tipp: Sie können die Prozentzahlen in einem neuen, zusätzlichen Dictionary + speichern oder, anstatt nur dem Gehalt, für jeden Mitarbeiter das Gehalt und + die Prozent des Durchschnittsverdienstes als Tuple mit zwei Elementen als + Wert im Dictionary ablegen. + + +## Ressourcen + +Hilfe zu Dictionaries: + +* +* diff --git a/uebungen/employee_skills.txt b/uebungen/employee_skills.txt new file mode 100644 index 0000000..919400d --- /dev/null +++ b/uebungen/employee_skills.txt @@ -0,0 +1,8 @@ +Anna: buchhaltung,management,marketing +Mark: management,marketing +Judith: management,buchhaltung,human resources +Thomas: software development,it support +Barbara: software development,management +Elke: management,buchhaltung,it support +Michael: software development,buchhaltung +Johann: it support,software development diff --git a/uebungen/job_skills.txt b/uebungen/job_skills.txt new file mode 100644 index 0000000..fd14d73 --- /dev/null +++ b/uebungen/job_skills.txt @@ -0,0 +1,5 @@ +office manager: management,buchhaltung +ceo: management,human resources +developer: software development +cto: software development,system design,human resources +support desk: it support diff --git a/uebungen/salaries-errors.txt b/uebungen/salaries-errors.txt new file mode 100644 index 0000000..0f94eb7 --- /dev/null +++ b/uebungen/salaries-errors.txt @@ -0,0 +1,10 @@ +Anna: 2000 +Mark: 3000$ +# Gekündigt: +# Margrit: 4000 +Judith: 3500€ +Thomas 2500 +Barbara: 3000€ +Elke: 3300 +Michael: 2800€ +Johann: 2000 diff --git a/uebungen/salaries.txt b/uebungen/salaries.txt new file mode 100644 index 0000000..63fe638 --- /dev/null +++ b/uebungen/salaries.txt @@ -0,0 +1,8 @@ +Anna: 2000 +Mark: 3000 +Judith: 3500 +Thomas: 2500 +Barbara: 3000 +Elke: 3300 +Michael: 2800 +Johann: 2000 diff --git a/uebungen/sets.md b/uebungen/sets.md new file mode 100644 index 0000000..3509450 --- /dev/null +++ b/uebungen/sets.md @@ -0,0 +1,83 @@ +# Übungen zu Sets + + +## Ausgangslage + +Sie haben eine Liste mit Mitarbeitern und ihren Skills sowie eine Liste +von Planstellen im Betrieb mit erforderlichen Skills: + +```py +employee_skills = { + 'Anna': ("buchhaltung", "management", "marketing"), + 'Mark': ("management", "marketing"), + 'Judith': ("management", "buchhaltung", "human resources"), + 'Thomas': ("software development", "it support"), + 'Barbara': ("software development", "management"), + 'Elke': ("management", "buchhaltung", "it support"), + 'Michael': ("software development", "buchhaltung"), + 'Johann': ("it support", "software development"), +} + +job_skills = { + "office manager": ("management", "buchhaltung"), + "ceo": ("management", "human resources"), + "developer": ("software development",), + "cto": ("software development", "system design", "human resources"), + "support desk": ("it support",), +} +``` + + +## Aufgabe 1: + +Schreiben Sie ein Programm, das ermittelt, welche Menge an Skills bei den +Mitarbeitern insgesamt vorhanden sind. Jeder Skill wird nur einmal +berücksichtigt. + +Verwenden Sie zum Speichern ein Set und geben Sie den Inhalt diese Sets aus. +Wieviele unterschiedliche Skills sind vorhanden? + + +## Aufgabe 2: + +Schreiben Sie ein Programm, das ermittelt, welche Menge an Skills benötigt +werden, um die Anforderungen für alle Planstellen zu erfüllen. + +Verwenden Sie zum Speichern ein Set und geben Sie den Inhalt diese Sets aus. +Wieviele unterschiedliche Skills werden insgesamt benötigt? + + +## Aufgabe 3: + +Schreiben Sie ein Programm, das die beiden Sets aus Aufgabe 1 und 2 vergleicht +und feststellt, welche Skills im Mitabeiterstamm fehlen. + + +## Aufgabe 3: + +Schreiben Sie ein Programm, das die beiden Sets aus Aufgabe 1 und 2 vergleicht +und feststellt, welche vorhandene Skills der Mitarbeiter von keiner Planstelle +abgedeckt werden. + + +## Aufgabe 4: + +Schreiben Sie ein Programm, das für jede Planstelle herausfindet, welche +Mitarbeiter die notwendigen Skills für die Stelle besitzen. + +Speichern Sie das Ergebnis in einem Dictionary der Form: + +```py +candidates = { + "job 1": ("name 1", "name 2", ...), + "job 2: ("name 1", "name 3", ...), + ... +} +``` + + +## Ressourcen + +Hilfe zu Dictionaries: + +*