From 3211b695e0d3d61888b56f4b7d1896c6582ee9f5 Mon Sep 17 00:00:00 2001
From: Jens Albrecht <jens.albrecht@th-nuernberg.de>
Date: Fri, 6 Dec 2024 13:28:18 +0100
Subject: [PATCH] .

---
 BuchstabenHistogramm/BuchstabenHistogramm.cs  | 69 +++++++++++++++++++
 .../BuchstabenHistogramm.csproj               | 10 +++
 EntferneZeichen/EntferneZeichen.cs            | 44 ++++++++++++
 EntferneZeichen/EntferneZeichen.csproj        | 10 +++
 HammingDistance/HammingDistance.cs            | 30 ++++++++
 HammingDistance/HammingDistance.csproj        | 10 +++
 Palindrom/Palindrom.cs                        | 61 ++++++++++++++++
 Palindrom/Palindrom.csproj                    | 10 +++
 SeparatorCounter/SeparatorCounter.cs          | 29 ++++++++
 SeparatorCounter/SeparatorCounter.csproj      | 10 +++
 Uebung09.sln                                  | 49 +++++++++++++
 ZeilenSpaltenSummen/Program.cs                | 59 ++++++++++++++++
 .../ZeilenSpaltenSummen.csproj                | 10 +++
 13 files changed, 401 insertions(+)
 create mode 100644 BuchstabenHistogramm/BuchstabenHistogramm.cs
 create mode 100644 BuchstabenHistogramm/BuchstabenHistogramm.csproj
 create mode 100644 EntferneZeichen/EntferneZeichen.cs
 create mode 100644 EntferneZeichen/EntferneZeichen.csproj
 create mode 100644 HammingDistance/HammingDistance.cs
 create mode 100644 HammingDistance/HammingDistance.csproj
 create mode 100644 Palindrom/Palindrom.cs
 create mode 100644 Palindrom/Palindrom.csproj
 create mode 100644 SeparatorCounter/SeparatorCounter.cs
 create mode 100644 SeparatorCounter/SeparatorCounter.csproj
 create mode 100644 Uebung09.sln
 create mode 100644 ZeilenSpaltenSummen/Program.cs
 create mode 100644 ZeilenSpaltenSummen/ZeilenSpaltenSummen.csproj

diff --git a/BuchstabenHistogramm/BuchstabenHistogramm.cs b/BuchstabenHistogramm/BuchstabenHistogramm.cs
new file mode 100644
index 0000000..d2cb7c4
--- /dev/null
+++ b/BuchstabenHistogramm/BuchstabenHistogramm.cs
@@ -0,0 +1,69 @@
+class Program
+{
+    static int BuchstabenIndex(char b)
+    {
+        // Sonderfälle, zur Abwechslung mal mit switch statt if
+        switch (b)
+        {
+            case 'Ä':
+            case 'ä':
+                b = 'a'; break;
+            case 'Ö':
+            case 'ö':
+                b = 'o'; break;
+            case 'Ü':
+            case 'ü':
+                b = 'u'; break;
+            case 'ß':
+                b = 's'; break;
+        }
+
+        // Index-Berechnung
+        if (b >= 'A' && b <= 'Z')
+            return b - 'A';
+        else if (b >= 'a' && b <= 'z')
+            return b - 'a';
+        else
+            return -1;
+    }
+
+    static void Main()
+    {
+        // Hauptprogramm
+        string gedicht =
+            @"Joachim Ringelnatz: Genau besehn
+              Wenn man das zierlichste Näschen
+              Von seiner liebsten Braut
+              Durch ein Vergrößerungsgläschen
+              Näher beschaut,
+              Dann zeigen sich haarige Berge,
+              Daß einem graut.";
+
+        // string satz = "Der böse Aal beißt";
+
+        string test = "Aaboösßz ?.";
+        foreach (char c in test)
+            Console.WriteLine($"BuchstabenIndex('{c}') = " + BuchstabenIndex(c));
+
+        int[] histogram = new int[26];
+
+        // Buchstaben zählen
+        foreach (char c in gedicht)
+        {
+            int i = BuchstabenIndex(c);
+            if (i >= 0)
+                histogram[i]++;
+        }
+
+        // Histogramm ausgeben
+        for (int i = 0; i < histogram.Length; i++)
+        {
+            char buchstabe = (char)('a' + i);
+            int anzahl = histogram[i];
+            Console.Write($"{buchstabe} ({anzahl,2}) ");
+            for (int j = 0; j < anzahl; j++)
+                Console.Write('\u2584');
+            Console.WriteLine();
+        }
+    }
+}
diff --git a/BuchstabenHistogramm/BuchstabenHistogramm.csproj b/BuchstabenHistogramm/BuchstabenHistogramm.csproj
new file mode 100644
index 0000000..206b89a
--- /dev/null
+++ b/BuchstabenHistogramm/BuchstabenHistogramm.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/EntferneZeichen/EntferneZeichen.cs b/EntferneZeichen/EntferneZeichen.cs
new file mode 100644
index 0000000..72cd2f1
--- /dev/null
+++ b/EntferneZeichen/EntferneZeichen.cs
@@ -0,0 +1,44 @@
+class Program
+{
+    // Entfernt alle Vorkommen der angegebenen Zeichen aus dem String
+    static string EntferneZeichen(string s, params char[] sonderzeichen)
+    {
+        string ergebnis = "";
+
+        foreach (char c in s)
+        {
+            bool istSonderzeichen = false;
+
+            for (int i = 0; i < sonderzeichen.Length && !istSonderzeichen; i++)
+                if (c == sonderzeichen[i])
+                    istSonderzeichen = true;
+
+            if (!istSonderzeichen)
+                ergebnis += c;
+        }
+
+        return ergebnis;
+    }
+
+
+    // Entfernt alle Vorkommen der angegebenen Zeichen aus dem String
+    // mit Hilfe der String-Replace-Funktion.
+    // Effizienter wäre es allerdings mit StringBuilder.Replace()
+    static void EntferneZeichen2(ref string s, params char[] sonderzeichen)
+    {
+        for (int i = 0; i < sonderzeichen.Length; i++)
+            s = s.Replace(sonderzeichen[i].ToString(), "");
+    }
+
+
+    static void Main(string[] args)
+    {
+        // Testfälle für EntferneSonderzeichen
+        Console.WriteLine(EntferneZeichen("a b c", ' '));
+        Console.WriteLine(EntferneZeichen("0153-3563-7545", '-'));
+        Console.WriteLine(EntferneZeichen("ottos mops hopst", 'o'));
+
+        // mit Params-Aufruf
+        Console.WriteLine(EntferneZeichen("Er sagte: Guten Tag!", ':', ' ', '!'));
+    }
+}
diff --git a/EntferneZeichen/EntferneZeichen.csproj b/EntferneZeichen/EntferneZeichen.csproj
new file mode 100644
index 0000000..9ec5c75
--- /dev/null
+++ b/EntferneZeichen/EntferneZeichen.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/HammingDistance/HammingDistance.cs b/HammingDistance/HammingDistance.cs
new file mode 100644
index 0000000..4cb69a7
--- /dev/null
+++ b/HammingDistance/HammingDistance.cs
@@ -0,0 +1,30 @@
+class Program
+{
+    // Hamming-Abstand
+    static int HammingDistance(string s1, string s2)
+    {
+        int ergebnis = 0;
+        if (s1.Length != s2.Length)
+            return -1; // verschieden lang, lassen sich nicht vergleichen
+        else // s1.Length == s2.Length ... gleich lang
+        {
+            for (int i = 0; i < s1.Length; i++)
+            {
+                // zeichenweise: wenn nicht gleich, dann wird gezählt
+                if (s1[i] != s2[i])
+                    ergebnis++;
+            }
+        }
+        return ergebnis;
+    }
+
+    static void Main(string[] args)
+    {
+        // Hamming-Abstand
+        Console.Write("Hamming-Distance:\n");
+        Console.WriteLine($"Foo, Bar\t{HammingDistance("Foo", "Bar")}");
+        Console.WriteLine($"Hello, Hallo\t{HammingDistance("Hello", "Hallo")}");
+        Console.WriteLine($"Prog, Prog\t{HammingDistance("Prog1", "Prog1")}");
+        Console.WriteLine($"Hallo, Welt\t{HammingDistance("Hallo", "Welt")}");
+    }
+}
diff --git a/HammingDistance/HammingDistance.csproj b/HammingDistance/HammingDistance.csproj
new file mode 100644
index 0000000..6f4623a
--- /dev/null
+++ b/HammingDistance/HammingDistance.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/Palindrom/Palindrom.cs b/Palindrom/Palindrom.cs
new file mode 100644
index 0000000..7f8d225
--- /dev/null
+++ b/Palindrom/Palindrom.cs
@@ -0,0 +1,61 @@
+class Program
+{
+    // Hier nochmal die Funktion aus anderem Projekt reinkopiert. 
+    // In der Praxis würden wir die Funktion aus dem anderen Projekt (andere Klasse)
+    // einfach aufrufen - ohne den Code zu kopieren. Ist aber für die Übung einfacher so.
+    static string EntferneZeichen(string s, params char[] sonderzeichen)
+    {
+        string ergebnis = "";
+
+        foreach (char c in s)
+        {
+            bool istSonderzeichen = false;
+
+            for (int i = 0; i < sonderzeichen.Length && !istSonderzeichen; i++)
+                if (c == sonderzeichen[i])
+                    istSonderzeichen = true;
+
+            if (!istSonderzeichen)
+                ergebnis += c;
+        }
+
+        return ergebnis;
+    }
+
+
+    // Palindrom-Test
+    static bool IstPalindrom(string s)
+    {
+        s = EntferneZeichen(s, ' ', ',', ';', ':', '.', '!', '?', '-', '\'');
+        s = s.ToUpper();
+
+        // Zeichen in s müssen von vorn und hinten kommend übereinstimmen
+        //for (int i = 0, j = s.Length - 1; i < s.Length / 2; i++, j--)
+        //    if (s[i] != s[j])
+        //        return false;
+
+        // Ohne j geht es auch ganz einfach so:
+        for (int i = 0; i < s.Length / 2; i++)
+            if (s[i] != s[^(i + 1)])
+                return false;
+
+        return true;
+    }
+
+
+    static void Main(string[] args)
+    {
+        string[] texte = { "ANNA", "Anna", "legal", "Otto", "Lagerregal", "123421",
+                               "Hermine - sie mag Ameisen im Reh.",
+                               "Einhorn roh? Nie!" };
+
+        foreach (var text in texte)
+        {
+            Console.Write($"\"{text}\" ist ");
+            if (IstPalindrom(text))
+                Console.WriteLine("ein Palindrom.");
+            else
+                Console.WriteLine("kein Palindrom.");
+        }
+    }
+}
diff --git a/Palindrom/Palindrom.csproj b/Palindrom/Palindrom.csproj
new file mode 100644
index 0000000..9ec5c75
--- /dev/null
+++ b/Palindrom/Palindrom.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/SeparatorCounter/SeparatorCounter.cs b/SeparatorCounter/SeparatorCounter.cs
new file mode 100644
index 0000000..b8ca854
--- /dev/null
+++ b/SeparatorCounter/SeparatorCounter.cs
@@ -0,0 +1,29 @@
+class Program
+{
+    static void SeparatorCounter(string s, out int period, out int comma, out int semicolon)
+    {
+        period = 0;
+        comma = 0;
+        semicolon = 0;
+
+        for (int i = 0; i < s.Length; i++)
+            if (s[i] == '.')
+                period++;
+            else if (s[i] == ',')
+                comma++;
+            else if (s[i] == ';')
+                semicolon++;
+    }
+
+    static void Main(string[] args)
+    {
+        int punkt, komma, semi;
+        string test = "A, B, C; D; E; F. G; H; I";
+
+        SeparatorCounter(test, out punkt, out komma, out semi);
+
+        Console.WriteLine("Punkte: " + punkt);
+        Console.WriteLine("Kommas: " + komma);
+        Console.WriteLine("Semikolons: " + semi);
+    }
+}
diff --git a/SeparatorCounter/SeparatorCounter.csproj b/SeparatorCounter/SeparatorCounter.csproj
new file mode 100644
index 0000000..9ec5c75
--- /dev/null
+++ b/SeparatorCounter/SeparatorCounter.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/Uebung09.sln b/Uebung09.sln
new file mode 100644
index 0000000..3e2c36d
--- /dev/null
+++ b/Uebung09.sln
@@ -0,0 +1,49 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.7.34031.279
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HammingDistance", "HammingDistance\HammingDistance.csproj", "{DB77F902-F669-4437-8918-0A499330B35B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EntferneZeichen", "EntferneZeichen\EntferneZeichen.csproj", "{AF1FCBE7-81D6-4C6F-B2C7-8B27B417A94F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Palindrom", "Palindrom\Palindrom.csproj", "{D6320D94-94B5-4980-BDBA-A0DE98443FC1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SeparatorCounter", "SeparatorCounter\SeparatorCounter.csproj", "{E619C3E7-9BCA-43A4-AFAC-4B656F5B0D97}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuchstabenHistogramm", "BuchstabenHistogramm\BuchstabenHistogramm.csproj", "{AB8315A5-2A94-4D30-B7A9-18627B67C213}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{DB77F902-F669-4437-8918-0A499330B35B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DB77F902-F669-4437-8918-0A499330B35B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DB77F902-F669-4437-8918-0A499330B35B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DB77F902-F669-4437-8918-0A499330B35B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AF1FCBE7-81D6-4C6F-B2C7-8B27B417A94F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AF1FCBE7-81D6-4C6F-B2C7-8B27B417A94F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AF1FCBE7-81D6-4C6F-B2C7-8B27B417A94F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AF1FCBE7-81D6-4C6F-B2C7-8B27B417A94F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D6320D94-94B5-4980-BDBA-A0DE98443FC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D6320D94-94B5-4980-BDBA-A0DE98443FC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D6320D94-94B5-4980-BDBA-A0DE98443FC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D6320D94-94B5-4980-BDBA-A0DE98443FC1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E619C3E7-9BCA-43A4-AFAC-4B656F5B0D97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E619C3E7-9BCA-43A4-AFAC-4B656F5B0D97}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E619C3E7-9BCA-43A4-AFAC-4B656F5B0D97}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E619C3E7-9BCA-43A4-AFAC-4B656F5B0D97}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AB8315A5-2A94-4D30-B7A9-18627B67C213}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AB8315A5-2A94-4D30-B7A9-18627B67C213}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AB8315A5-2A94-4D30-B7A9-18627B67C213}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AB8315A5-2A94-4D30-B7A9-18627B67C213}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {6F1FE9D2-3B51-43A6-A1E3-96B8C2923A7D}
+	EndGlobalSection
+EndGlobal
diff --git a/ZeilenSpaltenSummen/Program.cs b/ZeilenSpaltenSummen/Program.cs
new file mode 100644
index 0000000..b2c6f22
--- /dev/null
+++ b/ZeilenSpaltenSummen/Program.cs
@@ -0,0 +1,59 @@
+namespace Uebung
+{
+    class Program
+    {
+        // 2D-Array: Spalten- und Zeilensummen
+        static void FeldAusgeben(int[,] f)
+        {
+            for (int z = 0; z < f.GetLength(0); z++)
+            {
+                for (int s = 0; s < f.GetLength(1); s++)
+                {
+                    Console.Write($"{f[z, s]} ");
+                }
+                Console.WriteLine();
+            }
+        }
+
+        static int ZeileSpalte(int k, int[,] m)
+        {
+            int summe = 0; // mit 0 initialisieren spart den else-Zweig
+
+            if (k >= 0) // keine negativen Indizes
+            {
+                if (k < m.GetLength(0)) // Es gibt die Zeile.
+                {
+                    for (int i = 0; i < m.GetLength(1); i++) // Anzahl aller Spalten
+                    {
+                        summe += m[k, i];
+                    }
+                }
+                if (k < m.GetLength(1)) // Es gibt die Spalte.
+                {
+                    for (int i = 0; i < m.GetLength(0); i++) // Anzahl aller Zeilen
+                    {
+                        summe -= m[i, k];
+                    }
+                }
+            }
+
+            return summe;
+        }
+
+        static void Main(string[] args)
+        {
+            //Spalten- und Zeilensummen
+            Console.Write("\nSpalten- und Zeilensummen:\n");
+            int[,] meinFeld = { { 1, 2, 6, 8 }, 
+                                { 3, 4, 7, 2 }, 
+                                { 5, 6, 5, 4 }, 
+                                { 7, 8, 9, 1 }, 
+                                { 8, 7, 1, 2 }, 
+                                { 2, 9, 2, 1 } };
+            FeldAusgeben(meinFeld);
+            Console.WriteLine("\nRechnung Zeilen/Spalten");
+            int meineSumme = ZeileSpalte(2, meinFeld);
+            Console.WriteLine($"Summe: {meineSumme}\n");
+        }
+    }
+}
\ No newline at end of file
diff --git a/ZeilenSpaltenSummen/ZeilenSpaltenSummen.csproj b/ZeilenSpaltenSummen/ZeilenSpaltenSummen.csproj
new file mode 100644
index 0000000..9ec5c75
--- /dev/null
+++ b/ZeilenSpaltenSummen/ZeilenSpaltenSummen.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>
-- 
GitLab