3358
Комментарий:
|
4590
|
Удаления помечены так. | Добавления помечены так. |
Строка 39: | Строка 39: |
* Спойлер: /* Не надо пытаться `exec()`-ать тест — синтаксис калькулятора отличается от синтаксиса Python. В выражениях надо честно проверить наличие только допустимых символов и отсутствие конструкций вида `//`, `**` и `идентификатор(` (это вызов функции, которых в калькуляторе нет). Заменить `/` на `//`. Во избежание конфликта имён переменных с ключевыми словами python приписать к ним всем какую-нибудь ерунду, типа '`_C_`'. И вот в таком виде `eval()-ить` — причём переменные калькулятора хранить в словаре, и ''этот самый словарь'' передавать в качестве globals. Я в качестве globals передавал словарь, содержащий ''пустой'' `__builtins__`, а словарь с переменными — в locals, но, кажется, необходимости в этом нет. */ |
Написать программу — калькулятор с переменными и обработкой ошибок. Программа построчно вводит команды калькулятора, и если надо, выводит результат их выполнения или ошибку.
- Пробелы в строках игнорируются
Команда, начинающаяся на '#' — комментарий, такие команды игнорируются
Команда вида Идентификатор = выражение задаёт переменную Идентификатор
идентификатор определяется стандартно: «произвольная последовательность букв, цифр и символов подчёркивания не начинающаяся с цифры»
Если слева от "=" стоит не идентификатор, выводится "Assignment error"; всё, что справа, игнорируется, присваивания не происходит
Команда вида выражение выводит значение выражения.
- Выражение — это арифметическое выражение, состоящее из
целых чисел
- уже определённых идентификаторов
- круглых скобок
действий +, -, *, /, % и унарных + и -.
Деление целочисленное
Любое другое выражение приводит к выводу ошибки "Syntax error"
Если выражение нельзя вычислить, потому что в нём встречаются неопределённые переменные, выводится ошибка "Name error"
Если выражение нельзя вычислить по какой-то другой причине, выводится "Runtime error"
# Ошибок нет 234 10/3 A = 3*(2+(1-7)%5) A+100 + ++ - -- - + - - 0 # Начинаются ошибки 7*B 3=3 A=4=5 A() A/0
Подсказка 1: удобно пользоваться eval() со всеми тремя параметрами
есть такая в нашем случае неприятная штука — __builtins__, её тоже следует перебить или как-то поигнорить
- Подсказка 2: кое-какие иные конструкции Python тоже являются синтаксическими ошибками
Спойлер:
234 3 118 0 Name error Assignment error Syntax error Syntax error Runtime error
- В этом примере сначала приведён ввод, затем вывод (так и будет при тестировании), но если запустить вручную они перемешиваются
- Я делал так:
- и в другом окне