Zum Inhalt springen

etwas komplexerer Taschenrechner


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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 =)

Geschrieben
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

Geschrieben

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 ?

Geschrieben (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 von DerKoenig
Geschrieben

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

Geschrieben

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^^ :-)

Geschrieben

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

  • 1 Monat später...
Geschrieben

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?

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...