From d1bc456ec3f0f4d415da1c43775d26385806a6ed Mon Sep 17 00:00:00 2001 From: Jorge Reina Date: Thu, 21 May 2015 18:36:15 -0400 Subject: [PATCH] Initial Commit --- Calculator/.DS_Store | Bin 0 -> 6148 bytes Calculator/Calculator.iml | 19 + Calculator/app/.gitignore | 1 + Calculator/app/app.iml | 93 ++ Calculator/app/build.gradle | 25 + Calculator/app/proguard-rules.pro | 17 + .../c4q/nyc/calculator/ApplicationTest.java | 13 + Calculator/app/src/main/AndroidManifest.xml | 21 + Calculator/app/src/main/ic_launcher-web.png | Bin 0 -> 81555 bytes .../c4q/nyc/calculator/Expression.java | 1129 +++++++++++++++++ .../c4q/nyc/calculator/MainActivity.java | 425 +++++++ Calculator/app/src/main/res/.DS_Store | Bin 0 -> 6148 bytes Calculator/app/src/main/res/anim/rotation.xml | 9 + .../app/src/main/res/drawable/button.xml | 24 + .../app/src/main/res/drawable/calcicon.png | Bin 0 -> 17569 bytes .../app/src/main/res/layout/activity_main.xml | 388 ++++++ .../app/src/main/res/menu/menu_main.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6364 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3150 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 10184 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 20375 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 32524 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + Calculator/app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 6 + Calculator/app/src/main/res/values/styles.xml | 8 + Calculator/build.gradle | 19 + .../build/intermediates/dex-cache/cache.xml | 33 + Calculator/build/intermediates/model_data.bin | Bin 0 -> 87205 bytes Calculator/gradle.properties | 18 + Calculator/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + Calculator/gradlew | 164 +++ Calculator/gradlew.bat | 90 ++ Calculator/local.properties | 10 + Calculator/settings.gradle | 1 + 36 files changed, 2536 insertions(+) create mode 100644 Calculator/.DS_Store create mode 100644 Calculator/Calculator.iml create mode 100644 Calculator/app/.gitignore create mode 100644 Calculator/app/app.iml create mode 100644 Calculator/app/build.gradle create mode 100644 Calculator/app/proguard-rules.pro create mode 100644 Calculator/app/src/androidTest/java/jorgereina1986/c4q/nyc/calculator/ApplicationTest.java create mode 100644 Calculator/app/src/main/AndroidManifest.xml create mode 100644 Calculator/app/src/main/ic_launcher-web.png create mode 100644 Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/Expression.java create mode 100644 Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/MainActivity.java create mode 100644 Calculator/app/src/main/res/.DS_Store create mode 100644 Calculator/app/src/main/res/anim/rotation.xml create mode 100644 Calculator/app/src/main/res/drawable/button.xml create mode 100644 Calculator/app/src/main/res/drawable/calcicon.png create mode 100644 Calculator/app/src/main/res/layout/activity_main.xml create mode 100644 Calculator/app/src/main/res/menu/menu_main.xml create mode 100644 Calculator/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 Calculator/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 Calculator/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 Calculator/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 Calculator/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 Calculator/app/src/main/res/values-w820dp/dimens.xml create mode 100644 Calculator/app/src/main/res/values/dimens.xml create mode 100644 Calculator/app/src/main/res/values/strings.xml create mode 100644 Calculator/app/src/main/res/values/styles.xml create mode 100644 Calculator/build.gradle create mode 100644 Calculator/build/intermediates/dex-cache/cache.xml create mode 100644 Calculator/build/intermediates/model_data.bin create mode 100644 Calculator/gradle.properties create mode 100644 Calculator/gradle/wrapper/gradle-wrapper.jar create mode 100644 Calculator/gradle/wrapper/gradle-wrapper.properties create mode 100755 Calculator/gradlew create mode 100644 Calculator/gradlew.bat create mode 100644 Calculator/local.properties create mode 100644 Calculator/settings.gradle diff --git a/Calculator/.DS_Store b/Calculator/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + + + + + + + + + + + + + + + + diff --git a/Calculator/app/.gitignore b/Calculator/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/Calculator/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Calculator/app/app.iml b/Calculator/app/app.iml new file mode 100644 index 0000000..3e7a176 --- /dev/null +++ b/Calculator/app/app.iml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Calculator/app/build.gradle b/Calculator/app/build.gradle new file mode 100644 index 0000000..de67181 --- /dev/null +++ b/Calculator/app/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion "22.0.1" + + defaultConfig { + applicationId "jorgereina1986.c4q.nyc.calculator" + minSdkVersion 15 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:22.1.1' +} diff --git a/Calculator/app/proguard-rules.pro b/Calculator/app/proguard-rules.pro new file mode 100644 index 0000000..e5fc410 --- /dev/null +++ b/Calculator/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/c4q-jorgereina/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/Calculator/app/src/androidTest/java/jorgereina1986/c4q/nyc/calculator/ApplicationTest.java b/Calculator/app/src/androidTest/java/jorgereina1986/c4q/nyc/calculator/ApplicationTest.java new file mode 100644 index 0000000..f5f46f7 --- /dev/null +++ b/Calculator/app/src/androidTest/java/jorgereina1986/c4q/nyc/calculator/ApplicationTest.java @@ -0,0 +1,13 @@ +package jorgereina1986.c4q.nyc.calculator; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/Calculator/app/src/main/AndroidManifest.xml b/Calculator/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..22dc668 --- /dev/null +++ b/Calculator/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/Calculator/app/src/main/ic_launcher-web.png b/Calculator/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..ee94cdc2e8782afc334edad352e7dd36fa872809 GIT binary patch literal 81555 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 literal 0 HcmV?d00001 diff --git a/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/Expression.java b/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/Expression.java new file mode 100644 index 0000000..f893462 --- /dev/null +++ b/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/Expression.java @@ -0,0 +1,1129 @@ +/* + * Copyright 2012 Udo Klimaschewski + * + * http://UdoJava.com/ + * http://about.me/udo.klimaschewski + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package jorgereina1986.c4q.nyc.calculator; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +/** +*

EvalEx - Java Expression Evaluator

+* +*

Introduction

+* EvalEx is a handy expression evaluator for Java, that allows to evaluate simple mathematical and boolean expressions. +*
+* Key Features: +*
    +*
  • Uses BigDecimal for calculation and screen
  • +*
  • Single class implementation, very compact
  • +*
  • No dependencies to external libraries
  • +*
  • Precision and rounding mode can be set
  • +*
  • Supports variables
  • +*
  • Standard boolean and mathematical operators
  • +*
  • Standard basic mathematical and boolean functions
  • +*
  • Custom functions and operators can be added at runtime
  • +*
+*
+*

Examples

+*
+*  BigDecimal screen = null;
+*  
+*  Expression expression = new Expression("1+1/3");
+*  screen = expression.eval():
+*  expression.setPrecision(2);
+*  screen = expression.eval():
+*  
+*  screen = new Expression("(3.4 + -4.1)/2").eval();
+*  
+*  screen = new Expression("SQRT(a^2 + b^2").with("a","2.4").and("b","9.253").eval();
+*  
+*  BigDecimal a = new BigDecimal("2.4");
+*  BigDecimal b = new BigDecimal("9.235");
+*  screen = new Expression("SQRT(a^2 + b^2").with("a",a).and("b",b).eval();
+*  
+*  screen = new Expression("2.4/PI").setPrecision(128).setRoundingMode(RoundingMode.UP).eval();
+*  
+*  screen = new Expression("random() > 0.5").eval();
+* 
+*  screen = new Expression("not(x<7 || sqrt(max(x,9)) <= 3))").with("x","22.9").eval();
+* 
+*
+*

Supported Operators

+* +* +* +* +* +* +* +* +* +*
Mathematical Operators
OperatorDescription
+Additive operator
-Subtraction operator
*Multiplication operator
/Division operator
%Remainder operator (Modulo)
^Power operator
+*
+* +* +* +* +* +* +* +* +* +* +* +* +* +*
Boolean Operators*
OperatorDescription
=Equals
==Equals
!=Not equals
<>Not equals
<Less than
<=Less than or equal to
>Greater than
>=Greater than or equal to
&&Boolean and
||Boolean or
+* *Boolean operators screen always in a BigDecimal value of 1 or 0 (zero). Any non-zero value is treated as a _true_ value. Boolean _not_ is implemented by a function. +*
+*

Supported Functions

+* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
Function*Description
NOT(expression)Boolean negation, 1 (means true) if the expression is not zero
IF(condition,value_if_true,value_if_false)Returns one value if the condition evaluates to true or the other if it evaluates to false
RANDOM()Produces a random number between 0 and 1
MIN(e1,e2)Returns the smaller of both expressions
MAX(e1,e2)Returns the bigger of both expressions
ABS(expression)Returns the absolute (non-negative) value of the expression
ROUND(expression,precision)Rounds a value to a certain number of digits, uses the current rounding mode
FLOOR(expression)Rounds the value down to the nearest integer
CEILING(expression)Rounds the value up to the nearest integer
LOG(expression)Returns the natural logarithm (base e) of an expression
LOG10(expression)Returns the common logarithm (base 10) of an expression
SQRT(expression)Returns the square root of an expression
SIN(expression)Returns the trigonometric sine of an angle (in degrees)
COS(expression)Returns the trigonometric cosine of an angle (in degrees)
TAN(expression)Returns the trigonometric tangens of an angle (in degrees)
ASIN(expression)Returns the angle of asin (in degrees)
ACOS(expression)Returns the angle of acos (in degrees)
ATAN(expression)Returns the angle of atan (in degrees)
SINH(expression)Returns the hyperbolic sine of a value
COSH(expression)Returns the hyperbolic cosine of a value
TANH(expression)Returns the hyperbolic tangens of a value
RAD(expression)Converts an angle measured in degrees to an approximately equivalent angle measured in radians
DEG(expression)Converts an angle measured in radians to an approximately equivalent angle measured in degrees
+* *Functions names are case insensitive. +*
+*

Supported Constants

+* +* +* +* +* +*
ConstantDescription
PIThe value of PI, exact to 100 digits
TRUEThe value one
FALSEThe value zero
+* +*

Add Custom Operators

+* +* Custom operators can be added easily, simply create an instance of `Expression.Operator` and add it to the expression. +* Parameters are the operator string, its precedence and if it is left associative. The operators `eval()` method will be called with the BigDecimal values of the operands. +* All existing operators can also be overridden. +*
+* For example, add an operator `x >> n`, that moves the decimal point of _x_ _n_ digits to the right: +* +*
+* Expression e = new Expression("2.1234 >> 2");
+* 
+* e.addOperator(e.new Operator(">>", 30, true) {
+*     {@literal @}Override
+*     public BigDecimal eval(BigDecimal v1, BigDecimal v2) {
+*         return v1.movePointRight(v2.toBigInteger().intValue());
+*     }
+* });
+* 
+* e.eval(); // returns 212.34
+* 
+*
+*

Add Custom Functions

+* +* Adding custom functions is as easy as adding custom operators. Create an instance of `Expression.Function`and add it to the expression. +* Parameters are the function name and the count of required parameters. The functions `eval()` method will be called with a list of the BigDecimal parameters. +* All existing functions can also be overridden. +*
+* For example, add a function `average(a,b,c)`, that will calculate the average value of a, b and c: +*
+*
+* Expression e = new Expression("2 * average(12,4,8)");
+* 
+* e.addFunction(e.new Function("average", 3) {
+*     {@literal @}Override
+*     public BigDecimal eval(List parameters) {
+*         BigDecimal sum = parameters.get(0).add(parameters.get(1)).add(parameters.get(2));
+*         return sum.divide(new BigDecimal(3));
+*     }
+* });
+* 
+* e.eval(); // returns 16
+* 
+* The software is licensed under the MIT Open Source license (see LICENSE file). +*
+*
    +*
  • The *power of* operator (^) implementation was copied from [Stack Overflow](http://stackoverflow.com/questions/3579779/how-to-do-a-fractional-power-on-bigdecimal-in-java) Thanks to Gene Marin
  • +*
  • The SQRT() function implementation was taken from the book [The Java Programmers Guide To numerical Computing](http://www.amazon.de/Java-Number-Cruncher-Programmers-Numerical/dp/0130460419) (Ronald Mak, 2002)
  • +*
+* +*@author Udo Klimaschewski (http://about.me/udo.klimaschewski) +*/ +public class Expression { + + + public static final BigDecimal E = new BigDecimal("2.7182818284590452"); + + /** + * Definition of PI as a constant, can be used in expressions as variable. + */ + public static final BigDecimal PI = new BigDecimal( + "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"); + + /** + * The {@link java.math.MathContext} to use for calculations. + */ + private MathContext mc = MathContext.DECIMAL32; + + /** + * The original infix expression. + */ + private String expression = null; + + /** + * The cached RPN (Reverse Polish Notation) of the expression. + */ + private List rpn = null; + + /** + * All defined operators with name and implementation. + */ + private Map operators = new HashMap(); + + /** + * All defined functions with name and implementation. + */ + private Map functions = new HashMap(); + + /** + * All defined variables with name and value. + */ + private Map variables = new HashMap(); + + /** + * What character to use for decimal separators. + */ + private final char decimalSeparator = '.'; + + /** + * What character to use for minus sign (negative values). + */ + private final char minusSign = '-'; + + /** + * The expression evaluators exception class. + */ + public class ExpressionException extends RuntimeException { + private static final long serialVersionUID = 1118142866870779047L; + + public ExpressionException(String message) { + super(message); + } + } + + /** + * Abstract definition of a supported expression function. A function is + * defined by a name, the number of parameters and the actual processing + * implementation. + */ + public abstract class Function { + /** + * Name of this function. + */ + private String name; + /** + * Number of parameters expected for this function. + */ + private int numParams; + + /** + * Creates a new function with given name and parameter count. + * + * @param name + * The name of the function. + * @param numParams + * The number of parameters for this function. + */ + public Function(String name, int numParams) { + this.name = name.toUpperCase(); + this.numParams = numParams; + } + + public String getName() { + return name; + } + + public int getNumParams() { + return numParams; + } + + /** + * Implementation for this function. + * + * @param parameters + * Parameters will be passed by the expression evaluator as a + * {@link java.util.List} of {@link java.math.BigDecimal} values. + * @return The function must return a new {@link java.math.BigDecimal} value as a + * computing screen. + */ + public abstract BigDecimal eval(List parameters); + } + + /** + * Abstract definition of a supported operator. An operator is defined by + * its name (pattern), precedence and if it is left- or right associative. + */ + public abstract class Operator { + /** + * This operators name (pattern). + */ + private String oper; + /** + * Operators precedence. + */ + private int precedence; + /** + * Operator is left associative. + */ + private boolean leftAssoc; + + /** + * Creates a new operator. + * + * @param oper + * The operator name (pattern). + * @param precedence + * The operators precedence. + * @param leftAssoc + * true if the operator is left associative, + * else false. + */ + public Operator(String oper, int precedence, boolean leftAssoc) { + this.oper = oper; + this.precedence = precedence; + this.leftAssoc = leftAssoc; + } + + public String getOper() { + return oper; + } + + public int getPrecedence() { + return precedence; + } + + public boolean isLeftAssoc() { + return leftAssoc; + } + + /** + * Implementation for this operator. + * + * @param v1 + * Operand 1. + * @param v2 + * Operand 2. + * @return The screen of the operation. + */ + public abstract BigDecimal eval(BigDecimal v1, BigDecimal v2); + } + + /** + * Expression tokenizer that allows to iterate over a {@link String} + * expression token by token. Blank characters will be skipped. + */ + private class Tokenizer implements Iterator { + + /** + * Actual position in expression string. + */ + private int pos = 0; + + /** + * The original input expression. + */ + private String input; + /** + * The previous token or null if none. + */ + private String previousToken; + + /** + * Creates a new tokenizer for an expression. + * + * @param input + * The expression string. + */ + public Tokenizer(String input) { + this.input = input.trim(); + } + + @Override + public boolean hasNext() { + return (pos < input.length()); + } + + /** + * Peek at the next character, without advancing the iterator. + * + * @return The next character or character 0, if at end of string. + */ + private char peekNextChar() { + if (pos < (input.length() - 1)) { + return input.charAt(pos + 1); + } else { + return 0; + } + } + + @Override + public String next() { + StringBuilder token = new StringBuilder(); + if (pos >= input.length()) { + return previousToken = null; + } + char ch = input.charAt(pos); + while (Character.isWhitespace(ch) && pos < input.length()) { + ch = input.charAt(++pos); + } + if (Character.isDigit(ch)) { + while ((Character.isDigit(ch) || ch == decimalSeparator) + && (pos < input.length())) { + token.append(input.charAt(pos++)); + ch = pos == input.length() ? 0 : input.charAt(pos); + } + } else if (ch == minusSign + && Character.isDigit(peekNextChar()) + && ("(".equals(previousToken) || ",".equals(previousToken) + || previousToken == null || operators + .containsKey(previousToken))) { + token.append(minusSign); + pos++; + token.append(next()); + } else if (Character.isLetter(ch) || (ch == '_')) { + while ((Character.isLetter(ch) || Character.isDigit(ch) || (ch == '_')) && (pos < input.length())) { + token.append(input.charAt(pos++)); + ch = pos == input.length() ? 0 : input.charAt(pos); + } + } else if (ch == '(' || ch == ')' || ch == ',') { + token.append(ch); + pos++; + } else { + while (!Character.isLetter(ch) && !Character.isDigit(ch) && ch != '_' + && !Character.isWhitespace(ch) && ch != '(' + && ch != ')' && ch != ',' && (pos < input.length())) { + token.append(input.charAt(pos)); + pos++; + ch = pos == input.length() ? 0 : input.charAt(pos); + if (ch == minusSign) { + break; + } + } + if (!operators.containsKey(token.toString())) { + throw new ExpressionException("Unknown operator '" + token + + "' at position " + (pos - token.length() + 1)); + } + } + return previousToken = token.toString(); + } + + @Override + public void remove() { + throw new ExpressionException("remove() not supported"); + } + + /** + * Get the actual character position in the string. + * + * @return The actual character position. + */ + public int getPos() { + return pos; + } + + } + + /** + * Creates a new expression instance from an expression string. + * + * @param expression + * The expression. E.g. "2.4*sin(3)/(2-4)" or + * "sin(y)>0 & max(z, 3)>3" + */ + public Expression(String expression) { + this.expression = expression; + addOperator(new Operator("+", 20, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.add(v2, mc); + } + }); + addOperator(new Operator("-", 20, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.subtract(v2, mc); + } + }); + addOperator(new Operator("*", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.multiply(v2, mc); + } + }); + addOperator(new Operator("/", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.divide(v2, mc); + } + }); + addOperator(new Operator("%", 30, true) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.remainder(v2, mc); + } + }); + addOperator(new Operator("^", 40, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + /*- + * Thanks to Gene Marin: + * http://stackoverflow.com/questions/3579779/how-to-do-a-fractional-power-on-bigdecimal-in-java + */ + int signOf2 = v2.signum(); + double dn1 = v1.doubleValue(); + v2 = v2.multiply(new BigDecimal(signOf2)); // n2 is now positive + BigDecimal remainderOf2 = v2.remainder(BigDecimal.ONE); + BigDecimal n2IntPart = v2.subtract(remainderOf2); + BigDecimal intPow = v1.pow(n2IntPart.intValueExact(), mc); + BigDecimal doublePow = new BigDecimal(Math.pow(dn1, + remainderOf2.doubleValue())); + + BigDecimal result = intPow.multiply(doublePow, mc); + if (signOf2 == -1) { + result = BigDecimal.ONE.divide(result, mc.getPrecision(), + RoundingMode.HALF_UP); + } + return result; + } + }); + addOperator(new Operator("&&", 4, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + boolean b1 = !v1.equals(BigDecimal.ZERO); + boolean b2 = !v2.equals(BigDecimal.ZERO); + return b1 && b2 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("||", 2, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + boolean b1 = !v1.equals(BigDecimal.ZERO); + boolean b2 = !v2.equals(BigDecimal.ZERO); + return b1 || b2 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator(">", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == 1 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator(">=", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) >= 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("<", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == -1 ? BigDecimal.ONE + : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("<=", 10, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) <= 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addOperator(new Operator("=", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) == 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + addOperator(new Operator("==", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return operators.get("=").eval(v1, v2); + } + }); + + addOperator(new Operator("!=", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return v1.compareTo(v2) != 0 ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + addOperator(new Operator("<>", 7, false) { + @Override + public BigDecimal eval(BigDecimal v1, BigDecimal v2) { + return operators.get("!=").eval(v1, v2); + } + }); + + addFunction(new Function("NOT", 1) { + @Override + public BigDecimal eval(List parameters) { + boolean zero = parameters.get(0).compareTo(BigDecimal.ZERO) == 0; + return zero ? BigDecimal.ONE : BigDecimal.ZERO; + } + }); + + addFunction(new Function("IF", 3) { + @Override + public BigDecimal eval(List parameters) { + boolean isTrue = !parameters.get(0).equals(BigDecimal.ZERO); + return isTrue ? parameters.get(1) : parameters.get(2); + } + }); + + addFunction(new Function("RANDOM", 0) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.random(); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("SIN", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.sin(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("COS", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.cos(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("TAN", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.tan(Math.toRadians(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("ASIN", 1) { // added by av + @Override + public BigDecimal eval(List parameters) { + double d = Math.toDegrees(Math.asin(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("ACOS", 1) { // added by av + @Override + public BigDecimal eval(List parameters) { + double d = Math.toDegrees(Math.acos(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("ATAN", 1) { // added by av + @Override + public BigDecimal eval(List parameters) { + double d = Math.toDegrees(Math.atan(parameters.get(0) + .doubleValue())); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("SINH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.sinh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("COSH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.cosh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("TANH", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.tanh(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("RAD", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.toRadians(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("DEG", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.toDegrees(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("MAX", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal v1 = parameters.get(0); + BigDecimal v2 = parameters.get(1); + return v1.compareTo(v2) > 0 ? v1 : v2; + } + }); + addFunction(new Function("MIN", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal v1 = parameters.get(0); + BigDecimal v2 = parameters.get(1); + return v1.compareTo(v2) < 0 ? v1 : v2; + } + }); + addFunction(new Function("ABS", 1) { + @Override + public BigDecimal eval(List parameters) { + return parameters.get(0).abs(mc); + } + }); + addFunction(new Function("LOG", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.log(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("LOG10", 1) { + @Override + public BigDecimal eval(List parameters) { + double d = Math.log10(parameters.get(0).doubleValue()); + return new BigDecimal(d, mc); + } + }); + addFunction(new Function("ROUND", 2) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal toRound = parameters.get(0); + int precision = parameters.get(1).intValue(); + return toRound.setScale(precision, mc.getRoundingMode()); + } + }); + addFunction(new Function("FLOOR", 1) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal toRound = parameters.get(0); + return toRound.setScale(0, RoundingMode.FLOOR); + } + }); + addFunction(new Function("CEILING", 1) { + @Override + public BigDecimal eval(List parameters) { + BigDecimal toRound = parameters.get(0); + return toRound.setScale(0, RoundingMode.CEILING); + } + }); + addFunction(new Function("SQRT", 1) { + @Override + public BigDecimal eval(List parameters) { + /* + * From The Java Programmers Guide To numerical Computing + * (Ronald Mak, 2003) + */ + BigDecimal x = parameters.get(0); + if (x.compareTo(BigDecimal.ZERO) == 0) { + return new BigDecimal(0); + } + if (x.signum() < 0) { + throw new ExpressionException( + "Argument to SQRT() function must not be negative"); + } + BigInteger n = x.movePointRight(mc.getPrecision() << 1) + .toBigInteger(); + + int bits = (n.bitLength() + 1) >> 1; + BigInteger ix = n.shiftRight(bits); + BigInteger ixPrev; + + do { + ixPrev = ix; + ix = ix.add(n.divide(ix)).shiftRight(1); + // Give other threads a chance to work; + Thread.yield(); + } while (ix.compareTo(ixPrev) != 0); + + return new BigDecimal(ix, mc.getPrecision()); + } + }); + + variables.put("PI", PI); + variables.put("TRUE", BigDecimal.ONE); + variables.put("FALSE", BigDecimal.ZERO); + variables.put("e", E); + + } + + /** + * Is the string a number? + * + * @param st + * The string. + * @return true, if the input string is a number. + */ + private boolean isNumber(String st) { + if (st.charAt(0) == minusSign && st.length() == 1) + return false; + for (char ch : st.toCharArray()) { + if (!Character.isDigit(ch) && ch != minusSign + && ch != decimalSeparator) + return false; + } + return true; + } + + /** + * Implementation of the Shunting Yard algorithm to transform an + * infix expression to a RPN expression. + * + * @param expression + * The input expression in infx. + * @return A RPN representation of the expression, with each token as a list + * member. + */ + private List shuntingYard(String expression) { + List outputQueue = new ArrayList(); + Stack stack = new Stack(); + + Tokenizer tokenizer = new Tokenizer(expression); + + String lastFunction = null; + String previousToken = null; + while (tokenizer.hasNext()) { + String token = tokenizer.next(); + if (isNumber(token)) { + outputQueue.add(token); + } else if (variables.containsKey(token)) { + outputQueue.add(token); + } else if (functions.containsKey(token.toUpperCase())) { + stack.push(token); + lastFunction = token; + } else if (Character.isLetter(token.charAt(0))) { + stack.push(token); + } else if (",".equals(token)) { + while (!stack.isEmpty() && !"(".equals(stack.peek())) { + outputQueue.add(stack.pop()); + } + if (stack.isEmpty()) { + throw new ExpressionException("Parse error for function '" + + lastFunction + "'"); + } + } else if (operators.containsKey(token)) { + Operator o1 = operators.get(token); + String token2 = stack.isEmpty() ? null : stack.peek(); + while (operators.containsKey(token2) + && ((o1.isLeftAssoc() && o1.getPrecedence() <= operators + .get(token2).getPrecedence()) || (o1 + .getPrecedence() < operators.get(token2) + .getPrecedence()))) { + outputQueue.add(stack.pop()); + token2 = stack.isEmpty() ? null : stack.peek(); + } + stack.push(token); + } else if ("(".equals(token)) { + if (previousToken != null) { + if (isNumber(previousToken)) { + throw new ExpressionException("Missing operator at character position " + tokenizer.getPos()); + } + } + stack.push(token); + } else if (")".equals(token)) { + while (!stack.isEmpty() && !"(".equals(stack.peek())) { + outputQueue.add(stack.pop()); + } + if (stack.isEmpty()) { + throw new RuntimeException("Mismatched parentheses"); + } + stack.pop(); + if (!stack.isEmpty() + && functions.containsKey(stack.peek().toUpperCase())) { + outputQueue.add(stack.pop()); + } + } + previousToken = token; + } + while (!stack.isEmpty()) { + String element = stack.pop(); + if ("(".equals(element) || ")".equals(element)) { + throw new RuntimeException("Mismatched parentheses"); + } + if (!operators.containsKey(element)) { + throw new RuntimeException("Unknown operator or function: " + + element); + } + outputQueue.add(element); + } + return outputQueue; + } + + /** + * Evaluates the expression. + * + * @return The screen of the expression. + */ + public BigDecimal eval() { + + Stack stack = new Stack(); + + for (String token : getRPN()) { + if (operators.containsKey(token)) { + BigDecimal v1 = stack.pop(); + BigDecimal v2 = stack.pop(); + stack.push(operators.get(token).eval(v2, v1)); + } else if (variables.containsKey(token)) { + stack.push(variables.get(token).round(mc)); + } else if (functions.containsKey(token.toUpperCase())) { + Function f = functions.get(token.toUpperCase()); + ArrayList p = new ArrayList( + f.getNumParams()); + for (int i = 0; i < f.numParams; i++) { + p.add(0,stack.pop()); + } + BigDecimal fResult = f.eval(p); + stack.push(fResult); + } else { + stack.push(new BigDecimal(token, mc)); + } + } + return stack.pop().stripTrailingZeros(); + } + + /** + * Sets the precision for expression evaluation. + * + * @param precision + * The new precision. + * + * @return The expression, allows to chain methods. + */ + public Expression setPrecision(int precision) { + this.mc = new MathContext(precision); + return this; + } + + /** + * Sets the rounding mode for expression evaluation. + * + * @param roundingMode + * The new rounding mode. + * @return The expression, allows to chain methods. + */ + public Expression setRoundingMode(RoundingMode roundingMode) { + this.mc = new MathContext(mc.getPrecision(), roundingMode); + return this; + } + + /** + * Adds an operator to the list of supported operators. + * + * @param operator + * The operator to add. + * @return The previous operator with that name, or null if + * there was none. + */ + public Operator addOperator(Operator operator) { + return operators.put(operator.getOper(), operator); + } + + /** + * Adds a function to the list of supported functions + * + * @param function + * The function to add. + * @return The previous operator with that name, or null if + * there was none. + */ + public Function addFunction(Function function) { + return functions.put(function.getName(), function); + } + + /** + * Sets a variable value. + * + * @param variable + * The variable name. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression setVariable(String variable, BigDecimal value) { + variables.put(variable, value); + return this; + } + + /** + * Sets a variable value. + * + * @param variable + * The variable to set. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression setVariable(String variable, String value) { + if (isNumber(value)) + variables.put(variable, new BigDecimal(value)); + else { + expression = expression.replaceAll("\\b" + variable + "\\b", "(" + value + ")"); + rpn = null; + } + return this; + } + + /** + * Sets a variable value. + * + * @param variable + * The variable to set. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression with(String variable, BigDecimal value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable + * The variable to set. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression and(String variable, String value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable + * The variable to set. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression and(String variable, BigDecimal value) { + return setVariable(variable, value); + } + + /** + * Sets a variable value. + * + * @param variable + * The variable to set. + * @param value + * The variable value. + * @return The expression, allows to chain methods. + */ + public Expression with(String variable, String value) { + return setVariable(variable, value); + } + + /** + * Get an iterator for this expression, allows iterating over an expression + * token by token. + * + * @return A new iterator instance for this expression. + */ + public Iterator getExpressionTokenizer() { + return new Tokenizer(this.expression); + } + + /** + * Cached access to the RPN notation of this expression, ensures only one + * calculation of the RPN per expression instance. If no cached instance + * exists, a new one will be created and put to the cache. + * + * @return The cached RPN instance. + */ + private List getRPN() { + if (rpn == null) { + rpn = shuntingYard(this.expression); + } + return rpn; + } + + /** + * Get a string representation of the RPN (Reverse Polish Notation) for this + * expression. + * + * @return A string with the RPN representation for this expression. + */ + public String toRPN() { + String result = new String(); + for (String st : getRPN()) { + result = result.isEmpty() ? result : result + " "; + result += st; + } + return result; + } + +} diff --git a/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/MainActivity.java b/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/MainActivity.java new file mode 100644 index 0000000..58b1e37 --- /dev/null +++ b/Calculator/app/src/main/java/jorgereina1986/c4q/nyc/calculator/MainActivity.java @@ -0,0 +1,425 @@ +package jorgereina1986.c4q.nyc.calculator; + +import android.support.v7.app.ActionBarActivity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import java.math.BigDecimal; + + +public class MainActivity extends ActionBarActivity { + + Expression expression; + TextView screen; + String input; + Button one, two, three, four, five, six, seven, eight, nine, zero, openP, closeP, point, percent, equals, ac, divide, times, minus, plus, sin, cos, tan, pi, root, delete, exp, e, asin, acos, atan, log, log10, radian, degree; + String last = ""; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + + openP = (Button) findViewById(R.id.openParenthesis); + closeP = (Button) findViewById(R.id.closeParenthesis); + zero = (Button) findViewById(R.id.zeroButton); + one = (Button) findViewById(R.id.oneButton); + two = (Button) findViewById(R.id.twoButton); + three = (Button) findViewById(R.id.threeButton); + four = (Button) findViewById(R.id.fourButton); + five = (Button) findViewById(R.id.fiveButton); + six = (Button) findViewById(R.id.sixButton); + seven = (Button) findViewById(R.id.sevenButton); + eight = (Button) findViewById(R.id.eightButton); + nine = (Button) findViewById(R.id.nineButton); + plus = (Button) findViewById(R.id.plusButton); + minus = (Button) findViewById(R.id.minusButton); + times = (Button) findViewById(R.id.timesButton); + divide = (Button) findViewById(R.id.divideButton); + equals = (Button) findViewById(R.id.equalButton); + point = (Button) findViewById(R.id.pointButton); + percent = (Button) findViewById(R.id.percentButton); + ac = (Button) findViewById(R.id.acButton); + sin = (Button) findViewById(R.id.sinButton); + cos = (Button) findViewById(R.id.cosinButton); + tan = (Button) findViewById(R.id.tanButton); + pi = (Button) findViewById(R.id.piButton); + root = (Button) findViewById(R.id.rootButton); + delete = (Button) findViewById(R.id.deleteButton); + exp = (Button) findViewById(R.id.expButton); + e = (Button) findViewById(R.id.eButton); + asin = (Button) findViewById(R.id.asinButton); + acos = (Button) findViewById(R.id.acosButton); + atan = (Button) findViewById(R.id.atanButton); + log = (Button) findViewById(R.id.logButton); + log10 = (Button) findViewById(R.id.log10Button); + radian = (Button) findViewById(R.id.radianButton); + degree = (Button) findViewById(R.id.degreeButton); + + //SETTING BUTTONS + + openP.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("("); + + + } + }); + seven.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("7"); + + } + }); + four.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("4"); + + } + }); + one.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("1"); + + } + }); + zero.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("0"); + + } + }); + closeP.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append(")"); + + } + }); + eight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("8"); + + } + }); + five.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("5"); + + } + }); + two.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("2"); + + } + }); + point.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("."); + + } + }); + percent.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + + screen = (TextView) findViewById(R.id.inputField); + screen.append("%("); + + } + }); + nine.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("9"); + + } + }); + six.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("6"); + + } + }); + equals.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + input = screen.getText().toString(); + BigDecimal answer = null; + try { + Expression expression = new Expression(input); + answer = expression.eval(); + screen.setText("" + answer.toPlainString()); + } catch (Exception e) { + screen.setText("Wrong Format"); + } + + + } + }); + ac.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.setText(""); + + } + }); + divide.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + String screenText = screen.getText().toString(); + if (screenText.length()>0){ + last = screenText.substring(screenText.length()-1);} + + if (last.equals("/")){ + screen.append(""); + } + else { + screen.append("/"); + } + } + }); + three.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("3"); + + } + }); + times.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + String screenText = screen.getText().toString(); + if (screenText.length()>0){ + last = screenText.substring(screenText.length()-1);} + + if (last.equals("*")){ + screen.append(""); + } + else { + screen.append("*"); + } + + } + }); + minus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + String screenText = screen.getText().toString(); + + if (screenText.length()>0){ + last = screenText.substring(screenText.length()-1);} + + if (last.equals("-")){ + screen.append(""); + } + else { + screen.append("-"); + } + + } + }); + plus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + String screenText = screen.getText().toString(); + if (screenText.length()>0){ + last = screenText.substring(screenText.length()-1);} + + if (last.equals("+")){ + screen.append(""); + } + else { + screen.append("+"); + } + + } + }); + sin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("SIN("); + + + } + }); + cos.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("COS("); + + } + }); + tan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("TAN("); + + } + }); + pi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("PI"); + + } + }); + root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("SQRT("); + + } + }); + exp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("^"); + + } + }); + delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + try { + screen.setText(screen.getText().toString().substring(0, screen.getText().toString().length()-1)); + + } + catch (StringIndexOutOfBoundsException e){ + screen.setText(""); + } + } + }); + e.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("e"); + + } + }); + asin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("ASIN("); + + } + }); + acos.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("ACOS("); + + } + }); + atan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("ATAN("); + + } + }); + log.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("LOG("); + + } + }); + radian.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("RAD("); + + } + }); + degree.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + screen = (TextView) findViewById(R.id.inputField); + screen.append("DEG("); + + } + }); + + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/Calculator/app/src/main/res/.DS_Store b/Calculator/app/src/main/res/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4ffb3f483017d59bc7ebdc7335ce6d930043ec69 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8ru7n0q2MJ~!9$Bm@fK@63WZ9GsMLf6x)74mqz0*loP7-c-$V2r zd=zia?5;(ro&=FHv&??8vpXC1TiD4k#&~_`RT(oGV+JT+O5-KC%J&kZ6M=HA?XAmXG_dF8o$VQzlGD3%tnnM+qAD45ue+ZKM>HCOhcFmXia4?cySbVTSyX+0W- zUVPG0`*nnu^t$G1bKsvtXwwP(wupr*0+C!8MQmNOJQ{6pRyM3^ZD+h;jcPTpw>E3z zv3Y42YwO#)2S@$!)%DHo-TlMk)3dq_js&1AE12{z6N?ODfEXYKW{v^<^cjmYcQQH< zF+dFbmH~VpEKo#SW2R6(9ni@V0I&dVDPUtQfiadwTVtjWWk;h70$RWKDhoe*A)tvUx)oIxtwuZA@#%nG4Pdvyc(LA|M!2c|Gx&&h!`LSW{Lq` zXtWx2IFin-Q-{M`Yk{7DqTsqr;UokMnTla8rs6WF6!2SU0NNTeh2R099|1`Nb;Q7* GGVl(qvR`EY literal 0 HcmV?d00001 diff --git a/Calculator/app/src/main/res/anim/rotation.xml b/Calculator/app/src/main/res/anim/rotation.xml new file mode 100644 index 0000000..3c236fa --- /dev/null +++ b/Calculator/app/src/main/res/anim/rotation.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/Calculator/app/src/main/res/drawable/button.xml b/Calculator/app/src/main/res/drawable/button.xml new file mode 100644 index 0000000..0bd538f --- /dev/null +++ b/Calculator/app/src/main/res/drawable/button.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/Calculator/app/src/main/res/drawable/calcicon.png b/Calculator/app/src/main/res/drawable/calcicon.png new file mode 100644 index 0000000000000000000000000000000000000000..52f0c6097a9df731dd54a765b9eba39d49f6ea09 GIT binary patch literal 17569 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 IM6N<$g8nvEQ2+n{ literal 0 HcmV?d00001 diff --git a/Calculator/app/src/main/res/layout/activity_main.xml b/Calculator/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..e5fa2a5 --- /dev/null +++ b/Calculator/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,388 @@ + + + + + + + + + +