Advertisement
stalin_bro

calc

Dec 21st, 2024
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.44 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class Calculator {
  4.     public static void main(String[] args) {
  5.         Scanner scanner = new Scanner(System.in);
  6.         System.out.println("Введите математическую операцию:");
  7.         String matOperation = scanner.nextLine();
  8.         String result = calc(matOperation);
  9.         System.out.println(result);
  10.     }
  11.  
  12.     public static String calc(String input) {
  13.         String[] signsForCheck = {"+", "-", "*", "/"};
  14.         String[] arrayForMatOper = input.split(" ");
  15.  
  16.         boolean signTrueOrFalse = false;
  17.         int signIndex = -1;
  18.         for (int i = 0; i < signsForCheck.length; i++) {
  19.             if (input.contains(signsForCheck[i])) {
  20.                 signTrueOrFalse = true;
  21.                 signIndex = i;
  22.                 break;
  23.             }
  24.         }
  25.  
  26.         if (!signTrueOrFalse) {
  27.             return "Exception: Cтрока не является доступной математической операцией. Доступны операции: +, -, *, /.";
  28.         }
  29.  
  30.         if (arrayForMatOper.length != 3) {
  31.             return "Exception: Неверный формат математической операции. Верный: 1 + 1, 2 + 3 или I + I";
  32.         }
  33.  
  34. //        if (!NumberConverter.isCorrecFrom1to10(arrayForMatOper[0]) || !NumberConverter.isCorrecFrom1to10(arrayForMatOper[2]) ) {
  35. //            return "Exception: Калькулятор работает только с цифрами от 1(I) до 10(X)";
  36. //        }
  37.  
  38.         if (NumberConverter.isRoman(arrayForMatOper[0]) == NumberConverter.isRoman(arrayForMatOper[2])) {
  39.             int a = 0;
  40.             int b = 0;
  41.  
  42.             if (NumberConverter.isRoman(arrayForMatOper[0])) {
  43.                 a = NumberConverter.romanToArabic(arrayForMatOper[0]);
  44.                 b = NumberConverter.romanToArabic(arrayForMatOper[2]);
  45.             } else {
  46.                 a = Integer.parseInt(arrayForMatOper[0]);
  47.                 b = Integer.parseInt(arrayForMatOper[2]);
  48.             }
  49.  
  50.             if (a <= 0 || a > 10 || b <= 0 || b > 10) {
  51.                 return "Exception: Калькулятор работает только с цифрами от 1(I) до 10(X)";
  52.             }
  53.  
  54.             int result = 0;
  55.             switch (signsForCheck[signIndex]) {
  56.                 case "+":
  57.                     result = a + b;
  58.                     break;
  59.                 case "-":
  60.                     result = a - b;
  61.                     break;
  62.                 case "*":
  63.                     result = a * b;
  64.                     break;
  65.                 case "/":
  66.                     result = a / b;
  67.                     break;
  68.             }
  69.  
  70.             if (NumberConverter.isRoman(arrayForMatOper[0])) {
  71.                 String resultRomanNum = NumberConverter.arabicToRoman(result);
  72.                 if (resultRomanNum == null) {
  73.                     return "Exception: Римские числа не могут быть представлены отрицательными, или равными нулю";
  74.                 } else {
  75.                     return "Итог: " + resultRomanNum;
  76.                 }
  77.             } else {
  78.                 return "Итог: " + result;
  79.             }
  80.         } else {
  81.             return "Exception: Числа должны быть только арабские или только Римские";
  82.         }
  83.     }
  84. }
  85.  
  86. class NumberConverter {
  87.  
  88.     public static boolean isRoman(String number) {
  89.         String[] stringArray = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"};
  90.         for (String s : stringArray) {
  91.             if (Objects.equals(number, s)) {
  92.                 return true;
  93.             }
  94.         }
  95.         return false;
  96.     }
  97.  
  98.     static final Map<String, Integer> romanDictionary = new HashMap<>();
  99.     static final Map<Integer, String> arabicToRomanDic = new TreeMap<>((a, b) -> b - a);
  100.     static {
  101.         romanDictionary.put("I", 1);
  102.         romanDictionary.put("II", 2);
  103.         romanDictionary.put("III", 3);
  104.         romanDictionary.put("IV", 4);
  105.         romanDictionary.put("V", 5);
  106.         romanDictionary.put("VI", 6);
  107.         romanDictionary.put("VII", 7);
  108.         romanDictionary.put("VIII", 8);
  109.         romanDictionary.put("IX", 9);
  110.         romanDictionary.put("X", 10);
  111.  
  112.         arabicToRomanDic.put(100, "C");
  113.         arabicToRomanDic.put(90, "XC");
  114.         arabicToRomanDic.put(50, "L");
  115.         arabicToRomanDic.put(40, "XL");
  116.         arabicToRomanDic.put(10, "X");
  117.         arabicToRomanDic.put(9, "IX");
  118.         arabicToRomanDic.put(5, "V");
  119.         arabicToRomanDic.put(4, "IV");
  120.         arabicToRomanDic.put(1, "I");
  121.     }
  122.  
  123.     static boolean romanIntDictionary(String roman) {
  124.         return romanDictionary.containsKey(roman);
  125.     }
  126.  
  127.     static int romanToArabic(String roman) {
  128.         return romanDictionary.getOrDefault(roman, 0);
  129.     }
  130.  
  131.     static String arabicToRoman(int number) {
  132.         if (number <= 0) {
  133.             return null;
  134.         }
  135.         StringBuilder result = new StringBuilder();
  136.         for (Integer key : arabicToRomanDic.keySet()) {
  137.             while (number >= key) {
  138.                 result.append(arabicToRomanDic.get(key));
  139.                 number -= key;
  140.             }
  141.         }
  142.         return result.toString();
  143.     }
  144.  
  145.     static boolean isCorrecFrom1to10 (String number) {
  146.         int num = Integer.parseInt(number);
  147.         return num >= 1 && num <= 10;
  148.     }
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement