puts ""
puts "Conversion Program"
puts "------------------\n"
puts "Would you like to convert:"
puts "1. F to C"
puts "2. C to F"
puts"Enter your choice now: "
choice = gets.chomp.to_i
if choice == 1
puts "Enter a temperature in F:"
fahr = gets.chomp.to_f
cent = ( (fahr - 32) / 1.8 )
puts fahr.to_s + " F is " + cent.round.to_s + " C."
elsif choice == 2
puts "Enter a temperature in C:"
cent = gets.chomp.to_f
fahr = ( (cent * 1.8) + 32 )
puts cent.to_s + " C is " + fahr.round.to_s + " F."
else
puts "That is a not a valid choice. Good bye!"
end
I'm using Ruby, but I'll take a stab at it (learn from my mistakes).
Well, I started off OK (using classes for temp conversion) and then things got ugly (probably putting too much in the manager class).
At any rate, here it is. (aka, here's how not to do it.
#! /usr/bin/env ruby
class TemperatureConverter
attr_reader :from_unit, :to_unit, :conversion
def initialize( from_unit='', to_unit='', conversion=proc {|x| x } )
@from_unit = from_unit
@to_unit = to_unit
@conversion = conversion
end
def convert( arg )
@conversion.call( arg )
end
end
class FahrenheitToCelsiusConverter < TemperatureConverter
def initialize
super( 'F', 'C', proc {|f| (f - 32.0) / 1.8 } )
end
end
class CelsiusToFahrenheitConverter < TemperatureConverter
def initialize
super( 'C', 'F', proc {|c| (c * 1.8) + 32 } )
end
end
class TemperatureConversionManager
attr_reader :prompt
def initialize( *converters )
@converters = converters
@prompt = <<END_OF_PROMPT
Conversion Program
···
------------------
Would you like to convert:
END_OF_PROMPT
index = 0
@prompt += @converters.map do |converter|
"#{index += 1}. #{converter.from_unit} to #{converter.to_unit}"
end.join( "\n" )
@prompt += "\nEnter your choice now: "
end
def run
print prompt
user_choice = choose_converter - 1
if user_choice < 0 or user_choice >= @converters.size
puts "That is not a valid choice. Goodbye."
else
prompt_and_display_conversion( @converters[ user_choice ] )
end
end
def choose_converter
gets.chomp.to_i
end
def get_temperature
gets.chomp.to_f
end
def temperature_prompt( converter )
"Please enter temperature in #{converter.from_unit}: "
end
def prompt_and_display_conversion( converter )
print temperature_prompt( converter )
user_input = get_temperature
converted_temp = converter.convert( user_input )
puts <<END_OF_RESULTS
#{user_input} #{converter.from_unit} is #{converted_temp} #{converter.to_unit}
END_OF_RESULTS
end
end
TemperatureConversionManager.new(
FahrenheitToCelsiusConverter.new,
CelsiusToFahrenheitConverter.new
).run
Corrections / advice / criticisms are welcome.
(I think that I prefer the original version.)
Richard