{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Praktikum 4\n", "\n", "Allolevad ülesanded on kusrsuse \"Sissejuhatus programmeerimisse Pythoni baasil\" YFX0500 **praktikumis** koos kursusega ja **kodus** iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon `help`, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.\n", "\n", "
Viimati uuendatud 23.09.2024.
\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 1:**\n", "\n", "Juulius Tipikas ei oska süüa. Keegi ütles talle, et ta peab päeavas sööma vähemalt ühe köögivilja ja vähemalt ühe puuvilja selleks, et ta kõht oleks täis. Juuliusel on tavaliselt külmkapis kapsad, porgandid pirnid ja ploomid. Juulius kirjutas järgmise programmi. See programm tuletab talle meelde kas ta kõht on tühi või mitte ja kas ta peab veel sööma ja mida ta võiks süüa.\n", "\n", "```python\n", "kapsas = 3 # Köögivili\n", "porgand = 1 # Köögivili\n", "pirn = 0 # Puuvili\n", "ploom = 0 # Puuvili\n", "\n", "if kapsas or porgand and pirn or ploom:\n", " print('Juulius sinu kõht on täis.')\n", "else:\n", " print('Juulius sinu kõht pole päris täis.')\n", " if kapsas == False and porgand == False:\n", " print('Söö veel vähemalt üks puuvili.')\n", " else:\n", " print('Söö veel vähemalt üks köögivili.')\n", "```\n", "\n", "Probleem on selles, et programm ei tööta. Paranda selles esinevad vead.\n", "\n", "Vihje: Uuri allpool näidatud loogikaoperaatorite `and` ja `or` tõeväärtustabeleid ja vt. Loeng 3 koodinäited.\n", "\n", "\n", "
Tabel 1. Loogikaoperaatori and tõeväärtustabel.Tabel 2. Loogikaoperaatori or tõeväärtustabel.
\n", "\n", "| x | y |`x and y`|\n", "|:-:|:-:|:-------:|\n", "| 0 | 0 | 0 |\n", "| 0 | 1 | 0 |\n", "| 1 | 0 | 0 |\n", "| 1 | 1 | 1 |\n", "\n", "\n", "\n", "| x | y |`x or y`|\n", "|:-:|:-:|:------:|\n", "| 0 | 0 | 0 |\n", "| 0 | 1 | 1 |\n", "| 1 | 0 | 1 |\n", "| 1 | 1 | 1 |\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 2:**\n", "\n", "Kirjuta funktsioon mis kontrollib ja teatab kasutajat sellest kas etteantud arv on täisarv (`int`), reaalne murdarv (`float`) või kompleksarv (`complex`). Lisaks peab funktsioon teisendama etteantud arvu kompleksarvuks.\n", "\n", "Vihje: Objekti andmetüüpi saab järgi vaadata kasutades sisseehitatud funktsiooni `type`. Lisaks eksisteerib sissehitatud funktsioon `isinstance`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 3:**\n", "\n", "Juulius Tipika arst kirjutas programmi. Programm näitab mis juhtub Juuliuse kehaga erinevatel temperatuuridel.\n", "\n", "```python\n", "temp = -36 # Temperatuur Celsiuse kraadides.\n", "\n", "if temp > 20:\n", " print('Juulius higistab.') \n", "elif temp > 25:\n", " print('Juulius saab kuumarabanduse.')\n", "elif temp > 30:\n", " print('Juulius saab infarkti ja insuldi ning sureb.')\n", "else:\n", " print('Juulius alajahtub ja sureb.')\n", "```\n", "\n", "Paranda programmis esinevad vead.\n", "\n", "Vihje: Uuri `if-elif-else` bloki voodiagrammi." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 4:**\n", "\n", "Lisa eelmises ülesandes kasutatud valikuavaldistele uue lisatingimuse. Lisaks olemasolevale temperatuurile lisa saju olemasolu (vihn, lumi, jne.). On teada, et lisaks eelmises ülesandes viidatud tegevustele hakkab Juulius nutma kui väljas sajab." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 5:**\n", "\n", "Number `7` on väga-super-hea täisarv. Kui sisendiks on kaks täisarvu `a` ja `b`, tagasta `True` kui üks nendest on `7` või kui nende summa või vahe on `7`.\n", "\n", "Märkus: Sisseehitatud funktsioon `abs` leiab arvu absoluutväärtuse." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 6:**\n", "\n", "Given a day of the week encoded as 1 = Mon, 2 = Tue, 3 = Wed, ..., 7 = Sun, and a boolean indicating if we are on vacation, return a string of the form `7:00` indicating when the alarm clock should ring. Weekdays, the alarm should be `7:00` and on the weekend it should be `10:00`. Unless we are on vacation, then on weekdays it should be `10:00` and weekends it should be `off`.\n", "\n", "Expected outcome:\n", "```python\n", "alarm_clock(1, False) # --> 7:00\n", "alarm_clock(5, True) # --> 10:00\n", "alarm_clock(7, True) # --> off\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 7:**\n", "\n", "Loo kolm funktsiooni:\n", "1. Funktsioon mis tõstab etteantud arvu ruutu.\n", "2. Funktsioon mis tõstab etteantud arvu kuupi.\n", "3. Funktsioon mis juurib etteantud arvu.\n", "\n", "Kasuta lausendit `lambda`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 8:**\n", "\n", "Loo anonüümne funktsioon mis leiab kolme etteantud arvu ruutkeskväärtuse. Kasuta valemit\n", "\n", "$$x_{\\rm rms} = \\sqrt{\\frac{x_1^2 + x_2^2 + x_3^2}{3}}.$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 9:**\n", "\n", "Kirjuta allolev `if`-blokk `if`-`else` valikuavaldise kujule.\n", "\n", "```python\n", "num = 3.4\n", "\n", "if num > 0:\n", " print(\"Positiivne\")\n", "elif num == 0:\n", " print(\"Neutraalne\")\n", "else:\n", " print(\"Negatiivne\") \n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 10:**\n", "\n", "Kasuta `if`-`else` valikuavaldist funktsiooni `print` argumendina. Koosta programm mis hindab arvu paarsust ja väljastab tulemuse konsooli järgmise sõnena\n", "\n", "```\n", " on paaris.\n", "```\n", "või\n", "```\n", " on paaritu.\n", "```\n", "kus `` on täisarvu numbriline väärtus." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 11:**\n", "\n", "Kirjuta programm mis sarnaneb ja käitub sarnaselt eelmises ülesandes loodule. `if`-`else` valikuavaldise asemel kasuta `and` ja `or` operaatoreid." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 12:**\n", "\n", "Kuidas töötab arvu paarsust leidev programm kujul:\n", "\n", "```python\n", "def is_even(x):\n", " if x == 0:\n", " return True\n", " else:\n", " return is_odd(x - 1)\n", "\n", "def is_odd(x):\n", " if x == 0:\n", " return False\n", " else:\n", " return is_even(x - 1)\n", "\n", "print(is_even(5)) # --> False\n", "```\n", "Tegemist on nn. vastastikuse rekursiooni algoritmiga täisarvu paarsuse määramiseks.\n", "\n", "Vihje või soovitus: Kasuta funktsiooni `print`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 13:** \n", "\n", "Kirjuta programm vastavalt allolevale algoritmile.\n", "\n", "Ruutvõrrandi kommenteeritud lahendamine:\n", "1. Defineeri muutujad `a`, `b`, `c` väärtustega `1`, `-5`, `4` (ruutvõrrandi kordajad).\n", "2. Juhul kui `a = 0`, väljasta vastav teade ja määra lahendiks tühimärgid (`None`) ning lõpeta programmi töö.\n", "3. Arvuta diskriminant `D` väärtus.\n", "4. Juhul kui `D > 0`, väljasta teade, et lahendid on reaalsed ja arvuta võrrandi reaalsete lahendite väärtused.\n", "5. Juhul kui `D = 0`, väljasta teade, et lahend on reaalne ja arvuta võrrandi reaalse lahendi väärtus.\n", "6. Juhul kui `D < 0`, väljasta teade, et reaalseid lahendeid ei eksisteeri ja arvuta kompleksete lahendite väärtused.\n", "7. Väljasta ruutvõrrandi lahendite väärtused.\n", "9. Muuda muutujate `a`, `b`, `c` väärtusi. Nt.\n", "```\n", "a = 1, b = 2, c = 1,\n", "a = 1, b = 2, c = 5,\n", "a = 0, b = 1, c = 1\n", "```\n", "\n", "**Teoreetiline taust:**\n", "\n", "Ruutvõrrand on antud kujul\n", "\n", "$$a x^2 + b x + c = 0,$$\n", "\n", "kus $x$ on tundmatu, $a$, $b$ ja $c$ on etteantud koefitsendid. Ruutvõrrandi üldlahend on antud kujul:\n", "\n", "$$x_\\pm = \\frac{-b \\pm \\sqrt{\\Delta}}{2 a},$$\n", "\n", "kus lahendi käitumine sõltub diskriminandi\n", "\n", "$$\\Delta = b^2 - 4ac$$\n", "\n", "väärtusest. Lahendi sõltuvus diskriminandist ja kordajatest $a$, $b$, $c$ on järgmine:\n", "\n", "1. Kui $a = 0$ siis pole tegu ruutvõrrandiga.\n", "\n", "2. Kui $\\Delta > 0$ eksisteerivad reaalsed lahendid:\n", " $$x_\\pm = \\frac{-b \\pm \\sqrt{\\Delta}}{2a}.$$\n", "\n", "3. Kui $\\Delta = 0$ siis eksisteerib üks reaalne lahend:\n", " $$x = x_+ = x_- = -\\frac{b}{2a}.$$\n", "\n", "4. Kui $\\Delta < 0$ siis eksisteerivad kompleksarvulised lahendid kujul:\n", " $$x_{\\pm} = -\\frac{b}{2a} \\pm \\frac{\\sqrt{-\\Delta}}{2a}{\\rm i},$$\n", " kus ${\\rm i}$ on imaginaarühik." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 14:**\n", "\n", "Üldista eelmises ülesandes kasutatud algoritmi juhule $a = 0$. Teatavasti kui $a = 0$ siis\n", "\n", "$$ax^2 + bx + c = 0 \\quad \\Rightarrow \\quad bx + c = 0.$$\n", "\n", "Lahendamine $x$ suhtes annab\n", "\n", "$$x = -\\frac{c}{b}.$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 15:**\n", "\n", "Sabarekursiivne faktoriaali leidmine. Uuri allolevat koodi ja mõista mille poolest erineb see loengus näidatud algoritmist?\n", "\n", "```python\n", "def saba_faktoriaal(n, konteiner):\n", " if n <= 1:\n", " return konteiner\n", " else:\n", " return saba_faktoriaal(n - 1, n * konteiner)\n", "\n", "arv = 5\n", "print(saba_faktoriaal(arv, 1))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 16:**\n", "\n", "Defineeri rekursiivne funktsioon mis leiab $n$-da Fibonacci jada liikme, kasutades lausendit `def`.\n", "\n", "Fibonacci arvude jada on selline positiivsete täisarvude jada, mis algab ühega ja mille iga järgmine liige on kahe eelmise liikme summa:\n", "\n", "$$1,\\;1,\\;2,\\;3,\\;5,\\;8,\\;13,\\;21,\\;34,\\;55,\\;89,\\;144,\\; \\ldots$$\n", "\n", "$n$-da Fibonacci jada liikme leidmise rekursiivne lahenduseeskiri on kujul:\n", "\n", "$$F(n) = F(n-2) + F(n-1),$$\n", "\n", "kus $n > 2$ ja $F(1) = F(2) = 1$. Joonis 1 näitab kuidas leida kuues Fibonacci jada liige rekursiivselt.\n", "\n", "\n", "||\n", "|:----------------------------:|\n", "|Joonis 1: Fibonacci jada liikme leidmine juhul $n = 6$.|" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 17:**\n", "\n", "Loo funktsioon mis arvutab $n$-da Fibonacci jada liikme rekursiivselt. Kasuta lausendit `lambda`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 18:**\n", "\n", "Loo kõrgemat järku funktsioon mis kasutab kahes eelmises ülesandes loodud funktsioone, et leida kahe meelevaldselt valitud Fibonacci jada liikme summa. Ära kasuta suuri $n$ väärtusi.\n", "\n", "Näide: Juhul kui $n=3$ ja $n=6$ siis\n", "\n", "$${\\rm summa} = F(3) + F(6) = 2 + 8 = 10.$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 19:**\n", "\n", "Defineeri kõrgemat järku funktsioon mis võtab argumentidena vastu täisarvu ja kaks funktsiooni. Loodav kõrgemat järku funktsioon peab väljastama esimese funktsiooni kui arv on paaris ja teise kui arv on paaritu.\n", "\n", "Kasuta defineeritud kõrgemat järku funktsiooni koos Ülesannetes 16 ja 17 loodud funktsioonidega. Veendu loodud funktsiooni töös leides Fibonacci jada kuuenda liikme väärtuse." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "### Kodus\n", "\n", "**Ülesanna 20:****\n", "Ülemus palkab kullerid kes toimetavad pakid järgmistesse kodudesse\n", "\n", "`kodud = [\"Juuliuse kodu\", \"Mari kodu\", \"Kerdi kodu\", \"Juulia kodu\"]`\n", "\n", "Kuna ülemus on laisk ei toimeta ta pakke isiklikult. Ta kasutab järgmist strateegiat:\n", "\n", "1. Palka kuller ja delegeeri talle kogu vastutus.\n", "2. Kui kulleri vastutusalas on rohkem kui üks maja siis luba tal palgata kaks uut kullerit ja jagada kulleritöö nenede vahel ära.\n", "3. Kui kulleri vastutuses on ainult üks maja peab ta paki isiklikult kohale toimetama.\n", "\n", "Eelmanitud strateegia on kujutatud Joonisel 2. \n", "\n", "||\n", "|:----------------------------:|\n", "|Joonis 2: Rekursiivne kulleriteenus.|" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ülesanne 21**:**\n", "\n", "Täienda Ülesandes 13 loodud funktsiooni. Kontrolli kas leitud lahendid rahuldavad võrrandit. Võrdle võrrandi vasakut ja paremat poolt. Teavita kasutajat kontrolli tulemusest.\n", "\n", "Vihje/probleem: Kas vasak ja parem pool on *võrdsed*. Kas arvuti suudab tulemusi leida apsoluutse täpsusega?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" } }, "nbformat": 4, "nbformat_minor": 4 }