1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
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 # Naiv lösning till att slumpa fram en ledig parkeringsplats. Returnerar en # ledig plats (nummer mellan 1-32). 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 # returnera den genererade siffran 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 # konstruktor för en Guest. Initierar gästen med det valda för- och # efternamnet, adress, telefonnummer samt den genererande ny. def initialize (name, address, phone, arrival, plot) @name = name @address = address @phone = phone @arrival = arrival # dagens datum i strängformat @plot = plot end # skriver ut den aktuella registreringen i ett läsbart format def to_s " Registrering för #{@name}: #{@address} #{@phone} Ankomst: #{@arrival} Utchecking: #{@departure} #{@plot} " end end require 'camping' require 'menu' =begin Huvudklass för programmet. Ansvarar för att skapa en ny Camping och påbörja menyloopen. Robert Sebescen 2010-06-16 =end 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 # Hämtar indata från användaren tills korrekt val har gjorts 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 # Ber användaren om data och registrerar en gäst på en slumpmässig # husvagnsplats samt i historiken. 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 # hämta ledig plats och låta gästens plats peka på den 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 in 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!