<jupyter_start><jupyter_text>Programmierung für KI Winterersemester 2021/22Prof. Dr. <NAME> / Prof. Dr. <NAME> Im folgenden entwickeln wir eine Software zur Personalverwaltung. Die einzelnen Aufgaben bauen aufeinander auf und sollten in der aufgelisteten Reihenfolge bearbeitet werden. **Übung 1** Definieren Sie eine Klasse `Mitarbeiter`. Ein Mitarbeiter besitzt einen Vornamen (`first_name`), einen Nachnamen (`last_name`) und eine Adresse (`address`). Fügen Sie zugehörige getter und setter, sowie einen Konstruktor für die Attribute hinzu.<jupyter_code>class Mitarbeiter:
    # YOUR CODE HERE
    raise NotImplementedError()
"""Tests für Mitarbeiter"""
from nose.tools import assert_equal

arbeiter = Mitarbeiter("Max", "Mustermann", "Musterstraße 3, Iserlohn")

"""Test Konstruktor"""
assert_equal("Max", arbeiter.first_name, "Der Konstruktor weißt den Vornamen nicht richtig zu, oder es existiert kein korreker Getter.")
assert_equal("Mustermann", arbeiter.last_name, "Der Konstrukor weißt den Nachnamen nicht richtig zu, oder es existiert kein korreker Getter.")
assert_equal("Musterstraße 3, Iserlohn", arbeiter.address, "Der Konstruktor weißt die Adresse nicht richtig zu, oder es existiert kein korreker Getter.")

arbeiter.first_name = "Ursula"
arbeiter.last_name = "Musterfrau"
arbeiter.address = "Musterplatz 3, Iserlohn"

assert_equal("Ursula", arbeiter.first_name, "Der Setter weißt den Vornamen nicht richtig zu.")
assert_equal("Musterfrau", arbeiter.last_name, "Der Setter weißt den Nachnamen nicht richtig zu.")
assert_equal("Musterplatz 3, Iserlohn", arbeiter.address, "Der Setter weißt die Adresse nicht richtig zu.")<jupyter_output><empty_output><jupyter_text>**Übung 2** Definieren Sie eine Klasse `Freier_Mitarbeiter`. Sie soll die Eigenschaften der Klasse `Mitarbeiter` erben und um ein Attribut Stundenlohn (`stundenlohn`) erweitert werden. Fügen Sie einen Konstruktor für alle Attribute hinzu (Achtung: auf Vererbung achten!).<jupyter_code>class Freier_Mitarbeiter(Mitarbeiter):
    # YOUR CODE HERE
    raise NotImplementedError()
"""Tests für Freier_Mitarbeiter"""
from nose.tools import assert_equal

freier_arbeiter = Freier_Mitarbeiter("Max", "Mustermann", "Musterstraße 3, Iserlohn", 100.00)

"""Konstruktor Test"""
assert_equal(100.00, freier_arbeiter.stundenlohn, "Der Konstruktor weißt den Stundenlohn falsch zu, oder es existiert kein korrekter Getter.")

freier_arbeiter.stundenlohn = 200.0
assert_equal(200.00, freier_arbeiter.stundenlohn, "Der Setter weißt den Stundenlohn falsch zu.")<jupyter_output><empty_output><jupyter_text>**Übung 3** Definieren Sie eine Klasse `Personaldatenbank`. Eine Personaldatenbank besitzt *eine* Liste aller *Mitarbeiter* und *Freien-Mitarbeiter* (`Personalliste`). Schreiben Sie Funktionen, die es erlauben einen Mitarbeiter (oder Freien-Mitarbeiter) der Liste hinzuzufügen (`add_mitarbeiter`) und zu entfernen (`remove_mitarbeiter`). Den Funktionen soll das hinzuzufügende/zu entfernende  Objekt als Parameter übergeben werden.Schreiben Sie eine Funktion die aus der *Personalliste* eine Liste von Freien-Mitarbeitern (`freie_mitarbeiter`) zurück gibt.Schreiben Sie eine Funktion (`count_mitarbeiter`), die zählt wie viele Mitarbeiter in der Personaldatenbank registriert sind. Ziehen Sie jedoch die Anzahl der Freien-Mitarbeiter davon ab, da diese nicht direkt dem Unternehmen zugehörig sind. Geben Sie das Ergebnis zurück.Schreiben Sie eine Funktion (`daily_costs`), die berechnet wie viel Geld das Unternehmen für alle Freie-Mitarbeiter an einem Arbeitstag mit 8 Stunden insgesamt bezahlt. Nutzen Sie den Stundenlohn der freien Mitarbeiter. Geben Sie das Ergebnis zurück.**Achtung bei den Tests kann es zu Fehlern aufgrund von Speicherdaten aus dem vorherrigen Durchlauf kommen. Führen Sie, um die Fehler zu beheben, den Codeblock unten erneut aus oder starten Sie den Kernel neu und löschen Sie den Output.**<jupyter_code>class Personaldatenbank:
   
    # YOUR CODE HERE
    raise NotImplementedError()
"""Tests für die Personaldatenbank"""
from nose.tools import assert_equal

m1 = Mitarbeiter("Max", "Mustermann", "Kreisstraße 1, Iserlohn")
m2 = Mitarbeiter("Wilfred", "Meier", "Hauptstraße 2, Dortmund")
m3 = Mitarbeiter("Marianne", "Müller", "Zur alten Post 3, Hagen")

