Rästitehtävä 2

Polynomilaskuri (350 p)

Tällä rästitehtävällä voit korvata yhden kierroksista 4, 5 tai 6. Jos sinulta puuttuu minimipisteet kahdelta näistä kierroksista, sinun pitää tehdä sekä tämä tehtävä että rästitehtävä 1 tai 3. Jos sinulta puuttuu minimipisteet kaikilta näiltä kierroksilta, tee rästitehtävät 1, 2 ja 3. Jotta rästitehtävä korvaisi tehtäväkierroksen, siitä on saatava vähintään 300 pistettä. Vaikka saisit tehtävästä enemmän pisteitä, niin harjoitustehtäväarvosanaa määrättäessä tällä tehtävällä korvatun kierroksen pistemääräksi lasketaan kuitenkin vain korvattavan kierroksen minimipistemäärä.

Tee Eclipseen uusi projekti, jonka nimi on tehtava10_2. Luo sitten tähän projektiin moduuli polynomeja ja kirjoita siihen ohjelma, jonka avulla käyttäjä voi tehdä erilaisia yhden muuttujan polynomien laskutoimituksia. Tarkempi selostus ohjelman vaatimuksista on alempana.

Ohjelmasi pitää pystyä laskemaan kahden polynomin summa ja tulo, derivoimaan polynomi sekä laskemaan polynomin arvo halutussa pisteessä. Polynomi tallennetaan listaan siten, että polynomin nollannen asteen termin kerroin on listassa indeksillä 0, ensimmäisen asteen kerroin listassa indeksillä 1 jne. Listan pituus on yhtä suurempi kuin polynomin asteluku. Esimerkiksi polynomi 4x**4 - 12x**3 + 25x**2 + 24x**1 - 16 olisi tallennettu listaksi [-16, 24, 25, -12, 4] ja polynomi 25x**2 - 16 listaksi [-16, 0, 25]. Yksinkertaisuuden vuoksi tässä tehtävässä käsitellään vain sellaisia polynomeja, joissa termien kertoimet ovat kokonaislukuja.

Termien kertoimet voivat olla myös nollia. Tehtävän helpottamiseksi tässä tehtävässä sallitaan myös polynomit, joiden korkeimman asteen termin kerroin on 0, esimerkiksi polynomi 0x**2 - 16 (esitetään listana [-16, 0, 0]) on tässä tehtävässä sallittu. Ohjelmaa olisi järkevää laajentaa siten, että tällaisista polynomeista karsittaisiin pois alun nollakertoimiset termit (nollat listan lopusta), mutta tämä laajennus on jätetty tästä tehtävästä pois, jotta tehtävän työmäärä ei tulisi liian suureksi.

Kirjoita ohjelmaasi seuraavat funktiot:

Kirjoita lisäksi pääohjelma, joka tekee seuraavat asiat annetussa järjestyksessä. Katso tarkemmin esimerkkiajoista, millaisia tulostusten pitää olla.

  1. Pyytää käyttäjältä ensimmäisen polynomin.
  2. Tulostaa ensimmäisen polynomin käyttämällä apuna polynomista_merkkijono-funktiota.
  3. Pyytää käyttäjältä toisen polynomin.
  4. Tulostaa toisen polynomin käyttämällä apuna polynomista_merkkijono-funktiota.
  5. Laskee ensimmäisen ja toisen polynomin summan.
  6. Tulostaa summapolynomia esittävän listan. Huomaa, että voit tehdä tulostuksen suoraan käskyllä print lista, jos lista on polynomia esittävään listaan viittaavan muuttujan nimi.
  7. Tulostaa summapolynomin käyttämällä apuna polynomista_merkkijono-funktiota.
  8. Laskee ensimmäisen ja toisen polynomin tulon.
  9. Tulostaa tulopolynomia esittävän listan.
  10. Tulostaa tulopolynomin käyttämällä apuna polynomista_merkkijono-funktiota.
  11. Kysyy käyttäjältä, missä pisteessä ensimmäisen polynomin arvo lasketaan. Laskee polynomin arvon tässä pisteessä ja tulostaa sen. Sekä piste että arvo tulostetaan kolmen desimaalin tarkkuudella.
  12. Laskee ensimmäisen polynomin derivaattapolynomin.
  13. Tulostaa derivaattapolynomia kuvaavan listan.
  14. Tulostaa derivaattapolynomin käyttämällä apuna polynomista_merkkijono-funktiota.

