Инженерный калькулятор · Шаг 2 из 10
Один уровень приоритета
«2 + 3 * 4» — это 14, а не 20: умножение сильнее сложения. Хитрость в том, что сложение и умножение разбираются одним и тем же способом: взять кусок, и пока дальше стоит «свой» знак — взять ещё кусок и соединить. Разница только в том, что считать куском. Для сложения кусок — целое произведение, для умножения — одно число.
Что сделать
Разберите одну ступень приоритета: кусок, а пока дальше стоит свой знак — ещё кусок и соединить слева направо.
Что приходит
tokeny— список токеновi— с какого токена начатьnizhe— функция ступени ниже:nizhe(tokeny, i)возвращает(значение, номер следующего токена)deystviya— словарь «знак → функция двух чисел», например{"+": operator.add, "-": operator.sub}
Что вернуть
Пару (значение, номер первого токена после разобранного).
Допишите функцию uroven в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Калькулятор зовёт uroven дважды: сложение и вычитание — над произведениями, умножение и деление — над тем, что сильнее. Из этого вложения и получается, что «2 + 3 * 4» — 14.
В проверке ступень ниже — игрушечная: chislo берёт ровно один токен-число. Тогда [2, "+", 3, "-", 1] — это (2 + 3) − 1, ответ (4, 5): значение 4, и разобраны все пять токенов.
Сначала — nizhe(tokeny, i): первый кусок. Затем, пока номер в пределах списка и токен под ним — ключ deystviya: запомнить знак, взять следующий кусок через nizhe с токена после знака и соединить: deystviya[знак](накопленное, новый кусок).
Соединять — слева направо: 10 − 2 − 3 — это (10 − 2) − 3 = 5, а не 10 − (2 − 3) = 11.
На первом токене, который не ключ deystviya (другой знак, закрывающая скобка, конец списка), — остановиться и вернуть (значение, номер этого токена). Ошибок шаг сам не поднимает: ошибки ступени ниже пролетают насквозь.
Образцовый тест целиком
import operator
chislo = lambda t, i: (t[i], i + 1)
plyus_minus = {"+": operator.add, "-": operator.sub}
uroven([2, "+", 3, "-", 1], 0, chislo, plyus_minus)
(4, 5)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.