f1 = Freier_Mitarbeiter("Eva", "Fabel", "Friedensstraße 4, Essen", 45.4)
f2 = Freier_Mitarbeiter("Michelle", "Krone", "Wendeplatz 5, Bochum", 98.2)
f3 = Freier_Mitarbeiter("Leon", "Mustermann", "Lampenweg 6, Düsseldorf", 34.7)

datenbank = Personaldatenbank()

# Mitarbeiter hinzugefügen prüfen
datenbank.add_mitarbeiter(m1)
datenbank.add_mitarbeiter(m2)
datenbank.add_mitarbeiter(m3)
datenbank.add_mitarbeiter(f1)
datenbank.add_mitarbeiter(f2)
datenbank.add_mitarbeiter(f3)

assert_equal(3, len(datenbank.freie_mitarbeiter()), "Da Stimmt etwas beim Hinzufügen der Mitarbeiter oder in der Funktion get_freie_mitarbeiter nicht.")
assert_equal(3, datenbank.count_mitarbeiter(), "Da Stimmt etwas in der Funktion count_mitarbeiter nicht.")

# daily_costs prüfen
assert_equal(1426.4, datenbank.daily_costs(), "Die täglichen Kosten der freien Mitarbeiter werden falsch berechnet.")

# Mitarbeiter entfernen prüfen
datenbank.remove_mitarbeiter(f1)
assert_equal(2, len(datenbank.freie_mitarbeiter()), "Da Stimmt etwas beim entfernen eines Mitarbeiters nicht.")<jupyter_output><empty_output><jupyter_text>**Übung 4** Für ein Tochterunternehmen soll die Personaldatenbank angepasst werden. Neben Mitarbeitern sollen auch Arbeitsplätze verwaltet werden können.Implementieren Sie dazu eine Klasse `Workplace` mit den Eigenschaften Standort (`location`) und Mitarbeiter (`mitarbeiter`). Definieren Sie zudem passende Getter und Setter, sowie einen Konstruktor für die Eigenschaften.<jupyter_code>class Workplace:
    
    # YOUR CODE HERE
    raise NotImplementedError()
from nose.tools import assert_equal

m = Mitarbeiter("Max", "Mustermann", "<NAME>, Iserlohn")
w = Workplace("Hauptgebäude", m)

#Konstruktor testen
assert_equal(m, w.mitarbeiter, "Fehler im Konstruktor oder im Getter für Mitarbeiter")
assert_equal("Hauptgebäude", w.location, "Fehler im Konstruktor oder im Getter für Location")

w.location = "Nebengebäude"
m2 = Mitarbeiter("Max", "Mustermann", "Kreisstraße 1, Iserlohn")
w.mitarbeiter = m2

assert_equal(m2, w.mitarbeiter, "Fehler im Setter für Mitarbeiter")
assert_equal("Nebengebäude", w.location, "Fehler im Setter für Location")<jupyter_output><empty_output><jupyter_text>**Übung 5** Implementieren Sie eine Klasse `Unternehmensdatenbank`, welche von der *Personaldatenbank* erbt und zusätzlich eine Arbeitsplatz-Liste (`workplace_list`) führt. Definieren Sie für die Liste jeweils eine Funktion zum Hinzufügen (`add_workplace`) und zum entfernen (`remove_workplace`) eines Arbeitsplatzes. Überprüfen Sie beim hinzufügen eines Arbeitsplatzes, *ob der Mitarbeiter der Personaldatenbank bekannt ist*. Geben Sie `Der Mitarbeiter muss der Datenbank bekannt sein` zurück, wenn der Mitarbeiter unbekannt ist, fügen Sie ansonsten den Arbeitsplatz hinzu. Überschreiben Sie zudem Funktion `daily_costs`, sodass eine Stundenanzahl ansteller des Standartwerts von 8 Stunden verwendet wird.**Achtung bei den Tests kann es zu Fehlern aufgrund von Speicherdaten aus dem vorherrigen Durchlauf kommen. Führen Sie, um die Fehler zu beheben, den Codeblock unten erneut aus oder starten Sie den Kernel neu und löschen Sie den Output.**<jupyter_code>class Unternehmensdatenbank(Personaldatenbank):
    
    # YOUR CODE HERE
    raise NotImplementedError()
from nose.tools import assert_equal

u = Unternehmensdatenbank()
m = Mitarbeiter("Max", "Mustermann", "Kreisstraße 1, Iserlohn")
w = Workplace("Hauptgebäude", m)

# Test add_workplace ohne Mitarbeiter
assert_equal("Der Mitarbeiter muss der Datenbank bekannt sein", u.add_workplace(w))

# Test add_workplace mit Mitarbeiter
u.add_mitarbeiter(m)
assert_equal(None, u.add_workplace(w))

# Test remove_workplace
assert_equal(None, u.remove_workplace(w))

# Test daily_costs mit halben Arbeitstag (4 Stunden)
f1 = Freier_Mitarbeiter("Eva", "Fabel", "Friedensstraße 4, Essen", 45.4)
u.add_mitarbeiter(f1)
assert_equal(181.6, u.daily_costs(4))
u.remove_mitarbeiter(f1)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0869140625, 'fraction_numerical': 0.0111083984375, 'mean_word_length': 6.765876777251185, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 24, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '232471', 'license': 'MIT', 'n_tokens_mistral': 2939, 'n_tokens_neox': 2917, 'n_words': 834, 'path': 'u5/15a-personalverwaltung.ipynb', 'repo_name': 'fhswf/pki', 'size': '8212'}