Ruby: Problem adding variables - ruby

I'm making a simple Ruby program to add the letters of a person's full name, but I don't know how to add the variables in the code.
puts "What's your first name?"
first = gets.chomp
puts "What's your middle name?"
middle = gets.chomp
puts "What's your last name?"
last = gets.chomp
puts "You have " + first.length.to_s + middle.length.to_s + last.length.to_s + " letters in your name."
If I put a name like "John Jacob Smith", I get "You have 455 letters in your name" instead of "You have 14 letters in your name".

puts "You have " + first.length.to_s + middle.length.to_s + last.length.to_s + " letters in your name."
first.length is 4 (a number), because "john" has 4 letters.
first.length.to_s is "4" (a string) because you turned the number into as string - too early.
In the rest of your code, you 'add' two other strings to it, to get "455"
4 + 5 = 9 # what you want
"4" + "5" = "45" # what you got

puts "You have " + (first.size + middle.size + last.size).to_s + " letters in your name."
# or
puts "You have #{first.size + middle.size + last.size} letters in your name."
or little more "Rubyish"
puts "You have " + [first, middle, last].inject(0){|s,w| s+=w.size}.to_s + " letters in your name."

Try this: puts "You have " + (first.length + middle.length + last.length) + " letters in your name."

That's because you're adding actual string representations of numbers instead of numbers thembselves. Check the #fl00r's answer

Related

Sorting and loops in ruby

This is a program that ask input from the user about the characteristics of a gemstone then prints to the screen. Things like color, price and name. I have written it to an extend where the user enters all this and prints them out. Am now stuck where I should loop and enable the user to enter any number of gemstones. Like if he/she enters 3 gemstones then it should loop and allow the user to enter the characteristics of the 3 gemstone types. I would also like to sort the resulting output of gemstone names in alphabetical order. Appreciated
class GemStones
# input variables
name = ""
color = ""
price = 0
gemstoneNumber = 0
# output variable
gemstoneNumber = 0
# processing
print "How many gemstones do you want to enter? "
gemstoneNumber = gets
print "What is the name of the gemstone? "
name = gets
print "What is the color of the gemstone? "
color = gets
print "What is the price of the gemstone? "
price = gets
puts " You entered #{gemstoneNumber} The name is #{name}, the color is #{color} and price is
$ #{price}"
end
You should not wrap the code in class in the first place. There is no OOP in your code, hence the class is not needed as well. Also, gets returns a string, while for number you likely need an integer.
Here would be a [more-or-less] rubyish version of your code:
print "How many gemstones do you want to enter? "
# ⇓⇓⇓⇓⇓ get rid of trailing CR/LF
# ⇓⇓⇓⇓ convert to integer
gemstoneNumber = gets.chomp.to_i
gemstones =
1.upto(gemstoneNumber).map do |i|
puts
puts "Please enter data for the gemstone ##{i}:"
print "What is the name of the gemstone? "
name = gets.chomp # shave the trailing CR/LF off
print "What is the color of the gemstone? "
color = gets.chomp
print "What is the price of the gemstone? "
price = gets.chomp.to_f # convert to float
# in Ruby we normally use hashes to store
# the named values
{name: name, color: color, price: price}
end
puts "You entered #{gemstoneNumber} gemstones. They are:"
gemstones.each do |gemstone|
puts "Name: #{gemstone[:name]}. " \
"Color: #{gemstone[:color]}. " \
"Price: $#{gemstone[:price]}."
end
Alternatively, you might use the class instead of hash to store the gemstone info.
To sort the gemstones by the name:
puts "You entered #{gemstoneNumber} gemstones. They are:"
# ⇓⇓⇓⇓⇓⇓⇓ HERE
gemstones.sort_by { |gemstone| gemstone[:name] }.each do |gemstone|
puts "Name: #{gemstone[:name]}. " \
"Color: #{gemstone[:color]}. " \
"Price: $#{gemstone[:price]}."
end
The good documentation on enumerations might be found in the official ruby docs: https://ruby-doc.org/core/Enumerable.html#method-i-sort_by (and around.)
You can try this as well.
def gem_stones num
#gem_stones = []
num.times do |a|
print "Enter the name of gemstone #{a+1} "
name=gets.chomp
print "Enter the color of gemstone #{a+1} "
color = gets.chomp
print "Enter the price of gemstone #{a+1} "
price = gets.chomp.to_f
#gem_stones.push({name: name, color: color, price: price})
end
puts #gem_stones.sort_by {|a| a[:name]}.map{|gem| "Name: #{gem[:name]}, Color: #{gem[:color]}, Price: #{gem[:price]}"}.join("\n")
end
puts "Ener the number of gem stones you want to enter?"
num = gets.to_i
gem_stones num

Ruby won't divide string

I am trying to divide a user-input age by 2. My code is below:
puts "what is your name?"
name = gets.chomp
puts "when were you born please enter your birthdate"
birthdate = gets.chomp
puts "how old are you "
age = gets.chomp
puts "hello" + name + " wow that is a good day to be born" + "thats a great age"
puts "the half of your age is" + age/2 + " that is good to know"
It does not work.
Your age is a string
age = gets.to_i
Now it's a number. But you can't concatenate a string and a number. Two options:
interpolation
puts "the half of your age is #{age/2} that is good to know"
or
puts "the half of your age is " + (age/2).to_s + " that is good to know"

Unambigous behaviour during print in Ruby

The print statement given below executes correctly when I remove the parentheses and produces an error syntax error, unexpected ',', expecting ')' when parentheses are kept. Any help would be appreciated since I am new to Ruby
print "Enter name: "
name=gets
puts name
puts "Enter first number"
num1=gets
puts "Enter Second number"
num2=gets
result=Integer(num1)+Integer(num2)
print ("The addition of "+num1.chomp+" and " + num2.chomp+ " is ",result)
There are several ways to achieve what you want:
get rid of the space between print and (
print("The addition of " + num1.chomp + " and " + num2.chomp + " is ", result)
use + to concatenate the strings; this will require you to use to_s to convert the numeric value result into a string:
print("The addition of " + num1.chomp + " and " + num2.chomp + " is " + result.to_s)
use string interpolation:
print("The addition of #{num1.chomp} and #{num2.chomp} is #{result}")
Do you have a Python background? This code looks like Python written in Ruby ;)
print 'Enter first number: '
num1 = gets.to_i
print 'Enter Second number: '
num2 = gets.to_i
puts format('The addition of %d and %d is %d', num1, num2, num1 + num2)
String#to_i is more often used than Integer(). Also, both Integer() and to_i ignore newlines, so you don't need to call chomp.
Kernel#format is a good and fast way to integrate variables in a string. It uses the same format as C/Python/Java/...
print "Enter name: "
name=gets.strip ##strip method removes unnecessary spaces from start & End
puts "Enter first number"
num1=gets.strip.to_i ##convert string number into Int
puts "Enter Second number"
num2=gets.strip.to_i
result=num1+num2
print "The addition: #{num1} + #{num2} = #{result}" ##String interpolation.

Converting and adding variables

I am having trouble taking a variable given by gets.chomp and either adding it to another variable or to an integer.
puts 'Hello mate what is thy first name?'
name1 = gets.chomp
puts 'Your name is ' + name1 + ' eh? What is thy middle name?'
name2 = gets.chomp
puts 'What is your last name then ' + name1 + '?'
name3 = gets.chomp
Puts 'Oh! So your full name is ' + name1 + ' ' + name2 + ' ' + name3 + ' ?'
puts 'That is lovey!'
puts 'did you know there are ' ' + name1.length.to_i + '+' + 'name2.length.to_i + '+' + name3.length.to_i + '' in your full name
Any Ideas?
There's a few ways to clean this up in Ruby that I'll demonstrate here:
puts 'Hello mate what is thy first name?'
name1 = gets.chomp
# Inline string interpolation using #{...} inside double quotes
puts "Your name is #{name1} eh? What is thy middle name?"
name2 = gets.chomp
# Interpolating a single string argument using the String#% method
puts 'What is your last name then %s?' % name1
name3 = gets.chomp
# Interpolating with an expression that includes code
puts "Oh! So your full name is #{ [ name1, name2, name3 ].join(' ') }?"
puts 'That is lovey!'
# Combining the strings and taking their aggregate length
puts 'Did you know there are %d letters in your full name?' % [
(name1 + name2 + name3).length
]
# Using collect and inject to convert to length, then sum.
puts 'Did you know there are %d letters in your full name?' % [
[ name1, name2, name3 ].collect(&:length).inject(:+)
]
The String#% method is a variant of sprintf that's very convenient for this sort of formatting. It gives you a lot of control over presentation.
That last one might look a bit mind-bending but one of the powerful features of Ruby is being able to string together a series of simple transformations into something that does a lot of work.
That part would look even more concise if you used an array to store the name instead of three independent variables:
name = [ ]
name << gets.chomp
name << gets.chomp
name << gets.chomp
# Name components are name[0], name[1], and name[2]
# Using collect -> inject
name.collect(&:length).inject(:+)
# Using join -> length
name.join.length
It's generally a good idea to organize things in structures that lend themselves to easy manipulation, exchange with other methods, and are easy to persist and restore, such as from a database or a file.
#I think using "#{variable_name}" would be easier to achieve your goal, just
#stay away from the single quotes when using this form of string
#interpolation.
puts "Hello mate what is thy first name?"
name1 = gets.chomp
puts "Your name is #{name1} eh? What is thy middle name?"
name2 = gets.chomp
puts "What is your last name then #{name1}?"
name3 = gets.chomp
puts "Oh! So your full name is #{name1} #{name2} #{name3}?"
puts "That is lovey!"
puts "Did you know there are '#{name1.length + name2.length + name3.length}' letters in your full name?"

How to insert and get name of multiple users

I am trying to accept the first_name, the middle name, and the last name of the user and then display the abbreviated first, middle name of the user with the unaltered last name. I've written the following code and managed to get for a single user.
h = Hash.new
puts "Enter the first name for user"
h["First_name"] = gets.capitalize
puts "Enter the Middle name for user"
h["Middle_name"] = gets.capitalize
puts "Enter the Last name for user"
h["Last_name"]= gets.capitalize
puts "The name entered is #{h["First_name"][0]}" +
"." + "#{h["Middle_name"][0]}" + "." + "#{h["Last_name"]}"
I want this to happen for five users repeatedly, and display all five name at the end. Can any one help me find a solution for this problem?
Put the whole thing in an array (and end the block with h):
a = Array.new(5) do
h = Hash.new
puts "Enter the first name for user"
h["First_name"] = gets.capitalize
puts "Enter the Middle name for user"
h["Middle_name"] = gets.capitalize
puts "Enter the Last name for user"
h["Last_name"] = gets.capitalize
h
end
In the end, a will have five hashes of the kind you had. You might want to put chomp after each gets to get rid of the newline character.
You can print each name by iterating over a.
a.each do |h|
puts "The name entered is " + h["First_name"][0] +
"." + h["Middle_name"][0] + "." + h["Last_name"]
end

Resources