Advertisement
Guest User

Untitled

a guest
May 25th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.29 KB | None | 0 0
  1. """
  2. TIE-02100 Johdatus ohjelmointiin
  3. Valtteri Vuorio, 268084
  4. vuorio.valtteri@student.tut.fi
  5. polynomilaskin
  6. Ohjelmalle annetaan tekstitiedostossa polynomeja ja niitä voi laskea yhteen,
  7. vähentää toisistaan ja kertoa toisillaan antamalla laskimelle komentoja.
  8. """
  9.  
  10.  
  11. """
  12. Polynomi -luokka tallentaa polynomin termit sanakirjaan, jossa avaimina on
  13. eksponentit ja arvoina kerroin. Luodessa annetaan kaksi parametria.
  14. :param eksponentti: Ensimmäisen termin eksponentti. Tallennetaan avaimena
  15. sanakirjaan self.__polynomi
  16. :param kerroin: Ensimmäisen termin kerroin. Tallennetaan arvona sanakirjaan.
  17. :return: None.
  18. """
  19.  
  20.  
  21. class Polynomi:
  22.     def __init__(self, eksponentti, kerroin):
  23.         self.__polynomi = {}
  24.         self.__polynomi[eksponentti] = kerroin
  25.  
  26.     """
  27.    Metodi lisää uuden termin olion sanakirjaan.
  28.    :param eksponentti: Ensimmäisen termin eksponentti. Tallennetaan avaimena
  29.    sanakirjaan.
  30.    :param kerroin: Ensimmäisen termin kerroin. Tallennetaan arvona sanakirjaan
  31.    :return: None.
  32.    """
  33.  
  34.     def lisää_termi(self, eksponentti, kerroin):
  35.         self.__polynomi[eksponentti] = kerroin
  36.  
  37.     """
  38.    Tulostaa olion halutussa muodosa.
  39.    :param muistipaikka: Käytetään tulosteessa. Jos parametriksi annetaan "-1",
  40.    tulosteesta poistetaan muistipaikka -osuus.
  41.    :return: None.
  42.    """
  43.  
  44.     def tulosta(self, muistipaikka):
  45.         tuloste = ""
  46.         for eksponentti in sorted(self.__polynomi):
  47.             if tuloste == "":
  48.                 if int(self.__polynomi[eksponentti]) == 0:
  49.                     pass
  50.                 else:
  51.                     tuloste += "{}x^{}".format(self.__polynomi[eksponentti],
  52.                                                eksponentti)
  53.             else:
  54.                 if int(self.__polynomi[eksponentti]) == 0:
  55.                     pass
  56.                 else:
  57.                     tuloste = "{}x^{} + ".format(self.__polynomi[eksponentti],
  58.                                                  eksponentti) + tuloste
  59.         if tuloste == "":
  60.             tuloste = "0"
  61.  
  62.         if muistipaikka != "x":
  63.             print("Memory location {}:".format(muistipaikka), tuloste)
  64.         else:
  65.             print("The simplified result:")
  66.             if tuloste == "":
  67.                 print("0")
  68.             else:
  69.                 print(tuloste)
  70.  
  71.     """
  72.    Hakee kertoimen tietyn eksponentin termille.
  73.    :param eksponentti: Kertoo minkä termin kerroin palauttaa
  74.    :return: kerroin int -muodossa
  75.    """
  76.  
  77.     def hae_kerroin(self, eksponentti):
  78.         if eksponentti not in self.__polynomi:
  79.             return 0
  80.         else:
  81.             kerroin = int(self.__polynomi[eksponentti])
  82.             return kerroin
  83.  
  84.     """
  85.    Hakee olion kaikkien termien eksponentit.
  86.    :return: Lista, jossa kaikki olion termien eksponentit.
  87.    """
  88.  
  89.     def hae_eksponentit(self):
  90.         eksponentit = []
  91.         for eksponentti in self.__polynomi:
  92.             eksponentit.append(eksponentti)
  93.         return eksponentit
  94.  
  95.  
  96. """
  97. Lukee tekstitiedostosta polynomit. Käy läpi tiedoston rivi kerrallaan ja luo
  98. uusia polynomi -olioita tarvittaessa
  99. :param nimi: Käyttäjän antama tiedoston nimi.
  100. :return: None.
  101. """
  102.  
  103.  
  104. def lue_tiedosto(nimi):
  105.     polynomit = []
  106.     tiedosto = open(nimi, 'r')
  107.     k = 0
  108.     for rivi in tiedosto:
  109.         rivi = rivi.rstrip()
  110.         termit = rivi.split(';')
  111.         i = 1
  112.         for luku in termit:
  113.             luku = luku.split(" ")
  114.             kerroin = luku[0]
  115.             eksponentti = luku[1]
  116.             if i == 1:
  117.                 polynomit.append(Polynomi(eksponentti, kerroin))
  118.                 i += 1
  119.             else:
  120.                 polynomit[k].lisää_termi(eksponentti, kerroin)
  121.         k += 1
  122.     return polynomit
  123.  
  124.  
  125. """
  126. Laskee yhteen kaksi polynomia. Käy läpi ensimmäisen polynomin eksponentit ja
  127. lisää niihin toisesta polynomista löytyvät saman asteen termit. Jos toisesta
  128. polynomista ei löydy samanasteista termiä toisen polynomin kerroin siirtyy
  129. ratkaisuun.
  130. :param eka: Ensimmäisen polynomin muistipaikka. Käytetään polynomi -olion
  131. löytämiseen.
  132. :param toka: Toisen polynomin muistipaikka.
  133. :return: Polynomi -olio, jossa tallennettuna tulos.
  134. """
  135.  
  136.  
  137. def lisää(eka, toka):
  138.     ekan_eksponentit = eka.hae_eksponentit()
  139.     tokan_eksponentit = toka.hae_eksponentit()
  140.     l = 1
  141.     for eksponentti in ekan_eksponentit:
  142.         if eksponentti in tokan_eksponentit:
  143.             kerroin1 = eka.hae_kerroin(eksponentti)
  144.             kerroin2 = toka.hae_kerroin(eksponentti)
  145.             kerroin = kerroin1 + kerroin2
  146.         else:
  147.             kerroin = eka.hae_kerroin(eksponentti)
  148.  
  149.         if l == 1:
  150.             tulos = Polynomi(eksponentti, kerroin)
  151.             l += 1
  152.         else:
  153.             tulos.lisää_termi(eksponentti, kerroin)
  154.     tuloksen_eksponentit = tulos.hae_eksponentit()
  155.     for eksponentti in tokan_eksponentit:
  156.         if eksponentti not in tuloksen_eksponentit:
  157.             kerroin = toka.hae_kerroin(eksponentti)
  158.             tulos.lisää_termi(eksponentti, kerroin)
  159.     return tulos
  160.  
  161.  
  162. """
  163. Vähentää kaksi polynomia toisistaan. Toimii vastaavasti lisää -funktion kanssa,
  164. mutta vähennyslaskuun muokattuna.
  165. :param eka: Ensimmäisen polynomin muistipaikka. Käytetään polynomi -olion
  166. löytämiseen.
  167. :param toka: Toisen polynomin muistipaikka.
  168. :return: Polynomi -olio, jossa tallennettuna tulos.
  169. """
  170.  
  171.  
  172. def vähennä(eka, toka):
  173.     ekan_eksponentit = eka.hae_eksponentit()
  174.     tokan_eksponentit = toka.hae_eksponentit()
  175.     l = 1
  176.     for eksponentti in ekan_eksponentit:
  177.         if eksponentti in tokan_eksponentit:
  178.             kerroin1 = eka.hae_kerroin(eksponentti)
  179.             kerroin2 = toka.hae_kerroin(eksponentti)
  180.             kerroin = kerroin1 - kerroin2
  181.         else:
  182.             kerroin = eka.hae_kerroin(eksponentti)
  183.  
  184.         if l == 1:
  185.             tulos = Polynomi(eksponentti, kerroin)
  186.             l += 1
  187.         else:
  188.             tulos.lisää_termi(eksponentti, kerroin)
  189.  
  190.     tuloksen_eksponentit = tulos.hae_eksponentit()
  191.     for eksponentti in tokan_eksponentit:
  192.         if eksponentti not in tuloksen_eksponentit:
  193.             kerroin = -1 * toka.hae_kerroin(eksponentti)
  194.             tulos.lisää_termi(eksponentti, kerroin)
  195.     return tulos
  196.  
  197.  
  198. """
  199. Kertoo kaksi polynomia toisillaan. Käy läpi ensimmäisen polynomin termit
  200. kertoen niillä kaikki toisen polynomin termit. Jos kerrottaessa syntyy useita
  201. saman eksponentin termejä, ne yhdistetään.
  202. :param eka: Ensimmäisen polynomin muistipaikka. Käytetään polynomi -olion
  203. löytämiseen.
  204. :param toka: Toisen polynomin muistipaikka.
  205. :return: Polynomi -olio, jossa tallennettuna tulos.
  206. """
  207.  
  208.  
  209. def kerro(eka, toka):
  210.     ekan_eksponentit = eka.hae_eksponentit()
  211.     tokan_eksponentit = toka.hae_eksponentit()
  212.     l = 1
  213.     for eksponentti1 in ekan_eksponentit:
  214.         for eksponentti2 in tokan_eksponentit:
  215.             tuloksen_eksponentti = int(eksponentti1) + int(eksponentti2)
  216.             kerroin1 = eka.hae_kerroin(eksponentti1)
  217.             kerroin2 = toka.hae_kerroin(eksponentti2)
  218.             tuloksen_kerroin = kerroin1 * kerroin2
  219.             if l == 1:
  220.                 tulos = Polynomi(tuloksen_eksponentti, tuloksen_kerroin)
  221.                 l += 1
  222.             else:
  223.                 tuloksen_eksponentit = tulos.hae_eksponentit()
  224.                 if tuloksen_eksponentti in tuloksen_eksponentit:
  225.                     kerroin1 = tulos.hae_kerroin(tuloksen_eksponentti)
  226.                     uusi_kerroin = kerroin1 + tuloksen_kerroin
  227.                     tulos.lisää_termi(tuloksen_eksponentti, uusi_kerroin)
  228.                 else:
  229.                     tulos.lisää_termi(tuloksen_eksponentti, tuloksen_kerroin)
  230.     return tulos
  231.  
  232.  
  233. """
  234. Lukee ensin tiedostosta polynomit.
  235. Kysyy käyttäjätä käskyä.
  236. Käsittelee käskyn ja suorittaa halutun laskutoimituksen.
  237. Käsittelee tarvittaessa virhetilanteet.
  238. """
  239.  
  240.  
  241. def main():
  242.     tiedosto_nimi = input("Enter file name: ")
  243.     try:
  244.         polynomit = lue_tiedosto(tiedosto_nimi)
  245.         skip = False
  246.     except:
  247.         print("Error in reading the file.")
  248.         skip = True
  249.  
  250.     while True:
  251.         formaatti = True
  252.         tuntematon = True
  253.         paikat = True
  254.         if skip:
  255.             return
  256.  
  257.         komento = input("> ")
  258.  
  259.         if komento == "quit":
  260.             print("Bye bye!")
  261.             return
  262.         try:
  263.             komento = komento.split(" ")
  264.             eka = int(komento[0])
  265.             toka = int(komento[2])
  266.             merkki = komento[1]
  267.         except:
  268.             print("Error: entry format is memory_location "
  269.                   "operation memory_location.")
  270.             formaatti = False
  271.  
  272.         if len(komento) != 3 and formaatti:
  273.             print("Error: entry format is memory_location "
  274.                   "operation memory_location.")
  275.             formaatti = False
  276.  
  277.         if eka < 0 and formaatti:
  278.             print("Error: entry format is memory_location "
  279.                   "operation memory_location.")
  280.             formaatti = False
  281.  
  282.         if toka < 0 and formaatti:
  283.             print("Error: entry format is memory_location "
  284.                   "operation memory_location.")
  285.             formaatti = False
  286.  
  287.         if merkki != "+" and merkki != "-" and merkki != "*" and formaatti:
  288.             print("Error: unknown operator.")
  289.             tuntematon = False
  290.  
  291.         try:
  292.             testi = polynomit[eka]
  293.             testi = polynomit[toka]
  294.         except:
  295.             if formaatti and tuntematon:
  296.                 print("Error: the given memory location does not exist.")
  297.             paikat = False
  298.  
  299.         if formaatti and tuntematon and paikat:
  300.             if merkki == "+":
  301.                 polynomit[eka].tulosta(eka)
  302.                 polynomit[toka].tulosta(toka)
  303.                 tulos = lisää(polynomit[eka], polynomit[toka])
  304.                 tulos.tulosta("x")
  305.  
  306.             elif merkki == "-":
  307.                 polynomit[eka].tulosta(eka)
  308.                 polynomit[toka].tulosta(toka)
  309.                 tulos = vähennä(polynomit[eka], polynomit[toka])
  310.                 tulos.tulosta("x")
  311.  
  312.             elif merkki == "*":
  313.                 polynomit[eka].tulosta(eka)
  314.                 polynomit[toka].tulosta(toka)
  315.                 tulos = kerro(polynomit[eka], polynomit[toka])
  316.                 tulos.tulosta("x")
  317.  
  318.  
  319. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement