Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Ruby Ruby Basics (Retired) Ruby Methods Practice Makes Perfect!

Adrian Cunanan
seal-mask
.a{fill-rule:evenodd;}techdegree
Adrian Cunanan
Front End Web Development Techdegree Student 9,996 Points

I am trying to build a simple calculator with Ruby. Using Ruby Basic topics. Please help...

Here is my code:

# This method greets the user on start up and request their name
# It returns their name
def greeting

  name = gets "Hello!  Please type your name: "

  puts "It is nice to meet you #{name}.  I am a simple calculator application.  \n
  I can add, subtract, multiply, and divide.\n"

  return name

end

# This method ask the user what type of calculation they would like to perform
# It returns the operation or an error for erroneous entry
def request_calculation_type

  operation_selection = gets "Type 1 to add, 2 to subtract, 3 to multiply, or 4 to divide two numbers: "

  if operation_selection == 1 
    return "add"
  elsif operation_selection == 2
    return "subtract"
  elsif operation_selection == 3
    return "multiply"
  elsif operation_selection == 4
    return "divide"
  else return "error"

end

# This method performs the requested calculation
# It returns the result of the calculation
def calculate_answer(operator, a, b)

  if operator == "add"
    return result= a + b
  elsif operator == "subtract"
    return result = a - b
  elsif operator == "multiply"
    return result = a * b
  elsif operator == "divide"
    return result = a / b

end

name = greeting
run_calculator = 1

while run_calculator == 1

  current_calculation = request_calculation_type()

  if current_calculation == "error"

    puts "I do not understand this type of calculation... Can we try again?"  

  else

    first_number = gets "What is the first number you would you like to #{calc_type}: "
    second_numer = gets "What is the second number you would like to #{calc_type}: "

    answer = calculate_answer(current_calculation, first_number, second_number)

    puts "The answer is #{answer}"
    run_calculator = gets "Type 1 to run another calcution or 2 to end: "

  end
end

Here is the error:

calculator.rb:69: syntax error, unexpected end-of-input, expecting keyword_end

FYI - Line 69 is the end in the code

Please help... I would like to accomplish this as my first Ruby program ;-)

To save counting, you might want to add where line 69 is with a comment!

10 Answers

I had a play and had more success with this:

# This method greets the user on start up and request their name
# It returns their name
def greeting
  puts "Hello!  Please type your name: "
  name = gets
  puts "It is nice to meet you #{name}.  I am a simple calculator application.  \n
  I can add, subtract, multiply, and divide.\n"
  name
end

# This method ask the user what type of calculation they would like to perform
# It returns the operation or an error for erroneous entry
def request_calculation_type
  puts "Type 1 to add, 2 to subtract, 3 to multiply, or 4 to divide two numbers: "
  operation_selection = gets.to_i

  if operation_selection == 1 
    "add"
  elsif operation_selection == 2
    "subtract"
  elsif operation_selection == 3
    "multiply"
  elsif operation_selection == 4
    "divide"
  else 
    "error"
  end

end

# This method performs the requested calculation
# It returns the result of the calculation
def calculate_answer(operator, a, b)
  if operator == "add"
    a + b
  elsif operator == "subtract"
   a - b
  elsif operator == "multiply"
    a * b
  elsif operator == "divide"
    a / b
  end
end

name = greeting
run_calculator = 1

while run_calculator == 1

  current_calculation = request_calculation_type()

  if current_calculation == "error"

    puts "I do not understand this type of calculation... Can we try again?"  

  else
    puts "What is the first number you would you like to #{current_calculation}: "
    first_number = gets.to_i
    puts "What is the second number you would like to #{current_calculation}: "
    second_number = gets.to_i 

    answer = calculate_answer(current_calculation, first_number, second_number)

    puts "The answer is #{answer}"
    puts "Type 1 to run another calcution or 2 to end: "
    run_calculator = gets.to_i

  end
end

Lol I literally couldn't help myself. The above code operates as you want it to - I've just added to_i to the gets fucntion.

gets means get string, so if you're relying on a number you need to convert to an integer (to_i)

Are you missing an end statement for either of the if statements in "def calculate_answer(operator, a, b)" and "def request_calculation_type"?

def calculate_answer(operator, a, b)

  if operator == "add"
    return result= a + b
  elsif operator == "subtract"
    return result = a - b
  elsif operator == "multiply"
    return result = a * b
  elsif operator == "divide"
    return result = a / b
#missing end?

end
Daniel Cunningham
Daniel Cunningham
21,109 Points

request_calculation_type and calculate_answer need an additional 'end' (1 to end the method, and 1 for the if statements). Additionally, you'll want to add puts or print lines in front of some of your statements (see below). Those lines are not coming up before the gets method is activated.

def greeting puts "Hello! Please type your name: " name = gets

puts "It is nice to meet you #{name}. I am a simple calculator application. \n I can add, subtract, multiply, and divide.\n"

return name

end

Adrian Cunanan
seal-mask
.a{fill-rule:evenodd;}techdegree
Adrian Cunanan
Front End Web Development Techdegree Student 9,996 Points

Yeah that was it! gets.to_i

Thanks Tom!!!

Here is the edited code:

# This method greets the user on start up and request their name
# It returns their name

def greeting

  puts "Hello!  Please type your name: "
  name = gets
  puts "It is nice to meet you #{name}"  
  puts "I am a simple calculator application.  I can add, subtract, multiply, and divide."

  return name

end

# This method ask the user what type of calculation they would like to perform
# It returns the operation or an error for erroneous entry
def request_calculation_type

  puts "Type 1 to add, 2 to subtract, 3 to multiply, or 4 to divide two numbers: "
  operation_selection = gets.to_i

  if operation_selection == 1 
    return "add"
  elsif operation_selection == 2
    return "subtract"
  elsif operation_selection == 3
    return "multiply"
  elsif operation_selection == 4
    return "divide"
  else 
    return "error"

  end

end

# This method performs the requested calculation
# It returns the result of the calculation
def calculate_answer(operator, a, b)

  if operator == "add"
    return result= a + b
  elsif operator == "subtract"
    return result = a - b
  elsif operator == "multiply"
    return result = a * b
  elsif operator == "divide"
    return result = a / b
  end

end

name = greeting
run_calculator = 1

while run_calculator == 1

  current_calculation = request_calculation_type()

  if current_calculation == "error"

    puts "I do not understand this type of calculation... Can we try again?"  

  else
    puts "What is the first number you would you like to #{current_calculation}: "
    first_number = gets.to_i
    puts "What is the second number you would like to #{current_calculation}: "
    second_number = gets.to_i

    answer = calculate_answer(current_calculation, first_number, second_number)

    puts "The answer is #{answer}"
    puts "Type 1 to run another calculation or 2 to end: "
    run_calculator = gets.to_i

    if run_calculator != 1

      puts "Thanks for working with me to crunch some numbers!  See you later ;-)"

    end
  end
end

Awesome! If you're as lazy as me, it's handy to remember you don't need to return values with ruby. The last line of the method is automatically returned. You could shorten like so:

return result= a + b

you can just do

 a + b

and

return "multiply"

to

"multiply"

Have you looked at both "def calculate_answer(operator, a, b)" and "def request_calculation_type"? *

Adrian Cunanan
seal-mask
.a{fill-rule:evenodd;}techdegree
Adrian Cunanan
Front End Web Development Techdegree Student 9,996 Points

Thanks Tom! That resolved the error.

However, the calculator is not working. None of the puts statements seem to output.

Am I calling the methods incorrectly?

Your "gets" Syntax needs to be more like: (or atleast - this worked for me)

puts "What is your name: "
name = gets 
Kevin Naegele
Kevin Naegele
10,868 Points

i would like to see this app when it is done.

Adrian Cunanan
seal-mask
.a{fill-rule:evenodd;}techdegree
Adrian Cunanan
Front End Web Development Techdegree Student 9,996 Points

Here is a better version with formatting that makes the program easier to read:

# This method greets the user on start up and request their name
# It returns their name

def greeting

  puts "Hello!  Please type your name: "
  name = gets
  puts "\n" + "It is nice to meet you #{name}"  
  puts "\n" + "I am a simple calculator application.  I can add, subtract, multiply, and divide."

  return name

end

# This method ask the user what type of calculation they would like to perform
# It returns the operation or an error for erroneous entry
def request_calculation_type

  puts "\n" + "Type 1 to add, 2 to subtract, 3 to multiply, or 4 to divide two numbers: "
  operation_selection = gets.to_i

  if operation_selection == 1 
    return "add"
  elsif operation_selection == 2
    return "subtract"
  elsif operation_selection == 3
    return "multiply"
  elsif operation_selection == 4
    return "divide"
  else 
    return "error"

  end

end

# This method performs the requested calculation
# It returns the result of the calculation
def calculate_answer(operator, a, b)

  if operator == "add"
    return  a + b
  elsif operator == "subtract"
    return  a - b
  elsif operator == "multiply"
    return a * b
  elsif operator == "divide"
    return a / b
  end

end

name = greeting
run_calculator = 1

while run_calculator == 1

  current_calculation = request_calculation_type()

  if current_calculation == "error"

    puts "\n" + "I do not understand this type of calculation... Can we try again?"  

  else
    puts "\n" + "What is the first number you would you like to #{current_calculation}: "
    first_number = gets.to_i
    puts "\n" + "What is the second number you would like to #{current_calculation}: "
    second_number = gets.to_i

    answer = calculate_answer(current_calculation, first_number, second_number)

    puts "\n" + "The answer is #{answer}"
    puts "\n" + "Type 1 to run another calculation or anything else to end: "
    run_calculator = gets.to_i

    if run_calculator != 1

      puts "\n" + "Thanks for working with me to crunch some numbers!  See you later ;-)"

    end
  end
end
Liviu Tudor
Liviu Tudor
7,061 Points

just tried this ! is amazing ! thank you