2015-09-11 8 views
0

Я пытаюсь написать программу, которая возьмет две фракции от пользователя (в форме a/b) и проведет их через определенные манипуляции и упростит результаты. Я получил правильную математику, но мне не повезло с упрощающей частью. Я получаю арифметические исключения, когда запускаю программу.Программа Java для упрощения работы фракций.

Может ли кто-нибудь указать мне правильное направление и предоставить некоторую обратную связь по моему коду?

Любые советы приветствуются и оцениваются!

Главный класс:

import java.util.*; 
    public class Fraction { 

     /** 
     * @param args 
     */ 
     @SuppressWarnings("resource") 
     public static void main(String[] args) { 

      Scanner input = new Scanner(System.in); 
      System.out.println("Please enter your first fraction:"); 
      String frac = input.nextLine(); 
      Driver f1 = new Driver(frac); 

      System.out.println("Please enter your second fraction:"); 
      String frac2 = input.nextLine(); 
      Driver f2 = new Driver(frac2); 

      Driver multiFrac = f1.multiply(f1, f2); 
      System.out.println("Multiplication: " +multiFrac.getNum()+ "/" + multiFrac.getDenom()); 

      Driver divFrac = f1.divide(f1, f2); 
      System.out.println("Division: " + divFrac.getNum()+ "/" + divFrac.getDenom()); 

      Driver addFrac = f1.add(f1, f2); 
      System.out.println("Addition: " + addFrac.getNum()+ "/" + addFrac.getDenom()); 


      Driver subFrac = f1.sub(f1, f2); 
      System.out.println("Subtraction: " + subFrac.getNum()+ "/" + subFrac.getDenom()); 


     } 


    } 

Конструктор класса:

public class Driver { 

     public static int num0; 
     public static int denom0; 
     private int denom = 0; 
     private int num = 0; 

     public Driver (String frac){ 

    String s0[] = frac.split("/"); 

    int[] numbers0 = new int[s0.length]; 
    for(int i = 0;i < s0.length;i++){ 

     numbers0[i] = Integer.parseInt(s0[i]); 
    } 

    num = numbers0[0]; 
    denom = numbers0[1]; 
} 

public Driver(int num0, int denom0) { 
    num = num0; 
    denom = denom0; 
} 

public int getNum(){ 
    int gcf= GCD(num0, denom0); 
    return (num/gcf); 
} 

public int getDenom(){ 
    int gcf = GCD(num0, denom0); 
    return (denom/gcf); 
} 


public Driver add(Driver firstFrac, Driver secondFrac){ 
    int denom0 = firstFrac.getDenom() * secondFrac.getDenom(); 
    int num0 = firstFrac.getNum() * secondFrac.getDenom() + secondFrac.getNum() * firstFrac.getDenom(); 
    this.GCD(num0, denom0); 
    return new Driver (num0 , denom0); 
} 

public Driver sub(Driver firstFrac, Driver secondFrac){ 
    int denom0 = firstFrac.getDenom() * secondFrac.getDenom(); 
    int num0 = (firstFrac.getNum() * secondFrac.getDenom()) - (secondFrac.getNum() * firstFrac.getDenom()); 
    return new Driver (num0 , denom0); 
} 

public Driver multiply(Driver firstFrac, Driver secondFrac){ 
    int num0 = firstFrac.getNum() * secondFrac.getNum(); 
    int denom0 = firstFrac.getDenom() * secondFrac.getDenom(); 
    return new Driver (num0, denom0); 
} 

public Driver divide(Driver firstFrac, Driver secondFrac){ 
    int num0 = firstFrac.getNum() * secondFrac.getDenom(); 
    int denom0 = firstFrac.getDenom() * secondFrac.getNum(); 
    this.GCD(num0, denom0); 
    return new Driver (num0, denom0); 
} 

public int GCD(int a, int b){ 
     if (b==0) return a; 
     return GCD(b,a%b); 
} 
} 

ответ

0

Вот подсказка, используйте BigDecimal

String str[] = frac.split("/"); 

BigDecimal top = new BigDecimal (str[0]); 
BigDecimal bottom= new BigDecimal (str[1]); 

BigDeimal result = top.divide (bottom); 

см http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#divide(java.math.BigDecimal)

+0

'BigDecimal' не так полезно для фракций. 'new BigDecimal (1) .divide (новый BigDecimal (3));' генерирует исключение. –

+0

Да, прочитайте javadocs и подумайте об использовании режима округления. Я попытаюсь проиллюстрировать OP, что не так уж хорошо требовать стандартные классы Java. –

 Смежные вопросы

  • Нет связанных вопросов^_^