Skip to content

n03d3n/Long_Arithmetic_Calculator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

Задача 5

Описание

Разработать консольную утилиту calculator, которая позволяет вычислять арифметические выражения для целых чисел произвольной длины.

Операции

Необходимо поддержать следующие операции:

  • Сложение
  • Вычитание
  • Умножение
  • Optional Целочисленное деление

Нотации

Выражение может быть представлено в обратной польской нотации (поддержка обязательна) и инфиксной нотации (поддержка опциональна).

Утилита должна обрабатывать следующие аргументы командной строки для выбора нотации:

  • --revpol — выражение вводится в обратной польской нотации
    • В этом случае предполагается, что числа с числами, числа с операторами, операторы с числами, разделены пробелами, выражение вводится без скобок.
  • Optional `--infix` — выражение вводится в инфиксной форме
    • В этом случае не предполагается обязательное разделение пробелами. Также в записи выражения могут участвовать скобки.

Требования к реализации

  • Выражение, которое необходимо вычислить, подаётся на стандартный поток ввода
  • Хранение чисел должно быть реализовано на связных списках
    • В узлах списка можно хранить биты, байты, uint32_t, uint64_t
  • Должны быть реализованы отрицательные числа
    • способ на усмотрение автора
    • отрицательные числа начинаются с минуса после которого сразу следуют цифры
    • таким образом, вычитание возможно двумя способами:
      • 10 4 -
      • 10 -4 +
    • Optional в инфиксной нотации отрицательное число находится в скобках
      • `10 + (-4)`
      • `(-4) * 5`
      • `10 + ((-4) * 5)`
  • Optional При выполнении целочисленного деления ответ должен совпадать с результатом, полученным следующими вычислениями:
    1. Необходимо разделить `p` на `q`
    2. При выполнении обычного деления будет получена дробь `p/q`
    3. Результатом будет округление получившейся дроби вниз до ближайшего целого числа, иными словами `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`

About

template for a future task

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages