Инженерный калькулятор · Шаг 9 из 10
Память
Инженерный калькулятор помнит: «r = 2.5» заводит переменную, а потом «pi * r^2» считает площадь. И каждый ответ запоминается как ans — «ans * 2» продолжает счёт с прошлого результата. Память — обычный словарь «имя → число».
Что сделать
Выполните строку калькулятора: «имя = выражение» запоминает переменную, и любой ответ запоминается как ans.
Что приходит
stroka— строка, как её набрали: выражение или «имя = выражение»pamyat— словарь «имя → число»; менять его нельзяschitat— функцияschitat(выражение, память): считает выражение с этими переменными
Что вернуть
Пару (ответ, новая память): в новой памяти — всё прежнее, переменная, если её задавали, и ans.
Допишите функцию vypolnit в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Окно и текстовый режим зовут vypolnit на каждое «=» и хранят память, которую вы вернули. Решите шаг — и заработают переменные и ans.
В проверке schitat — игрушка: умеет только складывать числа и переменные через «+». vypolnit("x + 1", {"x": 4}, schitat) — это (5, {"x": 4, "ans": 5}): ответ 5, и он же запомнен как ans.
Если в строке есть "=" — слева от первого знака = имя, справа выражение. Имя без пробелов по краям обязано состоять из латинских букв (isascii() и isalpha()), иначе ValueError("слева от «=» должно быть имя латиницей"). Имя ans задавать нельзя: ValueError("переменную ans калькулятор ведёт сам").
Ответ — schitat(выражение, pamyat). Новая память — копия прежней, в которой переменной присвоен ответ (если строка с «=») и ans — ответ.
Строка без «=» — schitat(вся строка, pamyat), в новой памяти меняется только ans.
Переданный словарь pamyat не меняется: ошибка посреди счёта не должна портить память.
Образцовый тест целиком
def schitat(stroka, pamyat):
chasti = stroka.replace(" ", "").split("+")
return sum(pamyat[ch] if ch.isalpha() else int(ch) for ch in chasti)
vypolnit("x + 1", {"x": 4}, schitat)
(5, {'x': 4, 'ans': 5})
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.