Feedback

C# - Formelevaluierung aus RPN Form

Veröffentlicht von am 19.11.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.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

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!