Hallo zusammen,
ich bin absoluter C#-Anfänger und benötige eure Hilfe.
Es geht um folgendes. Ich möchte eine polnische Notation programmieren.
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
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]);
}
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"?
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.
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:
OK, dann werde ich vor der Eingabe des Ausdrucks noch eine Information mitgeben, dass zwischen jeder Ziffer, Operator ein Leerzeichen stehen muss.
Das habe ich auch jetzt alles schon soweit programmiert.
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!
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
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.