2016-12-04 11 views
0

私はAPコンピュータサイエンスクラスの分数計算プログラムに取り組んでいます。このコードはコンパイルされて実行されますが、入力を入れると、終了するだけでなくエラーが発生します。スレッド「メイン」java.lang.NumberFormatExceptionで分数計算の入力エラー

例外:入力文字列については、「4 + 3/7」入力8_9/4 + 3/7との誤差があります。

誰かが間違っていることを理解できますか?

import java.util.*; 

public class FracCalc { 
    public static void main(String[] args) { 
     typeEquation(); 
    } 
    public static void typeEquation() { 
     System.out.print("Enter an equation, or \"quit\" : "); 
     Scanner scan = new Scanner(System.in); 
     String fraction = scan.nextLine(); 
     String secondOperator; 

     if (fraction.equalsIgnoreCase("quit")) { 
     finish(); 
     } 
     else { 
     produceAnswer(fraction); 
     } 
    } 
    public static void produceAnswer(String fraction) { 
     int whole2; 
     int numerator2; 
     int denominator2; 
     int whole1; 
     int numerator1; //all caps identifier thing? 
     int denominator1; 
     String operator = fraction.substring((fraction.indexOf(" ")) + 1); 

     if (fraction.contains("_")) { 
      whole2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_"))); 
      numerator2 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/"))); 
      denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
      numerator2 = whole2 * denominator2 + numerator2; 
     } 
     else if (fraction.contains("/")) { 
      numerator2 = Integer.parseInt(fraction.substring(0,fraction.indexOf("/"))); 
      denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
     } 
     else { 
      whole2 = Integer.parseInt(fraction.substring(0)); 
      numerator2 = whole2; 
      denominator2 = 1; 
     } 

     if (fraction.contains("_")) { 
      whole1 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_"))); 
      numerator1 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/"))); 
      denominator1 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
      numerator1 = (whole1*denominator1) + numerator1; 
     } 
     else if (fraction.contains("/")) { 
      numerator1 = Integer.parseInt(fraction.substring(0, fraction.indexOf("/"))); 
      denominator1 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
     } 
     else { 
      whole1 = Integer.parseInt(fraction.substring(0)); 
      numerator1 = whole1; 
      denominator1 = 1; 
     } 


     if (fraction.contains("_")) { 
      whole2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("_"))); 
      numerator2 = Integer.parseInt(fraction.substring(fraction.indexOf("_") + 1, fraction.indexOf("/"))); 
      denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
      numerator2 = whole2 * denominator2 + numerator2; 
     } 
     else if (fraction.contains("/")) { 
      numerator2 = Integer.parseInt(fraction.substring(0, fraction.indexOf("/"))); 
      denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
     } 
     else { 
      whole2 = Integer.parseInt(fraction.substring(0)); 
      numerator2 = whole2; 
      denominator2 = 1; 
     }  
     if (operator.equals("+")) { 
     System.out.println(addingFractions(numerator1, numerator2, denominator1, denominator2)); 
     } 
     else if (operator.equals("*")) { 
     System.out.println(multiplyingFractions(numerator1, numerator2, denominator1, denominator2)); 
     } 
     else { 
      int x = numerator2; 
      int y = denominator2; 
      denominator2 = x; 
      numerator2 = y; 
      System.out.println(multiplyingFractions(numerator1, numerator2, denominator1, denominator2)); 
     } 
     int dividend = (denominator1 * numerator2) + (numerator1 * denominator2); 
     int divisor = denominator1 * denominator2; 
     int remainder = dividend % divisor; 
     while (remainder != 0){ 
      dividend = divisor; 
      divisor = remainder; 
      remainder = dividend % divisor; 
     } 
    } 
    public static String multiplyingFractions(int numerator1, int numerator2, int denominator1, int denominator2) { 
     int newNumerator = numerator1 * numerator2; 
     int newDenominator = denominator1 * denominator2; 

     int divisor = reducingFractions(newNumerator, newDenominator); 
     newNumerator /= divisor; 
     newDenominator /= divisor; 

     int integerComponent = 0; 

     while (newNumerator >= newDenominator) { 
      integerComponent++; 
      newNumerator -= newDenominator; 
     } 
     String answer = ""; 
     if (integerComponent > 0) { 
      answer += integerComponent + "_"; 
     } 
     if (newNumerator != 0) { 
      answer += reducingFractions(newNumerator, newDenominator); 
     } 
     return answer; 
    } 
    public static String addingFractions(int numerator1, int numerator2, int denominator1, int denominator2) { 
     int newNumerator = (numerator1 * denominator2) + (numerator2 * denominator1); 
     int newDenominator = denominator1 * denominator2; 
     int divisor = reducingFractions(newNumerator, newDenominator); 
     newNumerator /= divisor; 
     newDenominator /= divisor; 
     int integerComponent = 0; 
     while (newNumerator >= newDenominator) { 
      integerComponent++; 
      newNumerator -= newDenominator; 
     } 
     String answer = ""; 
     if (integerComponent > 0) { 
      answer += integerComponent + "_"; 
     } 
     if (newNumerator != 0) { 
      answer += newNumerator + "/" + newDenominator; 
     } 
     return answer; 
    } 
    public static int reducingFractions(int newNumerator, int newDenominator) { 
     int newNumerator_abs = Math.abs (newNumerator); 
     int newDenominator_abs = Math.abs (newDenominator); 
     int minimumNumber = Math.min (newNumerator_abs, newDenominator_abs); 
     int divisor = 1; 

     for (int i = 1; i <= minimumNumber; i++) { 
     if (newNumerator % i == 0 && newDenominator % i == 0){ 
      divisor = 1; 
     } 
     } 
     return divisor; 
    } 
    public static void finish() { 
     System.out.println("Goodbye!"); 
    } 
} 

答えて

2

あなたはそれが整数でない場合であっても、整数としてStringを解析しようとするので、あなたは、このエラーを取得しています。問題のある行:

denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 

この入力は8_9/4 + 3/7です。

このfraction.indexOf("/")は、最初のスラッシュが返されます。したがって、次の式fraction.substring(fraction.indexOf("/") + 1)は整数ではない4 + 3/7を返します。したがって、Integer.parseIntを使用して解析することはできません。

あなただけ4代わり4 + 3/7のを取得したい場合は、あなたがあなたの行を置き換えることができます:あなたは正しく「分数」の文字列を抽出していなかった

denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1, fraction.indexOf(" "))); 
0

。 Integer.parseInt()を実行するときは注意してください。それは方程式をとらない。あなたが書いたコードで

else if (fraction.contains("/")) { 
     numerator2 = Integer.parseInt(fraction.substring(0,fraction.indexOf("/"))); 
     denominator2 = Integer.parseInt(fraction.substring(fraction.indexOf("/") + 1)); 
    } 

fraction.substring(0、fraction.indexOfは( "/")が返されます "8_9" の文字列としてInteger.parseIntによって認識されていません。

デバッグで実行され、値を可視化するためInterger.parseIntで破るためにブレークポイントを設定してみてください。

+0

私はデバッグする方法に精通していないよ。それが何をするために、私は何を探しています?私はどのように設定しますブレークポイントとは何ですか?そして、ブレークポイントとは何ですか? – agb1158

+0

2つの方法でデバッグできます。変数を出力するにはconsole.out.printlnを使います。 2)IDEを使用して特定の行にブレークポイントを設定します。ビジュアルスタジオを使用している場合、非常に簡単になる – hygoh2k

+0

デバッグはちょっと基本的なスキルですが、YouTubeやGoogleの「ビジュアルスタジオでC#をデバッグする」ことをお勧めします。そこにはたくさんのリソースがあります。あなたが困っている場合は教えてください。 – hygoh2k

関連する問題