C# :: Aufgabe #30 :: Lösung #6
8 Lösungen

#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:
Die Erkennung der Schreibweise sollte automatisch funktionieren.
Konsolenausgabe:
Geben Sie eine Zahl ein: 1234
entspricht: MCCXXXIV
Geben Sie eine Zahl ein: DXXXVII
entspricht: 537
Die Erkennung der Schreibweise sollte automatisch funktionieren.
#6

von sasanaf (100 Punkte)
- 03.02.2016 um 11:53 Uhr

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RömischeZahlenConverter { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Römische(1) oder Arabische(2) Zahl? Für alle Zahlen (3)"); string Wert = Console.ReadLine(); Console.WriteLine("Wie lautet der Wert?"); switch (Wert) { case "1": { Wert = Console.ReadLine(); Console.WriteLine("Das Ergebnis lautet: {0}\n", RomToArab.Ausgabe(Wert)); Console.ReadLine(); Console.Clear(); break; } case "2": { Wert = Console.ReadLine(); Console.WriteLine("Das Ergebnis lautet: {0}\n", ArabToRom.Ausgabe(Wert)); Console.ReadLine(); Console.Clear(); break; } case "3": { Action.Go(Wert); Console.ReadLine(); Console.Clear(); break; } default: { Console.Clear(); break; } } } } class RomToArab { //Berechnungsalgorithmus public static int Ausgabe(string GivenValue) { GivenValue = GivenValue.ToUpper(); int GivenValueLength = GivenValue.Length; if (CheckIfEquals(GivenValue)) { string LetterNow; string LetterNext; int ergebnis = 0, loop = 0; while (loop != GivenValueLength) { LetterNow = Convert.ToString(GivenValue[loop]); LetterNext = Convert.ToString(GivenValue[loop]); if (loop + 1 != GivenValueLength) { LetterNext = Convert.ToString(GivenValue[loop + 1]); } if (CheckIfSubstract(LetterNow, LetterNext) && loop + 1 != GivenValueLength) { ergebnis += Substract(GivenValue, GivenValueLength, LetterNow, LetterNext); LetterNow = Convert.ToString(GivenValue[loop]); LetterNext = Convert.ToString(GivenValue[loop + 1]); loop += 2; } else { ergebnis += Addition(GivenValue, GivenValueLength, LetterNow); LetterNow = Convert.ToString(GivenValue[loop]); loop += 1; } } if (ergebnis >= 4000) { Console.WriteLine("Fehler!"); ergebnis = 0; Convert.ToBoolean(ergebnis); return ergebnis; } return ergebnis; } Console.WriteLine("Fehler!"); return 0; } //Überprüfen ob Subtraktion public static bool CheckIfSubstract(string LetterNow, string LetterNext) { return "IV,IX,XL,XC,CD,CM".Contains(LetterNow + LetterNext); } //Subtraktion public static int Substract(string GivenValue, int GivenValueLength, string LetterNow, string LetterNext) { int ergebnis = 0; ergebnis += (RoemZahlenGiver(LetterNext) - (RoemZahlenGiver(LetterNow))); return ergebnis; } //Addition public static int Addition(string GivenValue, int GivenValueLength, string LetterNow) { int ergebnis = 0; ergebnis += (RoemZahlenGiver(LetterNow)); return ergebnis; } //Überprüfen ob Grundzahl public static bool IsGrundzahl(string LetterNow) { return "IXCM".Contains(LetterNow); } //Überprüfen ob Nebenzahl public static bool IsNebenZahl(string LetterNow) { return !IsGrundzahl(LetterNow); } //Zahlen"Tabelle" public static int RoemZahlenGiver(string Buchstabe) { switch (Buchstabe) { case "I": return 1; case "V": return 5; case "X": return 10; case "L": return 50; case "C": return 100; case "D": return 500; case "M": return 1000; default: return 0; } } //Überprüfungsalgorithmus public static bool CheckIfEquals(string GivenValue) { GivenValue = GivenValue.ToUpper(); int GivenValueLength = GivenValue.Length; for (int x = 0; x < GivenValueLength; x++) { string LetterNow = Convert.ToString(GivenValue[x]); if (!CheckIfEqualsLetters(LetterNow)) return false; } if (!CheckIfNotMutliple(GivenValue, GivenValueLength)) { return false; } return IsNoDouble(GivenValue); } //Überprüfen ob 4x aufeinanderfolgend public static bool CheckIfNotMutliple(string GivenValue, int GivenValueLength) { if (GivenValueLength >= 4) { int ValueValue = 0; while (ValueValue != GivenValueLength - 3) { if (GivenValue[ValueValue] == GivenValue[ValueValue + 1] && GivenValue[ValueValue + 1] == GivenValue[ValueValue + 2] && GivenValue[ValueValue + 2] == GivenValue[ValueValue + 3]) { return false; } ValueValue++; } } return true; } //Überprüfen ob nur römische Zahlenzeichen public static bool CheckIfEqualsLetters(string LetterNow) { { if (!char.IsLetter(LetterNow, 0)) return false; } string[] ArrayRoemische = new string[7] { "I", "V", "X", "L", "C", "D", "M" }; for (int x = 0; x < 7; x++) { if (LetterNow == ArrayRoemische[x]) //! = operand error ?? return true; } return false; } //Überprüfen ob 2 oder mehr zwischenzahlen nebeneinander public static bool IsNoDouble(string GivenValue) { if (GivenValue.Contains("VV")) return false; if (GivenValue.Contains("LL")) return false; if (GivenValue.Contains("DD")) return false; return true; } } class ArabToRom { public static string Ausgabe(string Eingabe) { int Zwischenergebnis = Convert.ToInt32(Eingabe); string Buchstaben = ""; while (Zwischenergebnis != 0) { Buchstaben += BuchstabeEinzeln(Convert.ToInt32(Zwischenergebnis)); Zwischenergebnis -= Ausrechnen(Convert.ToInt32(Zwischenergebnis)); } Buchstaben = Umwandlung(Buchstaben); return Buchstaben; } public static string Umwandlung(string s) { s = s.Replace("CCCC", "CD").Replace("XXXX", "XL").Replace("IIII", "IV"); s = s.Replace("VIV", "IX").Replace("LXL", "XC").Replace("DCD", "CM"); return s; } public static string BuchstabeEinzeln(int Eingabe) { if ((Eingabe / 1000) >= 1) return "M"; else if ((Eingabe / 500) >= 1) return "D"; else if ((Eingabe / 100) >= 1) return "C"; else if ((Eingabe / 50) >= 1) return "L"; else if ((Eingabe / 10) >= 1) return "X"; else if ((Eingabe / 5) >= 1) return "V"; else if ((Eingabe / 1) >= 1) return "I"; else return ""; } public static int Ausrechnen(int Eingabe) { if ((Eingabe / 1000) >= 1) return 1000; else if ((Eingabe / 500) >= 1) return 500; else if ((Eingabe / 100) >= 1) return 100; else if ((Eingabe / 50) >= 1) return 50; else if ((Eingabe / 10) >= 1) return 10; else if ((Eingabe / 5) >= 1) return 5; else if ((Eingabe / 1) >= 1) return 1; else return 0; } } class Action { public static void Go(string Wert) { Console.Clear(); int int1 = 0; for (int i = 0; i < 4000; i++) { int1 = Convert.ToInt32(Wert); int1++; Wert = Convert.ToString(int1); Console.WriteLine("{0}".PadRight(5) + "{1}".PadLeft(5), i, ArabToRom.Ausgabe(Wert)); } } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1