Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python помогите с решением задачи

d Ученик (147), на голосовании 11 месяцев назад
Необходимо написать консольное приложение, реализующее структурный паттерн Адаптер (Adapter) и представляющее из себя древнеримский калькулятор (проверить себя можно на ресурсе Rimcalc). Пользователю приложения будет представлено меню из четырёх пунктов.

Перевод чисел из римских в арабские: пользователь вводит N римских чисел через запятую, а результатом являются N строк формата «<римское_число> -> <арабское число>» (без кавычек).
Перевод чисел из арабских в римские: пользователь вводит N арабских чисел через запятую, а результатом являются N строк формата «<арабское число> -> <римское_число>» (без кавычек).
Вычисление выражения: пользователь вводит либо римские, либо арабские числа в выражении вида «<число1> <операция> <число2>» (без кавычек) и в результате получает строку вида «<число1> <операция> <число2> = <результат>», а сами вычисления должны производиться над строками (т. е. без преобразования чисел к числовым типам).
Выход.
Голосование за лучший ответ
bqlqmutoff Гуру (4528) 12 месяцев назад
Код на языке программирования python для данной задачи может выглядеть следующим образом:

# Импортируем необходимые библиотеки
import re # для работы с регулярными выражениями

# Создаем класс-адаптер для римского калькулятора
class RomanCalculator:
# Метод для перевода римских чисел в арабские
def roman_to_arabic(self, roman_num):
# Создаем словарь с соответствиями римских и арабских чисел
roman_to_arabic_dict = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
# Инициализируем переменные для хранения промежуточного и общего результата
result = 0
prev_num = 0
# Проходим по каждой цифре в римском числе
for i in range(len(roman_num)):
# Получаем арабское значение текущей цифры
curr_num = roman_to_arabic_dict[roman_num[i]]
# Если предыдущее значение было меньше текущего, то вычитаем его из общего результата
if prev_num < curr_num:
result -= prev_num
# Иначе прибавляем его к общему результату
else:
result += prev_num
# Обновляем значение предыдущего числа
prev_num = curr_num
# Добавляем последнее значение к общему результату
result += curr_num
# Возвращаем полученный результат
return result

# Метод для перевода арабских чисел в римские
def arabic_to_roman(self, arabic_num):
# Создаем словарь с соответствиями арабских и римских чисел
arabic_to_roman_dict = {1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC', 50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}
# Инициализируем переменную для хранения результата
result = ""
# Проходим по каждой паре ключ-значение в словаре
for key, value in arabic_to_roman_dict.items():
# Пока число больше или равно текущему ключу
while arabic_num >= key:
# Добавляем соответствующее значение в результат
result += value
# Вычитаем текущий ключ из числа
arabic_num -= key
# Возвращаем полученный результат
return result

# Метод для вычисления выражения
def calculate_expression(self, expression):
# Используем регулярное выражение для разделения выражения на числа и операцию
nums = re.split(' |\+|-|\*|/', expression)
# Вычисляем результат для каждого числа в выражении
num1 = self.roman_to_arabic(nums[0]) if nums[0].isalpha() else int(nums[0])
num2 = self.roman_to_arabic(nums[2]) if nums[2].isalpha() else int(nums[2])
# Вычисляем результат в зависимости от операции
if expression.find('+') != -1:
result = num1 + num2
elif expression.find('-') != -1:
result = num1 - num2
elif expression.find('*') != -1:
result = num1 * num2
elif expression.find('/') != -1:
result = num1 // num2 # Для целочисленного деления
# Возвращаем строку с выражением и результатом
return f"{nums[0]} {nums[1]} {nums[2]} =
dУченик (147) 12 месяцев назад
спасибо большое
dУченик (147) 12 месяцев назад
это точно весь код?
Похожие вопросы