C# :: Aufgabe #337
2 Lösungen

Zahlensysteme konvertieren
Anfänger - C#
von JKooP
- 01.11.2020 um 10:53 Uhr
Schreibe eine Methode/Funktion, mit der man jede als Datentyp „String“ angegeben Zahl eines beliebigen Zahlensystems (binär, ternär, oktal, hexadezimal…) ins Dezimalsystem konvertieren kann.
Beispiele:
("1010", 2) binär --> 10 dezimal
("120", 3) ternär --> 15 dezimal
("15", 8) oktal --> 13 dezimal
("FF", 16) hexadezimal --> 255 dezimal
Viel Spaß
Beispiele:
("1010", 2) binär --> 10 dezimal
("120", 3) ternär --> 15 dezimal
("15", 8) oktal --> 13 dezimal
("FF", 16) hexadezimal --> 255 dezimal
Viel Spaß
Lösungen:

using System; using System.Collections.Generic; namespace _337___Zahlensysteme_konvertieren { class Program { private static Dictionary<char, int> charNumberRelationships; private static int[] decimalBaseInputArray; [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0060:Nicht verwendete Parameter entfernen", Justification = "<Ausstehend>")] static void Main(string[] args) { FillDictionary(); Console.BackgroundColor = ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("************************************************************"); Console.WriteLine("** **"); Console.WriteLine("** Zahlensysteme in das Dezimalsystem konvertieren **"); Console.WriteLine("** **"); Console.WriteLine("************************************************************"); Console.WriteLine("** Unterstützt werden die Zahlensysteme von **"); Console.WriteLine("** Basis 2 bis Basis 16. **"); Console.WriteLine("** Zum Beenden des Programms das Eingabefeld leer lassen! **"); Console.WriteLine("************************************************************"); Console.WriteLine("** **"); while (true) { Console.Write("Geben Sie die zu konvertierende Zahl ein: "); string userInputValue = Console.ReadLine(); if (string.IsNullOrEmpty(userInputValue)) break; Console.Write("Geben Sie das Zahlensystem an: "); string userInputNumberBase = Console.ReadLine(); if (TryConvertAnyNumericBaseToDecimalBase(Convert.ToInt32(userInputNumberBase), userInputValue.Trim().ToUpper(), out string result)) { Console.WriteLine($"Der Wert { userInputValue } im Zahlensystem { userInputNumberBase } entspricht dem Wert { result } im Dezimalsystem."); } Console.WriteLine("************************************************************"); } } /// <summary> /// Try to convert a given input value and number system to its decimal equivalent /// </summary> /// <param name="inputBase">The input number system</param> /// <param name="input">The input value</param> /// <param name="result">The calculated result</param> /// <returns>True if the conversion is successful, otherwise false</returns> private static bool TryConvertAnyNumericBaseToDecimalBase(int inputBase, string input, out string result) { result = "0"; if (input.Equals("0")) return true; if (inputBase < 2 || inputBase > 16) { Console.WriteLine("Ungültiges Zahlensystem!"); return false; } char[] reversedInputArray = ReverseArray(input); if (CheckinputString(inputBase, reversedInputArray)) { if (decimalBaseInputArray != null && decimalBaseInputArray.Length > 0) { result = CalculateDecimalSum(inputBase).ToString(); } else { Console.WriteLine("Ein Fehler ist aufgetreten!"); return false; } } else { Console.WriteLine("Ein Fehler ist aufgetreten!"); return false; } return true; } /// <summary> /// Calculate the decimal value of the input value /// using the Horner method /// </summary> /// <param name="inputBase">The input number base</param> /// <returns>The decimal value of the input value</returns> private static double CalculateDecimalSum(int inputBase) { double sum = 0; for (int i = 0; i < decimalBaseInputArray.Length; i++) { sum += decimalBaseInputArray[i] * Math.Pow(inputBase, i); } return sum; } /// <summary> /// Reverse an array /// </summary> /// <param name="input">The array to reverse</param> /// <returns>The reversed array</returns> private static char[] ReverseArray(string input) { char[] reversedInputArray = input.ToCharArray(); Array.Reverse(reversedInputArray); return reversedInputArray; } /// <summary> /// Check the input value for invalid characters. /// Examples: /// Binary: Only 0 and 1 are valid /// Octal: Only the values from 0 to 7 are valid /// Duodecimal: Only the values from 0 to 9, A and B are valid /// </summary> /// <param name="inputBase">The inbut number system</param> /// <param name="inputArray">The input value in char array representation</param> /// <returns>True if the check is successful, otherwise false</returns> private static bool CheckinputString(int inputBase, char[] inputArray) { bool isValid = true; decimalBaseInputArray = new int[inputArray.Length]; int index = -1; foreach (char inputChar in inputArray) { index++; if(charNumberRelationships.ContainsKey(inputChar)) { int number = charNumberRelationships[inputChar]; if(number >= inputBase) { Console.WriteLine($"{ inputChar } ist ein ungültiger Wert im Zahlensystem mit der Basis { inputBase }!"); isValid = false; decimalBaseInputArray = null; break; } else { decimalBaseInputArray[index] = number; } } else { Console.WriteLine($"{ inputChar } ist ungültig!"); isValid = false; decimalBaseInputArray = null; break; } } return isValid; } /// <summary> /// Fill the dictionary with valid chars /// </summary> private static void FillDictionary() { charNumberRelationships = new Dictionary<char, int> { { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, { '4', 4 }, { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 }, { 'A', 10 }, { 'B', 11 }, { 'C', 12 }, { 'D', 13 }, { 'E', 14 }, { 'F', 15 } }; } } }
NET 5.x; C# 9.x
Neuerung in C# 9.x: Top-Level-Anweisung
https://docs.microsoft.com/de-de/dotnet/csharp/whats-new/csharp-9
C#-Code
Neuerung in C# 9.x: Top-Level-Anweisung
https://docs.microsoft.com/de-de/dotnet/csharp/whats-new/csharp-9

using System; using System.Linq; Console.WriteLine(BaseX2Dec("1010", 2)); // 10 Console.WriteLine(BaseX2Dec("120", 3)); // 15 Console.WriteLine(BaseX2Dec("15", 8)); // 13 Console.WriteLine(BaseX2Dec("FF", 16)); // 255 int BaseX2Dec(string s, int b) => s.ToLower().Aggregate(0, (x, y) => (b * x) + (y - ((y is >= 'a' and <= 'f') ? 87 : 48))); // C# 9.x