require 'guest'
require 'parking_lot'
=begin
Klass som representerar en camping. Varje Camping har ett fält bestående av
32 gäster (typen Guest), varav 5 genereras när Campingen skapas. Här finns
möjlighet att registrera, ta bort och lista gäster.
=end
class Camping
attr_accessor :current_guests, :parking_lots, :all_guests
# Initiera Campingen genom att skapa fältet och generera 5 gäster på
# slumpade platser i den 1-baserade listan
def initialize
# de nuvarande gästerna
@current_guests = Array.new(32)
# initiera husvagnsplatserna
@parking_lots = Array.new(32)
32.times do |nr|
@parking_lots[nr] = Parking_Lot.new(nr)
end
end
# samtliga gäster
@all_guests = []
# initiera incheckade gäster
defaultGuests = Array[
Guest.new("Jake", "Halmstad", "1337", 1, @parking_lots[0]),
Guest.new("Mark", "Amsterdam", "1234", 2, @parking_lots[1]),
Guest.new("Conan", "Berlin", "2532", 3, @parking_lots[2]),
Guest.new("Tom", "Chicago", "9318", 4, @parking_lots[3]),
Guest.new("David", "Dubai", "6546", 5, @parking_lots[4]),
]
# lägg in de incheckade gästerna i nuvarande gästerna samt historiken
defaultGuests.each do |guest|
@current_guests[guest.plot.nr] = guest
@all_guests.push(guest)
end
end
# Returnerar en strängrepresentation av gästlistan, dvs to_s från Guest-klassen.
# Om en plats är ledig skrivs texten "Ledig" ut.
def to_s
# skapa en tom sträng som fylls på vidare
list = ""
# loopa från 1 till 32
(1..32).each do |n|
# översätt positionen till 0-baserad array och kolla om det finns
# någon gäst registrerad på positionen, och i så fall lägg till
# texten i list
if (!@current_guests[n-1].nil?)
list += @current_guests[n-1].to_s
else
# annars, lägg till texten "Ledig"
list += n.to_s + ": Ledig\n"
end
end
return list
end
def generateParkingLot
# slumpa ett tal mellan 1 och 32
randomNr = 1+rand(32)
# finns det en gäst på den (0-baserade) positionen?
if (!@current_guests[randomNr-1].nil?)
# isåfall, generera en ny siffra
generateParkingLot
else
return randomNr
end
end
=begin
Klass för att representera en campinggäst. Varje gäst har förnamn, efternamn,
adress och telefonnummer, telefonnummer, ankomstdatum, en husvagnsplats och
en elmätarställning. De tre sistnämnda genereras av programmet.
=end
class Guest
attr_accessor :name, :address, :phone, :departure
attr_reader :arrival, :plot
def initialize (name, address, phone, arrival, plot)
@name = name
@address = address
@phone = phone
@arrival = arrival # dagens datum i strängformat
@plot = plot
end
def to_s
"
Registrering för #{@name}:
#{@address}
#{@phone}
Ankomst: #{@arrival}
Utchecking: #{@departure}
#{@plot}
"
end
end
require 'camping'
require 'menu'
class Main
if __FILE__ == $0
$camping = Camping.new # skapa en ny camping
puts "Välkommen till Ruby Camping!"
# loopa igenom menyn
while (true)
Menu.menu
end
end
end
require 'camping'
=begin
Klass som ansvarar för att visa meny, hämta indata och utföra händelser
beroende på val.
=end
class Menu
# Skriver ut menyn
def self.menu
puts "------------------------------"
puts "-- Meny --"
puts "-- --"
puts "-- 1. Incheckning --"
puts "-- 2. Utcheckning --"
puts "-- 3. Lista aktuella gäster --"
puts "-- 4. Lista samtliga gäster --"
puts "-- 5. Avsluta --"
puts "------------------------------"
action = get_input
do_action(action)
end
def self.get_input
input = gets.chomp.to_i
# gets.to_i returnerar 0 vid fel så vi kollar efter intervallet 1-5
while input > 5 || input < 1 do
puts "Felaktigt alternativ eller ogiltig indata."
input = gets.chomp.to_i
end
return input
end
# Utför vald händelse baserat på valt alternativ.
def self.do_action(action)
case action # när valet är...
when 1 # 1, gör då...
check_in
when 2
check_out
when 3
puts $camping # skriv ut aktuella gäster
when 4
puts $camping.all_guests
when 5
exit
end
end
def self.check_in
puts "Skriv in ditt namn: "
name = gets.chomp
puts "Skriv in din adress: "
address = gets.chomp
puts "Skriv in ditt telefonnummer: "
phone = gets.chomp
puts "Skriv in ankomstdag (ett tal):"
arrival = gets.chomp.to_i
newPLot = $camping.generateParkingLot
newGuest = Guest.new(name, address, phone, arrival, $camping.parking_lots[newPLot-1])
$camping.current_guests[newPLot-1] = newGuest
$camping.all_guests.push(newGuest) # lägg till gästen i historiken
puts "Registreringen lyckades. Du har fått husvagnsplats " + newPLot.to_s + "."
end
# Checkar ut en användare, det vill säga frigör parkeringsplatsen han/hon är
# registrerad på.
def self.check_out
puts "Vilken gäst vill du checka ut? (ange husvagnsplatsnr):"
plot = gets.chomp.to_i
guest = $camping.current_guests[plot-1]
# Fanns det någon gäst där?
if (guest.nil? || plot < 1) # hantera fallet med negativt index
puts "Det finns ingen gäst på den positionen eller så har du angett en ogiltig position."
else
puts "Du vill checka ut " + guest.name + "."
puts "Ange utcheckningsdatum: "
departureDate = gets.chomp.to_i
guest.departure = departureDate
guestStayedDays = departureDate - guest.arrival # gästen har stannat så många dygn
guest.plot.increase(guestStayedDays) # öka på elmätaren
puts guest # skriv ut gästen
$camping.current_guests[plot-1] = nil # töm platsen
end
end
end
=begin
Representerar en husvagnsplats. Varje husvagnsplats har ett nummer och en
elmätare.
=end
class Parking_Lot
attr_accessor :nr, :gauge;
# Initierar en ny husvagnsplats med numret nr och en elmätare mellan
# 2000 och 4000.
def initialize (nr)
@nr = nr
@gauge = 2000+rand(2000) # slumpa tal mellan 2000 och 4000
end
# Ökar elmätaren för användning med en slumpmässig mängd mellan
# 10-80 kWh per dygn.
def increase(days)
generatedUse = (10+rand(70))*days
puts "Ökar elmätaren med " + generatedUse.to_s + " kWh."
@gauge += generatedUse
end
# Returnerar en strängrepresentation av husvagnsplatsen.
def to_s
"
Husvagnsplats #{@nr+1}:
Elmätare #{@gauge} kWh
"
end
end
Refactorings
No refactoring yet !
steved
July 19, 2010, July 19, 2010 23:04, permalink
You initialize @parking_lots as an instance variable in initialize(). Your error on line 31 is because in the body of the class (outside a method definition), @parking_lots is a class instance variable. See http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/.
>tragicdancer
July 20, 2010, July 20, 2010 10:00, permalink
Ok thanks. but how should i do it then. I must confess at this point I am a bit confused on the whole matter. Help much appreciated:)
Thanks
stevec
July 23, 2010, July 23, 2010 18:38, permalink
It looks like you can just move the "end" on line 25 down to line 81.
Hi!
whn i try and run my program that im working on i get an error saying: ruby_test.rb:31: undefined method `[]' for nil:NilClass (NoMethodError). When i try to execute the code through TextMate it says:# !> instance variable @parking_lots not initialized. I try to google this problem but just keep banging my head against the wall. Please someone help!
Thanks!