C# :: Aufgabe #337 :: Lösung #1

2 Lösungen Lösungen öffentlich
#337

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ß
#1
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 }
            };
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2117197

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.