Git Product home page Git Product logo

special-calculator's Introduction

Дополнительное задание ко второй лабораторной работе по программированию "Особый калькулятор"

В этом дополнительном задании Вам предлагается попрактиковаться в написании кода, а также в использовании полиморфизма. Мотивацией к составлению этого доп. задания послужил тот факт, что студенты в первом семестре чаще всего не до конца понимают полиморфизм (а понимать надо).

О чем задание?

Вам необходимо разработать "особый" калькулятор, используя скромный шаблон кода, представленный в этом репозитории. Вам не требуется собирать jar-архив, запускать код из консоли и т.д. Проверка функицональности калькулятора осуществляется при помощи авто-тестов, написанных преподавателями.

Вы также можете запустить эти тесты, для этого:

  1. Откройте терминал вашей ОС
  2. Перейдите в директорию с проектом (команда cd)
  3. Выполните команду:
./gradlew test

Для Windows:

./gradlew.bat test

Система сборки Gradle автоматически запустить весь набор тестов и после их завершения предоставит отчет о тестировании как в терминале, так и в виде html документа (см build/reports/tests/test/index.html), который Вы можете открыть в любом браузере.

В чем состоит задание?

Вам необходимо реализовать калькулятор поддерживающий следующие целочисленные операции:

  • a + b - сложить числа a и b
  • a - b - вычесть из a b
  • a * b - умножить a на b
  • a \ b - получить целую часть от деления a на b
  • a % b - получить остаток от деления a на b
  • a ^ b - возвести a в степень b
  • a ++ b - сложить a и b, затем к результату прибавить b
  • a -- b - вычесть из a b, затем из результата вычесть b
  • a */ b - умножить a на b, затем получить целую часть от деления результата на b

Приоритеты всех операций равны. Скобки не используются.

Гарантируется, что результат любой из операций находится в пределах от -2^63 - 1 до 2^63.

Кроме того, в конструкторе калькулятора задается количество ячеек памяти калькулятора (если параметр конструктора отрицательный или больше 100, следует трактовать его как 0). При создании объекта класса калькулятора считается, что все ячейки заполнены нулями. Для работы с ячейками памяти в калькуляторе определены 2 метода:

  • String putLastResultInMemory(int memoryCellIndex) - калькулятор должен запомнить результат последней операции в ячейке памяти с индексом memoryCellIndex.
  • String resetMemory(int memoryCellIndex) - калькулятор должен очистить (т.е. записать 0) в ячейку памяти с индексом memoryCellIndex.

При вызове любого из вышеперечисленных методов с неправильным параметром, например, отрицательным. необходимо вернуть строку ERROR_1. Если же параметр правильный, нужно вернуть обновленное значение ячейки памяти.

Кроме того, вместо числа в выражении может использоваться Mi, что означает "использовать в качестве значения операнда содержимое ячейки памяти с индексом i". Гарантируется, что i находится в диапазоне от 0 до 100 (включительно обе границы).

Для выполнения самих вычислений в калькуляторе определен метод String calculate(String expression). Он принимает в качестве аргумента строку-выражение, значение которой необходимо вычислить. Гарантируется, что:

  • все числа в строке находятся в диапазоне от -2^31 - 1 до 2^31.
  • количество операций в строке не превосходит 5.
  • на месте операнда в выражении либо целое число в описанном диапазоне, либо выражение Mi.
  • выражение не начинается и не оканчивается на символ операции.

Если при вычислении выражения случается ошибка, непредвиденная ситуация нужно вернуть одно из сообщений:

  • ошибка деления на 0 - ERROR_0
  • ячейка памяти не существует - ERROR_1
  • правый операнд при возведении в степень отрицательный - ERROR_2
  • правый операнд в операции деления с остатком отрицательный - ERROR_3

Примеры:

Аргумент метода calculate:
5 + 4 -- 1 * 9
Возвращаемое значение метода calculate:
63
Пояснение:
Т.к. приоритеты всех операций равны, просто вычисляем слева направо:

  1. 5 + 4 = 9
  2. 9 - 1 - 1 = 7
  3. 7 * 9 = 63

Аргумент метода calculate:
5 - M0
Возвращаемое значение метода calculate:
5
Пояснение:
При создании калькулятора во всех ячейках памяти (предполагается, что в примере в качестве параметра конструктора поступило положительное число) записаны нули. Поэтому: 5 - 0 = 5


Аргумент метода calculate:
5 % -2
Возвращаемое значение метода calculate:
ERROR_3


Аргумент метода calculate:
5 ^ -2
Возвращаемое значение метода calculate:
ERROR_2


Аргумент метода calculate:
5 + M5
Возвращаемое значение метода calculate:
ERROR_1
Пояснение:
В примере считается, что при создании калькулятора в конструктор было передано значение 5.


Аргумент метода calculate:
5 \ 0
Возвращаемое значение метода calculate:
ERROR_0


Аргумент метода calculate:
5 % 0
Возвращаемое значение метода calculate:
ERROR_0


Пример кода:

var calculator = new SpecialCalculator(2);
calculator.calculate("2 * 6");
calculator.putLastResultInMemory(0);
calculator.calculate("6 / 4");
calculator.putLastResultInMemory(1);
calculator.calculate("M0 + M1");

Возвращаемое значение при последнем вызове метода calculate:
13
Пояснение:
По номерам строк:

  1. Создаем объект калькулятора с двумя ячейками памяти.
  2. Вычисляем 2 * 6, результат равен 12.
  3. Запоминаем результат последней операции, т.е. 12, в ячейку памяти M0.
  4. Вычисляем 6 / 4, результат равен 1.
  5. Запоминаем результат последней операции, т.е. 1, в ячейку памяти M1.
  6. Вычисляем M0 + M1, т.е. 12 + 1, результат равен 13

Где писать код?

В директории src/main/java Вы найдете пакет org.itmo.calculator с единственным классом в нем - SpecialCalculator. Вам необходимо дописать в этом пакете свои классы (любые на Ваше усмотрение) и реализовать пустые методы и конструктор. Сигнатуры методов уже определены преподавателями.

ЗАПРЕЩАЕТСЯ:

  1. Менять сигнатуру методов.
  2. Менять параметры конструктора или определять новые конструкторы.
  3. Менять модификаторы конструктора и класса.
  4. Изменять название класса SpecialCalculator
  5. Изменять название иерархии пакетов org.itmo.calculator
  6. Изменять содержимое директории src/main
  7. Изменять содержимое файлов:
    • .gitignore
    • build.gradle
    • gradlew
    • gradlew.bat
    • README.md
    • settings.gradle

РАЗРЕШАЕТСЯ:

  1. Дополнять код внутри методов.
  2. Дополнять код внутри конструктора.
  3. Определять поля класса.
  4. Определять новые методы класса.
  5. Определять новые статические методы.
  6. Создавать новые классы.
  7. Создавать новые пакеты внутри пакета org.itmo.calculator

Требования к коду

  1. Оформление в соответствии с Соглашением об именовании (CamelCase)
  2. Отсутствие длинных цепочек if-ов или гигантских switch-ей. Суть задания не только в реализации корректно работающего кода, но и в изучении полиморфизма. Заменяйте, где это возможно, if-ы, switch-и на полиморфизм.
  3. Названия ВСЕГО должны быть осмысленными.
  4. Не должно быть длинных и запутанных методов. Старайтесь использовать маленькие по количеству строк методы.

special-calculator's People

Contributors

roggired avatar arden30 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.