Advertisement
Ghosty_

reitityssimulaattori

Jan 17th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.48 KB | None | 0 0
  1. class Reititin:
  2.     """
  3.    TODO: KOMMENTIT
  4.    Luokka Reititin sisältää reitittimen nimen,
  5.    listan naapureista sekä dictin,jossa on verkkojen "nimet",
  6.    sekä reitittimen "etäisyys" verkon reunareitittimestä.
  7.    """
  8.     def __init__(self, nimi):
  9.         self.__nimi = nimi
  10.         self.__naapurit = []
  11.         self.__verkot = {}
  12.  
  13.     def tulosta_tiedot(self):
  14.         """
  15.        tulostaa reitittimen tiedot.
  16.        """
  17.         print(" "*2+self.__nimi)
  18.         print(" "*4+"N: "+", ".join(sorted(self.__naapurit)))
  19.         #verkot, muotoa "v1:et1, ... vn:etn" missä vn = verkko, etn = etäisyys
  20.         print(" "*4+"R: "+", ".join(sorted([a+":"+str(self.__verkot[a]) for a in self.__verkot])))
  21.  
  22.  
  23.     def lisää_naapuri(self, naapuri):
  24.         """
  25.        naapuri: naapuriksi lisättävä olio (reititin)
  26.        metodi lisää naapurireitittimen
  27.        """
  28.         if naapuri.__nimi not in self.__naapurit:
  29.             self.__naapurit.append(naapuri.__nimi)
  30.  
  31.     def lisää_verkko(self, vosoite, etäisyys): #TODO: kommentoi, poikkeus: int(etäisyys)
  32.         self.__verkot[vosoite] = int(etäisyys)#TODO: testaa tarviiko int() etäisyyteen
  33.  
  34.     def hae_naapurit(self): #TODO: kommentoi, in use
  35.         return self.__naapurit
  36.  
  37.     def hae_verkot(self):
  38.         return self.__verkot
  39.  
  40.  
  41.     def vastaanota_reititystaulu(self, lähdereititin):
  42.         for verkko in lähdereititin.__verkot:
  43.             if verkko in self.__verkot:
  44.                 if lähdereititin.__verkot[verkko] >= self.__verkot[verkko]:
  45.                     continue
  46.             self.__verkot[verkko] = int(lähdereititin.__verkot[verkko])+1
  47.  
  48.     def tunteeko_reitin(self, verkko):
  49.         """
  50.        verkko: verkko:etäisyys; tarkistaa, onko reitittimellä verkkoa __verkot-dictissä,
  51.        ja antaa tulosteen, joka kertoo verkon reunareitittimen etäisyyden jos reitti on tunnettu
  52.        """
  53.         if verkko not in self.__verkot:
  54.             print("Reitti verkkoon tuntematon.")
  55.             return
  56.         if self.__verkot[verkko] == 0:
  57.             print("Reititin on verkon reunareititin.")
  58.         else:
  59.             print("Verkko",verkko,"on",self.__verkot[verkko],"askeleen päässä")
  60.  
  61. def lue_tiedosto(verkkotiedosto):#TODO: poikkeukset
  62.     """
  63.    verkkotiedosto: luettavan tiedoston nimi
  64.    """
  65.     rtiedot = []
  66.     try:
  67.         tiedosto = open(verkkotiedosto, "r")
  68.         for rivi in tiedosto:
  69.             rivi = rivi.strip()
  70.             rtiedot.append(rivi)
  71.         tiedosto.close()
  72.     except:
  73.         print("Virhe: Tiedostoa ei saa luettua tai siinä on jotain mätää.")
  74.         return None
  75.     return rtiedot
  76.  
  77. def luo_reitittimet(rtiedot):
  78.     """
  79.    Funktio luo reitittimet tiedostosta saatujen tietojen perusteella
  80.    """
  81.     reitittimet = {}
  82.     for reititin in rtiedot:
  83.         rnimi = reititin.split("!")[0]
  84.         reitittimet[rnimi] = Reititin(rnimi)
  85.     return reitittimet
  86.  
  87. def lisää_reititintiedot(reitittimet, rtiedot):
  88.     """
  89.    Funktio lisää naapuri- ja verkkotiedot aikaisemmin luotuihin reitittimiin
  90.    param reitittimet: reititinolioiden lista
  91.    param rtiedot: tiedoston tiedot,
  92.    """#TODO: viimeistele kommentti
  93.     for reititin in rtiedot:
  94.         nimi, naapurit, verkot = reititin.split("!")
  95.         if len(naapurit) > 0:
  96.             for naapuri in naapurit.split(";"):
  97.                 reitittimet[nimi].lisää_naapuri(reitittimet[naapuri])
  98.         if len(verkot) > 0:
  99.             for verkko in verkot.split(";"):
  100.                 vosoite, etäisyys = verkko.split(":")
  101.                 reitittimet[nimi].lisää_verkko(vosoite, etäisyys)
  102.     return reitittimet
  103.  
  104. def main():
  105.     reitittimet = {} #TODO:
  106.     verkkotiedosto = input("Verkkotiedosto: ")
  107.     if verkkotiedosto != "":
  108.         rtiedot = lue_tiedosto(verkkotiedosto)
  109.         if rtiedot == None:
  110.             return #TODO: tarkista, meneekö oikein
  111.         reitittimet = luo_reitittimet(rtiedot)
  112.         reitittimet = lisää_reititintiedot(reitittimet, rtiedot)
  113.  
  114.     while True:
  115.         komento = input("> ")
  116.         komento = komento.upper()
  117.  
  118.         if komento == "T":  # TODO: Järjestetään tehtävänannon lopulliseen järjestykseen
  119.             rnimi = input("Syötä reitittimen nimi: ")
  120.             if rnimi not in reitittimet:
  121.                 print("Reititintä ei löytynyt.")
  122.             else:
  123.                 reitittimet[rnimi].tulosta_tiedot()
  124.  
  125.         elif komento == "TK":
  126.             for reititin in sorted(reitittimet):
  127.                 reitittimet[reititin].tulosta_tiedot()
  128.  
  129.         elif komento == "L":
  130.             reititin = input("Anna reitittimen nimi: ")
  131.             naapurit = reitittimet[reititin].hae_naapurit()
  132.             for naapuri in naapurit:
  133.                 reitittimet[naapuri].vastaanota_reititystaulu(reitittimet[reititin])
  134.  
  135.         elif komento == "Y":
  136.             rnimi = input("Syötä yhdistettävän reitittimen nimi: ")
  137.             rnaapuri = input("Syötä toisen reitittimen nimi: ")
  138.             if rnimi and rnaapuri in reitittimet:
  139.                 reitittimet[rnimi].lisää_naapuri(reitittimet[rnaapuri])
  140.                 reitittimet[rnaapuri].lisää_naapuri(reitittimet[rnimi])
  141.         elif komento == "R":
  142.             reititin = input("Syötä reitittimen nimi: ")
  143.             verkko = input("Syötä verkon nimi: ")
  144.             reitittimet[reititin].tunteeko_reitin(verkko)
  145.  
  146.         elif komento == "UR":
  147.             rnimi = input("Syötä nimi uudelle reitittimelle: ")
  148.             if rnimi in reitittimet:
  149.                 print("Nimi varattu.")
  150.             else:
  151.                 reitittimet[rnimi] = Reititin(rnimi)
  152.  
  153.         elif komento == "UV":
  154.             rnimi = input("Syötä reitittimen nimi: ")
  155.             vosoite = input("Syötä verkko: ")
  156.             etäisyys = int(input("Syötä etäisyys: ")) #TODO: poikkeukset?
  157.             reitittimet[rnimi].lisää_verkko(vosoite, etäisyys)
  158.  
  159.         elif komento == "Q":
  160.             print("Simulaattori suljetaan.")
  161.             return
  162.  
  163.         else:
  164.             print("Virheellinen komento!")
  165.             print("Syötä jokin seuraavista komennoista:")
  166.             print("UR (uusi reititin)")
  167.             print("T (tiedot)")  # TODO: Järjestetään tehtävänannon lopulliseen järjestykseen
  168.             print("Y (reitittimien yhdistäminen)")
  169.             print("UV (uusi verkko)")
  170.             print("TK (kaikkien tiedot)")
  171.             print("L (reititystaulujen lähetys)")
  172.             print("R (reittikysely)")
  173.             print("Q (lopeta)")
  174.  
  175. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement