3

1桁の数字を入力するときにうまく機能するこの基本的なプログラムがあります。しかし、1337 - 456 + 32 のように複数の数字を含む式を計算すると、プログラムは先に進まず...何もしなかったかのように振る舞います。フリーズしたり、エラー メッセージを出力したりせず、停止するだけです。

コードは次のとおりです。

import java.io.*;
import java.util.*;
public class Tester {
    public static void main(String args[]) {
        Scanner kb = new Scanner(System.in);
        System.out.print("Enter number: ");
        String s = kb.nextLine();
        Scanner sc = new Scanner(s);
        //Set delimiters to a plus sign surrounded by any amount of white space...or...
        // a minus sign surrounded by any amount of white space.
        sc.useDelimiter("\\s*");
        int sum = 0;
        int temp = 0;
        int intbefore = 0;
        
        if (sc.hasNext("\\-")) {
            sc.next();
            if (sc.hasNextInt()) {
                intbefore = sc.nextInt();
                int temper = intbefore * 2;
                intbefore = intbefore - temper; 
            }
        }
        if (sc.hasNextInt()) {
            intbefore = sc.nextInt(); //now its at the sign (intbefore = 5)
        }
        sum = intbefore;
        
        while (sc.hasNext()) {
            if(sc.hasNext("\\+")) { //does it have a plus sign?
                sc.next(); //if yes, move on (now at the number)
                System.out.println("got to the next();");
                
                if(sc.hasNextInt()) { //if there's a number
                    temp = sc.nextInt();
                    sum = sum + temp; //add it by the sum (0) and the sum of (5) and (4)
                    System.out.println("added " + sum);
                }
            }
            if(sc.hasNext("\\-")) {
                sc.next();
                System.out.println("got to the next();");
                
                if (sc.hasNextInt()) {
                    temp = sc.nextInt();
                    sum = sum - temp; //intbefore - temp == 11
                    System.out.println("intbefore: " + intbefore + "  temp: " + temp);
                    System.out.println("subtracted " + sum); // subtracted by 11
                }
            }
        }
        System.out.println("Sum is: " + sum);
    }
}

これが発生する理由と、それを修正するために何をすべきかを教えてください。(それが役立つ場合は、ネットビーンズを使用しています)

また、入力には各数値の間にスペースがあると想定しています例: 123 + -23 - 5

4

2 に答える 2

2

私はあなたのコードを実行しようとしましたが、これが私が見つけたものです。

入力が 12+1 であるとします。

Not sc.hasNextInt()は、あなた1が に割り当てているものを提供しますintbefore

次に、whileコード内のループが無限ループになります cos sc.hasNext()は常に true になり (この場合は 2 を返します)、ループ内の 2 つの if 条件に一致しないwhileため、コードが無限ループで実行されます。さあ、それに取り組んでください。ではごきげんよう。

于 2012-12-29T07:18:08.717 に答える
1

そもそもディリメーターを変更する"\\s+"か、デフォルトのものを使用してみてください

于 2012-12-29T07:18:16.613 に答える