Feedback

C# - Formelevaluierung aus RPN Form

Veröffentlicht von am 11/19/2006
(1 Bewertungen)
Evaluiert einen String der eine Formel in umgekehrer polnischer Notation enthält.

Bsp.:
"3 4 +" wird zu 7 evaluiert

Grundrechenarten +,-,*,/,^,sqrt,sin,cos,tan,exp und log werden berechnet.

Auch eine einfache Fehlerbehandlung ist implementiert.
public double EvalRPNString(string input) {
            string[] tokens = input.Split(' ');
            Stack<double> EvalStack = new Stack<double>();
            double tmpNum = 0;
            for (int i = 0; i < tokens.Length; i++) {
                if (double.TryParse(tokens[i], out tmpNum)) {
                    EvalStack.Push(tmpNum);
                } else {
                    try {    
                        tmpNum = EvalStack.Pop();
                    
                        switch (tokens[i]) {
                            case "+": {
                                    EvalStack.Push(EvalStack.Pop() + tmpNum);
                                    break;
                                }
                            case "-": {
                                    EvalStack.Push(EvalStack.Pop() - tmpNum);
                                    break;
                                }
                            case "*": {
                                    EvalStack.Push(EvalStack.Pop() * tmpNum);
                                    break;
                                }
                            case "/": {
                                    EvalStack.Push(EvalStack.Pop() / tmpNum);
                                    break;
                                }
                            case "^": {
                                    EvalStack.Push(Math.Pow(EvalStack.Pop(), tmpNum));
                                    break;
                                }
                            case "sqrt": {
                                    EvalStack.Push(Math.Sqrt(tmpNum));
                                    break;
                                }
                            case "sin": {
                                    EvalStack.Push(Math.Sin(tmpNum));
                                    break;
                                }
                            case "cos": {
                                    EvalStack.Push(Math.Cos(tmpNum));
                                    break;
                                }
                            case "tan": {
                                    EvalStack.Push(Math.Tan(tmpNum));
                                    break;
                                }
                            case "exp": {
                                    EvalStack.Push(Math.Exp(tmpNum));
                                    break;
                                }
                            case "log": {
                                    EvalStack.Push(Math.Log(EvalStack.Pop(), tmpNum));
                                    break;
                                }
                        }
                    } catch (InvalidOperationException ioe) {
                        Console.WriteLine("Fehler an Stelle {0}.", i + 1);
                        break;
                    }
                }
            }
            if (EvalStack.Count > 1) {
                Console.WriteLine("Stack nicht leer - fehlerhafter Inputstring");
                return EvalStack.Pop();
            } else {
                try {
                    return EvalStack.Pop();
                } catch (InvalidOperationException ioe) {
                    Console.WriteLine("Kein Ergebniss da ungültiger Inputstring");
                    return double.NaN;
                }
            }
        }

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!