2016-07-19 6 views
0

Ich versuche einen Befehlszeilenrechner zu machen, aber ich habe keine Ahnung, wo ich anfangen soll. HierRuby Befehlszeilenrechner

ist das, was ich bisher:

puts "Calculator " 
    puts "please write what youd like to calculate . i.e '4 + 3 * 4'" 

    cal = gets.chomp.split(" ") 

    cal.map!.with_index do |num, i| 
     if i.even? 
     num.to_i 
     else 
     num.to_sym 
     end 
    end 
    cal.inspect 
    # i.e [3, :+, 4] 

Ich möchte in der Lage sein, zu bekommen, was innerhalb des Arrays ist und gibt das Ergebnis davon. Wie folgt: 3 + 4 = 7

Antwort

1

Für einen einfachen Taschenrechner werden Sie wahrscheinlich zuerst die Positionen der Symbole in BODMAS bestellen möchten.

Halten Sie es einfach, ändern Sie das zu DMAS - Division, Multiplikation, Addition und Subtraktion.

Nehmen wir "4 + 3 - 5/2 * 5". Wenn Sie davon ausgehen, dass Sie denken, dass der Benutzer jedes Symbol oder jede Zahl mit einem Leerzeichen trennt, können wir diese Zeichenfolge durch Leerzeichen aufteilen.

Wenn der Benutzer eine korrekte (nicht fehlerhafte) Berechnung eingegeben hat, sollten wir nach dem Index des ersten Operators suchen. Wegen DMAS sollten wir zuerst Abteilung machen.

Wir finden den Index der / und teilen dann den Wert im Index davor mit dem Wert im Index danach, also 5/2.

Ersetzen Sie im Array die Werte, die Sie gerade verwendet haben, und den Operator mit dem berechneten Wert. So wird ["4", "+", "3", "-", "5", "/", "2", "*", "5"][4, "+", 3, "-", 2.5, "*", 5].

Sie wiederholen diesen Vorgang und ändern, was Sie mit den Werten tun, je nachdem, was der Operator ist.

2

Verwenden Sie Eval auf die Eingabezeichenfolge vom Benutzer und es sollte das für Sie behandeln. I. e .:

eval('4 + 3 * 4') 
#⇒ 16 

Sie können dies in irb laufen, wenn Sie verschiedene kurze Beispiele von eval Umgang mit verschiedenen Saiten sehen wollen.

Hier ist ein Beitrag über die Verwendung von Eval.

https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/63-eval

+0

es funktioniert dank. so ersetzt das im Grunde genommen alles was ich geschrieben habe lol –

+1

würde ich dagegen empfehlen.'eval' ist nicht etwas, was man sich angewöhnen möchte; Es ist gefährlich, weil Ruby jeden Code ausführt, den Sie eingeben. Für eine App, die nur Sie verwenden werden, wird es wahrscheinlich in Ordnung sein, aber im Allgemeinen könnten Sie eine harmlose Rechner-App schreiben, und ein Benutzer könnte zum Beispiel "\\ cd ~" eingeben; rm -r \ '', und Ihre App würde fortfahren und das Home-Verzeichnis löschen. – lwassink

+0

@lwassink von der Tatsache, dass _the Benutzer in der Lage war, Rechner zu laufen, und der Prozess, der Rechner ausführte, war in der Lage, den Befehl auszuführen, folgt unmittelbar, dass dieser Benutzer nur in der Lage war, den Befehl selbst auszuführen. Andererseits, wenn jemand einen Taschenrechner programmiert, ist es wahrscheinlich ein Lernprozess und deshalb würde ich nicht empfehlen, einfach 'eval' zu verwenden, was in vielen Fällen ziemlich gut funktioniert und in 90% als unfair gilt. von Fällen. Eval sollte mit Vorsichtsmaßnahme verwendet werden - ja, aber es ist ein perfektes Werkzeug in den Händen eines guten Programmierers. – mudasobwa

3

Sie sind fast da!

Wie Sie vielleicht bewusst sind, Operatoren wie + nur syntaktischer Zucker für Methoden in Ruby, so dass dieser Array:

cal = [3, :+, 4] 

... hat alles, was Sie brauchen: ein Empfänger (3), ein Verfahren zu nennen auf diesem Empfänger (:+) und einem Argument (4):

recv, meth, arg = cal 
recv.public_send(meth, arg) 
# => 7 

die obige entspricht 3.+(4) zu nennen, die natürlich als 3 + 4 gleich ist.

+0

Was schlagen Sie vor, wenn Sie Klammern für die Priorisierung benötigen? 3 * 5 + 2! = 3 * (5 + 2) – pjs

+0

Lösen Sie Ausdrücke zuerst in Klammern und ersetzen Sie sie durch das Ergebnis. Tun Sie dies rekursiv, bis Sie ein einzelnes Ergebnis haben. –

+0

Es ist erwähnenswert, dass "[3,: +, 4]" [AST] (https://en.wikipedia.org/wiki/Abstract_syntax_tree) heißt und es Sprachen gibt (wie zB LISP), die AST benutzen als die Sprachsyntax selbst. Leider ist der Aufbau von komplettem AST in Rubin ein schmerzhafter Prozess, da Rubin nicht so entworfen wurde, dass es gegen seine AST transparent ist (im Gegensatz zu Elixir). – mudasobwa