diff --git a/EnumRechenOperationen/EnumRechenOperationen.csproj b/EnumRechenOperationen/EnumRechenOperationen.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..206b89a9a8b9320db4b017a262b565f104489193
--- /dev/null
+++ b/EnumRechenOperationen/EnumRechenOperationen.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/EnumRechenOperationen/RechenOperationen.cs b/EnumRechenOperationen/RechenOperationen.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c358a34be11658e62dea8159ee26a1b504de29aa
--- /dev/null
+++ b/EnumRechenOperationen/RechenOperationen.cs
@@ -0,0 +1,37 @@
+namespace Uebung;
+
+enum Operation { Add, Sub, Mult, Div }
+
+class Program
+{
+    static double Berechne(Operation op, double x, double y)
+    {
+        double ergebnis;
+
+        switch (op)
+        {
+            case Operation.Add:
+                ergebnis = x + y;
+                break;
+            case Operation.Sub:
+                ergebnis = x - y;
+                break;
+            case Operation.Mult:
+                ergebnis = x * y;
+                break;
+            default: // Operator.Div:
+                ergebnis = x / y;
+                break;
+        }
+
+        return ergebnis;
+    }
+
+    static void Main(string[] args)
+    {
+        Console.WriteLine($"Berechne(Add, 5, 4) = {Berechne(Operation.Add, 5, 4)}");
+        Console.WriteLine($"Berechne(Sub, 5, 4) = {Berechne(Operation.Sub, 5, 4)}");
+        Console.WriteLine($"Berechne(Mult, 5, 4) = {Berechne(Operation.Mult, 5, 4)}");
+        Console.WriteLine($"Berechne(Div, 5, 4) = {Berechne(Operation.Div, 5, 4)}");
+    }
+}
diff --git a/MagischesQuadrat/MagischesQuadrat.cs b/MagischesQuadrat/MagischesQuadrat.cs
new file mode 100644
index 0000000000000000000000000000000000000000..611fbe21754401afc23d5ddc39cda3720b003325
--- /dev/null
+++ b/MagischesQuadrat/MagischesQuadrat.cs
@@ -0,0 +1,31 @@
+
+static bool MagicQuadrat(int[,] a)
+{
+    if (a.GetLength(0) != a.GetLength(1))
+        return false;
+
+    int diagSum = 0;
+    for (int i = 0; i < a.GetLength(0); i++)
+        diagSum += a[i, i];
+
+    for (int i = 0; i < a.GetLength(0); i++)
+    {
+        int rowSum = 0;
+        for (int j = 0; j < a.GetLength(1); j++)
+            rowSum += a[i, j];
+
+        if (diagSum != rowSum)
+            return false;
+
+    }
+
+    return true;
+}
+
+int[,] testArray1 = { { 8, 1, 6 }, { 3, 5, 7 }, { 4, 9, 2 } };
+int[,] testArray2 = { { 8, 1, 6 }, { 3, 5, 7 }, { 4, 9, 3 } };
+int[,] testArray3 = { { 8, 1, 6 }, { 3, 5, 7 } };
+
+Console.WriteLine(MagicQuadrat(testArray1));
+Console.WriteLine(MagicQuadrat(testArray2));
+Console.WriteLine(MagicQuadrat(testArray3));
diff --git a/MagischesQuadrat/MagischesQuadrat.csproj b/MagischesQuadrat/MagischesQuadrat.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..206b89a9a8b9320db4b017a262b565f104489193
--- /dev/null
+++ b/MagischesQuadrat/MagischesQuadrat.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/Millionaer/Millionaer.csproj b/Millionaer/Millionaer.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..206b89a9a8b9320db4b017a262b565f104489193
--- /dev/null
+++ b/Millionaer/Millionaer.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/Millionaer/Program.cs b/Millionaer/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..efc764b8c4a4171fb83c98756d40c240961e7393
--- /dev/null
+++ b/Millionaer/Program.cs
@@ -0,0 +1,16 @@
+static int Millionaer(double betrag, double zins)
+{
+    int jahre = 0;
+
+    while (betrag < 1000000)
+    {
+        betrag += betrag * (zins/100);
+        jahre++;
+        // Debug-Ausgabe
+        Console.WriteLine($"Betrag nach {jahre} Jahren: {betrag:f2}");
+    }
+
+    return jahre;
+}
+
+Console.WriteLine(Millionaer(1000, 3));
diff --git a/PersonAbteilung/Abteilung.cs b/PersonAbteilung/Abteilung.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e1aa26a65f8e0cdfbff20be30acedf2bd4bd59e6
--- /dev/null
+++ b/PersonAbteilung/Abteilung.cs
@@ -0,0 +1,69 @@
+// Klasse Abteilung
+namespace Uebung12;
+
+class Abteilung
+{
+    string name; // Name der Abteilung
+    Person[] mitarbeiter; // Array mit Mitarbeitern
+
+    // Parameter Konstruktor
+    public Abteilung(string name, params Person[] mitarbeiter)
+    {
+        this.name = name;
+        this.mitarbeiter = mitarbeiter;
+    }
+
+    // Konstruktor für Erzeugung aus Datei
+    public Abteilung(string dateiname)
+    {
+        StreamReader sr = new StreamReader(dateiname);
+
+        // Abteilungsnamen einlesen
+        string? zeile = sr.ReadLine() ?? "";
+        string[] daten = zeile.Split(':');
+        this.name = daten[0].Trim();
+
+        // Mitarbeiterfeld anlegen
+        int anzahl = Convert.ToInt32(daten[1]);
+        this.mitarbeiter = new Person[anzahl];
+
+        // Mitarbeiter einlesen
+        int i = 0;
+        while ((zeile = sr.ReadLine()) != null)
+        {
+            daten = zeile.Split(';', ',');
+
+            int persnr = Convert.ToInt32(daten[0]);
+            string vorname = daten[2].Trim();
+            string nachname = daten[1].Trim();
+            string email = daten[3].Trim();
+
+            this.mitarbeiter[i++] = new Person(persnr, vorname, nachname, email);
+        }
+    }
+
+    public override string ToString()
+    {
+        return name + " (" + mitarbeiter.Length + ")";
+    }
+
+    public void Ausgabe()
+    {
+        // Ausgabe des Abteilungsnamens - es wird implizit ToString() aufgerufen
+        Console.WriteLine(this);
+        // Ausgabe der Mitarbeiter
+        for (int i = 0; i < mitarbeiter.Length; i++)
+            Console.WriteLine(mitarbeiter[i]);
+    }
+
+    public Person? Suche(string email)
+    {
+        for (int i = 0; i < mitarbeiter.Length; i++)
+        {
+            if (mitarbeiter[i].GetEmail() == email)
+                return mitarbeiter[i];
+        }
+
+        return null;
+    }
+}
diff --git a/PersonAbteilung/Person.cs b/PersonAbteilung/Person.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e5a7ff5b75529df191bac979aa3809c57cc8c53a
--- /dev/null
+++ b/PersonAbteilung/Person.cs
@@ -0,0 +1,80 @@
+namespace Uebung12;
+
+// Hauptprogramm in Program.cs
+class Person
+{
+    int persnr;
+    string vorname;
+    string nachname;
+    string email;
+
+    // Parameter Konstruktur
+    public Person(int persnr, string vorname, string nachname, string email)
+    {
+        if (vorname == null || vorname.Length < 2 ||
+            nachname == null || nachname.Length < 2)
+            throw new ArgumentException("Ungültiger Name");
+        else if (!EmailGueltig(email))
+            throw new ArgumentException("Ungültige Email");
+
+        this.persnr = persnr;
+        this.vorname = vorname;
+        this.nachname = nachname;
+        this.email = email;
+    }
+
+    #region Methoden
+    // Getter für Name
+    public string GetName()
+    {
+        return nachname + ", " + vorname;
+    }
+
+    // Getter und Setter für Email
+    public string GetEmail() => email; // ist das gleiche wie nur return email;
+
+    public void SetEmail(string newEmail)
+    {
+        if (!EmailGueltig(newEmail)) // Aufgabe 11.3
+            throw new ArgumentException("Ungültige Email");
+        this.email = newEmail;
+    }
+
+    // ToString-Methode mit override
+    public override string ToString()
+    {
+        return $"{persnr}: {GetName()}; {email}";
+    }
+
+    // Gültigkeitstest für Email. Achtung: static!
+    // Die Methode überprüft nur für einen String, ob er eine gültige Email-Adresse darstellt.
+    // Als Objekt-Methode geht das nicht, denn wir wollen ja gar kein Objekt haben,
+    // das eine ungültige Adresse hat!
+    public static bool EmailGueltig(string email)
+    {
+        if (email == null || email.Length == 0)
+            return false;
+
+        // erstes Zeichen ist Buchstabe
+        if (!Char.IsLetter(email[0]))
+            return false;
+
+        // Merker für @ und . danach
+        bool atGefunden = false;
+        bool pktNachAtGefunden = false;
+
+        // Schleife über email
+        foreach (char c in email)
+        {
+            if (c == ' ')
+                return false;
+            else if (c == '@')
+                atGefunden = true;
+            else if (atGefunden && c == '.')
+                pktNachAtGefunden = true;
+        }
+
+        return pktNachAtGefunden;
+    }
+    #endregion
+}
diff --git a/PersonAbteilung/PersonAbteilung.csproj b/PersonAbteilung/PersonAbteilung.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..206b89a9a8b9320db4b017a262b565f104489193
--- /dev/null
+++ b/PersonAbteilung/PersonAbteilung.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/PersonAbteilung/Program.cs b/PersonAbteilung/Program.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c63cbfa6059e14589b68b699fbdbcffad3b7f0bb
--- /dev/null
+++ b/PersonAbteilung/Program.cs
@@ -0,0 +1,60 @@
+namespace Uebung12;
+
+// Test-Klasse für Abteilung
+class Program
+{
+    static void Main(string[] args)
+    {
+        // Main aus letzter Übung
+        Person person = new Person(12, "Anne", "Meier", "ameier@thn.de");
+
+        Console.WriteLine(person.GetName());
+        Console.WriteLine(person);
+        person.SetEmail("ameier@th-nuernberg.de"); // Ändern der Email
+        Console.WriteLine(person);
+
+
+        // Test für Anlage einer Abteilung
+        Person[] mitarbeiterPR = new Person[6];
+
+        mitarbeiterPR[0] = new Person(13, "Donald", "Duck", "dd@entenhausen.com");
+        mitarbeiterPR[1] = new Person(21, "Gustav", "Gans", "gg@entenhausen.com");
+        mitarbeiterPR[2] = new Person(37, "Micky", "Maus", "mm@entenhausen.com");
+        mitarbeiterPR[3] = new Person(42, "Duffy", "Duck", "dd@warner.com");
+        mitarbeiterPR[4] = new Person(76, "Silvester", "Cat", "silly@cat.org");
+        mitarbeiterPR[5] = new Person(88, "Tweety", "Bird", "birdy@twitter.com");
+
+        Abteilung pr = new Abteilung("Public Relations", mitarbeiterPR);
+        Console.WriteLine();
+        Console.WriteLine(pr);
+        Console.WriteLine();
+        pr.Ausgabe();
+        Console.WriteLine();
+
+        // Test-Emails für Suche
+        string[] emails = { "mm@entenhausen.com", "dsmith@th-nuernberg.de",
+                        "ahuber@thn.de", "silly@cat.org" };
+
+        Console.WriteLine();
+        Console.WriteLine("Suche:");
+        foreach (string email in emails)
+        {
+            Person? p = pr.Suche(email);
+            if (p != null)
+                Console.WriteLine("Person gefunden: " + p);
+            else
+                Console.WriteLine("Person zu email " + email + " nicht gefunden");
+        }
+        Console.WriteLine();
+
+        // Einlesen einer Abteilung aus Datei:
+        string dateiname = "Marketing.txt";
+        // Damit's auf Windows und Unix klappt verwenden wir hier Path.Combine
+        // Dabei werden die Namen mit Path.PathSeparator (\ auf Windows, / auf Unix) verknüpft
+        string dateipfad = Path.Combine("..", "..", "..", dateiname);
+        Console.WriteLine("Öffne Datei: " + dateipfad);
+        Abteilung marketing = new Abteilung(dateipfad);
+        marketing.Ausgabe();
+        Console.WriteLine();
+    }
+}
\ No newline at end of file
diff --git a/Uebung12.sln b/Uebung12.sln
new file mode 100644
index 0000000000000000000000000000000000000000..9594ab00276b09f0d63bfa011462c9b419c7f9cd
--- /dev/null
+++ b/Uebung12.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 25.0.1706.14
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PersonAbteilung", "PersonAbteilung\PersonAbteilung.csproj", "{6811F6BC-B3F5-4894-A64D-A026D1FCECCF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnumRechenOperationen", "EnumRechenOperationen\EnumRechenOperationen.csproj", "{C7625BE2-6E42-4EEB-9BDA-7FDA8986A4C3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagischesQuadrat", "MagischesQuadrat\MagischesQuadrat.csproj", "{6DD50361-EE2D-4AEF-A307-EE9ADA930199}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Millionaer", "Millionaer\Millionaer.csproj", "{088F39F4-2753-480A-A633-828AEC9D1DD5}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6811F6BC-B3F5-4894-A64D-A026D1FCECCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6811F6BC-B3F5-4894-A64D-A026D1FCECCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6811F6BC-B3F5-4894-A64D-A026D1FCECCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6811F6BC-B3F5-4894-A64D-A026D1FCECCF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C7625BE2-6E42-4EEB-9BDA-7FDA8986A4C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C7625BE2-6E42-4EEB-9BDA-7FDA8986A4C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C7625BE2-6E42-4EEB-9BDA-7FDA8986A4C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C7625BE2-6E42-4EEB-9BDA-7FDA8986A4C3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6DD50361-EE2D-4AEF-A307-EE9ADA930199}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6DD50361-EE2D-4AEF-A307-EE9ADA930199}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6DD50361-EE2D-4AEF-A307-EE9ADA930199}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6DD50361-EE2D-4AEF-A307-EE9ADA930199}.Release|Any CPU.Build.0 = Release|Any CPU
+		{088F39F4-2753-480A-A633-828AEC9D1DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{088F39F4-2753-480A-A633-828AEC9D1DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{088F39F4-2753-480A-A633-828AEC9D1DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{088F39F4-2753-480A-A633-828AEC9D1DD5}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {0BA7133D-AEF5-4356-9B80-C02CB1DA77E4}
+	EndGlobalSection
+EndGlobal