Создай калькулятор на GOlang, который принимает выражение в одну строку. Операндами могут быть либо только арабские цифры, либо римские числа от 1 до 10.
package main
import (
"fmt"
"strconv"
"strings"
)
// Функция для проверки входного числа на соответствие
// требованиям римской системы счисления
func isValidRomanNumber(number string) bool {
// Валидные римские цифры
romanValues := map[rune]int{
'I': 1,
'V': 5,
'X': 10,
}
prevVal := 0 // Предыдущее значение
count := 0 // Количество раз, которое повторяется цифра подряд
for _, char := range number {
val := romanValues[char]
if val == 0 {
return false
}
if prevVal > 0 && prevVal < val {
return false
}
if prevVal == val {
count++
if count > 2 {
return false
}
} else {
prevVal = val
count = 1
}
}
return true
}
// Функция для преобразования римского числа в арабское
func convertRomanToArabic(number string) (int, error) {
if !isValidRomanNumber(number) {
return 0, fmt.Errorf("invalid roman number")
}
romanValues := map[rune]int{
'I': 1,
'V': 5,
'X': 10,
}
arabicValue := 0
prevValue := 0
for _, char := range number {
value := romanValues[char]
if prevValue > 0 && prevValue < value {
arabicValue -= prevValue
value -= prevValue
}
arabicValue += value
prevValue = value
}
return arabicValue, nil
}
// Функция для вычисления результата
func calculate(operand1, operand2 int, operator string) int {
switch operator {
case "+":
return operand1 + operand2
case "-":
return operand1 - operand2
case "*":
return operand1 * operand2
case "/":
return operand1 / operand2
default:
return 0
}
}
func main() {
expression := "5 + 6"
components := strings.Split(expression, " ")
if len(components) != 3 {
fmt.Println("invalid expression")
return
}
operand1, err := strconv.Atoi(components[0])
if err != nil {
operand1, err = convertRomanToArabic(components[0])
if err != nil {
fmt.Println("invalid operand 1")
return
}
}
operand2, err := strconv.Atoi(components[2])
if err != nil {
operand2, err = convertRomanToArabic(components[2])
if err != nil {
fmt.Println("invalid operand 2")
return
}
}
result := calculate(operand1, operand2, components[1])
fmt.Println(result)
}
В данном примере реализован калькулятор, который принимает выражение в строковом формате, разбивает его на составляющие, проверяет операнды на соответствие требованиям, преобразовывает римские числа в арабские и выполняет вычисления. В результате на экран выводится результат вычислений. Если входная строка не соответствует формату, выводится сообщение об ошибке.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет