C# :: Aufgabe #337

2 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von MarkusH. (440 Punkte) - 16.11.2020 um 18:53 Uhr
Quellcode ausblenden C#-Code
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 }
            };
        }
    }
}
vote_ok
von JKooP (18090 Punkte) - 15.12.2020 um 19:50 Uhr
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
Quellcode ausblenden C#-Code
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
2116967

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.