Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Kulkukortti:
- """
- Kulkukortti-luokkaan luodaan kulkukortti-olioita, jonka parametreinä on
- tunniste ja nimi. Luokkaan tallennetaan myös kortille kuuluvat
- kulkuoikeudet, joita tarkastellaan ja muokataan metodeilla.
- """
- def __init__(self, tunniste, nimi):
- """ Luokan rakentaja
- :param tunniste: henkilön tunniste (str)
- :param nimi: henkilön nimi (str)
- """
- self.__tunniste = tunniste
- self.__nimi = nimi
- self.__oikeudet = []
- def tulosta_tiedot(self):
- """
- Tulostaa kulkukortin tiedot muodossa: tunnus, nimi, kulkualueet.
- """
- print(self.__tunniste + ", " + self.__nimi + ", kulkualueet: " +
- ",".join(sorted(self.__oikeudet)))
- def anna_nimi(self):
- """
- Palauttaa kulkukortille talletetun henkilön nimen.
- :return: self.__nimi: palauttaa halutun nimen annetun kortin tunnuksen
- perusteella.
- """
- return self.__nimi
- def tarkista_pääsy(self, ovi):
- """
- Tarkastaa pääseekö kulkukortilla halutusta ovesta sisään.
- :param ovi: Ovi josta halutaan sisään.
- :return: True: ovi avautuu kulkukortille tallennetuilla oikeuksilla.
- False: ovi ei avaudu kulkukortin oikeuksilla
- """
- for n in range(len(ovi) + 1):
- if ovi[:n + 1] in self.__oikeudet:
- return True
- return False
- def lisää_kulkualue(self, uusi_alue):
- """
- Funktio lisää uuden alueen kulkukortin oikeuksiin jos kyseiselle
- alueelle ei vielä ole kulkuoikeutta. Tämän jälkeen funktio kutsuu
- poista_päällekäisyydet-funktiota tarkistamaan onko kortilla valmiina
- suppeampia kulkuoikeuksia poistaakseen päällekkäisyydet.
- :param uusi_alue: Lisättävä kulkualue
- """
- lisätään = False
- # Tarkistetaan onko alue tai laajempi alue jo oikeuksissa
- if len(uusi_alue) == 1 and uusi_alue not in self.__oikeudet:
- lisätään = True
- else:
- for i in range(len(uusi_alue)):
- if len(uusi_alue) == i + 2:
- if uusi_alue[0:i + 1] not in self.__oikeudet and \
- uusi_alue not in self.__oikeudet:
- lisätään = True
- # Jos laajempaa aluetta ei löydy, lisätään se
- if lisätään is True:
- self.__oikeudet.append(uusi_alue)
- # Lisäyksen jälkeen poistetaan päällekkäisyydet
- self.poista_päällekkäisyydet(self.__oikeudet)
- def yhdistä_kulkukortti(self, toinen_kortti):
- """
- Yhdistää toinen_kortti-parametrin sisältämät kulkuoikeudet
- halutulle kortille käyttämällä lisää_kulkualue-funktiota.
- :param toinen_kortti: Kulkukortti, jonka kanssa oikeudet yhdistetään
- """
- for uusi_alue in toinen_kortti.__oikeudet:
- self.lisää_kulkualue(uusi_alue)
- def poista_päällekkäisyydet(self, oikeuslista):
- """
- Tarkastaa kulkuoikeuksien päällekkäisyydet ja poistaa päällekkäisyydet.
- :param oikeuslista: lista tarkistettavista oikeuksista
- """
- # Tarkistetaan oikeuslistan päällekkäisyydet, ja muutetaan
- # päällekäiset oikeudet listassa tyhjiksi
- for i in range(len(oikeuslista)):
- for e in range(len(oikeuslista[i])):
- if oikeuslista[i][0:len(oikeuslista[i]) - e] in oikeuslista \
- and oikeuslista[i][0:len(oikeuslista[i]) - e] != \
- oikeuslista[i]:
- oikeuslista[i] = ""
- # Luodaan uusi lista johon ei tule päällekkäisiä (tyhjiä) arvoja
- uusi_lista = []
- for oikeus in oikeuslista:
- if oikeus != "":
- uusi_lista.append(oikeus)
- self.__oikeudet = uusi_lista
- def lue_tiedosto():
- """
- Funktio lukee ennaltamääritetyn kulkutiedot.txt -tiedoston ja luo
- jokaisesta rivistä oman Kulkukortti-luokan olion.
- :return: tietorakenne: dictionary jossa on tallennettuna kulkukurtti-oliot
- False: palautetaan jos tiedoston lukemisessa tapahtuu virhe
- """
- tietorakenne = {}
- try:
- tiedosto = open("kulkutiedot.txt", "r", encoding="UTF-8")
- for rivi in tiedosto:
- # Luodaan kulkukortti-oliot ja lisätään kulkuoikeudet sekä
- # tarkistetaan päällekkäisyydet poista_päällekkäisyydet-funktiolla
- tunniste, nimi, oikeudet = rivi.rstrip().split(";")
- oikeuslista = oikeudet.split(",")
- tietorakenne[tunniste] = Kulkukortti(tunniste, nimi)
- tietorakenne[tunniste].poista_päällekkäisyydet(oikeuslista)
- # Jos tiedoston lukeminen onnistuu ja kulkukortit saadaan luotua
- # palautetaan tietorakenne
- return tietorakenne
- # Mikäli tiedostoa ei saa luettua tai se on väärin muotoiltu, tulostetaan
- # virheilmoitus ja palautetaan False
- except IOError and ValueError:
- print("Virhe: tiedostoa ei saada luettua.")
- return False
- def main():
- # Luetaan tiedosto ja luodaan Kulkukortti-oliot lue_tiedosto-funktiolla
- tietorakenne = lue_tiedosto()
- while True:
- # Tarkistetaan tuliko tiedoston lukemisessa virhettä
- if tietorakenne == False:
- break
- rivi = input("komento> ")
- if rivi == "":
- break
- osat = rivi.split()
- käsky = osat[0]
- if käsky == "lista" and len(osat) == 1:
- # Listataan kaikkien kulkukorttien tiedot
- for tunniste in sorted(tietorakenne):
- tietorakenne[tunniste].tulosta_tiedot()
- elif käsky == "tiedot" and len(osat) == 2:
- tunniste = osat[1]
- # Tulostetaan halutun kulkukortin tiedot
- if tunniste in tietorakenne:
- tietorakenne[tunniste].tulosta_tiedot()
- else:
- print("Virhe: tuntematon tunniste.")
- elif käsky == "kulku" and len(osat) == 3:
- tunniste = osat[1]
- huone = osat[2]
- # Tarkistetaan onko kulkukortilla oikeus haluttuun huoneeseen
- if tunniste in tietorakenne:
- if tietorakenne[tunniste].tarkista_pääsy(huone) == True:
- print("Kortilla " + tunniste + " ( "
- + tietorakenne[tunniste].anna_nimi() +
- " ) on kulkuoikeus huoneeseen " + huone)
- else:
- print("Kortilla " + tunniste + " ( "
- + tietorakenne[tunniste].anna_nimi() +
- " ) ei kulkuoikeutta huoneeseen " + huone)
- else:
- print("Virhe: tuntematon tunniste.")
- elif käsky == "lisää" and len(osat) == 3:
- tunniste = osat[1]
- alue = osat[2]
- # Lisätään kulkuoikeudet kulkukortille
- if tunniste in tietorakenne:
- tietorakenne[tunniste].lisää_kulkualue(alue)
- else:
- print("Virhe: tuntematon tunniste.")
- elif käsky == "yhdistä" and len(osat) == 3:
- henkilö = osat[1]
- kortti = osat[2]
- # Yhdistetään jälkimmäisen tunnuksen oikeudet ensimmäiselle
- if henkilö in tietorakenne and kortti in tietorakenne:
- tietorakenne[henkilö].yhdistä_kulkukortti(tietorakenne[kortti])
- else:
- print("Virhe: tuntematon tunniste.")
- # Mikäli käsky on väärä, tulostetaan virheilmoitus
- else:
- print("Virhe: Väärä syöte, yritä uudelleen")
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement