Laden...

Polnische Notation / Array-Elemente vergleichen

Erstellt von caliu92 vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.243 Views
C
caliu92 Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren
Polnische Notation / Array-Elemente vergleichen

Hallo zusammen,

ich bin absoluter C#-Anfänger und benötige eure Hilfe.

Es geht um folgendes. Ich möchte eine polnische Notation programmieren.

  1. User gibt einen ausdruck ein (a+b)
  2. Ausdruck wird in einen Array gespeichert
  3. einzelne Array-Elemente werden ausgegeben
  4. einzelne Array-Elemente werden vergleichen (Zahl? Operator? Klammer?)

Genau hier hänge ich jetzt! Wie kann ich abbilden, dass die einzelnen Array-Elemente ausgegeben und mit den jeweiligen Zeichen (Zahl, Operator, Klammer) verglichen werden.

Wenn der Vergleich stattgefunden hat, möchte ich dann zu Punkt 5 übergehen

  1. Speicherung der Array-Elemente in den jeweiligen Stack

Bitte bitte helft mir auf den Sprung, sonst verzweifel ich hier noch komplett..

    class Program
    {
        static void Main(string[] args)
        {
            string eing;

            Console.Write("Bitte geben sie den Ausdruck ein: ");
            eing = Console.ReadLine();

         //Speichert den Wert der Eingabe in den Array
         string [] eingabe = new String[20];
         string ausdruck = eing;

            //Speichert jeden Wert der Eingabe in ein eigenes Array-Feld
            for (int i = 0; i < ausdruck.Length; i++)
            {
                eingabe[i] = ausdruck[i].ToString();
            }
            //Gibt aus wie viele Elemente sich im Array befinden
            Console.WriteLine("Es befinden sich " + ausdruck.Length + " Elemente im Array!");

            //Gibt alle Arrayfelder aus
            for (int i = 0; i < ausdruck.Length; i++)
            {
                Console.WriteLine(+i +". Wert: " + ausdruck[i]);
            }
C
2.121 Beiträge seit 2010
vor 8 Jahren

Nachdem einige Zeit ohne Antwort vergangen ist scheine ich nicht der einzige zu sein der die Frage nicht verstanden hat 😃

zu 1: (a+b) ist laut meiner Recherche keine polnische Notation

zu 2: Den Ausdruck in einem Array speichern bedeutet was genau? Ich nehme an du willst nicht den ganzen Ausdruck sondern die einzelnen Teile im Array haben?

zu 3: Ausgabe ist auch ein Problem?

zu 4 und "dass die einzelnen Array-Elemente ausgegeben und mit den jeweiligen Zeichen (Zahl, Operator, Klammer) verglichen werden. ": Was genau willst du womit vergleichen?

zu 5: was ist der "jeweilige Stack"?

189 Beiträge seit 2014
vor 8 Jahren

Hallo caliu92,

also wie chilic schon richtig angemerkt hat, ist dein Beispiel keine Polnische Notation (PN) oder Umgekehrte Polnische Notation (UPN).
Dein Beispiel müsste so aussehen:


+ a b (PN)
a b + (UPN)

Dann solltest du - falls du diese Freiheit hast - die Konvention festlegen, dass jeder Operator und jeder Operand von dem vorherigen mit einem Leerzeichen abgetrennt werden muss.
Dann kannst du per Split-Methode dir einen string-Array geben lassen, der alle Operatoren und Operanden als string enthält.
Den Array elementenweise durchgehen, das Element richtig casten und auf den Operatoren- bzw. Operanden-Stack legen. - Fertig.
Ist es ein Operand, auf den Stack damit.
Ist es ein Operator, die zwei letzten Operanden vom Stack holen, rechnen, Ergebnis auf den Stack.

EDIT: Überarbeitet.

C
caliu92 Themenstarter:in
2 Beiträge seit 2015
vor 8 Jahren

Hallo zusammen,

vielen Dank für die Antworten!

Ich meinte mit meinem Beispiel einfach nur einen Ausdruck, der so von der Eingabe kommt und in die Polnische Notation zerlegt werden sollte.

@Ezio:

  1. OK, dann werde ich vor der Eingabe des Ausdrucks noch eine Information mitgeben, dass zwischen jeder Ziffer, Operator ein Leerzeichen stehen muss.

  2. Das habe ich auch jetzt alles schon soweit programmiert.

  • Ausdruck wird eingelesen
  • Alle einzelnen Elemente werden in ein Array-Feld gespeichert
  • Zur Kontrolle ausgegeben

Jetzt hänge aber daran, festzustellen ob das Array-Element ein Operator, Klammer oder Zahl ist um diese dann auf den entsprechenden Stack abzulegen...

Grüße!

189 Beiträge seit 2014
vor 8 Jahren

Hallo caliu92,

ah ... ich (wir) haben dich absolut falsch verstanden: Ich dachte, es ginge um einen einfachen Rechner, der einen Ausdruck in PN auswertet/das Ergebnis berechnet.
Du hängst aber bei einem Konverter Infixnotation -> Polnische Notation ... . (Solltest du in deinem Startbeitrag + Überschrift etwas deutlicher machen.)

Das ist gar nicht so trivial.
Du musst Operatorenrang (im einfachen Fall Klammer vor Punkt vor Strich, später könnten noch Späße wie Vorzeichen, unäre Operatoren, Potenz, Sin, Cos, ... dazukommen) und Verschachtelungstiefe (innerste Klammer zuerst) beachten.
Von daher kannst du nicht einfach jedes Element durchgehen und auf den Stack werfen.

Für die Konvertierung eines einzelnen Elements kannst du zuerst Prüfen, ob es sich in eine Zahl konvertieren lässt z.B. mit double.TryParse() und falls das nicht geht in einen char konvertieren.

VG Ezio

D
96 Beiträge seit 2012
vor 8 Jahren

Auch wenn die der Anfangspost etwas ungünstig formuliert war, hab ich mir schon fast gedacht, dass es sich um eine Konvertierung von Infix in UPN handelt.

Was du wahrscheinlich versuchst zu programmieren ist der Shunting-Yard Algorithmus.

Um herauszufinden, ob das momentane Element eine Klammer, ein Operator oder eine Zahl ist, kannst du doch simple Vergleiche benutzen.

  1. Klammer: Element ist "(" oder ")"
  2. Operator: Element ist "+", "*", "-", .... (sonstiges). Hier bietet es sich an ein Array mit allen gültigen Operatoren anzulegen (oder sogar ein HashSet) und einfach ein Lookup darin zu machen.
  3. Zahl: int.TryParse oder float.TryParse (falls Kommazahlen auch erlaubt sind) sind vermutlich die einfachsten Methoden dafür.