Различия между версиями 10 и 11
Версия 10 от 2020-11-13 20:52:05
Размер: 3358
Редактор: FrBrGeorge
Комментарий:
Версия 11 от 2020-11-14 22:34:27
Размер: 4590
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 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
  • В этом примере сначала приведён ввод, затем вывод (так и будет при тестировании), но если запустить вручную они перемешиваются
  • Я делал так:
       1 $ mkfifo BoldCalc
       2 $ python3 BoldCalc.py > BoldCalc
       3 … ввод
       4 
    
    • и в другом окне
       1 $ cat BoldCalc
       2 … вывод
       3 
    


CategoryHomework

LecturesCMC/PythonIntro2020/Homework_BoldCalc (последним исправлял пользователь FrBrGeorge 2020-11-16 21:27:58)