Инженерный калькулятор · Шаг 3 из 10
Минус и степень
Две вещи ведут себя не так, как сложение и умножение. Минус перед числом — не вычитание: в «−2» вычитать не из чего. А степень считается справа налево: «2^3^2» — это 2 в девятой, а не 8 в квадрате. И между ними свой порядок: «−2^2» на калькуляторе — минус четыре.
Что сделать
Разберите знаки перед числом и степень: минус слабее степени, а степень считается справа налево.
Что приходит
tokeny— список токеновi— с какого токена начатьosnova— функция ступени ниже:osnova(tokeny, i)возвращает(значение, номер следующего токена)
Что вернуть
Пару (значение, номер первого токена после разобранного); степень — всегда дробным числом.
Допишите функцию unarnyy в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Калькулятор зовёт unarnyy как ступень под умножением: из неё произведение берёт свои куски. Решите шаг — и заработают «−5», «2^10» и «2^-1».
Основа в проверке — игрушка chislo: один токен-число. ["-", 2, "^", 2] — это минус от 2^2, ответ (-4.0, 4): степень дробная, разобраны все четыре токена.
Если под номером i знак "-" — разобрать всё, что дальше, этой же функцией и вернуть значение с обратным знаком. Знак "+" — так же, но значение не меняется. Знаков может быть несколько: «−−5» — это 5.
Иначе — взять основание через osnova. Если следом стоит "^" — показатель разбирается этой же функцией с токена после "^" (так в показателе разрешены и минус, и следующая степень, а степень считается справа налево), и результат — float(основание) ** показатель.
Отрицательное основание с дробным показателем ((−8)^0.5) — ValueError("дробная степень отрицательного числа"): Python вернул бы комплексное число. Целый показатель, даже записанный дробью (3.0), — можно.
Ошибки самого возведения пролетают насквозь: слишком большой результат — OverflowError, ноль в отрицательной степени — ZeroDivisionError.
Образцовый тест целиком
chislo = lambda t, i: (t[i], i + 1)
unarnyy(["-", 2, "^", 2], 0, chislo)
(-4.0, 4)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.