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);
	}
}

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, 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

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback