2016-07-29 25 views
1

Ich habe einen einfachen Rechner in Ruby gemacht. Nach dem Ausführen stoppt das Programm jedoch und muss erneut ausgeführt werden. Ich habe Folgendes versucht, aber es endete in einer Endlosschleife. Wie kann ich das so schreiben, dass es so lange läuft, bis die Benutzer sagen, dass es aufhören soll?Ruby Rechner kontinuierlich laufen

puts "Please enter two digits separated by operation you would like to calculate:" 

input = gets.chomp.split(' ') 

while input != nil 
    if input[1] == "+" 
    puts input[0].to_i + input[2].to_i 
    elsif input[1] == "-" 
    puts input[0].to_i - input[2].to_i 
    elsif input[1] == "*" 
    puts input[0].to_i * input[2].to_i 
    else 
    puts input[0].to_i/input[2].to_i 
end 
end 
+0

'Eingabe' wird nie' nil' sein, es ist immer ein Array. Beachten Sie, dass in Ruby 'x! = Nil' wirklich viel zu viel Chaos ist und 99% der Zeit' while x' ausreichen. Die einzigen logisch falschen Dinge sind 'false' und' nil'. Leeres Array, leere Zeichenkette, 0 usw. Sie sind alle wahrheitsgemäß. – tadman

Antwort

0

split(' ') gibt einen Array und nicht gleich Null, so input != nil immer wahr ergibt, die eine unendliche Schleife macht.

Sie möchten while input.size == 2 oder break die while-Schleife zu bestimmten Eingang versuchen, wie:

while true 
    # ... if/elsif for operators 
    elsif input[1] == 'exit' 
    break # end the 'while' loop 
    end 
end 
0

Eine rekursive Ansatz:

def recurs_calc 
    puts "Please enter two digits separated by operation you would like to calculate:" 
    input = gets.chomp.split(' ') 

    if input[1] == "+" 
    puts input[0].to_i + input[2].to_i 
    recurs_calc 
    elsif input[1] == "-" 
    puts input[0].to_i - input[2].to_i 
    recurs_calc 
    elsif input[1] == "*" 
    puts input[0].to_i * input[2].to_i 
    recurs_calc 
    elsif input[1] == '/' 
    puts input[0].to_f/input[2].to_i 
    recurs_calc 
    elsif input[0] == 'exit' 
    exit 
    else 
    puts 'please enter two numbers with SPACES i.e. 4 + 4 then enter' 
    recurs_calc 
    end 
end 

recurs_calc 

Hier erinnern wir recurs_calc nach Bedingungen und Ausgang, wenn die Benutzertypen 'exit'. Hinweis: Ich habe auch to_f in der /-Zweig verwendet, um ein genaueres Ergebnis zu erhalten und einen letzten Zweig, der eine "falsche" Eingabe berücksichtigt. Versuchen Sie es auszuführen.


einfach einen anderen Ansatz mit eval, die Sie nutzen können, obwohl dies wahrscheinlich ein bisschen zu betrügen. Es ist auch eine schlechte Praxis, aus Sicherheitsgründen eval zu verwenden. Auch ein besonderer Dank an @nicael für die String-Substitution:

loop do 
puts "Enter calculation" 
input = gets.chomp 
    if input == 'exit' 
    exit 
    else 
    p eval (input.gsub(/(\d+)/, '\1.0')) 
    end 
end 
0

Änderungen wie unten:

msg = "Please enter two digits separated by operation you would like to calculate:" 

puts msg 

while input = gets.chomp.split(' ') 
    if input[1] == "+" 
    puts input[0].to_i + input[2].to_i 
    elsif input[1] == "-" 
    puts input[0].to_i - input[2].to_i 
    elsif input[1] == "*" 
    puts input[0].to_i * input[2].to_i 
    else 
    puts input[0].to_i/input[2].to_i 
    end 
    puts msg 
end 
0

Das Ganze ist ein großes Durcheinander von Ruby, die drastisch nach und nach vereinfacht werden können. Der Schlüssel hier ist, den Ruby-Weg auf Dinge anzuwenden und elegante Lösungen werden sofort offensichtlich.

Betrachten Sie diese unordentliche while Schleife mit einer tatsächlichen loop Struktur ersetzen. Auch die Elemente Namen aus dem split resultierende auf der Grundlage ihrer Bedeutung für Sie:

loop do 
    puts "Please enter two digits separated by operation you would like to calculate:" 

    left, operator, right = gets.chomp.split(' ') 

    result = case (operator) 
    when '+' 
    left.to_i + right.to_i 
    when '-' 
    left.to_i - right.to_i 
    when '*' 
    left.to_i * right.to_i 
    when '/' 
    left.to_i/right.to_i 
    end 

    puts result 
end 

Nun ist diese wie eine Menge Wiederholung sieht, das einzige, was zu ändern ist hier der Betreiber. Da Ruby eine sehr dynamische Sprache ist, können wir dies tatsächlich kollabieren einige mehr:

loop do 
    puts "Please enter two digits separated by operation you would like to calculate:" 

    left, operator, right = gets.chomp.split(' ') 

    result = case (operator) 
    when '+', '-', '*', '/' 
    left.to_i.send(operator, right.to_i) 
    end 

    puts result 
end 

Jetzt hier noch einige Überschneidungen gibt. Was zu versuchen, diese weiter zu verringern und auch für mehr Flexibilität ermöglichen:

loop do 
    puts "Please enter digits separated by the operations you would like to calculate:" 

    values = gets.chomp.split(' ') 

    while (values.length > 2) 
    left = values.shift.to_i 
    operator = values.shift 
    right = values.shift.to_i 

    values.unshift(left.send(operator, right)) 
    end 

    puts values[0] 
end 

Das bedeutet, dass Sie beliebig lange Listen von Zahlen haben können zusammen zu fügen. Es ist nicht viel schwieriger, diese Zeichenfolge in Zahlen und Nicht-Zahlen-Komponenten zu zerlegen, aber das ist etwas, das Sie selbst ausprobieren können.