Polynomia kuvaavien listojen tulostus ei normaalisti kuuluisi tällaiseen ohjelmaan. Se on lisätty pääohjelmaan siksi, että tehtävästä voisi saada osan pisteistä siinä tapauksessa, että polynomien laskutoimitukset toimivat oikein, mutta funktiossa polynomista_merkkijono on vielä ongelmia.

Ole tarkka siitä, että ohjelmasi tulostus ja polynomien tulostukset ovat täsmälleen (välimerkkejä myöten) alla olevan mallin mukaisia.

Ohjelmasi ei tarvitse varautua siihen, että käyttäjä antaa lukuja pyydettäessä esimerkiksi merkkijonoja. Testaa ohjelmaasi ajamalla sitä itse monta kertaa ennen tehtävän palautusta. Palauta Gobliniin tiedosto polynomeja.py.

Huomautus: Pythonille on kirjoitettu myös valmiita moduuleita polynomien käsittelyyn. Niitä ei saa käyttää tämän tehtävän ratkaisussa. Oliot sopisivat polynomien kuvaamiseen erittäin hyvin. Niitä ei ole kuitenkaan käytetty tässä tehtävässä, koska oliot eivät kuulu kierrosten 4-6 vaatimuksiin.

Esimerkkejä ohjelman suorituksesta:

[ohjelman suoritus alkaa]
Anna 1. polynomi.
Anna polynomin asteluku.
2
Anna 2. asteen termin kerroin.
4
Anna 1. asteen termin kerroin.
-3
Anna 0. asteen termin kerroin.
2
p1(x) = 4x**2 - 3x**1 + 2
Anna 2. polynomi.
Anna polynomin asteluku.
1
Anna 1. asteen termin kerroin.
5
Anna 0. asteen termin kerroin.
-2
p2(x) = 5x**1 - 2
Polynomien summan laskeminen:
Summa listana: [0, 2, 4]
p1(x) + p2(x) = 4x**2 + 2x**1
Polynomien tulon laskeminen:
Tulo listana: [-4, 16, -23, 20]
p1(x) * p2(x) = 20x**3 - 23x**2 + 16x**1 - 4
Missa pisteessa 1. polynomin arvo lasketaan?
1.5
p1(1.500) = 6.500
Derivaatan laskeminen:
Derivaatta listana: [-3, 8]
p1'(x) = 8x**1 - 3
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Anna 1. polynomi.
Anna polynomin asteluku.
4
Anna 4. asteen termin kerroin.
0
Anna 3. asteen termin kerroin.
-2
Anna 2. asteen termin kerroin.
0
Anna 1. asteen termin kerroin.
0
Anna 0. asteen termin kerroin.
5
p1(x) = 0x**4 - 2x**3 + 5
Anna 2. polynomi.
Anna polynomin asteluku.
3
Anna 3. asteen termin kerroin.
-4
Anna 2. asteen termin kerroin.
6
Anna 1. asteen termin kerroin.
1
Anna 0. asteen termin kerroin.
-5
p2(x) = -4x**3 + 6x**2 + 1x**1 - 5
Polynomien summan laskeminen:
Summa listana: [0, 1, 6, -6, 0]
p1(x) + p2(x) = 0x**4 - 6x**3 + 6x**2 + 1x**1
Polynomien tulon laskeminen:
Tulo listana: [-25, 5, 30, -10, -2, -12, 8, 0]
p1(x) * p2(x) = 0x**7 + 8x**6 - 12x**5 - 2x**4 - 10x**3 + 30x**2 + 5x**1 - 25
Missa pisteessa 1. polynomin arvo lasketaan?
-3.97
p1(-3.970) = 130.142
Derivaatan laskeminen:
Derivaatta listana: [0, 0, -6, 0]
p1'(x) = 0x**3 - 6x**2
[ohjelman suoritus päättyy]

[ohjelman suoritus alkaa]
Anna 1. polynomi.
Anna polynomin asteluku.
-2
p1(x) = 0
Anna 2. polynomi.
Anna polynomin asteluku.
0
Anna 0. asteen termin kerroin.
5
p2(x) = 5
Polynomien summan laskeminen:
Summa listana: [5]
p1(x) + p2(x) = 5
Polynomien tulon laskeminen:
Tulo listana: [0]
p1(x) * p2(x) = 0
Missa pisteessa 1. polynomin arvo lasketaan?
9.4
p1(9.400) = 0.000
Derivaatan laskeminen:
Derivaatta listana: [0]
p1'(x) = 0
[ohjelman suoritus päättyy]

Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta