0

そのため、Input という名前のテキスト ファイルを読み取る必要があるこのプロジェクトがあり、次のように実行しています。

    public static void textParser() {
    File inputFile = new File("Input.txt");
    try {
        BufferedReader br = new BufferedReader(new FileReader(inputFile));
        String inputsText;
        while ((inputsText = br.readLine()) != null) {
            System.out.println(inputsText);
        }
        br.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

そしてそれは動作します。Input.txt の内部には、次のように表示されます。

6
10 + 4
12 - 3
1000 / 50
9 * 64
2^5
90 % 8
1 + 1
6 * 4

最初の行 (6) は、常にやるべき方程式の量であり、6 とは異なる場合があります。次に、最初の行に示されている方程式の数を実行する必要があります。ありがとう!

4

5 に答える 5

3

パーサーを作成する必要があります。宿題をしなくても、これは十分なはずの疑似コードです。

for line in ReadFile()  
{  
  for token in split(line,expression)  
  {  
      if token is digit  
         digits.enqueue(token) 
      if token is symbol  
         symbols.enqueue(token)    
  }  
     for element in digits,symbols:   
         applySymbol(firstDigit,secondDigit,symbol)
}  
于 2013-07-19T17:54:51.087 に答える
1

私はこの問題を異なる言語で数回解決しました。分流場アルゴリズムを調べる

基本的に、演算子とオペランドを優先キューにプッシュおよびポップします。基本的に、インフィックスをポストフィックスに変換しています。方程式を後置表記にすると、解くのがずっと簡単になります。

問題を心配する優先順位がない場合、問題ははるかに簡単ですが、同じアプローチで解決できます。

編集:

私たち人間は修正記法で使用します: 3 + 5 - 1 演算子はオペランドの間にあります。

Post fix 表記法では、次のようになります: 3 5 + 1 -

演算子はオペランドの後に表示されます。このように書かれた方程式は評価が容易です。オペランドをスタックにプッシュし、次の演算子を使用して最後の 2 つを評価するだけです。ここでは、3 と 5 をスタックにプッシュします。次に、+ 演算子に遭遇したので、3 と 5 を追加して 8 を取得します。8 をスタックにプッシュします。1 を読みました。スタックに 1 をプッシュします。今、あなたは読んだ-。1 から 8 を引きます。答えは 7 です。

分流ヤード アルゴリズムは、インフィックスからポスト フィックスへの変換方法を教えてくれます。

幸運を!

于 2013-07-19T17:51:49.170 に答える
0

私は最終的に別の方法で動作することを理解しました。これが私がやっている方法です:

    public static void textParser() {
    File inputFile = new File("Input.txt");
    try {
        Scanner scanner = new Scanner(inputFile);
        int numberOfQuestions = Integer.parseInt(scanner.next());
        for (int i = 1; i <= numberOfQuestions; i++) {
            int firstInt = Integer.parseInt(scanner.next());
            String operationSign = scanner.next();
            int secondInt = Integer.parseInt(scanner.next());
            if (operationSign.contains("+")) {
                int answer = firstInt + secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " + " + secondInt + " = " + answer);
            } else if (operationSign.contains("-")) {
                int answer = firstInt - secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " - " + secondInt + " = " + answer);
            } else if (operationSign.contains("/")) {
                int answer = firstInt / secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " / " + secondInt + " = " + answer);
            } else if (operationSign.contains("*")) {
                int answer = firstInt * secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " * " + secondInt + " = " + answer);
            } else if (operationSign.contains("%")) {
                int answer = firstInt % secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " % " + secondInt + " = " + answer);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

助けてくれてありがとう!

于 2013-07-20T20:34:29.680 に答える
0

オプションは、ANTLRを使用してパーサーを生成することです。このチュートリアルでは、あなたがやろうとしていることをほとんどカバーしています

于 2013-07-19T17:57:13.600 に答える