2016-05-16 11 views
1

Ich versuche, einen Rechner zu erstellen, der Benutzereingaben nimmt. Ich möchte, dass diese Eingabe nicht nur die Zahlen, sondern auch den Operator enthält (+, -, *, /). Ich habe eine Methode erstellt, die mit einem bestimmten Parameter arbeitet. Hier ist mein Code:Rechner, der einen Operator als Benutzereingabe verwendet

def calculator(x, y, z) 
    if y == '+' 
     ans = x + z 
    elsif y == '-' 
     ans = x - z 
    elsif y == '*' 
     ans = x * z 
    elsif y == '/' 
     ans = x/z 
    end 
    p ans 
end 

calculator(3, '+', 5) 
calculator(4, '-', 2) 
calculator(3, '*', 10) 
calculator(21, '/', 7) 

puts "Please enter your calculation" 
user_calc = gets.chomp 

user_calc.chars 
user_calc[0].to_i 
user_calc[4].to_i 
calculator(user_calc[0], user_calc[2], user_calc[4]) 

Das Programm nimmt Index 0 die erste ganze Zahl zu sein, Index 2 der Betreiber und der Index 4 die zweite ganze Zahl ist.

Wenn ich 3 + 5 eingib, ist der Ausgang 35 anstelle von 8. Jede andere Operation (-, *, /) gibt nil zurück. Wenn ich versuche, Benutzereingaben zu verwenden, erhalte ich einen Fehler. Ich denke, es behandelt alles im Array als String. Die angegebenen Parameter funktionieren wie vorgesehen. Aber ich kann die Benutzereingaben nicht ganz festhalten.

Ich frage mich, wie ich das beheben würde.

Antwort

3

user_calc[0].to_igibt eine Zahl als Ergebnis zurück; es ist nicht drehenuser_calc[0] in eins. So

calculator(user_calc[0], user_calc[2], user_calc[4]) 

tut

calculator("3", "+", "5") 

und "3" + "5" ist "35".

Der richtige Weg

calculator(user_calc[0].to_i, user_calc[2], user_calc[4].to_i) 

oder

arg1 = user_calc[0].to_i 
arg2 = user_calc[4].to_i 
calculator(arg1, user_calc[2], arg2) 
+0

Danke, Amadan. Ich verstehe, warum ich jetzt nicht die richtigen Ergebnisse erhielt. Ich habe ein bisschen mehr nachgedacht, und ich hatte eine zusätzliche Frage, die ich versucht habe zu lösen. Gibt es eine Möglichkeit, jede Eingabe (x, y, z) als eigenen Index zu behandeln? Im Augenblick, auch wenn ich user_calc.split ('') , jedes Zeichen wird behandelt, wie es eigenen Index ist. So würde zum Beispiel 5 + 95 stattdessen 5 + 9 zurückgeben. Ich frage mich, wie ich user_calc anders aufteilen könnte. Mit anderen Worten, wie würde ich eine Rückkehr von 100 für 5 + 95 statt einer Rückkehr von 14 erhalten. – Orie

+1

Wie Keith sagte, regelmäßige Ausdrücke. '_, arg1, op, arg2 = *" 5 + 95 ".match (/ (\ d +) \ s * ([- + * \ /]) \ s * (\ d +) /)' extrahiert zwei ganzzahlige Argumente (als Strings müssen Sie immer noch 'to_i') und ein Operator zwischen ihnen. – Amadan

2

Neben der Notwendigkeit to_i in einer anderen Antwort erwähnt zu schreiben wäre, wird user_calc[n] den n-te Charakter bekommen. Dies würde nicht mit Zeichen < 0 oder> 9 umgehen. Stattdessen könnten Sie reguläre Ausdrücke verwenden, um die Begriffe zu extrahieren (die übrigens besser benannt werden sollten, z. B. x, operator, y).

Sie können zu http://rubular.com/ für einen großen regulären Ausdruck Tester gehen.

Darüber hinaus gibt es Möglichkeiten, Ihre calculator Methode zu vereinfachen. Zum Beispiel könnten Sie case verwenden:

def calculator(x, y, z) 
    case y 
    when '+' 
     ans = x + z 
    when '-' 
     ans = x - z 
    when '*' 
     ans = x * z 
    when '/' 
     ans = x/z 
    end 
    p ans 
end 

... und weiter durch die Zuweisung außerhalb des Gehäuses Aussage bewegen:

def calculator(x, y, z) 
    x = x.to_i; z = z.to_i 
    ans = case y 
    when '+' 
     x + z 
    when '-' 
     x - z 
    when '*' 
     x * z 
    when '/' 
     x/z 
    end 
    p ans 
end 

Es gibt auch send, aber mit, dass es noch wichtiger um den Operator zu validieren, um sicherzustellen, dass er einer von denen ist, mit denen Sie umgehen können.

Verwandte Themen