Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Reititin:
- """
- TODO: KOMMENTIT
- Luokka Reititin sisältää reitittimen nimen,
- listan naapureista sekä dictin,jossa on verkkojen "nimet",
- sekä reitittimen "etäisyys" verkon reunareitittimestä.
- """
- def __init__(self, nimi):
- self.__nimi = nimi
- self.__naapurit = []
- self.__verkot = {}
- def tulosta_tiedot(self):
- """
- tulostaa reitittimen tiedot.
- """
- print(" "*2+self.__nimi)
- print(" "*4+"N: "+", ".join(sorted(self.__naapurit)))
- #verkot, muotoa "v1:et1, ... vn:etn" missä vn = verkko, etn = etäisyys
- print(" "*4+"R: "+", ".join(sorted([a+":"+str(self.__verkot[a]) for a in self.__verkot])))
- def lisää_naapuri(self, naapuri):
- """
- naapuri: naapuriksi lisättävä olio (reititin)
- metodi lisää naapurireitittimen
- """
- if naapuri.__nimi not in self.__naapurit:
- self.__naapurit.append(naapuri.__nimi)
- def lisää_verkko(self, vosoite, etäisyys): #TODO: kommentoi, poikkeus: int(etäisyys)
- self.__verkot[vosoite] = int(etäisyys)#TODO: testaa tarviiko int() etäisyyteen
- def hae_naapurit(self): #TODO: kommentoi, in use
- return self.__naapurit
- def hae_verkot(self):
- return self.__verkot
- def vastaanota_reititystaulu(self, lähdereititin):
- for verkko in lähdereititin.__verkot:
- if verkko in self.__verkot:
- if lähdereititin.__verkot[verkko] >= self.__verkot[verkko]:
- continue
- self.__verkot[verkko] = int(lähdereititin.__verkot[verkko])+1
- def tunteeko_reitin(self, verkko):
- """
- verkko: verkko:etäisyys; tarkistaa, onko reitittimellä verkkoa __verkot-dictissä,
- ja antaa tulosteen, joka kertoo verkon reunareitittimen etäisyyden jos reitti on tunnettu
- """
- if verkko not in self.__verkot:
- print("Reitti verkkoon tuntematon.")
- return
- if self.__verkot[verkko] == 0:
- print("Reititin on verkon reunareititin.")
- else:
- print("Verkko",verkko,"on",self.__verkot[verkko],"askeleen päässä")
- def lue_tiedosto(verkkotiedosto):#TODO: poikkeukset
- """
- verkkotiedosto: luettavan tiedoston nimi
- """
- rtiedot = []
- try:
- tiedosto = open(verkkotiedosto, "r")
- for rivi in tiedosto:
- rivi = rivi.strip()
- rtiedot.append(rivi)
- tiedosto.close()
- except:
- print("Virhe: Tiedostoa ei saa luettua tai siinä on jotain mätää.")
- return None
- return rtiedot
- def luo_reitittimet(rtiedot):
- """
- Funktio luo reitittimet tiedostosta saatujen tietojen perusteella
- """
- reitittimet = {}
- for reititin in rtiedot:
- rnimi = reititin.split("!")[0]
- reitittimet[rnimi] = Reititin(rnimi)
- return reitittimet
- def lisää_reititintiedot(reitittimet, rtiedot):
- """
- Funktio lisää naapuri- ja verkkotiedot aikaisemmin luotuihin reitittimiin
- param reitittimet: reititinolioiden lista
- param rtiedot: tiedoston tiedot,
- """#TODO: viimeistele kommentti
- for reititin in rtiedot:
- nimi, naapurit, verkot = reititin.split("!")
- if len(naapurit) > 0:
- for naapuri in naapurit.split(";"):
- reitittimet[nimi].lisää_naapuri(reitittimet[naapuri])
- if len(verkot) > 0:
- for verkko in verkot.split(";"):
- vosoite, etäisyys = verkko.split(":")
- reitittimet[nimi].lisää_verkko(vosoite, etäisyys)
- return reitittimet
- def main():
- reitittimet = {} #TODO:
- verkkotiedosto = input("Verkkotiedosto: ")
- if verkkotiedosto != "":
- rtiedot = lue_tiedosto(verkkotiedosto)
- if rtiedot == None:
- return #TODO: tarkista, meneekö oikein
- reitittimet = luo_reitittimet(rtiedot)
- reitittimet = lisää_reititintiedot(reitittimet, rtiedot)
- while True:
- komento = input("> ")
- komento = komento.upper()
- if komento == "T": # TODO: Järjestetään tehtävänannon lopulliseen järjestykseen
- rnimi = input("Syötä reitittimen nimi: ")
- if rnimi not in reitittimet:
- print("Reititintä ei löytynyt.")
- else:
- reitittimet[rnimi].tulosta_tiedot()
- elif komento == "TK":
- for reititin in sorted(reitittimet):
- reitittimet[reititin].tulosta_tiedot()
- elif komento == "L":
- reititin = input("Anna reitittimen nimi: ")
- naapurit = reitittimet[reititin].hae_naapurit()
- for naapuri in naapurit:
- reitittimet[naapuri].vastaanota_reititystaulu(reitittimet[reititin])
- elif komento == "Y":
- rnimi = input("Syötä yhdistettävän reitittimen nimi: ")
- rnaapuri = input("Syötä toisen reitittimen nimi: ")
- if rnimi and rnaapuri in reitittimet:
- reitittimet[rnimi].lisää_naapuri(reitittimet[rnaapuri])
- reitittimet[rnaapuri].lisää_naapuri(reitittimet[rnimi])
- elif komento == "R":
- reititin = input("Syötä reitittimen nimi: ")
- verkko = input("Syötä verkon nimi: ")
- reitittimet[reititin].tunteeko_reitin(verkko)
- elif komento == "UR":
- rnimi = input("Syötä nimi uudelle reitittimelle: ")
- if rnimi in reitittimet:
- print("Nimi varattu.")
- else:
- reitittimet[rnimi] = Reititin(rnimi)
- elif komento == "UV":
- rnimi = input("Syötä reitittimen nimi: ")
- vosoite = input("Syötä verkko: ")
- etäisyys = int(input("Syötä etäisyys: ")) #TODO: poikkeukset?
- reitittimet[rnimi].lisää_verkko(vosoite, etäisyys)
- elif komento == "Q":
- print("Simulaattori suljetaan.")
- return
- else:
- print("Virheellinen komento!")
- print("Syötä jokin seuraavista komennoista:")
- print("UR (uusi reititin)")
- print("T (tiedot)") # TODO: Järjestetään tehtävänannon lopulliseen järjestykseen
- print("Y (reitittimien yhdistäminen)")
- print("UV (uusi verkko)")
- print("TK (kaikkien tiedot)")
- print("L (reititystaulujen lähetys)")
- print("R (reittikysely)")
- print("Q (lopeta)")
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement