Implement a scientific calculator using MVC constructs in Swift 3 Programming language(basic calculator IOS app). It needs to have two classes. One class name is CalculatorBrain.swift for model and another is ViewController.swift for view. Also please show the screenshot of storyboard.
Requirements:
It needs to be able to handle multiple operations in a sequence.
It should ONLY use the last operand if multiple operands are entered consecutively
Example: “5++-1=”is equivalent to “5-1=”
Proper error handling and self-correction.
“+-5” is equivalent to “negative 5”
“0004+32 ++ 0101 -- 04=” is equivalent to “4+32+101-4=”
Implement 3 more buttons: ¼ ½ and ¾ at the bottom of the keyboard. The fractions should concatenate the number just typed in such as 24.75. In the case where an enter is in between this would be a 24 and then a .75 separately put in the stack.
Add a memory function to your calculator that stores and retrieves a number. Implement the following buttons at the top of the keyboard
MC = Memory clear sets memory to 0
MR – Memory recall uses the number in memory acting as it you typed that number in yourself
MS – Memory Store puts the number on display into memory
M+ – Memory takes the number on the display, adds it to the memory, and puts the result into memory.
Implement a clear (C) button. Put it to the left of the 0. If the clear button is pressed once, it should take whatever was typed before the last enter and put it to 0. If the clear is entered twice, it should clear the stack.
Implement a percent (%) button.
Show the history of every operand and operation input by displaying it.
package Model;
import java.util.LinkedList; import java.util.Observable; public class Model extends Observable { private String currentTotal; private String currentInputString; public Model() { currentTotal = "0"; currentInputString = ""; } public void computeString() { LinkedList<String> operationTokens = new StringParser(currentInputString).getTokens(); MathOperationsList possibleOperations = new MathOperationsList(); operationTokens = performMathInSequence(operationTokens, possibleOperations); boolean hasOnlyOneToken = (operationTokens.size() == 1); if (hasOnlyOneToken) { setCurrentTotal(operationTokens.get(0)); } else { System.out.println("uhh.. something went wrong? LOL!"); } } private LinkedList<String> performMathInSequence(LinkedList<String> operationTokens, MathOperationsList possibleOperations) { for (String operation : possibleOperations) { operationTokens = performOperations(operation, operationTokens); } return operationTokens; } private LinkedList<String> performOperations(String operation, LinkedList<String> tokens) { boolean isOperationCompleted = false; while (isOperationCompleted == false) { if (tokens.contains(operation)) { int operatorIndex = tokens.indexOf(operation); int firstOperandIndex = operatorIndex - 1; int secondOperandIndex = operatorIndex + 1; String firstOperand = tokens.get(operatorIndex - 1); String secondOperand = tokens.get(operatorIndex + 1); float computationResult; // perform the relevant operation switch (operation) { case "*":computationResult = Float.parseFloat(firstOperand)*Float.parseFloat(secondOperand);break; case "/":computationResult = Float.parseFloat(firstOperand)/Float.parseFloat(secondOperand);break; case "+":computationResult = Float.parseFloat(firstOperand)+Float.parseFloat(secondOperand);break; case "-":computationResult = Float.parseFloat(firstOperand)-Float.parseFloat(secondOperand);break; default:computationResult = (float) 69.69; System.out.println("Cannot detect operation"); break; } // cast the operation back into a String String tokenizedComputation = Float.toString(computationResult); // remove all relevant tokens tokens.remove(secondOperandIndex); tokens.remove(operatorIndex); tokens.remove(firstOperandIndex); // place relevant token into relevant position tokens.add(firstOperandIndex, tokenizedComputation); } else { isOperationCompleted = true; return tokens; } } return tokens; } public void Clear() { currentTotal = "0"; currentInputString = ""; setChanged(); CalcDisplayData update = new CalcDisplayData(); update.setComputationText(currentInputString); update.setCurrentTotal(currentTotal); notifyObservers(update); } public void setComputationText(String newInputString) { currentInputString = newInputString; setChanged(); CalcDisplayData update = new CalcDisplayData(); update.setComputationText(newInputString); notifyObservers(update); } public void setCurrentTotal(String newTotal) { float floatTotal = Float.parseFloat(newTotal); int intTotal = (int) floatTotal; setCurrentTotalAsIntValueIfPossible(floatTotal, intTotal); setChanged(); CalcDisplayData update = new CalcDisplayData(); update.setCurrentTotal(currentTotal); notifyObservers(update); } private void setCurrentTotalAsIntValueIfPossible(float floatTotal, int intTotal) { if (floatTotal == intTotal) { currentTotal = Integer.toString(intTotal); } else { currentTotal = Float.toString(floatTotal); } } }
Get Answers For Free
Most questions answered within 1 hours.