Advertisement
Guest User

Untitled

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