haruna Geschrieben 1. Dezember 2008 Teilen Geschrieben 1. Dezember 2008 Hallo, mal wieder wird das Programmieren eines Taschenrechners gefragt. Dieses Mal wird nicht erst eine Zahl, dann der Operand, dann die zweite Zahl gelesen und dann erscheint das Ergebnis. also man gibt 123 ein. Wenn man + drückt erscheint ein leeres Eingabefeld und hier wird die zweite Zahl eingegeben. Sondern wie bei den heutigen Taschenrechnern von Casio(fx-991 ES, falls das weiterhilft =/). Es wird z.B. 12+34-567 eingegeben und wenn man dann später auf = drückt, wird das Ergebnis errechnet. "12+34-567" liegt mir nun als String zu Verfügung. Und hier liegt auch mein Problem. Ich weiß nicht wie ich jetzt weiterarbeite.. parsen, splitten ..??, Array? Und WIE?? Vllt. hab ich grad auch net den Durchblick :confused: Danke im voraus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. Dezember 2008 Teilen Geschrieben 2. Dezember 2008 komplexere Ausdrücke müssen mit Hilfe eines Baumes verarbeitet werden, außerdem solltest Du dafür Sorge tragen, dass der Baum eindeutig für den Ausdruck wird (Präfixnotation) Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 2. Dezember 2008 Teilen Geschrieben 2. Dezember 2008 Servus, Du musst bei einer solchen Aufgabe den Eingabestring parsen und zerlegen in Operatoren und Operanden. Das heißt, Du musst Deine Operatoren kennen (zusätzlich auch solche Sachen wir Klammern, wenn Ihr das beachten müsst). Dann kannst Du mit String#split(String) anhand einer Regular Expression den Ausdruck zerlegen und ihn danach verarbeiten. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DerKoenig Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 also ich kann dir mal meine überlegung dazu schilden, die natürlich auch denkfehler aufweisen kann wichtig ist die reihenfolge (punkt vor strich und son zeug^^) nehmen wir mal an du hast folgenden String "23 + 33 * 5 - 8" logischerweise muss erstmal 33 * 5 genommen werden. Nehmen wir an du hast den kompletten String zerlegt in ein Array und hast folgendes: str[0] = "23" str[1] = "+" str[2] = "33" str[3] = "*" str[4] = "5" str[5] = "-" str[6] = "8" jetzt musst du in einer hierarchie erstmal alle * und / operationen raussuchen und ausrechnen (also mit ner vorschleife durchgehen) er würde im beispiel nun beim index 3 ein * finden also müssen die zahlen index-1 und index+1 mit einander multipliziert werden..., dann in index-1 gespeichert und die einträge bei index und index+1 werden removed... nun muss die vorschleife nochmal durchlaufen bis alle * bzw / operationen raus sind Anschließend das ganze für die Strichoperationen Als erstes solltest du allerdings immer nach Klammern filtern und diese Klammer dann als "eigene" aufgabe betrachten und das ergebnis der klammer einfach an stelle der klammer in den string eintragen. keine ahnung ob dir das geholfen hat =) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 also ich kann dir mal meine überlegung dazu schilden, die natürlich auch denkfehler aufweisen kann [...] keine ahnung ob dir das geholfen hat =) Vielleicht liest Du, bevor Du postet erst einmal andere Postings, dann wäre Dir auch aufgefallen, dass ich Dein komplettes Posting unter dem Begriff "Präfixnotation" schon formuliert habe. Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DerKoenig Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 noch ein beispiel: ((33+4*9)+39)/100 nun filterst du die erste klammer raus, dabei musst du darauf achten, dass du mitzählst wieviele offene klammern du findest du suchst im string nach "(" "(" erste gefunden... "(" zweite gefunden" sobald er eine ")" findet zählst du den counter wieder um eins runter sprich: ( c=1 ((33+4*9 c=2 ((33+4*9) c=1 ((33+4*9)+39) c=0 ist der counter wieder 0 schneidest du von den beiden Positionen den string aus und hast folgenden "Teilstring" ((33+4*9)+39) darüber läuft nochmal deine Klammer zerschneiden methode und kriegst folgende klammer raus (33+4*9) die rechnest du aus indem du erst die * bzw / rausfilterst arr[0]=33 arr[1]=+ arr[2]=4 arr[3]=* arr[4]=9 nun hast du beim durchlauf des arrays festgestlelt das bei index=3 ein mal ist also arr[index-1] = arr[index-1]*arr[index+1] also: 4*9 das ergebnis steht nun in arr[2] nun ein remove auf arr[3] und arr[4] hast du noch folgendes array 33+36 jetzt das selbe nochmal bloß mit + und - also hast du im endeffekt in arr[0]=69 stehen diesen string (sobald das array nurnoch ein element hat] trägst du einfach in den oberen string ein, in den Teilstring für die Klammer ((33+4*9)+39) (69+39) da lässt du dann die oben formulierte anwendung wieder drüber laufen ersetzt die klammer wieder durch den entstehenden string und setzt es im "hauptstring" ein 108/100 joa so würde ich smachen glaub ich ^^ kp obs zu kompliziert ist ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DerKoenig Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 (bearbeitet) Vielleicht liest Du, bevor Du postet erst einmal andere Postings, dann wäre Dir auch aufgefallen, dass ich Dein komplettes Posting unter dem Begriff "Präfixnotation" schon formuliert habe. Phil schön, dass du das gemacht hast, wenn ich mir die frage durchlese, seh ich, dass da jemand schreibt, der nicht weiß wie er anfangen soll und wenn man ihm ein wort an den kopf wirft, heisst es noch nicht, dass es hilft. Außerdem verstehe ich nicht, was dich daran stört und wenn ich dein post kopieren würde... du hast dein Beitrag geschrieben, vielleicht dem Fragenden geholfen, aber was is so schlimm dran, wenn ich ebenfalls drauf antworte? ich hab ein beispiel genannt so wie ich mir das vorstelle... wo hast du dein beispiel ? wo hast du seine fragen beantwortet ob array splitten etc^^ ist nicht böse gemeint, aber ich hab mir halt die mühe gemacht und finds dann unschön wenn man gleich was zu nörgeln hat Bearbeitet 3. Dezember 2008 von DerKoenig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 ich hab ein beispiel genannt so wie ich mir das vorstelle... wo hast du dein beispiel ? Du solltest Dir ggf mal die Mühe machen und das hier passend dazu lesen: Polnische Notation ? Wikipedia In Deinem Rat versuchst Du ein Problem der Chomsky-Hierarchie 2 mit einem Algorithmus der Chomsky-Hierarchie 3 zu lösen, das definitiv so scheitern wird. wo hast du seine fragen beantwortet ob array splitten etc^^ Ich habe hier auf den Punkt "wie man es macht" geantwortet, d.h. bringe die Gleichung in eine entsprechende Form (Präfixnotation), benutze dafür nun einen Baum und löse dann diesen Baum. Da man dies auch direkt aus der GUI in einen Baum schreiben kann, ist der Umweg über einen String nicht zwingend notwendig. Im OP sind die Datenstrukturen nicht vollständig bekannt, so dass es mehrere Möglichkeiten zur Lösung gibt und eine Antwort eben allgemeiner formuliert ist. Zusätzlich wird die von Dir vorgeschlagene Lösung in dieser Form nicht funktionieren, da sie in der Komplexität der Verarbeitung beschränkt sind, deshalb sehe ich Deine beiden Beispielpostings als fachlich falsch, so dass ich gerade einem Anfänger zu dieser Problemlösung nicht raten würde. Da Du selbst nicht weißt, ob es kompliziert ist, kann ich nur sagen, dass dieser Weg nicht zur Lösung führt Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DerKoenig Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 hmm, dass das nicht funktioniert kann ich mir kaum vorstellen... dass es vielleicht nicht der optimale weg ist, ok, aber nicht funktionieren ^^ naja sagt mir nicht wodran es hapert, wenn ich nachher zeit hab, probiere ich es aus und poste mein ergebnis greez ach ich sagte nicht, dass ich nicht weiß OB es kompliziert, sondern ob es ZU kompliziert ist, sprich es einen einfacheren weg gibt^^ :-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 3. Dezember 2008 Teilen Geschrieben 3. Dezember 2008 dass das nicht funktioniert kann ich mir kaum vorstellen... Löse: sin(30) + 5 => innerhalb der Klammer fehlt Dein Operator, da der Operator in diesem Fall vor der Klammer steht (analog auch Exponenten o.ä.) Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
haruna Geschrieben 4. Januar 2009 Autor Teilen Geschrieben 4. Januar 2009 Bin jetzt um einiges weitergekommen mit meinem Taschenrechner. danke nochmals. Ich benutze nun LinkedList. Habe nicht wirklich den super Plan davon. Und selbst wenn ich google.. versteh ich mein Problem nicht. Mir wird immer dieses gelbe Achtungzeichen angezeigt. Es will mir was sagen: "LinkedList ist a raw type.Reference to generic type LinkedList<E> should be parameterized." Meine Liste wird mir zwar angezeigt, auch mit den Elementen so wie ich sie haben möchte. Aber ich kann später nicht allzu viel mehr damit anstellen.. sehe halt nur noch ROT! Könnte mir jemand.. in einfachen Worten vielleicht.. etwas zu meinem Problem und LinkedList erzählen.. ich setze Strings in meine Liste ein.. list1.add(new String("bla")); und hole mir die entsprechenden Strings mit.. list1.get(1) Ist das richtig? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 5. Januar 2009 Teilen Geschrieben 5. Januar 2009 Also Dein Minimalbeispiel ist korrekt. Du schiebst einen String rein und bekommst ein Objekt raus. Leider hast Du nicht gezeigt, wie Du das zuweist. Beispiel (geht nicht): List list = new LinkedList(); list.add("bla"); String bla = list.get(1); Du erwartest, dass ein String zurück kommt, weil Du einen rein gesteckt hast. Das stimmt, aber der Rückgabetyp von get() ist Object. Folgendes ist also korrekt: List list = new LinkedList(); list.add("bla"); Object bla = list.get(1); Oder folgendes: List list = new LinkedList(); list.add("bla"); String bla = (String) list.get(1); Du castest das Rückgabeobjekt auf den korrekten Typ. Du musst halt wissen, was dieser Typ ist. Die Warning, die Du bekommst, geht genau auf das Problem ein: Du sollst der Liste sagen, welche Typen sie verwaltet, dann ist sie typsicher (parameterized): List<String> list = new LinkedList<String>(); list.add("bla"); String bla = list.get(1); Jetzt funktioniert das, weil die Liste nur Objekte vom Typ String aufnimmt und auch wieder ausspuckt. Ein Tipp: Lies Dir das Generics Tutorial von Sun durch, das erklärt die Geschichte: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
haruna Geschrieben 5. Januar 2009 Autor Teilen Geschrieben 5. Januar 2009 cool danke dass hilft mir bestimmt =D Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.