Vinnaren i pepparkakshustävlingen!
2019-03-12, 17:21
  #1
Medlem
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)

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]
Citera
2019-03-17, 10:51
  #2
Medlem
Kanske lite sent, men hade en liknande labb under utbildningen, råder dig att läsa på om b.la infix & postfix. Samt att du behöver ett sätt att bryta ned input strängen och dela upp den till operatorer och nummer.
Citera
2019-03-20, 22:34
  #3
Moderator
Neksnors avatar
Att parsa till Double är väl inte vad som ska göras? Låter vettigare att parsa till Expression, alltså en klass som representerar beräkningen. Och sedan bara anropa dess metod evaluate().
Men jag kanske är Haskell-skadad.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in