Hej! Som rubriken lyder försöker jag mig på att skapa en miniräknare som ska ta input av en sträng, parsea till double. Mitt problem är helt enkelt jag vet inte vad jag ska använda mig av för att det ska funka. Tillexempel input "5*5+2-10/2"
Och även att man ska prioritera tex multiplikation före addition.
Någon som har tips om hur man kan gå till väga?
Alltså metoderna i testCalc ( priorityTest testWithDifferentOperators)
[PHP]
package calculatorprojekt;
import java.util.Scanner;
public class Calculator {
static Scanner s=new Scanner (System.in);
public static void main(String []args) {
String input=s.nextLine();
Calculator calc=new Calculator();
String output=calc.calculateExpression(input);
System.out.println(output);
s.close();
}
//--------------HUVUDMETOD--------------------
public String calculateExpression(String expression) {
//TESTING DIVISION | expression "6/2"
double result = 0;
String [] split = expression.split("[/]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result = divide(d1,d2);
}
//TESTING ADDITION | expresssion "1+2+3"
split = expression.split("[+]");
if(split.length>1) {
for(int i=0;i<split.length;i++) {
double d=Double.parseDouble(split[i]);
result = add(result,d);
}
}
//TESTING MULTIPLY | expression "1*1"
split=expression.split("[*]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result=multiply(d1,d2);
}
//TESTING SUBTRACTION | expression "2-1"
split=expression.split("[-]");
if(split.length>1) {
double d1 = Double.parseDouble(split[0]);
double d2 = Double.parseDouble(split[1]);
result = sub(d1,d2);
}
//TESTING MODULUS | expression "11%2"
split=expression.split("[%]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result=modulus(d1,d2);
}
//TESTING PRIORITY | expression "5+2/2*2"
return Double.toString(result);
}
// Add
public double add(double i, double x) {
double sum=i+x;
return sum;
}
// subtract
public double sub(double i, double x) {
return i-x;
}
//Multiply
public double multiply(double i,double x) {
return i*x;
}
//Divide
public double divide(double i, double x) {
if(x==0) { // Om man delar med 0 kastas det ett ArithmeticException
throw new ArithmeticException();
}
return i/x; //Annars returnera i dividerat med x
}
//Modulus
public double modulus(double i, double x) {
return i%x;
}
}
[/PHP]
Och även att man ska prioritera tex multiplikation före addition.
Någon som har tips om hur man kan gå till väga?
Alltså metoderna i testCalc ( priorityTest testWithDifferentOperators)
Kod:
package tests;
import org.junit.Test;
import calculatorprojekt.Calculator;
import static org.junit.Assert.assertEquals;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
/*KVAR ATT GÖRA
* Använda olika operators
* Fixa prioriteten med operators
*/
public class testCalc {
@Test(expected=ArithmeticException.class)
public void divideByZero_ExecptionThrows(){
//Arrange
Calculator calc = new Calculator();
//Act
double actual = calc.divide(5,0); // Vi försöker dividera fem med noll. Går ej, förväntar oss ett undantag!
}
@Test
public void testSimpleDivision() {
//Arrange
Calculator calc = new Calculator();
//Act
String input="6/2";
String actual=calc.calculateExpression(input);
//Assert
assertEquals("3.0",actual);
}
@Test
public void testSimpleAddition() {
//Arrange
Calculator calc = new Calculator();
//Act
String input="1+1";
String actual=(calc.calculateExpression(input));
//Assert
assertEquals("2.0",actual);
}
@Test
public void testAdditionWithMultipleTerms() {
//Arramnge
Calculator calc=new Calculator();
//Act
String input="1+2+3";
String actual=calc.calculateExpression(input);
//Assert
assertEquals("6.0",actual);
}
@Ignore
@Test
public void testWithDifferentOperators() {
//Arrange
Calculator calc = new Calculator();
//Act
String input="5*4+7-3*0+4-10";
String actual=(calc.calculateExpression(input));
//Assert
assertEquals("21",actual,0.111);
}
@Test
public void priorityTest() {
// Arrange
Calculator calc=new Calculator();
//Act
String input="5+6/2*2";
double actual=Double.parseDouble(calc.calculateExpression(input));
//Assert
assertEquals(11d,actual,0.111);
}
@Test
public void add_test() {
// AAA - arrange act assert
// Arrange
Calculator calc=new Calculator();
// Act
double actual=calc.add(1,2);
// Assert
assertEquals(3d, actual, 0.111);
}
@Test
public void testSimpleSubtractTest() {
//Arrange
Calculator calc=new Calculator();
//Act
String input = "2-1";
String actual = calc.calculateExpression(input);
//Assert
assertEquals("1.0",actual);
}
@Test
public void testSimpleMultiplyTest() {
// Arrange
Calculator calc=new Calculator();
// Act
String input = "1*1";
String actual = calc.calculateExpression(input);
// Assert
assertEquals("1.0",actual);
}
@Test
public void modulus_Test() {
// Arrange
Calculator calc=new Calculator();
//Act
String input="11%2";
String actual=calc.calculateExpression(input);
//Assert
assertEquals("1.0",actual);
}
}
[PHP]
package calculatorprojekt;
import java.util.Scanner;
public class Calculator {
static Scanner s=new Scanner (System.in);
public static void main(String []args) {
String input=s.nextLine();
Calculator calc=new Calculator();
String output=calc.calculateExpression(input);
System.out.println(output);
s.close();
}
//--------------HUVUDMETOD--------------------
public String calculateExpression(String expression) {
//TESTING DIVISION | expression "6/2"
double result = 0;
String [] split = expression.split("[/]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result = divide(d1,d2);
}
//TESTING ADDITION | expresssion "1+2+3"
split = expression.split("[+]");
if(split.length>1) {
for(int i=0;i<split.length;i++) {
double d=Double.parseDouble(split[i]);
result = add(result,d);
}
}
//TESTING MULTIPLY | expression "1*1"
split=expression.split("[*]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result=multiply(d1,d2);
}
//TESTING SUBTRACTION | expression "2-1"
split=expression.split("[-]");
if(split.length>1) {
double d1 = Double.parseDouble(split[0]);
double d2 = Double.parseDouble(split[1]);
result = sub(d1,d2);
}
//TESTING MODULUS | expression "11%2"
split=expression.split("[%]");
if(split.length>1) {
double d1=Double.parseDouble(split[0]);
double d2=Double.parseDouble(split[1]);
result=modulus(d1,d2);
}
//TESTING PRIORITY | expression "5+2/2*2"
return Double.toString(result);
}
// Add
public double add(double i, double x) {
double sum=i+x;
return sum;
}
// subtract
public double sub(double i, double x) {
return i-x;
}
//Multiply
public double multiply(double i,double x) {
return i*x;
}
//Divide
public double divide(double i, double x) {
if(x==0) { // Om man delar med 0 kastas det ett ArithmeticException
throw new ArithmeticException();
}
return i/x; //Annars returnera i dividerat med x
}
//Modulus
public double modulus(double i, double x) {
return i%x;
}
}
[/PHP]