okurok

TrueRomanParse

May 8th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.06 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Ex_10
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             /* Парсинг римских чисел*/
  11.             Console.WriteLine("Введите римское число: ");
  12.             string romanNumber = Console.ReadLine();
  13.             // Избавляем число от лишних пробелов и отступов.
  14.             string formattedRomanNumber = romanNumber.Trim();
  15.             // Для удобства ввода пользователя(прим. программа съест xv как XV).
  16.             formattedRomanNumber = formattedRomanNumber.ToUpper();
  17.             Console.WriteLine($"Римское число {formattedRomanNumber} равно арабскому числу {RomanParse(formattedRomanNumber)}");
  18.  
  19.         }
  20.  
  21.         private static Dictionary<char,int> romanMap = new Dictionary<char, int>
  22.         {
  23.             {'I', 1 },
  24.             {'V', 5 },
  25.             {'X', 10 },
  26.             {'L', 50 },
  27.             {'C', 100 },
  28.             {'D', 500 },
  29.             {'M', 1000 }
  30.         };
  31.  
  32.         static int RomanParse(string number)
  33.         {
  34.             // Возвращаем исключение при пустой строке.
  35.             if (string.IsNullOrWhiteSpace(number))
  36.             {
  37.                 Console.WriteLine("Empty String!");
  38.                 return 0;
  39.             }
  40.  
  41.             // Непосредственно основное тело метода.
  42.             else
  43.             {
  44.                 // Обнуляем переменную результата для корректных арифметических действий с ней.
  45.                 int result = 0;
  46.  
  47.                 // Бежим по строке, обрабатывая по паре символов
  48.                 for (int i = 0; i < number.Length; i++)
  49.                 {
  50.                     // Условие, необходимое для того, чтобы понять вычитать или прибавлять число к результату.
  51.                     // Если мы находимся в границах строки, и метод IsSubtractive возвращает true, мы отнимаем от результата число.
  52.                     if (i + 1 < number.Length && IsSubtractive(number[i], number[i + 1]))
  53.                     {
  54.                         result -= romanMap[number[i]];
  55.                     }
  56.                     // Иначе естественно прибавляем.
  57.                     else
  58.                         result += romanMap[number[i]];
  59.                 }
  60.  
  61.                 return result;
  62.             }
  63.            
  64.         }
  65.  
  66.         // Метод, который возвращает true, если первый символ меньше второго символа, по romanMap Dictionary.
  67.         private static bool IsSubtractive(char c1, char c2)
  68.         {
  69.             return romanMap[c1] < romanMap[c2];
  70.         }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment