+1 (315) 557-6473 

Program To Build A 4 Function Calculator Assignment Solution.


Instructions

Objective
Write a program to build a 4 function calculator in any control flow.

Requirements and Specifications

Introduction
You will write a 4 function calculator without using any control flow, meaning you cannot write any code that will be executed conditionally. Instead you will apply object-orientation  programming approaches to make decisions based on types instead of values. Specifically, you are expected to use the state pattern to complete the c++ assignment.
The following are banned in your submissions:
  • Conditionals
  • if/else if/else
  • match/case
  • throw/try/catch/finally (Can be used to simulate conditionals)
  • Loops
  • for
  • while
  • do/while
  • Any way of directly simulating Conditionals or Loops that is against the spirit of thi assignment. (Ex. Taking advantage of short circuit evaluations) If your submission, including testing, contains any of the keywords listed above it will not be graded.
Source Code
package calculator.model
class Calculator() {
  private var lhs: Double = 0.0
  private var rhs: Double = 0.0
  private var state: State = new EqualsState
  // Accessed by View. You should edit this method as you build functionality
  def displayNumber(): Double = {
    rhs
  }
  def clearPressed(): Unit = {
    state.clearPressed()
  }
  def numberPressed(number: Int): Unit = {
    state.numberPressed(number)
  }
  def dividePressed(): Unit = {
    state.dividePressed()
  }
  def multiplyPressed(): Unit = {
    state.multiplyPressed()
  }
  def subtractPressed(): Unit = {
    state.subtractPressed()
  }
  def addPressed(): Unit = {
    state.addPressed()
  }
  def equalsPressed(): Unit = {
    state.equalsPressed()
  }
  def decimalPressed(): Unit = {
    state.decimalPressed()
  }
  abstract class State {
    def clearPressed(): Unit = {
      lhs = 0.0
      rhs = 0.0
      state = new EqualsState
    }
    def numberPressed(number: Int): Unit
    def dividePressed(): Unit
    def multiplyPressed(): Unit
    def subtractPressed(): Unit
    def addPressed(): Unit
    def equalsPressed(): Unit
    def decimalPressed(): Unit
  }
  abstract class OperationStartState extends State {
    def dividePressed(): Unit = {
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      state = new EqualsState
    }
  }
  class AddStartState extends OperationStartState {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
      state = new AddState
    }
    def decimalPressed(): Unit = {
      state = new AddDecimalState
    }
  }
  class SubtractStartState extends OperationStartState {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
      state = new SubtractState
    }
    def decimalPressed(): Unit = {
      state = new SubtractDecimalState
    }
  }
  class MultiplyStartState extends OperationStartState {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
      state = new MultiplyState
    }
    def decimalPressed(): Unit = {
      state = new MultiplyDecimalState
    }
  }
  class DivideStartState extends OperationStartState {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
      state = new DivideState
    }
    def decimalPressed(): Unit = {
      state = new DivideDecimalState
    }
  }
  abstract class OperationState extends State {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
    }
  }
  class AddState extends OperationState {
    def dividePressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new MultiplyState
    }
    def subtractPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new SubtractState
    }
    def addPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs + rhs
      state = new EqualsState
    }
    def decimalPressed(): Unit = {
      state = new AddDecimalState
    }
  }
  class SubtractState extends OperationState {
    def dividePressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs - rhs
    }
    def decimalPressed(): Unit = {
      state = new SubtractDecimalState
    }
  }
  class MultiplyState extends OperationState {
    def dividePressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs * rhs
    }
    def decimalPressed(): Unit = {
      state = new MultiplyDecimalState
    }
  }
  class DivideState extends OperationState {
    def dividePressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs / rhs
    }
    def decimalPressed(): Unit = {
      state = new DivideDecimalState
    }
  }
  class EqualsState extends State {
    def numberPressed(number: Int): Unit = {
      rhs = 10 * rhs + number
    }
    def dividePressed(): Unit = {
      lhs = rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
    }
    def decimalPressed(): Unit = {
      state = new EqualsDecimalState
    }
  }
  class EqualsDecimalState extends EqualsState {
    var d = 10.0
    override def numberPressed(number: Int): Unit = {
      rhs = (math.round(rhs * (d.toInt / 10)) * 10 + number) / d
      d *= 10
    }
    override def decimalPressed(): Unit = {
    }
  }
  abstract class OperationDecimalState extends State {
    var d = 10.0
    def numberPressed(number: Int): Unit = {
      rhs = (math.round(rhs * (d.toInt / 10)) * 10 + number) / d
      d *= 10
    }
    def decimalPressed(): Unit = {
    }
  }
  class AddDecimalState extends OperationDecimalState {
    def dividePressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new MultiplyState
    }
    def subtractPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new SubtractState
    }
    def addPressed(): Unit = {
      lhs = lhs + rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs + rhs
      state = new EqualsState
    }
  }
  class SubtractDecimalState extends OperationDecimalState {
    def dividePressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs - rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs - rhs
    }
  }
  class MultiplyDecimalState extends OperationDecimalState {
    def dividePressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs * rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      printf(lhs.toString)
      printf("\n")
      printf(rhs.toString)
      printf("\n")
      rhs = lhs * rhs
    }
  }
  class DivideDecimalState extends OperationDecimalState {
    def dividePressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new DivideStartState
    }
    def multiplyPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new MultiplyStartState
    }
    def subtractPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new SubtractStartState
    }
    def addPressed(): Unit = {
      lhs = lhs / rhs
      rhs = 0.0
      state = new AddStartState
    }
    def equalsPressed(): Unit = {
      rhs = lhs / rhs
    }
  }
}