Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.78 KB | None | 0 0
  1. class Kulkukortti:
  2. """
  3. Kulkukortti-luokkaan luodaan kulkukortti-olioita, jonka parametreinä on
  4. tunniste ja nimi. Luokkaan tallennetaan myös kortille kuuluvat
  5. kulkuoikeudet, joita tarkastellaan ja muokataan metodeilla.
  6. """
  7.  
  8. def __init__(self, tunniste, nimi):
  9. """ Luokan rakentaja
  10. :param tunniste: henkilön tunniste (str)
  11. :param nimi: henkilön nimi (str)
  12. """
  13. self.__tunniste = tunniste
  14. self.__nimi = nimi
  15. self.__oikeudet = []
  16.  
  17. def tulosta_tiedot(self):
  18. """
  19. Tulostaa kulkukortin tiedot muodossa: tunnus, nimi, kulkualueet.
  20. """
  21. print(self.__tunniste + ", " + self.__nimi + ", kulkualueet: " +
  22. ",".join(sorted(self.__oikeudet)))
  23.  
  24. def anna_nimi(self):
  25. """
  26. Palauttaa kulkukortille talletetun henkilön nimen.
  27. :return: self.__nimi: palauttaa halutun nimen annetun kortin tunnuksen
  28. perusteella.
  29. """
  30. return self.__nimi
  31.  
  32. def tarkista_pääsy(self, ovi):
  33. """
  34. Tarkastaa pääseekö kulkukortilla halutusta ovesta sisään.
  35. :param ovi: Ovi josta halutaan sisään.
  36. :return: True: ovi avautuu kulkukortille tallennetuilla oikeuksilla.
  37. False: ovi ei avaudu kulkukortin oikeuksilla
  38. """
  39. for n in range(len(ovi) + 1):
  40. if ovi[:n + 1] in self.__oikeudet:
  41. return True
  42.  
  43. return False
  44.  
  45. def lisää_kulkualue(self, uusi_alue):
  46. """
  47. Funktio lisää uuden alueen kulkukortin oikeuksiin jos kyseiselle
  48. alueelle ei vielä ole kulkuoikeutta. Tämän jälkeen funktio kutsuu
  49. poista_päällekäisyydet-funktiota tarkistamaan onko kortilla valmiina
  50. suppeampia kulkuoikeuksia poistaakseen päällekkäisyydet.
  51. :param uusi_alue: Lisättävä kulkualue
  52. """
  53. lisätään = False
  54.  
  55. # Tarkistetaan onko alue tai laajempi alue jo oikeuksissa
  56. if len(uusi_alue) == 1 and uusi_alue not in self.__oikeudet:
  57. lisätään = True
  58.  
  59. else:
  60. for i in range(len(uusi_alue)):
  61. if len(uusi_alue) == i + 2:
  62. if uusi_alue[0:i + 1] not in self.__oikeudet and \
  63. uusi_alue not in self.__oikeudet:
  64. lisätään = True
  65.  
  66. # Jos laajempaa aluetta ei löydy, lisätään se
  67. if lisätään is True:
  68. self.__oikeudet.append(uusi_alue)
  69.  
  70. # Lisäyksen jälkeen poistetaan päällekkäisyydet
  71. self.poista_päällekkäisyydet(self.__oikeudet)
  72.  
  73. def yhdistä_kulkukortti(self, toinen_kortti):
  74. """
  75. Yhdistää toinen_kortti-parametrin sisältämät kulkuoikeudet
  76. halutulle kortille käyttämällä lisää_kulkualue-funktiota.
  77. :param toinen_kortti: Kulkukortti, jonka kanssa oikeudet yhdistetään
  78. """
  79. for uusi_alue in toinen_kortti.__oikeudet:
  80. self.lisää_kulkualue(uusi_alue)
  81.  
  82. def poista_päällekkäisyydet(self, oikeuslista):
  83. """
  84. Tarkastaa kulkuoikeuksien päällekkäisyydet ja poistaa päällekkäisyydet.
  85. :param oikeuslista: lista tarkistettavista oikeuksista
  86. """
  87.  
  88. # Tarkistetaan oikeuslistan päällekkäisyydet, ja muutetaan
  89. # päällekäiset oikeudet listassa tyhjiksi
  90. for i in range(len(oikeuslista)):
  91. for e in range(len(oikeuslista[i])):
  92. if oikeuslista[i][0:len(oikeuslista[i]) - e] in oikeuslista \
  93. and oikeuslista[i][0:len(oikeuslista[i]) - e] != \
  94. oikeuslista[i]:
  95. oikeuslista[i] = ""
  96.  
  97. # Luodaan uusi lista johon ei tule päällekkäisiä (tyhjiä) arvoja
  98. uusi_lista = []
  99. for oikeus in oikeuslista:
  100. if oikeus != "":
  101. uusi_lista.append(oikeus)
  102.  
  103. self.__oikeudet = uusi_lista
  104.  
  105.  
  106. def lue_tiedosto():
  107. """
  108. Funktio lukee ennaltamääritetyn kulkutiedot.txt -tiedoston ja luo
  109. jokaisesta rivistä oman Kulkukortti-luokan olion.
  110. :return: tietorakenne: dictionary jossa on tallennettuna kulkukurtti-oliot
  111. False: palautetaan jos tiedoston lukemisessa tapahtuu virhe
  112. """
  113.  
  114. tietorakenne = {}
  115.  
  116. try:
  117. tiedosto = open("kulkutiedot.txt", "r", encoding="UTF-8")
  118.  
  119. for rivi in tiedosto:
  120. # Luodaan kulkukortti-oliot ja lisätään kulkuoikeudet sekä
  121. # tarkistetaan päällekkäisyydet poista_päällekkäisyydet-funktiolla
  122. tunniste, nimi, oikeudet = rivi.rstrip().split(";")
  123. oikeuslista = oikeudet.split(",")
  124. tietorakenne[tunniste] = Kulkukortti(tunniste, nimi)
  125. tietorakenne[tunniste].poista_päällekkäisyydet(oikeuslista)
  126.  
  127. # Jos tiedoston lukeminen onnistuu ja kulkukortit saadaan luotua
  128. # palautetaan tietorakenne
  129. return tietorakenne
  130.  
  131. # Mikäli tiedostoa ei saa luettua tai se on väärin muotoiltu, tulostetaan
  132. # virheilmoitus ja palautetaan False
  133. except IOError and ValueError:
  134. print("Virhe: tiedostoa ei saada luettua.")
  135. return False
  136.  
  137.  
  138. def main():
  139. # Luetaan tiedosto ja luodaan Kulkukortti-oliot lue_tiedosto-funktiolla
  140. tietorakenne = lue_tiedosto()
  141.  
  142. while True:
  143. # Tarkistetaan tuliko tiedoston lukemisessa virhettä
  144. if tietorakenne == False:
  145. break
  146.  
  147. rivi = input("komento> ")
  148.  
  149. if rivi == "":
  150. break
  151.  
  152. osat = rivi.split()
  153. käsky = osat[0]
  154.  
  155. if käsky == "lista" and len(osat) == 1:
  156. # Listataan kaikkien kulkukorttien tiedot
  157. for tunniste in sorted(tietorakenne):
  158. tietorakenne[tunniste].tulosta_tiedot()
  159.  
  160. elif käsky == "tiedot" and len(osat) == 2:
  161. tunniste = osat[1]
  162. # Tulostetaan halutun kulkukortin tiedot
  163. if tunniste in tietorakenne:
  164. tietorakenne[tunniste].tulosta_tiedot()
  165. else:
  166. print("Virhe: tuntematon tunniste.")
  167.  
  168. elif käsky == "kulku" and len(osat) == 3:
  169. tunniste = osat[1]
  170. huone = osat[2]
  171.  
  172. # Tarkistetaan onko kulkukortilla oikeus haluttuun huoneeseen
  173. if tunniste in tietorakenne:
  174. if tietorakenne[tunniste].tarkista_pääsy(huone) == True:
  175. print("Kortilla " + tunniste + " ( "
  176. + tietorakenne[tunniste].anna_nimi() +
  177. " ) on kulkuoikeus huoneeseen " + huone)
  178.  
  179. else:
  180. print("Kortilla " + tunniste + " ( "
  181. + tietorakenne[tunniste].anna_nimi() +
  182. " ) ei kulkuoikeutta huoneeseen " + huone)
  183.  
  184. else:
  185. print("Virhe: tuntematon tunniste.")
  186.  
  187. elif käsky == "lisää" and len(osat) == 3:
  188. tunniste = osat[1]
  189. alue = osat[2]
  190.  
  191. # Lisätään kulkuoikeudet kulkukortille
  192. if tunniste in tietorakenne:
  193. tietorakenne[tunniste].lisää_kulkualue(alue)
  194.  
  195. else:
  196. print("Virhe: tuntematon tunniste.")
  197.  
  198. elif käsky == "yhdistä" and len(osat) == 3:
  199. henkilö = osat[1]
  200. kortti = osat[2]
  201.  
  202. # Yhdistetään jälkimmäisen tunnuksen oikeudet ensimmäiselle
  203. if henkilö in tietorakenne and kortti in tietorakenne:
  204. tietorakenne[henkilö].yhdistä_kulkukortti(tietorakenne[kortti])
  205.  
  206. else:
  207. print("Virhe: tuntematon tunniste.")
  208.  
  209. # Mikäli käsky on väärä, tulostetaan virheilmoitus
  210. else:
  211. print("Virhe: Väärä syöte, yritä uudelleen")
  212.  
  213.  
  214. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement