C# :: Aufgabe #30 :: Lösung #5

8 Lösungen Lösungen öffentlich
#30

Zahlen in Römischer Schreibweise

Anfänger - C# von pocki - 29.12.2012 um 19:40 Uhr
Schreibe eine Programm welches eine Ganzzahl einliest und diese anschließend in römischer Schreibweise wieder ausgibt und umgekehrt bei einer eingegebenen Zahl in römischer Schreibweise diese als normale Zahl wieder ausgibt:

Konsolenausgabe:


Geben Sie eine Zahl ein: 1234
entspricht: MCCXXXIV

Geben Sie eine Zahl ein: DXXXVII
entspricht: 537


Die Erkennung der Schreibweise sollte automatisch funktionieren.
#5
vote_ok
von niknik (1230 Punkte) - 18.08.2015 um 11:26 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace RoemischConverter
{

    public class RomanNumber
    {
        public string Numeral { get; set; }
        public int Value { get; set; }
        public int Hierarchy { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            anfang:
            Console.Clear();
            Console.WriteLine("Geben Sie die Zahl ein, die konvertiert werden soll.");
            string eingabe = Console.ReadLine();

            int zahl;
            if (int.TryParse(eingabe, out zahl))
            {
                int[] zahlen = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 };
                string[] roemisch = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };

                int temp1 = zahl;
                string ausgabe = "";

                while (temp1 > 0)
                {
                    int zahlenzaehler = 0, temp2 = 0;
                    for (int i = 0; i < zahlen.Length; i++)
                    {
                        if (zahlen[i] > temp1)
                        {
                            zahlenzaehler = zahlen[i - 1];
                            temp2 = i - 1;
                            break;
                        }
                        zahlenzaehler = zahlen[i];
                        temp2 = i;
                    }
                    ausgabe += roemisch[temp2];
                    temp1 -= zahlenzaehler;
                }

                Console.WriteLine("Die Zahl {0} auf römisch:   {1}", zahl, ausgabe);
                Console.ReadLine();
            }
            else
            {
                Regex roman = new Regex("^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$");
                if (roman.IsMatch(eingabe))
                {

                    List<RomanNumber> RomanNumbers = new List<RomanNumber>
                    {
                        new RomanNumber {Numeral = "M", Value = 1000, Hierarchy = 4},
                        //{"CM", 900},
                        new RomanNumber {Numeral = "D", Value = 500, Hierarchy = 4},
                        //{"CD", 400},
                        new RomanNumber {Numeral = "C", Value = 100, Hierarchy = 3},
                        //{"XC", 90},
                        new RomanNumber {Numeral = "L", Value = 50, Hierarchy = 3},
                        //{"XL", 40},
                        new RomanNumber {Numeral = "X", Value = 10, Hierarchy = 2},
                        //{"IX", 9},
                        new RomanNumber {Numeral = "V", Value = 5, Hierarchy = 2},
                        //{"IV", 4},
                        new RomanNumber {Numeral = "I", Value = 1, Hierarchy = 1}
                    };

                    var total = 0;
                    for (var i = 0; i < eingabe.Length; i++)
                    {
                        // get current value
                        var current = eingabe[i].ToString();
                        var curRomanNum = RomanNumbers.First(rn => rn.Numeral.ToUpper() == current.ToUpper());

                        // last number just add the value and exit
                        if (i + 1 == eingabe.Length)
                        {
                            total += curRomanNum.Value;
                            break;
                        }

                        // check for exceptions IV, IX, XL, XC etc
                        var next = eingabe[i + 1].ToString();
                        var nextRomanNum = RomanNumbers.First(rn => rn.Numeral.ToUpper() == next.ToUpper());

                        // exception found
                        if (curRomanNum.Hierarchy == (nextRomanNum.Hierarchy - 1))
                        {
                            total += nextRomanNum.Value - curRomanNum.Value;
                            i++;
                        }
                        else
                        {
                            total += curRomanNum.Value;
                        }
                    }

                    Console.WriteLine("In der Römisch Konvertierung");
                    Console.WriteLine("Die Zahl {0} als Arabische Zahl:   {1}", eingabe, total);
                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Fehlerhafte Eingabe.");
                    Console.ReadLine();
                    goto anfang;
                }
            }

        }
    }
}

Kommentare:

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

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

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.