# 4g) 3 poeng # 3 poeng for a oppgi de to metodene uansett form og info om parametere/ returverdi # Kun 1 poeng dersom _finn_alle_passende_rom() er tatt med i tillegg # OK med eller uten __init__() # Grensesnittet til klassen reservasjon bestar av to metoder: # reserver_rom_i_hotell() med parameter krav (liste av strenger) # gruppe_reservasjon() med parameter gruppe (referanse til Gruppe-objekt) # som returnerer en bekreftelse (liste av strenger) # 4a) 3 poeng class Gruppe: def __init__(self, krav): self._krav = krav # Liste av strenger self._personer = [] # Liste av strenger def legg_til_personer(self, personer): # Liste av strenger for person in personer: self._personer.append(person) def hent_personer(self): # Returnerer liste av strenger return self._personer def hent_krav(self): # Returnerer liste av strenger return self._krav # 4b) 8 poeng class Rom: def __init__(self, rom_nr, ant_senger, fasiliteter): # Heltall, heltall, liste av strenger self._rom_nr = rom_nr self._ant_senger = ant_senger self._fasiliteter = fasiliteter self._gjester = [] # Liste av strenger, tom liste betyr ledig. def reserver(self, gjester): # Liste av strenger self._gjester = gjester def hent_ant_senger(self): # Returnerer heltall return self._ant_senger def passer(self, krav): # Liste av strenger if len(self._gjester) > 0: # "passer" kun hvis rommet er ledig return False for ett_krav in krav: if ett_krav.lower() not in self._fasiliteter: # .lower er ikke et krav i oppg return False return True def __str__(self): # Returnerer streng s = str(self._rom_nr) + " har " # Konverterer heltall til strenger s += str(self._ant_senger) + " senger" for fasilitet in self._fasiliteter: s += ", " + fasilitet return s # Oppg 4c) 10 poeng class Hotell: def __init__(self, hotellnavn): # Streng self._hotellnavn = hotellnavn self._rom = {} # Ordbok {romnummer: Rom-objekt} self._les_rom_info() def _les_rom_info(self): fil = open(self._hotellnavn + ".txt") for linje in fil: info = linje.strip().split() rom_nr = int(info[0]) ant_senger = int(info[1]) fasiliteter = [] for fasilitet in info[2:]: fasiliteter.append(fasilitet.lower()) # .lower ikke krav i oppgaven self._rom[rom_nr] = Rom(rom_nr, ant_senger, fasiliteter) fil.close() def reserver_rom(self, rom_nr, gjester): # Heltall, liste av strenger self._rom[rom_nr].reserver(gjester) def finn_passende_rom(self, krav): # Liste av strenger passende = [] # Liste av Rom-objekter for rom in self._rom.values(): if rom.passer(krav): passende.append(rom) return passende # Returnerer liste av Rom-objekter # Oppgave 4d) 7 poeng class Reservasjonssystem: def __init__(self, hotellnavn): # Liste av strenger self._hoteller = {} # Ordbok {hotellnavn: Hotell-objekt} for ett_hotellnavn in hotellnavn: self._hoteller[ett_hotellnavn] = Hotell(ett_hotellnavn) def reserver_rom_i_hotell(self, hotellnavn, rom_nr, gjester): # Streng, heltall, liste av strenger self._hoteller[hotellnavn].reserver_rom(rom_nr, gjester) # Oppgave 4e) 7 poeng def _finn_alle_passende_rom(self, krav): # Liste av strenger passende_rom = {} # Ordbok {hotellnavn: liste av Rom-objekter} for hotellnavn in self._hoteller: hotell = self._hoteller[hotellnavn] rom_liste = hotell.finn_passende_rom(krav) if len(rom_liste) > 0: passende_rom[hotellnavn] = rom_liste return passende_rom # Returnerer ordbok {hotellnavn: liste av Rom-objekter} # Oppgave 4f) 12 poeng # 3p OO: kall p? _finn_alle_passende_rom() og reserver() # 3p Problem: oppbygging og retur bekreftelser (ingen/alle/for fa fatt seng) # 3p Problem: traversering av passende rom # 3p Problem: handtering av antall gjester/ fordeling p? rom def gruppe_reservasjon(self, gruppe): # Gruppe-objekt # Metoden returnerer bekreftelse som liste av strenger krav = gruppe.hent_krav() personer = gruppe.hent_personer() alle_rom = self._finn_alle_passende_rom(krav) # Ordbok {hotellnavn: liste av Rom-objekter} if len(alle_rom) == 0: return ["Ingen passende rom funnet"] bekreftelse = ["Bekreftelse Gruppebestilling", "Hoteller med reserverte rom:"] neste_gjest = 0 # Plasserer personer i gruppen i ett og ett rom, for ett og ett hotell for hotellnavn in alle_rom: for rom in alle_rom[hotellnavn]: # rom er Rom-objekt: ledig rom som oppfyller krav gjester = [] # gjester er liste av personer med seng i dette rommet # Plasserer gjester sa lenge det er flere gjester OG flere senger while neste_gjest < len(personer) and len(gjester) < rom.hent_ant_senger(): gjester.append(personer[neste_gjest]) neste_gjest += 1 rom.reserver(gjester) # Reserverer rom til disse gjestene bekreftelse.append(hotellnavn + ": " + str(rom)) # Tar med rommet i bekreftelsen if neste_gjest == len(personer): # Alle i gruppen har fatt rom, returnerer return bekreftelse # Har gatt gjennom alle rommene - har alle gjester fatt rom? mangler_seng = len(personer) - neste_gjest if mangler_seng > 0: bekreftelse.append("NB: Mangler rom til " + str(mangler_seng) + " personer") return bekreftelse