Разработать консольную утилиту calculator, которая позволяет вычислять арифметические выражения для целых чисел произвольной длины.
Необходимо поддержать следующие операции:
- Сложение
- Вычитание
- Умножение
-
Optional
Целочисленное деление
Выражение может быть представлено в обратной польской нотации (поддержка обязательна) и инфиксной нотации (поддержка опциональна).
Утилита должна обрабатывать следующие аргументы командной строки для выбора нотации:
--revpol— выражение вводится в обратной польской нотации- В этом случае предполагается, что числа с числами, числа с операторами, операторы с числами, разделены пробелами, выражение вводится без скобок.
-
Optional
`--infix` — выражение вводится в инфиксной форме- В этом случае не предполагается обязательное разделение пробелами. Также в записи выражения могут участвовать скобки.
- Выражение, которое необходимо вычислить, подаётся на стандартный поток ввода
- Хранение чисел должно быть реализовано на связных списках
- В узлах списка можно хранить биты, байты,
uint32_t,uint64_t
- В узлах списка можно хранить биты, байты,
- Должны быть реализованы отрицательные числа
- способ на усмотрение автора
- отрицательные числа начинаются с минуса после которого сразу следуют цифры
- таким образом, вычитание возможно двумя способами:
10 4 -10 -4 +
-
Optional
в инфиксной нотации отрицательное число находится в скобках- `10 + (-4)`
- `(-4) * 5`
- `10 + ((-4) * 5)`
-
Optional
При выполнении целочисленного деления ответ должен совпадать с результатом, полученным следующими вычислениями:- Необходимо разделить `p` на `q`
- При выполнении обычного деления будет получена дробь `p/q`
- Результатом будет округление получившейся дроби вниз до ближайшего целого числа, иными словами `floor((double)p / q)`
-
`-1 2 /`
Ответ: `-1` -
`2 -3 /`
Ответ: `-1` -
`2 3 /`
Ответ: `0`
При различных сценариях программа должна завершаться с разными кодами возврата, а также информировать пользователя о некорректности ввода, в том числе в случае отсутствия одного из указанных аргументов или присутствия «мусора».
-
При корректном входе приложение должно выводить результат вычисления выражения в стандартный поток вывода и завершаться с кодом возврата 0;
-
При некорректной передаче аргументов командной строки приложение должно вывести соответствующее сообщение об ошибке в стандартный поток ошибок и завершиться с кодом 1;
-
В случае если приложение не поддерживает инфиксную нотацию, при аргументах командной строки
--infix, приложение должно вывести соответствующее сообщение в стандартный поток ошибок и завершиться с кодом 2; -
В случае если приложение не поддерживает целочисленное деление, а выражение присутствует такая операция, приложение должно вывести соответствующее сообщение в стандартный поток ошибок и завершиться с кодом 3;
-
Если при разборе структуры выражения или его вычисления возникли ошибки, необходимо вывести понятное сообщение о сути проблемы в стандартный поток ошибок и завершить программу с кодом возврата 4;
-
Во всех остальных случаях программа должна завершиться с кодом 5.
-
Запуск:
calculator --revpol
stdin:6 4 - 7 *
stdout:14
Код возврата:0 -
Запуск:
calculator --revpol
stdin:10 -4 + 7 -
stdout:-1
Код возврата:0 -
Запуск:
calculator --revpoch
stderr:Invalid command line arguments
Код возврата:1 -
Запуск:
calculator --infix
stderr:Unsupported notation
Код возврата:2 -
Запуск:
calculator --revpol
stdin:3 a + 7 *
stderr:Invalid character at position 3
Код возврата:4 -
Запуск:
calculator --revpol
stdin:3 (-4) + 7 *
stderr:Invalid character at position 3
Код возврата:4 -
Запуск:
calculator --revpol
stdin:3 4 + 7 /
stderr:Unsupported operation
Код возврата:3 -
Запуск:
calculator --revpol
stdin:10 -4 + 7 8
stderr:Operation symbol is missed
Код возврата:4
Optional
-
Запуск: `calculator --revpol`
stdin: `10 -4 + 7 /`
stdout: `0`
Код возврата: `0` -
Запуск: `calculator --infix`
stdin: `(3 + 4) * 7`
stdout: `49`
Код возврата: `0` -
Запуск: `calculator --infix`
stdin: `(10 + (-4)) / 7`
stdout: `0`
Код возврата: `0` -
Запуск: `calculator`
stderr: `Invalid command line arguments`
Код возврата: `1`