2017-08-31 2 views
-1

J'ai fait une calculatrice de postfix et je suis assez sûr que cela fonctionne cependant comme une erreur de lecture. La calculatrice est conçue pour lire les nombres en notation postfixée à partir d'une ligne dans un fichier et les calculer. Cependant, il ne reconnaît pas les lignes, par exemple si j'ai deux lignes, il combinera les deux expressions. J'ai de la difficulté à lire les fichiers, donc toute aide serait appréciée. Désolé pour tout problème de format c'est mon premier post. Donc, voici mon code pour que mon problème soit mieux compris.Erreur de lecture de fichier avec la calculatrice de postfix

import java.io.*; 
import java.util.*; 
import java.nio.charset.Charset; 


public class PostfixCalculator { 

private static final String ADD = "+"; 
private static final String SUB = "-"; 
private static final String MUL = "*"; 
private static final String DIV = "/"; 
private static final String EXP = "^"; 
private static final String NEG = "_"; //unary negation 
private static final String SQRT = "#"; 

public void calculateFile(String fileName) throws IOException { 
    BufferedReader br = null; 
    StringBuilder sb = null; 
    try { 
     FileReader fileReader = new FileReader(fileName); 
     br = new BufferedReader(fileReader); 

     sb = new StringBuilder(); 
     String line = br.readLine(); 

     while (line != null) { 
      sb.append(line); 
      line = br.readLine(); 
     } 

     String input = sb.toString(); 
     System.out.println(input + " = " + calculate(input)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     br.close(); 
    } 


    } 

private double calculate(String input) { 
    SinglyLinkedListStack<Double> stack = new SinglyLinkedListStack<Double>(); 

    String[] inputs = input.split(" "); 

    return handleCalculation(stack, inputs); 
} 

private static double handleCalculation(SinglyLinkedListStack<Double> stack, String[] el) { 
    double operand1, operand2; 

    for(int i = 0; i < el.length; i++) { 
     if(el[i].equals(ADD) || el[i].equals(SUB) || el[i].equals(MUL) || el[i].equals(DIV)||el[i].equals(EXP)||el[i].equals(NEG)||el[i].equals(SQRT)) { 
      operand2 = stack.pop(); 
      operand1 = stack.pop(); 
      switch(el[i]) { 
       case ADD: { 
        double local = operand1 + operand2; 
        stack.push(local); 
        break; 
       } 

       case SUB: { 
        double local = operand1 - operand2; 
        stack.push(local); 
        break; 
       } 

       case MUL: { 
        double local = operand1 * operand2; 
        stack.push(local); 
        break; 
       } 

       case DIV: { 
        double local = operand1/operand2; 
        stack.push(local); 
        break; 
       } 
       case EXP: { 
        double local = Math.pow(operand1, operand2); 
        stack.push(local); 
        break; 

       } 
       case NEG: { 
        double local = -(operand1); 
        stack.push(local); 
        break; 
       } 
       case SQRT:{ 
        double local = Math.pow(operand1, .5); 
        stack.push(local); 
        break; 
       } 

      } 
     } else { 
      stack.push(Double.parseDouble(el[i])); 
     } 
    } 

    return (double)stack.pop(); 
} 

} 

C'est ma liste chaînée

public class SinglyLinkedListStack<T> { 

private int size; 
private Node<T> head; 

public SinglyLinkedListStack() { 
    head = null; 
    size = 0; 
} 

public void push(double local) { 
    if(head == null) { 
     head = new Node(local); 
    } else { 
     Node<T> newNode = new Node(local); 
     newNode.next = head; 
     head = newNode; 
    } 

    size++; 
} 

public T pop() { 
    if(head == null) 
     return null; 
    else { 
     T topData = head.data; 

     head = head.next; 
     size--; 

     return topData; 
    } 
} 

public T top() { 
    if(head != null) 
     return head.data; 
    else 
     return null; 
} 

public int size() { 
    return size; 
} 

public boolean isEmpty() { 
    return size == 0; 
} 

private class Node<T> { 
    private T data; 
    private Node<T> next; 

    public Node(T data) { 
     this.data = data; 
    } 

} 


} 

C'est ma démo

import java.io.IOException; 

public class PostFixCalculatorDemo { 
public static void main(String[] args) throws IOException { 
    PostfixCalculator calc = new PostfixCalculator(); 
    calc.calculateFile("in.dat"); 
} 
} 

Le fichier texte contient

2 3^35 5/-

1 2 + 3 * # 4 - 5 6 - + _

ma sortie est 2 3^35 5/-1 2 + 3 * 4 - 5 6 - + _ = -8,0 tel qu'il est vu, il combine les deux lignes. Je veux qu'il lise les deux lignes séparément et calcule 2 3^35 5/- et 1 2 + 3 * # 4 - 5 6 - + _ sans le mettre ensemble. Je sais que c'est le cas parce que j'ai mal programmé la classe calculateFile mais je ne suis pas sûr de savoir comment résoudre ce problème sans casser mon programme.

+1

Où est l'erreur? – shmosel

+0

L'erreur est qu'il ne peut pas lire le fichier ligne par ligne – masalaman

+0

C'est juste une vague description du problème. S'il y a une erreur, vous devriez avoir un message d'erreur et une trace de pile. Postez-le ici. – shmosel

Répondre

0
while (line != null) { 
     sb.append(line); 
     line = br.readLine(); 
    } 

Fondamentalement, vous lisez chaque ligne et annexant à un seul Stringbuffer qui se traduira par concaténation de chaque ligne de votre fichier. Ce tampon ne contient pas de caractère de nouvelle ligne ou tout autre signe où vos lignes se terminent.

De l'documentation:

readline:

Reads une ligne de texte. Une ligne est considérée comme terminée par un saut de ligne ('\ n'), un retour chariot ('\ r') ou un retour chariot suivi immédiatement d'un saut de ligne.

Retourne: une chaîne contenant le contenu de la ligne, ne comprenant pas tous les caractères de fin de lignes, ou une valeur nulle si la fin du flux a atteint Génère:

conseils I ajoutant les lignes à une ArrayList si vous envisagez de tout lire en même temps.