2019-03-12, 17:21
  #1
Medlem
Hej! Som rubriken lyder frsker jag mig p att skapa en minirknare som ska ta input av en strng, parsea till double. Mitt problem r helt enkelt jag vet inte vad jag ska anvnda mig av fr att det ska funka. Tillexempel input "5*5+2-10/2"
Och ven att man ska prioritera tex multiplikation fre addition.
Ngon som har tips om hur man kan g till vga?
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 GRA
 * Anvnda 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 frsker dividera fem med noll. Gr ej, frvntar 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);
	}
}

Kod:
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 idouble x) {
        
double sum=i+x;
        return 
sum;
    }
    
    
// subtract
    
public double sub(double idouble x) {
        return 
i-x;
    }
    
    
//Multiply    
    
public double multiply(double i,double x) {
        return 
i*x;
    }
    
    
//Divide
    
public double divide(double idouble 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 idouble x) {
        return 
i%x;
    }
        

Citera
2019-03-17, 10:51
  #2
Medlem
Kanske lite sent, men hade en liknande labb under utbildningen, rder dig att lsa p om b.la infix & postfix. Samt att du behver ett stt att bryta ned input strngen och dela upp den till operatorer och nummer.
Citera
2019-03-20, 22:34
  #3
Medlem
Neksnors avatar
Att parsa till Double r vl inte vad som ska gras? Lter vettigare att parsa till Expression, allts en klass som representerar berkningen. 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