{"id":60,"date":"2018-12-05T00:29:06","date_gmt":"2018-12-05T00:29:06","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=60"},"modified":"2025-12-12T11:45:24","modified_gmt":"2025-12-12T11:45:24","slug":"tsuklite-rakendamine","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/tsuklite-rakendamine\/","title":{"raw":"Ts\u00fcklite rakendamine","rendered":"Ts\u00fcklite rakendamine"},"content":{"raw":"Selles peat\u00fckis n\u00e4eme, kuidas saab ts\u00fckleid kasutada erinevate eesm\u00e4rkide t\u00e4itmiseks. Loome ts\u00fcklite abil programmid rahvastiku muutumise ennustamiseks, pangaautomaadi ligip\u00e4\u00e4su lubamiseks ning arvude \u00e4raarvamise m\u00e4ngu.\r\n<h2>Suur arv<\/h2>\r\nAlustame elulise n\u00e4itega, kus ts\u00fcklimuutuja suureneb igal sammul \u00fche v\u00f5rra, aga algv\u00e4\u00e4rtus pole 0, vaid hoopis 2017. Oletame, et aastal 2017 on Eesti riigi elanike arv 1 315 635 (<a href=\"https:\/\/www.stat.ee\/et\/avasta-statistikat\/valdkonnad\/rahvastik\">link<\/a>). Iibe kordaja n\u00e4itab selle arvu muutumist aasta jooksul 1000 inimese kohta (positiivse iibe korral on kordaja positiivne, negatiivse korral negatiivne). 2017. aastal v\u00f5iks see olla -1.33 (<a href=\"https:\/\/andmed.stat.ee\/et\/stat\/rahvastik__rahvastikunaitajad-ja-koosseis__demograafilised-pehinaitajad\/RV030\">link<\/a>). Leiame, mis oleks riigi elanike arv aastal 2080, kui iibe kordaja ei muutuks:\r\n\r\n<strong>N\u00e4iteprogramm. Elanike arv I<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">aasta = 2017                             # loendamist ei pea nullist alustama\r\narv = 1315635\r\niibe_kordaja = -1.33                     # Promillides (arvukuse muutus 1000 elaniku kohta)\r\nwhile aasta &lt; 2080:\r\n   arv = arv + arv * iibe_kordaja \/ 1000 # Arvutame selle aasta uue arvu\r\n   aasta = aasta + 1                     # L\u00e4heme j\u00e4rgmise aasta juurde\r\nprint(\"Aastal \" + str(aasta) + \" on elanikke \" + str(round(arv)) + \".\")<\/pre>\r\nKui me tahaks teada, mis aastal oleks elanikke 2 000 000, kui iibe kordaja oleks 6 promilli:\r\n\r\n<strong>N\u00e4iteprogramm. Elanike arv II<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">aasta = 2017\r\narv = 1315635\r\niibe_kordaja = 6\r\nwhile arv &lt; 2000000:\r\n   arv = arv + arv * iibe_kordaja \/ 1000\r\n   aasta = aasta + 1\r\nprint(\"Aastal \" + str(aasta) + \" on elanike arv \" + str(round(arv)) + \".\")<\/pre>\r\nT\u00e4psema prognoosi saamiseks oleks vaja arvestada paljusid erinevaid asjaolusid. Huvi korral uuri <a href=\"https:\/\/www.stat.ee\/et\/avasta-statistikat\/valdkonnad\/rahvastik\/rahvastikuprognoos\">statistikaameti prognoosi 2080. aasta kohta<\/a>.\r\n<h2>Mitu korda?<\/h2>\r\nEelnevates n\u00e4idetes oli ts\u00fckli korduste arv p\u00f5him\u00f5tteliselt algusest peale teada. N\u00fc\u00fcd teeme programmi, kus ts\u00fckli l\u00e4bimiste arv s\u00f5ltub kasutaja sisestatud vastustest. Alustame valikulause materjalides vaadeldud programmist, milles k\u00fcsitakse PIN-koodi. Seal k\u00fcsiti PIN-koodi \u00fcks kord ja l\u00f5plik otsus tehti \u00fche pakkumise j\u00e4rel:\r\n\r\n<strong>N\u00e4iteprogramm. Pangaautomaat I\r\n<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n   print(\"Sisenesid pangaautomaati!\")\r\nelse:\r\n   print(\"Vale parool! Ligip\u00e4\u00e4s keelatud!\")\r\n<\/pre>\r\nTavaliselt lubatakse PIN-koodi m\u00f5ned korrad uuesti proovida, kui \u00f5iget koodi ei sisestatud. Ilmselt on siin kasu ts\u00fcklist. Antud juhul peame ts\u00fckliliselt k\u00e4ituma (koodi uuesti k\u00fcsima) vaid siis, kui sisestatud PIN-kood ei ole \u00f5ige. J\u00e4tkamistingimuseks sobiks seega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin != \"1234\"<\/code>. Programm oleks j\u00e4rgmine:\r\n\r\n<strong>N\u00e4iteprogramm. Pangaautomaat II<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()\r\nwhile sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")\r\n\r\n<\/pre>\r\nM\u00f5tle l\u00e4bi, kuidas see programm samm-sammult t\u00f6\u00f6tab. Vajadusel joonista selle plokkskeem. Proovi programmi erinevate PIN-koodidega.\r\n<h3>Muutujate olemasolu ts\u00fcklis<\/h3>\r\nProgrammi vaadates n\u00e4eme, et j\u00e4rgmine l\u00f5ik on kahes kohas (nii ts\u00fckli ees kui sees):\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()<\/pre>\r\nV\u00f5ime proovida ts\u00fckli eest selle l\u00f5igu \u00e4ra j\u00e4tta:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">while sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\r\nSellisel juhul ilmub veateade, sest muutujal\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> ei ole v\u00e4\u00e4rtust, kui seda <em>while<\/em>-tingimuses esimest korda kontrollida tahetakse:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\"><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\">Traceback (most recent call last):\r\n  File \"C:\/Python33\/pin.py\", line 1, in &lt;module&gt;\r\n    while sisestatud_pin != \"1234\":\r\nNameError: name 'sisestatud_pin' is not defined<\/span><\/pre>\r\nAnname muutujale <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> esialgseks v\u00e4\u00e4rtuseks t\u00fchja s\u00f5ne. Sellega garanteerime, et muutujal <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> on alati v\u00e4\u00e4rtus ja ts\u00fckli j\u00e4tkamistingimus on esialgu kindlasti t\u00f5ene, sest t\u00fchi s\u00f5ne ei ole v\u00f5rdne s\u00f5nega \"1234\". Programmi plokkskeem on kujutatud joonisel 1.\r\n\r\n<strong>N\u00e4iteprogramm. Pangaautomaat III<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin = \"\"\r\nwhile sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\r\n[caption id=\"attachment_61\" align=\"aligncenter\" width=\"188\"]<img class=\"wp-image-61 size-full\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/Ndal3_pangaautomaat.png\" alt=\"\" width=\"188\" height=\"603\" \/> Joonis 1. Programmi \"Pangaautomaat III\" plokkskeem[\/caption]\r\n\r\nN\u00fc\u00fcd ei p\u00e4\u00e4se ilma parooli sisestamata edasi. Paraku on s\u00fcsteem ebaturvaline, sest katsetada saab suvaline arv kordi. P\u00fc\u00fcame katsete arvu piirata:\r\n\r\n<strong>N\u00e4iteprogramm. Pangaautomaat IV<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n   print(\"Sisesta PIN-kood:\")\r\n   print(\"J\u00e4\u00e4nud on \" + str(katseid) + \" katset.\")\r\n   katseid -= 1\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\r\nN\u00fc\u00fcd koosneb j\u00e4tkamistingimus kahest osast - endiselt kontrollitakse, ega sisestatud PIN-kood \u00f5ige ei ole, aga lisaks kontrollitakse seda, mitu korda veel vastata tohib. Enne ts\u00fcklit on kordade arvuks m\u00e4\u00e4ratud 3 ja p\u00e4rast igat ts\u00fckli keha t\u00e4itmist v\u00e4heneb see arv 1 v\u00f5rra. Esimesel korral saab muutuja\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">katseid<\/code> v\u00e4\u00e4rtuseks 2, teisel korral 1 ja kolmandal korral 0.\r\n\r\nJ\u00e4tkamistingimuses kasutatakse v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">and<\/code>, mis t\u00e4hendab, et tingimuse kehtimiseks peab nii selles s\u00f5nast paremal kui vasakul pool olevad tingimused t\u00f5esed olema, teisis\u00f5nu peavad m\u00f5lemad osaavaldised olema t\u00f5esed. Meie koodis k\u00fcsitakse PIN-koodi ainult siis, kui \u00f5iget koodi pole sisestatud ja j\u00e4rele j\u00e4\u00e4nud katseid on rohkem kui 0. Nagu eelmise n\u00e4dala materjalides mainiti, v\u00f5ib ka siin tingimus olla \u00fcksk\u00f5ik kui keeruline. Tehetega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">and<\/code>,\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">or<\/code> ja\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">not<\/code> saab moodustada v\u00e4ga erinevaid avaldisi.\r\n\r\nKokkuv\u00f5ttev video programmi koostamisest: <a href=\"https:\/\/www.youtube.com\/embed\/OJhIV5IcE5o\">link<\/a>\r\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\r\n<code>[h5p id=\"7\"]<\/code>\r\n<h3>T\u00e4iendatud pangaautomaat<\/h3>\r\nMeie programm ei toimi veel nii, nagu me tahaks. Mure on selles, et k\u00fcsimiste arv on k\u00fcll piiratud, aga isegi kui vale kood kolm korda sisestatakse, lubab programm kasutaja pangaautomaati sisse. Muudame programmi nii, et arvestataks, kas l\u00f5puks sisestati \u00f5ige kood v\u00f5i mitte. Kui ei sisestatud, siis \u00e4hvardame kasutajat turvat\u00f6\u00f6tajaga, keda lubame kutsuda 10 sekundi p\u00e4rast. Programmi saab \u00fcheks sekundiks \"uinutada\" k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sleep(1)<\/code>, kuid selle kasutamiseks tuleb see importida moodulist\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">time<\/code> k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from time import sleep<\/code>.\r\n\r\n<strong>N\u00e4iteprogramm. Pangaautomaat V<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from time import sleep\r\nsisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n   print(\"Sisesta PIN-kood:\")\r\n   print(\"J\u00e4\u00e4nud on \" + str(katseid) + \" katset.\")\r\n   katseid -= 1\r\n   sisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n   print(\"Sisenesid pangaautomaati!\")\r\nelse:\r\n   print(\"Katsete arv \u00fcletatud! Turvat\u00f6\u00f6taja kutsutakse 10 sekundi p\u00e4rast!\")\r\n   i = 10\r\n   while i &gt; 0:\r\n      print(i)\r\n      i -= 1\r\n      sleep(1)\r\n   print(\"Turvat\u00f6\u00f6taja kutsutud!\")\r\n<\/pre>\r\nHuvi korral katseta, mida teeb programm teisiti, kui\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">if sisestatud_pin == \"1234\":<\/pre>\r\nasemel oleks\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">if katseid &gt; 0:<\/pre>\r\n<h3>Mitmetasandiline taane<\/h3>\r\nEelmises programmis oli viimane ts\u00fckkel valikulause <em>else<\/em>-osa sees. N\u00e4eme, et taane on vastavalt l\u00e4inud veel kaugemale. Selline mitmetasemeline struktuur on programmides t\u00e4iesti tavaline. n\u00e4iteks v\u00f5ib esineda <em>while<\/em>-ts\u00fckkel, mille sees on tingimuslause, mille sees on veel \u00fcks ts\u00fckkel. Kuna mitmetasandiliste programmide k\u00e4itumise ette ennustamine v\u00f5ib muutuda keeruliseks, siis tuleks v\u00f5imaluse korral hoida struktuur v\u00f5imalikult lihtne.\r\n<h3>Arvamism\u00e4ng<\/h3>\r\nKlassikalises arvamism\u00e4ngus on kasu tingimuslausest ts\u00fckli sees:\r\n\r\n<strong>N\u00e4iteprogramm. Arvamism\u00e4ng<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from random import randint\r\n\r\narv = randint(1,19) # Juhuslik t\u00e4isarv\r\nprint(\"M\u00f5tlen \u00fchele 20-st v\u00e4iksemale naturaalarvule. Arva \u00e4ra!\")\r\narvamus = int(input())\r\n\r\nwhile arvamus != arv:\r\n   if arv &gt; arvamus:\r\n      print(\"Minu arv on suurem!\")\r\n   else:\r\n      print(\"Minu arv on v\u00e4iksem!\")\r\n\r\n   print(\"Arva veel!\")\r\n   arvamus = int(input())\r\n\r\nprint(\"\u00d5ige! Tubli!\")\r\n<\/pre>\r\nProovi m\u00e4ngu modifitseerida. N\u00e4iteks pane programm loendama sooritatud arvamiste arvu ja sellele reageerima. Kui arv arvatakse esimese korraga \u00e4ra, siis v\u00f5ib m\u00e4ngijal soovitada oma selgeltn\u00e4gija-v\u00f5imeid laiemaltki kasutada.\r\n\r\nPalun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSeoHq8MRYdev1d7t3NITGh20eZOEy_NJ4nEYr2uDJxMFbGcHQ\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google'i k\u00fcsimustikus<\/a>.\r\n<h2>Video<\/h2>\r\nVaata ka ts\u00fcklit kokkuv\u00f5tvat videot:\r\n\r\nhttps:\/\/www.youtube.com\/watch?v=Lef-_DIpXTs","rendered":"<p>Selles peat\u00fckis n\u00e4eme, kuidas saab ts\u00fckleid kasutada erinevate eesm\u00e4rkide t\u00e4itmiseks. Loome ts\u00fcklite abil programmid rahvastiku muutumise ennustamiseks, pangaautomaadi ligip\u00e4\u00e4su lubamiseks ning arvude \u00e4raarvamise m\u00e4ngu.<\/p>\n<h2>Suur arv<\/h2>\n<p>Alustame elulise n\u00e4itega, kus ts\u00fcklimuutuja suureneb igal sammul \u00fche v\u00f5rra, aga algv\u00e4\u00e4rtus pole 0, vaid hoopis 2017. Oletame, et aastal 2017 on Eesti riigi elanike arv 1 315 635 (<a href=\"https:\/\/www.stat.ee\/et\/avasta-statistikat\/valdkonnad\/rahvastik\">link<\/a>). Iibe kordaja n\u00e4itab selle arvu muutumist aasta jooksul 1000 inimese kohta (positiivse iibe korral on kordaja positiivne, negatiivse korral negatiivne). 2017. aastal v\u00f5iks see olla -1.33 (<a href=\"https:\/\/andmed.stat.ee\/et\/stat\/rahvastik__rahvastikunaitajad-ja-koosseis__demograafilised-pehinaitajad\/RV030\">link<\/a>). Leiame, mis oleks riigi elanike arv aastal 2080, kui iibe kordaja ei muutuks:<\/p>\n<p><strong>N\u00e4iteprogramm. Elanike arv I<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">aasta = 2017                             # loendamist ei pea nullist alustama\r\narv = 1315635\r\niibe_kordaja = -1.33                     # Promillides (arvukuse muutus 1000 elaniku kohta)\r\nwhile aasta &lt; 2080:\r\n   arv = arv + arv * iibe_kordaja \/ 1000 # Arvutame selle aasta uue arvu\r\n   aasta = aasta + 1                     # L\u00e4heme j\u00e4rgmise aasta juurde\r\nprint(\"Aastal \" + str(aasta) + \" on elanikke \" + str(round(arv)) + \".\")<\/pre>\n<p>Kui me tahaks teada, mis aastal oleks elanikke 2 000 000, kui iibe kordaja oleks 6 promilli:<\/p>\n<p><strong>N\u00e4iteprogramm. Elanike arv II<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">aasta = 2017\r\narv = 1315635\r\niibe_kordaja = 6\r\nwhile arv &lt; 2000000:\r\n   arv = arv + arv * iibe_kordaja \/ 1000\r\n   aasta = aasta + 1\r\nprint(\"Aastal \" + str(aasta) + \" on elanike arv \" + str(round(arv)) + \".\")<\/pre>\n<p>T\u00e4psema prognoosi saamiseks oleks vaja arvestada paljusid erinevaid asjaolusid. Huvi korral uuri <a href=\"https:\/\/www.stat.ee\/et\/avasta-statistikat\/valdkonnad\/rahvastik\/rahvastikuprognoos\">statistikaameti prognoosi 2080. aasta kohta<\/a>.<\/p>\n<h2>Mitu korda?<\/h2>\n<p>Eelnevates n\u00e4idetes oli ts\u00fckli korduste arv p\u00f5him\u00f5tteliselt algusest peale teada. N\u00fc\u00fcd teeme programmi, kus ts\u00fckli l\u00e4bimiste arv s\u00f5ltub kasutaja sisestatud vastustest. Alustame valikulause materjalides vaadeldud programmist, milles k\u00fcsitakse PIN-koodi. Seal k\u00fcsiti PIN-koodi \u00fcks kord ja l\u00f5plik otsus tehti \u00fche pakkumise j\u00e4rel:<\/p>\n<p><strong>N\u00e4iteprogramm. Pangaautomaat I<br \/>\n<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n   print(\"Sisenesid pangaautomaati!\")\r\nelse:\r\n   print(\"Vale parool! Ligip\u00e4\u00e4s keelatud!\")\r\n<\/pre>\n<p>Tavaliselt lubatakse PIN-koodi m\u00f5ned korrad uuesti proovida, kui \u00f5iget koodi ei sisestatud. Ilmselt on siin kasu ts\u00fcklist. Antud juhul peame ts\u00fckliliselt k\u00e4ituma (koodi uuesti k\u00fcsima) vaid siis, kui sisestatud PIN-kood ei ole \u00f5ige. J\u00e4tkamistingimuseks sobiks seega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin != \"1234\"<\/code>. Programm oleks j\u00e4rgmine:<\/p>\n<p><strong>N\u00e4iteprogramm. Pangaautomaat II<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()\r\nwhile sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")\r\n\r\n<\/pre>\n<p>M\u00f5tle l\u00e4bi, kuidas see programm samm-sammult t\u00f6\u00f6tab. Vajadusel joonista selle plokkskeem. Proovi programmi erinevate PIN-koodidega.<\/p>\n<h3>Muutujate olemasolu ts\u00fcklis<\/h3>\n<p>Programmi vaadates n\u00e4eme, et j\u00e4rgmine l\u00f5ik on kahes kohas (nii ts\u00fckli ees kui sees):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">print(\"Sisesta PIN-kood:\")\r\nsisestatud_pin = input()<\/pre>\n<p>V\u00f5ime proovida ts\u00fckli eest selle l\u00f5igu \u00e4ra j\u00e4tta:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">while sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\n<p>Sellisel juhul ilmub veateade, sest muutujal\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> ei ole v\u00e4\u00e4rtust, kui seda <em>while<\/em>-tingimuses esimest korda kontrollida tahetakse:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-linenumbers=\"false\"><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\">Traceback (most recent call last):\r\n  File \"C:\/Python33\/pin.py\", line 1, in &lt;module&gt;\r\n    while sisestatud_pin != \"1234\":\r\nNameError: name 'sisestatud_pin' is not defined<\/span><\/pre>\n<p>Anname muutujale <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> esialgseks v\u00e4\u00e4rtuseks t\u00fchja s\u00f5ne. Sellega garanteerime, et muutujal <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin<\/code> on alati v\u00e4\u00e4rtus ja ts\u00fckli j\u00e4tkamistingimus on esialgu kindlasti t\u00f5ene, sest t\u00fchi s\u00f5ne ei ole v\u00f5rdne s\u00f5nega &#8220;1234&#8221;. Programmi plokkskeem on kujutatud joonisel 1.<\/p>\n<p><strong>N\u00e4iteprogramm. Pangaautomaat III<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin = \"\"\r\nwhile sisestatud_pin != \"1234\":\r\n   print(\"Sisesta PIN-kood:\")\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\n<figure id=\"attachment_61\" aria-describedby=\"caption-attachment-61\" style=\"width: 188px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-61 size-full\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/Ndal3_pangaautomaat.png\" alt=\"\" width=\"188\" height=\"603\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/Ndal3_pangaautomaat.png 188w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2018\/12\/Ndal3_pangaautomaat-65x208.png 65w\" sizes=\"auto, (max-width: 188px) 100vw, 188px\" \/><figcaption id=\"caption-attachment-61\" class=\"wp-caption-text\">Joonis 1. Programmi &#8220;Pangaautomaat III&#8221; plokkskeem<\/figcaption><\/figure>\n<p>N\u00fc\u00fcd ei p\u00e4\u00e4se ilma parooli sisestamata edasi. Paraku on s\u00fcsteem ebaturvaline, sest katsetada saab suvaline arv kordi. P\u00fc\u00fcame katsete arvu piirata:<\/p>\n<p><strong>N\u00e4iteprogramm. Pangaautomaat IV<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n   print(\"Sisesta PIN-kood:\")\r\n   print(\"J\u00e4\u00e4nud on \" + str(katseid) + \" katset.\")\r\n   katseid -= 1\r\n   sisestatud_pin = input()\r\nprint(\"Sisenesid pangaautomaati!\")<\/pre>\n<p>N\u00fc\u00fcd koosneb j\u00e4tkamistingimus kahest osast &#8211; endiselt kontrollitakse, ega sisestatud PIN-kood \u00f5ige ei ole, aga lisaks kontrollitakse seda, mitu korda veel vastata tohib. Enne ts\u00fcklit on kordade arvuks m\u00e4\u00e4ratud 3 ja p\u00e4rast igat ts\u00fckli keha t\u00e4itmist v\u00e4heneb see arv 1 v\u00f5rra. Esimesel korral saab muutuja\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">katseid<\/code> v\u00e4\u00e4rtuseks 2, teisel korral 1 ja kolmandal korral 0.<\/p>\n<p>J\u00e4tkamistingimuses kasutatakse v\u00f5tmes\u00f5na <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">and<\/code>, mis t\u00e4hendab, et tingimuse kehtimiseks peab nii selles s\u00f5nast paremal kui vasakul pool olevad tingimused t\u00f5esed olema, teisis\u00f5nu peavad m\u00f5lemad osaavaldised olema t\u00f5esed. Meie koodis k\u00fcsitakse PIN-koodi ainult siis, kui \u00f5iget koodi pole sisestatud ja j\u00e4rele j\u00e4\u00e4nud katseid on rohkem kui 0. Nagu eelmise n\u00e4dala materjalides mainiti, v\u00f5ib ka siin tingimus olla \u00fcksk\u00f5ik kui keeruline. Tehetega <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">and<\/code>,\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">or<\/code> ja\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">not<\/code> saab moodustada v\u00e4ga erinevaid avaldisi.<\/p>\n<p>Kokkuv\u00f5ttev video programmi koostamisest: <a href=\"https:\/\/www.youtube.com\/embed\/OJhIV5IcE5o\">link<\/a><\/p>\n<h3>Enesekontroll (1 k\u00fcsimus)<\/h3>\n<p><code><\/p>\n<div id=\"h5p-7\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-7\" class=\"h5p-iframe\" data-content-id=\"7\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Ts\u00fckkel-3-pangaautomaat\"><\/iframe><\/div>\n<\/div>\n<p><\/code><\/p>\n<h3>T\u00e4iendatud pangaautomaat<\/h3>\n<p>Meie programm ei toimi veel nii, nagu me tahaks. Mure on selles, et k\u00fcsimiste arv on k\u00fcll piiratud, aga isegi kui vale kood kolm korda sisestatakse, lubab programm kasutaja pangaautomaati sisse. Muudame programmi nii, et arvestataks, kas l\u00f5puks sisestati \u00f5ige kood v\u00f5i mitte. Kui ei sisestatud, siis \u00e4hvardame kasutajat turvat\u00f6\u00f6tajaga, keda lubame kutsuda 10 sekundi p\u00e4rast. Programmi saab \u00fcheks sekundiks &#8220;uinutada&#8221; k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">sleep(1)<\/code>, kuid selle kasutamiseks tuleb see importida moodulist\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">time<\/code> k\u00e4suga <code class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from time import sleep<\/code>.<\/p>\n<p><strong>N\u00e4iteprogramm. Pangaautomaat V<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from time import sleep\r\nsisestatud_pin = \"\"\r\nkatseid = 3\r\nwhile sisestatud_pin != \"1234\" and katseid &gt; 0:\r\n   print(\"Sisesta PIN-kood:\")\r\n   print(\"J\u00e4\u00e4nud on \" + str(katseid) + \" katset.\")\r\n   katseid -= 1\r\n   sisestatud_pin = input()\r\nif sisestatud_pin == \"1234\":\r\n   print(\"Sisenesid pangaautomaati!\")\r\nelse:\r\n   print(\"Katsete arv \u00fcletatud! Turvat\u00f6\u00f6taja kutsutakse 10 sekundi p\u00e4rast!\")\r\n   i = 10\r\n   while i &gt; 0:\r\n      print(i)\r\n      i -= 1\r\n      sleep(1)\r\n   print(\"Turvat\u00f6\u00f6taja kutsutud!\")\r\n<\/pre>\n<p>Huvi korral katseta, mida teeb programm teisiti, kui<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">if sisestatud_pin == \"1234\":<\/pre>\n<p>asemel oleks<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-linenumbers=\"false\">if katseid &gt; 0:<\/pre>\n<h3>Mitmetasandiline taane<\/h3>\n<p>Eelmises programmis oli viimane ts\u00fckkel valikulause <em>else<\/em>-osa sees. N\u00e4eme, et taane on vastavalt l\u00e4inud veel kaugemale. Selline mitmetasemeline struktuur on programmides t\u00e4iesti tavaline. n\u00e4iteks v\u00f5ib esineda <em>while<\/em>-ts\u00fckkel, mille sees on tingimuslause, mille sees on veel \u00fcks ts\u00fckkel. Kuna mitmetasandiliste programmide k\u00e4itumise ette ennustamine v\u00f5ib muutuda keeruliseks, siis tuleks v\u00f5imaluse korral hoida struktuur v\u00f5imalikult lihtne.<\/p>\n<h3>Arvamism\u00e4ng<\/h3>\n<p>Klassikalises arvamism\u00e4ngus on kasu tingimuslausest ts\u00fckli sees:<\/p>\n<p><strong>N\u00e4iteprogramm. Arvamism\u00e4ng<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from random import randint\r\n\r\narv = randint(1,19) # Juhuslik t\u00e4isarv\r\nprint(\"M\u00f5tlen \u00fchele 20-st v\u00e4iksemale naturaalarvule. Arva \u00e4ra!\")\r\narvamus = int(input())\r\n\r\nwhile arvamus != arv:\r\n   if arv &gt; arvamus:\r\n      print(\"Minu arv on suurem!\")\r\n   else:\r\n      print(\"Minu arv on v\u00e4iksem!\")\r\n\r\n   print(\"Arva veel!\")\r\n   arvamus = int(input())\r\n\r\nprint(\"\u00d5ige! Tubli!\")\r\n<\/pre>\n<p>Proovi m\u00e4ngu modifitseerida. N\u00e4iteks pane programm loendama sooritatud arvamiste arvu ja sellele reageerima. Kui arv arvatakse esimese korraga \u00e4ra, siis v\u00f5ib m\u00e4ngijal soovitada oma selgeltn\u00e4gija-v\u00f5imeid laiemaltki kasutada.<\/p>\n<p>Palun kommenteeri seda materjali <a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSeoHq8MRYdev1d7t3NITGh20eZOEy_NJ4nEYr2uDJxMFbGcHQ\/viewform\" target=\"_blank\" rel=\"noopener noreferrer\">Google&#8217;i k\u00fcsimustikus<\/a>.<\/p>\n<h2>Video<\/h2>\n<p>Vaata ka ts\u00fcklit kokkuv\u00f5tvat videot:<\/p>\n<p><iframe loading=\"lazy\" id=\"oembed-1\" title=\"Informaatika valikkursus g\u00fcmnaasiumile - Ts\u00fckkel\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Lef-_DIpXTs?feature=oembed&#38;rel=0\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"author":12,"menu_order":4,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-60","chapter","type-chapter","status-publish","hentry"],"part":21,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":18,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/60\/revisions"}],"predecessor-version":[{"id":580,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/60\/revisions\/580"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/21"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/60\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=60"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=60"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}