How can I take input from keyboard with Ruby?
Try this:
puts "In which city do you stay?"
STDOUT.flush
city = gets.chomp
puts "The city is " + city
Related
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
I want to check a string entered by a user. If it is a string, then move along, if not, then throw an error. I do not know how to check if the user input is a string or an int. Below is my code:
puts "what is your name?"
name = gets.chomp
if name == Int
puts "error enter a string"
end
if birthdate != Int
puts "error enter your birthdate"
end
puts "how old are you "
age = gets.to_i
if age == String
puts "error please enter your age"
end
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.0} that is good to know"
It may be checked as this:
puts "what is your name?"
name = gets.chomp
if !(name =~ /[0-9]/).nil?
puts "error enter a string"
end
puts "what is your age?"
age = gets.chomp
if age.to_i.to_s == age
puts "error enter a integer"
end
I think this is what you are looking for.
if name.class == String
Also this will always be false
age = gets.to_i # this is converting to integer
if age.class == String # I think this is what you meant
age will always be an Integer her because you have cast it as such with .to_i
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"
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?"
I am running through the Codecademy lessons to get up to speed with the basics of Ruby but I hit a snag with their redacted! exercise. I posted what I think should do the trick but it refuses to print.
The exercise instructions are as such :
Let's start simple: write an .each loop that goes through words and just prints out each word it finds.
Please help if you can. Thank you! Here is my code :
puts "What is your text, bra?"
text = gets.chomp
text.downcase!
puts "What is being hidden?"
redact= gets.chomp
redact.downcase!
words = text.split(" ")
eachredact = redact.split(" ")
#loop through the words in the string
words.each do |x|
print "#{x}" + " "
end
I ran it as below :
puts "What is your text, bra?"
text = gets.chomp
text.downcase!
puts "What is being hidden?"
redact= gets.chomp
redact.downcase!
words = text.split(" ")
eachredact = redact.split(" ")
#loop through the words in the string
words.each do |x|
print "#{x}" + " "
end
Output:
What is your text, bra?
i anm
What is being hidden?
Good
i anm
see here: