Как исправить код калькулятора на Java, чтобы он мог обрабатывать выражения типа VII * V и IX * IX?

Как можно переписать программу калькулятора так, чтобы она принимала только две переменные и один оператор как входные данные? Я понимаю, что есть ошибка, но не уверен, как ее исправить. Я буду очень благодарен, если кто-то сможет продемонстрировать, как это можно сделать правильно.
  • 28 марта 2024 г. 6:29
Ответы на вопрос 1
Для того чтобы калькулятор обрабатывал римские числа, можно использовать классы и методы для работы с ними. Вот пример исправленного кода калькулятора на Java:

```java
import java.util.HashMap;

public class Calculator {

    private HashMap<String, Integer> romanNumerals;

    public Calculator() {
        romanNumerals = new HashMap<>();
        romanNumerals.put("I", 1);
        romanNumerals.put("V", 5);
        romanNumerals.put("X", 10);
        romanNumerals.put("L", 50);
        romanNumerals.put("C", 100);
        // добавьте другие римские числа по аналогии
    }

    public int calculate(String input) {
        String[] parts = input.split("\\s+");
        String first = parts[0];
        String operator = parts[1];
        String second = parts[2];

        int num1 = isRomanNumeral(first) ? convertRomanToDecimal(first) : Integer.parseInt(first);
        int num2 = isRomanNumeral(second) ? convertRomanToDecimal(second) : Integer.parseInt(second);

        switch (operator) {
            case "+":
                return num1 + num2;
            case "-":
                return num1 - num2;
            case "*":
                return num1 * num2;
            case "/":
                return num1 / num2;
            default:
                throw new IllegalArgumentException("Неверный оператор: " + operator);
        }
    }

    private boolean isRomanNumeral(String input) {
        return input.matches("[IVXLCDM]+");
    }

    private int convertRomanToDecimal(String input) {
        int res = 0;
        int prev = 0;

        for (int i = input.length() - 1; i >= 0; i--) {
            char c = input.charAt(i);
            int current = romanNumerals.get(String.valueOf(c));

            if (current >= prev) {
                res += current;
            } else {
                res -= current;
            }

            prev = current;
        }

        return res;
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println(calculator.calculate("VII * V")); // 35
        System.out.println(calculator.calculate("IX * IX")); // 81
    }
}
```

Этот код включает метод `calculate`, который разделяет вводимую строку по пробелам, затем определяет тип чисел (римские или арабские) и выполняет операцию. Также есть методы для проверки, является ли входное значение римским числом и для конвертации римских чисел в десятичные.

Чтобы программа принимала только две переменные и один оператор как входные данные, можно изменить логику метода `calculate` на принятие трех аргументов (первый операнд, оператор, второй операнд) вместо строки с разделенными значениями. Например:

```java
public int calculate(int num1, String operator, int num2) {
    switch (operator) {
        case "+":
            return num1 + num2;
        case "-":
            return num1 - num2;
        case "*":
            return num1 * num2;
        case "/":
            return num1 / num2;
        default:
            throw new IllegalArgumentException("Неверный оператор: " + operator);
    }
}

public static void main(String[] args) {
    Calculator calculator = new Calculator();
    System.out.println(calculator.calculate(7, "*", 5)); // 35
    System.out.println(calculator.calculate(9, "*", 9)); // 81
}
```

Таким образом, программа будет принимать три аргумента (два операнда и оператор) и выполнять математическую операцию над ними.
Похожие вопросы