{"id":8236,"date":"2023-02-25T20:35:10","date_gmt":"2023-02-25T18:35:10","guid":{"rendered":"https:\/\/blue.pri.ee\/ttu\/?p=8236"},"modified":"2026-06-03T21:38:31","modified_gmt":"2026-06-03T19:38:31","slug":"pr2et5-qsort-code-div","status":"publish","type":"post","link":"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/","title":{"rendered":"PR2ET5:  Qsort ja t\u00fckeldus"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Praktikumi_materjal\" >Praktikumi materjal<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Praktikumi_ulesanded\" >Praktikumi \u00fclesanded<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Ulesanne_1_W05-1_Quicksort\" >\u00dclesanne 1 [W05-1]: Quicksort<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Nouded\" >N\u00f5uded<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Soovitusi_lahendamiseks\" >Soovitusi lahendamiseks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Testimine\" >Testimine<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Ulesanne_2_W05-2_Valiste_teekide_kasutamine_Tallinna_busside_valjumised\" >\u00dclesanne 2 [W05-2]: V\u00e4liste teekide kasutamine (Tallinna busside v\u00e4ljumised)<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Nouded-2\" >N\u00f5uded:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Soovituslik_toovoog\" >Soovituslik t\u00f6\u00f6voog<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Testimine-2\" >Testimine<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#MS_Windows\" >MS Windows<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Lisaulesanne_1_W05-3_Mitme_struktuuri_liikme_pohjal_sorteerimine\" >Lisa\u00fclesanne 1 [W05-3]: Mitme struktuuri liikme p\u00f5hjal sorteerimine<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Testimine-3\" >Testimine<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Lisaulesanne_2_W05-4_Soidukite_asukohad\" >Lisa\u00fclesanne 2 [W05-4]: S\u00f5idukite asukohad<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Testimine-4\" >Testimine<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Vihjed\" >Vihjed<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Parast_seda_tundi_peaksid\" >P\u00e4rast seda tundi peaksid<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/#Taiendav_materjal\" >T\u00e4iendav materjal<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_materjal\"><\/span>Praktikumi materjal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Slaidid: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/slaidid-et\/05_qsort.pdf\"><strong>Qsort<\/strong><\/a><\/li>\n<li>Slaidid: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/slaidid-et\/05_koodi_tykeldamine.pdf\"><strong>Koodi t\u00fckeldamine<\/strong><\/a><\/li>\n<li>Koodin\u00e4ide: <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/programmeerimine-ii\/koodinaited\/andmetuubist-soltumatu-mullsort\/\">Andmet\u00fc\u00fcbist s\u00f5ltumatu mullsorteerimine<\/a><\/strong><\/li>\n<li>N\u00e4idisprojekt koodi t\u00fckeldamisest:\u00a0<strong><a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/demokood\/division_to_files.zip\">https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/demokood\/division_to_files.zip<\/a><\/strong><\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_ulesanded\"><\/span>Praktikumi \u00fclesanded<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Selles praktikumis on kaks \u00fclesannet.<\/p>\n<ul>\n<li>Esimeses \u00fclesandes \u00f5pid sorteerima arvumassiive ning struktuuridest koosnevaid massiive ja koodi t\u00fckeldama<\/li>\n<li>Teises \u00fclesandes \u00f5pid andmeid internetist alla laadima<\/li>\n<\/ul>\n<p>M\u00f5lemat \u00fclesannet laiendab lisa\u00fclesanne<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_1_W05-1_Quicksort\"><\/span>\u00dclesanne 1 [W05-1]: Quicksort<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande eesm\u00e4rk on harjutada <span class=\"lang:default highlight:0 decode:true crayon-inline \">qsort()<\/span>\u00a0 funktsiooni kasutamist ning koodi t\u00fckeldamist erinevate koodifailide vahel, sealjuures alustad oma esimese kergesti lisatava teegifaili loomist. Aluskoodis on koodi t\u00fckeldus failidesse sinu eest juba tehtud.<\/p>\n<p><strong>Lae alla aluskood:<\/strong> <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/aluskoodid\/5_1_qsort_task_basecode.zip\">https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/aluskoodid\/5_1_qsort_task_basecode.zip<\/a><\/strong><\/p>\n<p><strong>NB! Aluskood sisaldab nii baas\u00fclesannet kui ka lisa\u00fclesannet!<\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded\"><\/span>N\u00f5uded<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Realiseeri vajalikud funktsioonid, mis on ette antud sulle erinevates p\u00e4isefailides protot\u00fc\u00fcpidena. Funktsiooni realisatsioon peab olema p\u00e4isefailiga samanimelises .c koodifailis<\/li>\n<li>Kutsu v\u00e4lja vajalikud funktsioonid andmete sorteerimiseks ja ekraanile kuvamiseks main funktsiooni switch lausest.<\/li>\n<li>Kompileeri programm kokku mitmest koodifailist &#8211; vastavalt struktuurile mis oli antud aluskoodis. Kasuta kompileerimiseks k\u00e4surida (v\u00f5id kasutada ka Makefile&#8217;i kui oskad).<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Soovitusi_lahendamiseks\"><\/span>Soovitusi lahendamiseks<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ol>\n<li>Tutvu arhiivis oleva koodi struktuuriga<\/li>\n<li>Realiseeri alustuseks qsort v\u00f5rdlusfunktsioon t\u00e4isarvude v\u00f5rdlemiseks.<br \/>\n<strong>Vihje:<\/strong> Testimaks \u00fche faili p\u00f5hiselt (nt array_helpers.c) kood sai korralikult kirja, v\u00f5id vajutada &#8220;compile&#8221; nuppu &#8211; selle p\u00f5hjal tehakse objektfail ainult k\u00e4esolevast failist, ignoreerides \u00fclej\u00e4\u00e4nud programmi. Sedasi saad kiirelt vigu lokaliseerida \u00fche faili sees.<\/li>\n<li>Lisa qsort v\u00e4ljakutse men\u00fc\u00fcsse, ehita kogu projekt ning proovi kas t\u00f6\u00f6tab<\/li>\n<li>Korda sama murdarvuliste massiivi sorteerimiseks (men\u00fc\u00fc valik 2). Arvesta, et pead leidma ka murdarvudest koosneva massiivi pikkuse ning lisama v\u00e4ljastamise v\u00e4ljakutse<\/li>\n<li>N\u00fc\u00fcd liigu struktuuride juurde. Alusta struktuuri v\u00e4ljastamise funktsioonist. Kirjuta see valmis ning lisa v\u00e4ljakutse men\u00fc\u00fcsse, testi<\/li>\n<li>Struktuuride v\u00f5rdlusfunktsioone kirjutades arvesta j\u00e4rgmist\n<ul>\n<li>V\u00f5rdlusfunktsiooni edastatakse <span class=\"lang:c highlight:0 decode:true crayon-inline \">void<\/span>\u00a0 t\u00fc\u00fcpi viidad on struktuurile endale (st struktuuri esimese baidi m\u00e4luaadress), mitte v\u00e4ljale, mille alusel sina soovid sorteerida<br \/>\n<strong>T\u00dc\u00dcPVIGA:\u00a0<\/strong>Teisendus peab toimuma struktuuri t\u00fc\u00fcpi viidaks, mitte int v\u00f5i float vms t\u00fc\u00fcpi viidaks<br \/>\nMiks? sorteerimisel sorteeritakse terveid struktuure korraga. qsort ise ei tea mis v\u00e4lja alusel sorteerimist tuleks teha ega oska seda v\u00e4lja valida sinu eest. Samuti j\u00e4rjestamise v\u00e4ltel tuleb \u00fcmber paigutada k\u00f5igi struktuuri liikmete andmed, mitte ainult \u00fcks alamv\u00e4li.<\/li>\n<li>Ole ettevaatlik sulgude paigutusega &#8211; tehete j\u00e4rjekord on \u00fclioluline! Esmalt tuleb v\u00f5rdlusfunktsiooni parameeter teisendada sobilikuks struktuuri t\u00fc\u00fcpi viidaks. Alles seej\u00e4rel v\u00f5ib struktuuri sees oleva v\u00e4lja poole p\u00f6\u00f6rduda.<\/li>\n<li>Mall teisendamiseks: <span class=\"lang:c decode:true crayon-inline\">((struct MyStruct *)x)-&gt;member<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h5><span class=\"ez-toc-section\" id=\"Testimine\"><\/span>Testimine<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-chevron su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Ava mind v\u00e4ljundi n\u00e4gemiseks<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<pre class=\"theme:cisco-router toolbar:2 nums:false lang:default decode:true \">risto@risto-wk-tux:~\/pr2\/lab\/wk5_div\/t1_qsort\/$ .\/qsort\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 1\r\nInteger array: \r\n-54 0 3 9 15 17 19 22 25 \r\n\r\n\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 2\r\nDecimal array: \r\n11.20 76.40 76.50 76.60 235.40 341.60 \r\n\r\n\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 3\r\nEmployees sorted by employment length: \r\n      Sirje       Vakra     15.40        0\r\n     Anneli         Oja      7.30        0\r\n      Doris      Rebane     10.20        3\r\n       Mark      Rebane     10.30        5\r\n     Andres      Rebane     22.50       10\r\n\r\n\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 4\r\nEmployees sorted by employee first name: \r\n     Andres      Rebane     22.50       10\r\n     Anneli         Oja      7.30        0\r\n      Doris      Rebane     10.20        3\r\n       Mark      Rebane     10.30        5\r\n      Sirje       Vakra     15.40        0\r\n\r\n\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 0\r\nristo@risto-wk-tux:~\/pr2\/lab\/wk5_div\/t1_qsort\/$<\/pre>\n<\/div><\/div>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_2_W05-2_Valiste_teekide_kasutamine_Tallinna_busside_valjumised\"><\/span>\u00dclesanne 2 [W05-2]: V\u00e4liste teekide kasutamine (Tallinna busside v\u00e4ljumised)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selles \u00fclesande eesm\u00e4rk on n\u00e4idata, et programmid saavad suhelda ka internetiga. Selleks tuleb k\u00f5igepealt programm liidestada v\u00e4lise teegiga libcurl, mis on laialdaselt kasutusel v\u00f5imaldades suhelda APIdega, laadida faile alla jne. \u00dclesande lahendamiseks kasutame Tallinna Transpordiameti poolt pakutavaid avaandmeid. Lisaks peate looma ja kompileerima projekti, mis koosneb mitmest koodi- ja p\u00e4isefailist.<\/p>\n<p><video style=\"width: 100%; height: auto; max-width: 100%;\" controls=\"controls\" width=\"300\" height=\"150\"><source src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/recording_raja.webm\" type=\"video\/webm\" \/>Your browser does not support the video tag.<\/video><\/p>\n<p>Selle lihtsustamiseks on tehtud esialgne koodijaotus ning internetist failide allalaadimiseks ja kettale salvestamiseks vajalik kood on juba loodud. Suurem osa sellest on libcurl teegi arendajate avalik n\u00e4idiskood. Kood on pakitud t\u00e4iendava turvakihiga, et v\u00e4ltida avalike andmete kuritarvitamist, piirates seejuures v\u00e4rskenduste allalaadimise sagedust. <strong>\u00c4ra eemalda leech-kaitsekoodi. Andmete liiga sage k\u00fcsimine toob t\u00f5en\u00e4oliselt kaasa teenusest blokeerimise.<\/strong><\/p>\n<p>Kirjutatud kood ja tehtud lihtsustused on loodud Linuxi jaoks. Kui soovid seda koodi Windowsis k\u00e4ivitada, tuleb faili k\u00e4sitlemise ja tuvastamise osad koodis \u00fcmber kirjutada.<\/p>\n<p><strong>Lae alla aluskood: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/aluskoodid\/5_2_timetable_starter.zip\">https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/aluskoodid\/5_2_timetable_starter.zip<\/a><\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Nouded-2\"><\/span>N\u00f5uded:<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Kasuta etteantud aluskoodi ja j\u00e4rgi faili struktuuri<\/li>\n<li>Lae alla Raja peatuse andmed<\/li>\n<li>V\u00e4ljasta praegune kellaaeg (kasuta peatuse andmetes olevat kellaaega)<\/li>\n<li>V\u00e4ljasta busside v\u00e4ljumisajad bussipeatusest\n<ul>\n<li>Minimaalselt tuleb kuvata liininumber, v\u00e4ljumise aeg, sihtkoht (l\u00f5pp-peatus) ja aeg bussi saabumiseni (GPS-andmete p\u00f5hjal)<\/li>\n<li>Lisa hilinemise hoiatus, kui buss hilineb \u00fcle \u00fche minuti<\/li>\n<li>\u00c4ra n\u00e4ita busse, mis on juba v\u00e4ljunud<\/li>\n<li>V\u00e4ljumisaeg peab olema formaadis h:mm:ss<\/li>\n<li>Uuenda j\u00e4relej\u00e4\u00e4nud aega korra sekundis<\/li>\n<\/ul>\n<\/li>\n<li>Minimaalselt peab kood olema jaotatud kolmeks koodi- ja p\u00e4isefailiks\n<ul>\n<li><span class=\"lang:default highlight:0 decode:true crayon-inline \">file_helper.c<\/span>\u00a0 ja <span class=\"lang:default highlight:0 decode:true crayon-inline\">file_helper.h<\/span> sisaldavad andmete allalaadimise ja ettevalmistamise koodi (antud algkoodis olemas, muuta ei ole vaja)<\/li>\n<li><span class=\"lang:default highlight:0 decode:true crayon-inline\">data_processor.c<\/span>\u00a0 ja <span class=\"lang:default highlight:0 decode:true crayon-inline\">data_processor.h<\/span> sisaldavad andmete lugemise ja t\u00f6\u00f6tlemise koodi.<\/li>\n<li><span class=\"lang:default highlight:0 decode:true crayon-inline \">main.c<\/span>\u00a0 ja <span class=\"lang:default highlight:0 decode:true crayon-inline\">main.h<\/span> sisaldavad programmi t\u00f6\u00f6voo juhtimist ja \u00fcldisi makrosid.<\/li>\n<li>Soovi korral v\u00f5id faili lugemise ja andmete t\u00f6\u00f6tlemise eraldada t\u00e4iendavatesse failidesse.<\/li>\n<\/ul>\n<\/li>\n<li>Kompileeri k\u00f5ik koodifailid kokku kas k\u00e4surealt v\u00f5i kasutades Makefile&#8217;i<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Soovituslik_toovoog\"><\/span>Soovituslik t\u00f6\u00f6voog<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p><strong>Samm 0: Ettevalmistus<\/strong><\/p>\n<p><strong>See on vajalik ainult siis, kui kasutad enda arvutit! Kooliarvutit kasutades pole ettevalmistus vajalik!<\/strong><\/p>\n<p>Installi\u00a0 <span class=\"lang:c highlight:0 decode:true crayon-inline\">libcurl<\/span>\u00a0 teek. Debianil p\u00f5hinevates s\u00fcsteemides, sealhulgas Ubuntu ja Linux Mint, tuleb k\u00e4ivitada j\u00e4rgmine k\u00e4sk:<\/p>\n<pre class=\"toolbar:2 lang:c highlight:0 decode:true\">sudo apt install libcurl4-openssl-dev<\/pre>\n<p>Teiste distributsioonide puhul, mis ei kasuta apt-i, kasuta oma distributsioonile vastavat paketihaldurit.<\/p>\n<p>See paigaldab vajaliku teegi, millega C-programm suhtleb failide internetist allalaadimiseks.<\/p>\n<p><strong>Samm 1: Leia Raja peatuse ID<\/strong><\/p>\n<p>Peatuse ID on t\u00e4isarv, mis j\u00e4\u00e4b tavaliselt vahemikku 100 kuni 10 000. Enamik Tallinna peatuste ID-d j\u00e4\u00e4vad vahemikku 100 kuni 2000.<\/p>\n<p>T\u00e4helepanu: Mitmel peatusel on sama nimi &#8211; nt Keemia peatusel on kaks erinevat peatuse ID-d, millest \u00fcks on suunaga kesklinna ja teine on suunaga bussiparki. Samamoodi on Raja peatusel \u00fcks peatus IT-maja ees ja teine IT-maja k\u00f5rval. M\u00f5lemal on erinev ID v\u00e4\u00e4rtus.<\/p>\n<p>Eeldatud on, et leiad \u00f5ige peatuse ID k\u00e4sitsi. Programmi abil stopid v\u00e4\u00e4rtuse leidmine j\u00e4\u00e4b \u00fclesande skoobist v\u00e4lja.<\/p>\n<p>Vajaliku peatuse leidmiseks on kaks v\u00f5imalust. N\u00e4idetes on toodud, kuidas leida V\u00e4ike-\u00d5ism\u00e4e peatuse ID, milleks on 844.<\/p>\n<ol style=\"list-style-type: lower-alpha;\">\n<li>Kasuta peatuste andmeid avaandmete portaalist: <a href=\"https:\/\/andmed.eesti.ee\/datasets\/tallinna-uhistranspordi-peatused-ja-marsruudid\">https:\/\/andmed.eesti.ee\/datasets\/tallinna-uhistranspordi-peatused-ja-marsruudid<\/a><br \/>\nOtselink faili, mis sisaldab nimesid ja ID-sid: <a href=\"https:\/\/transport.tallinn.ee\/data\/stops.xml\">https:\/\/transport.tallinn.ee\/data\/stops.xml<\/a><br \/>\n\u00d5ige peatuse ID leidmiseks tuleks vaadata liininumbreid ja nende s\u00f5idusuundi. <a href=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124547.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11240\" src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124547.png\" alt=\"\" width=\"906\" height=\"365\" srcset=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124547.png 906w, https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124547-300x121.png 300w, https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124547-768x309.png 768w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/a><\/li>\n<li>Mine <strong><a href=\"http:\/\/transport.tallinn.ee\">transport.tallinn.ee<\/a><\/strong> lehele ja ava oma brauseris arendaja t\u00f6\u00f6riistad (kiirklahv F12). Seej\u00e4rel ava vahekaart Network.\u00a0 N\u00fc\u00fcd on sul kaks v\u00f5imalust: kliki kaardil bussipeatusel ja vali v\u00e4ljumisaegade kuvamine; v\u00f5i vali s\u00f5iduplaanist buss ning kl\u00f5psa bussipeatuse nimele. L\u00f5puks otsi p\u00e4ringut nimega &#8220;siri-stop-departures&#8221; \u2013 see sisaldab parameetrit stopid=, kust leiad peatuse ID. <a href=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124347.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11239\" src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124347.png\" alt=\"\" width=\"824\" height=\"498\" srcset=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124347.png 824w, https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124347-300x181.png 300w, https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/Screenshot_20260227_124347-768x464.png 768w\" sizes=\"auto, (max-width: 824px) 100vw, 824px\" \/><\/a><\/li>\n<\/ol>\n<p><strong>Samm 2: Andmefaili allalaadimine<\/strong><\/p>\n<p>Failide allalaadimise kood on juba valmis. Kasutame libcurl teegi dokumentatsioonist p\u00e4rit n\u00e4idiskoodi, millele on lisatud kaitsemehhanismid, et programm ei koormaks serverit \u00fcle, kui peaksid kogemata k\u00e4ivitama allalaadimisfunktsiooni liiga tihti.<\/p>\n<p>Faili allalaadimiseks kutsu v\u00e4lja funktsioon <span class=\"lang:c highlight:0 decode:true crayon-inline\">DownloadFileToDisk()<\/span> .\u00a0 Funktsioon on kirjeldatud failis <span class=\"lang:c highlight:0 decode:true crayon-inline\">file_helper.h<\/span>\u00a0 ja implementeeritud failis <span class=\"lang:c highlight:0 decode:true crayon-inline\">file_helper.c<\/span> . Kasutusjuhised leiad p\u00e4isefailist. Esimese parameetrina tuleb sul koostada URL, mis sisaldab <span class=\"lang:c highlight:0 decode:true crayon-inline\">stopid<\/span>\u00a0 v\u00e4\u00e4rtust. URL peab olema defineeritud failis <span class=\"lang:c highlight:0 decode:true crayon-inline\">main.h<\/span> . M\u00e4rka, et vastavalt parameetrite v\u00e4\u00e4rtustele v\u00f5imaldab funktsioon alla laadida nii originaal CSV faili, kui ka soovi korral selle teisendada t\u00fchikutega eraldatud failiks.<\/p>\n<p>Seej\u00e4rel kompileeri programm koos k\u00f5igi kolme l\u00e4htefailiga ja k\u00e4ivita see. Kasuta\u00a0lippu\u00a0<span class=\"lang:c highlight:0 decode:true crayon-inline \">-lcurl<\/span>\u00a0 et linkida libcurl teek (nt <span class=\"lang:c highlight:0 decode:true crayon-inline\">gcc -o transport_app file1.c file2.c file3.c -g -Wall -Wextra -Wconversion -lcurl<\/span> ). Seej\u00e4rel laetakse fail alla. Kontrolli k\u00e4sitsi, et fail on kettale salvestatud (samas kataloogis, kus programm asub).<\/p>\n<p><strong>Samm 3: Andmete lugemine ja salvestamine<\/strong><\/p>\n<p>Failist saadud andmed tuleb lugeda struktuurimassiivi. Alusta sobiva struktuuri defineerimisest. K\u00f5iki andmefailis olevaid v\u00e4lju ei ole vaja salvestada \u2013 osa neist on \u00fclesande jaoks liiased.<\/p>\n<p>Kirjuta struktuuride deklaratsioonid faili <span class=\"lang:c highlight:0 decode:true crayon-inline\">data_processor.h<\/span> . Selles failis peavad olema ka k\u00f5ikide failis <span class=\"lang:c highlight:0 decode:true crayon-inline\">data_processor.c<\/span> realiseeritud funktsioonide protot\u00fc\u00fcbid. Nende hulka kuulub ka andmefaili lugemise funktsioon. Vajadusel v\u00f5id lisada abifunktsioone andmete eelt\u00f6\u00f6tlemiseks.<\/p>\n<p>Andmefaili lugemine on tavap\u00e4rasest veidi keerulisem, sest fail sisaldab kahte p\u00e4iserida, millele j\u00e4rgnevad s\u00f5idukite v\u00e4ljumised. Soovituslik on andmete lugemise ajal need ka ekraanile kuvada, et veenduda andmete lugemise korrektsuses.<\/p>\n<p><strong>Vihje 1: <\/strong>Faili kaks esimest rida sisaldavad p\u00e4ist, millega tuleb enne lugemists\u00fckli algust tegeleda. Esimene rida sisaldab ajatemplit, mida saab kasutada leidmaks kui palju aega on v\u00e4ljumiseni j\u00e4\u00e4nud. Kasuta seda arvutustes hetkeajana. See ei ole t\u00e4iesti t\u00e4pne, kuid piisavalt l\u00e4hedane. Aja lugemiseks t\u00fchikutega eraldatud failist v\u00f5id kasutada j\u00e4rgmist lugemislauset:<\/p>\n<pre class=\"lang:c decode:true\">int ret = fscanf(fp, \"%*s %*s %*s %*s %d %*[^\\n]\\n\", currentTime);<\/pre>\n<p>Kontrolli kindlasti tagastustatavat v\u00e4\u00e4rtust, et veenduda, kas andmed loeti korrektselt.<\/p>\n<p><strong>Vihje 2: <\/strong>Faili teine rida ei ole \u00fclesande jaoks oluline (see kinnitab stopid v\u00e4\u00e4rtust). V\u00f5id selle vahele j\u00e4tta, kasutades varasemalt \u00f5pitud v\u00f5tteid, nt: <span class=\"lang:c decode:true crayon-inline\">fscanf(fp, &#8220;%*[^\\n]\\n&#8221;);<\/span><\/p>\n<p data-start=\"190\" data-end=\"298\">Seej\u00e4rel j\u00e4tka lugemists\u00fckliga, mis peaks olema sulle tuttav selle semestri varasematest praktikumi\u00fclesannetest. Soovitatav on mittevajalikud v\u00e4ljad lugemisel vahele j\u00e4tta, kasutades formaati\u00a0 <span class=\"lang:c highlight:0 decode:true crayon-inline\">%*s<\/span>\u00a0 (nagu n\u00e4idatud currentTime\u00a0lugemise n\u00e4ites).<\/p>\n<p><strong>Samm 4: S\u00f5iduplaani v\u00e4ljastamine<\/strong><\/p>\n<p>Alustuseks v\u00e4ljasta s\u00f5iduplaan \u00fche korra. Peale kuvamist peaks programm tavap\u00e4raselt sulguma. Loo funktsioon, millele antakse parameetritena praegune aeg ja struktuur, mis sisaldab v\u00e4ljuvate s\u00f5idukite s\u00f5iduplaani andmeid. See peaks olema midagi sellist<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">void PrintTimetable(struct BusStopData *data, int n, int currentTime)<\/pre>\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-(--header-height)\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"ce6f1b6a-28f1-4fc8-8498-1f45c04f3902\" data-testid=\"conversation-turn-27\" data-scroll-anchor=\"false\" data-turn=\"user\"><\/article>\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"dd5ded08-fa88-4126-a951-ad2b79b6117e\" data-testid=\"conversation-turn-28\" data-scroll-anchor=\"false\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"dd5ded08-fa88-4126-a951-ad2b79b6117e\" data-message-model-slug=\"gpt-5-2-instant\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"89\">Kuva k\u00f5ik liininumbrid, sihtkohad, eeldatavad v\u00e4ljumisajad ja ajad eeldatava v\u00e4ljumiseni. Veendu, et v\u00e4ljastus oleks korrektselt vormistatud ja loetav.<\/p>\n<p><strong>Vihje 1:\u00a0<\/strong>Failis on kaks erinevat aega &#8211; ExpectedTimeInSeconds ja ScheduleTimeInSeconds. Kasuta v\u00e4ljumisaja ja v\u00e4ljumiseni j\u00e4\u00e4nud aja kuvamiseks s\u00f5iduki GPS-positsiooni p\u00f5hjal antud hinnangulist aega.<\/p>\n<p><strong>Vihje 2: <\/strong>Kuna aega on vaja kuvatada tundides, minutites ja sekundites, kuid see on antud sekundites alates s\u00fcda\u00f6\u00f6st, v\u00f5id oma koodi lihtsustamiseks kasutada j\u00e4rgmist abifunktsiooni. V\u00f5id seda kasutada ka andmete eelt\u00f6\u00f6tlemisel faili lugemise ajal (kuid veendu, et j\u00e4tad aja sekundite kujul alles).<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">struct Time SplitTimeFromSecToStruct(int timeInSec)\r\n{\r\n    return (struct Time){.hour = timeInSec \/ SEC_IN_MIN \/ MINS_IN_HOUR,\r\n                         .min  = timeInSec \/ SEC_IN_MIN % MINS_IN_HOUR,\r\n                         .sec  = timeInSec % SEC_IN_MIN};\r\n}<\/pre>\n<p>Selle kasutamiseks on vaja lisada j\u00e4rgnev koodil\u00f5ik p\u00e4isefaili<\/p>\n<pre class=\"toolbar:2 lang:c decode:true \">#define MINS_IN_HOUR 60\r\n#define SEC_IN_MIN   60\r\n\r\nstruct Time\r\n{\r\n    int hour;\r\n    int min;\r\n    int sec;\r\n};\r\n<\/pre>\n<p data-start=\"0\" data-end=\"37\"><strong data-start=\"0\" data-end=\"35\">T\u00e4helepanu: <\/strong>UTF-8 sihtkohanimed<\/p>\n<p data-start=\"39\" data-end=\"170\">Ilmselt m\u00e4rkad, et m\u00f5ned sihtkohanimed sisaldavad m\u00e4rke, mida ASCII-tabelis ei ole \u2013 nt V\u00e4ike-\u00d5ism\u00e4e, Mustam\u00e4e, M\u00e4nniku. Kui soovid vormindada v\u00e4ljundit vormingum\u00e4\u00e4rajatega nagu\u00a0<span class=\"lang:c highlight:0 decode:true crayon-inline\">%20s<\/span> , siis arvesta, et number 20 t\u00e4histab baitide arvu, mitte kuvatavate t\u00e4hem\u00e4rkide arvu. Seet\u00f5ttu ei pruugi v\u00e4ljund joonduda korrektselt.<\/p>\n<p data-start=\"358\" data-end=\"407\" data-is-last-node=\"\" data-is-only-node=\"\"><strong data-start=\"358\" data-end=\"407\" data-is-last-node=\"\">NB! Selle probleemi lahendamine ei kuulu selle \u00fclesande skoobi hulka!<\/strong><\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Aga kui oled huvitatud...<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p data-start=\"0\" data-end=\"394\">C23 sisaldab uusi v\u00f5imalusi UTF-8 vormingus teksti t\u00f6\u00f6tamiseks. Ka vanemad C-keele versioonid toetavad UTF-8 kodeeringut, kuid nende tugi on m\u00f5nev\u00f5rra kohmakam. Tavaliselt k\u00e4sitletakse seda mitmebaidiste m\u00e4rkide (<em>multibyte characters<\/em>) abil. See on korrektne ja robustne lahendus ning t\u00f5en\u00e4oliselt esimene vastus, mille keelemudelid lahendust k\u00fcsides pakuvad. Kuid meie eesm\u00e4rgi jaoks oleks see tarbetult keeruline.<\/p>\n<p data-start=\"396\" data-end=\"732\">On olemas ka lihtsam \/ h\u00e4kk-lahendus ilma mitmebaidiste m\u00e4rkide keerukuseta. Me teame, et andmetes ei esine kolme ega nelja-baidiseid m\u00e4rke. Vaadates UTF-8 standardit n\u00e4eme, et 2-baidise t\u00e4hem\u00e4rgi esimese baidi kolm esimest bitti on fikseeritud (vt 2-baidise m\u00e4rgi esimene bait: <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/UTF-8#Description\">https:\/\/en.wikipedia.org\/wiki\/UTF-8#Description<\/a> <\/strong>). Kasutades bitimaske saame kontrollida kolme esimese biti sisu.\u00a0 J\u00e4rgnevat koodil\u00f5iku saab professionaalsemalt kirjutada kasutades viitasid t\u00e4hem\u00e4rgile ja 16-s\u00fcsteemis kodeeritud konstanti, kuid j\u00e4tan j\u00e4rgneva lahenduse lihtsamini (otsemini) loetavaks.<\/p>\n<pre class=\"toolbar:2 lang:c decode:true \">\/\/ Count 2-byte UTF-8 characters in printable string for extra padding\r\nint wideChars = 0;\r\nfor (int i = 0; destination[i] != '\\0'; i++)\r\n{\r\n    if ((destination[i] &amp; 0b11100000) == 0b11000000)\r\n        wideChars++;\r\n}<\/pre>\n<p>N\u00fc\u00fcd v\u00f5ime <span class=\"lang:c highlight:0 decode:true crayon-inline\">printf(&#8220;%20s&#8221;, &#8230;)<\/span>\u00a0 asemel kasutada <span class=\"lang:c highlight:0 decode:true crayon-inline\">printf(&#8220;%*s&#8221;, 20 + wideChars, &#8230;)<\/span> . See arvestab lisabaitidega, mida on vaja m\u00e4rkide korrektseks kuvamiseks.<\/p>\n<\/div><\/div>\n<p><strong>Samm 5: S\u00f5iduplaani uuendamine<\/strong><\/p>\n<p>S\u00f5iduplaani tuleb v\u00e4rskendada \u00fche korra sekundis. Viivituse tekitamiseks kasuta funktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline\">sleep()<\/span> teegist <span class=\"lang:c highlight:0 decode:true crayon-inline\">unistd.h<\/span> .<\/p>\n<p data-start=\"151\" data-end=\"375\">Teiseks tuleb enne iga uut v\u00e4ljatr\u00fckki ekraan puhastada. Selleks kasutatakse ANSI escape jada (<em>escape sequence<\/em>). See on eelistatum lahendus v\u00f5rreldes <span class=\"lang:c highlight:0 decode:true crayon-inline\">system()<\/span>\u00a0 funktsiooni v\u00e4ljakutsetega, mida internetist sageli soovitatakse. Jada sisaldab k\u00e4ske ekraani puhastamiseks (<span class=\"lang:c highlight:0 decode:true crayon-inline\">[2J<\/span> )\u00a0ja kursori liigutamiseks vasakusse \u00fclanurka (<span class=\"lang:c highlight:0 decode:true crayon-inline\">[1;1H<\/span>\u00a0).<\/p>\n<pre class=\"toolbar:2 lang:c decode:true\">    while (1)\r\n    {\r\n        \/\/ ANSI escape sequences to clear the terminal\r\n        printf(\"\\033[2J\\033[1;1H\");\r\n        \r\n        \/\/ TODO: Header before the timetable\r\n        printf();\r\n\r\n        \/\/ TODO: Print the timetable\r\n        PrintTimeTable();\r\n\r\n        \/\/ TODO: Update current time by 1 second\r\n\r\n\r\n        \/\/ Next update in 1 second\r\n        sleep(1);\r\n    }<\/pre>\n<p><strong>Vihje:\u00a0<\/strong>Allalaetud failist saadud hetkeaeg on antud sekundites alates kesk\u00f6\u00f6st. Kui suurendad seda muutujat iga ts\u00fckli l\u00e4bimisega \u00fche v\u00f5rra, saad selle anda funktsioonile <span class=\"lang:c highlight:0 decode:true crayon-inline\">PrintTimeTable()<\/span> kaasa.\u00a0Sel juhul piisab j\u00e4relej\u00e4\u00e4nud aja kuvamiseks sellest, kui lahutad eeldatavast v\u00e4ljumisajast praeguse aja.<\/p>\n<p><strong>NB! Tegemist on l\u00f5pmatu ts\u00fckliga, millel puudub l\u00f5putingimus! <\/strong>Korrektne programmi l\u00f5petamine ei kuulu selle \u00fclesande skoopi. Programmi peatamiseks kasuta <strong data-start=\"173\" data-end=\"185\">Ctrl + C<\/strong>.<\/p>\n<div class=\"su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-spoiler-title\" tabindex=\"0\" role=\"button\"><span class=\"su-spoiler-icon\"><\/span>Aga kui oled huvitatud...<\/div><div class=\"su-spoiler-content su-u-clearfix su-u-trim\">\n<p>Selle k\u00e4sitlemiseks on kaks (kolm) levinud viisi<\/p>\n<ul>\n<li>Kasuta l\u00f5imesid (<em>thread<\/em>), mis kuulab klaviatuurisisendeid ja v\u00f5imaldab sellel l\u00f5imel seada muutuja, mis tagab ts\u00fcklist v\u00e4ljumise. See on m\u00f5nev\u00f5rra keeruline lahendus.<\/li>\n<li>Kasuta katkestussignaalide k\u00e4sitlejaid (<em>signal handlers, intterupt handler<\/em>). Selleks on vaja luua globaalne volatile t\u00fc\u00fcpi muutuja, mida juhib sinu loodud signaalik\u00e4itleja (funktsioon). Muutuja kontrollimisel ts\u00fckli v\u00e4ltel saad ts\u00fckli katkestada. Signaalik\u00e4itleja tuleb rakenduses registreerida. Tegu on lihtsaima v\u00f5imaliku loogikaga. Programmi sulgemine toimuks endiselt klahvikombinatsiooniga ctrl + c, kuid v\u00e4ljumine oleks korrektne. See on soovitatav viis, kui tahad proovida.<\/li>\n<li>Viimaks on v\u00f5imalik ka terminali t\u00f6\u00f6re\u017eiimi \u00fcmber seadistada interaktiivseks kasutuseks, kuid see on m\u00e4rksa keerulisem ja valesti k\u00e4sitlemisel veelgi veaohtlikum.<\/li>\n<\/ul>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-69a54ecb-7478-8394-a1fe-edbea9acfb4d-4\" data-testid=\"conversation-turn-48\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">Interaktiivsed programmid kasutavad sageli teeke, mis toetuvad nendele funktsioonidele, n\u00e4iteks ncurses.<\/div>\n<\/article>\n<\/div>\n<\/div><\/div>\n<h5><span class=\"ez-toc-section\" id=\"Testimine-2\"><\/span>Testimine<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Testimiseks kasuta esmalt Raja peatust. Seda on ka lihtne kontrollida, sest saad aknast v\u00e4lja vaadata ja veenduda, kas buss saabus siis, kui sinu programm seda v\u00e4idab.<\/p>\n<p><video style=\"width: 100%; height: auto; max-width: 100%;\" controls=\"controls\" width=\"300\" height=\"150\"><source src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/recording_raja.webm\" type=\"video\/webm\" \/>Your browser does not support the video tag.<\/video><\/p>\n<p data-start=\"0\" data-end=\"146\">Piirjuhtude testimine on siin keeruline, sest kasutad reaalaja liiklusandmeid ning k\u00f5iki olukordi ei pruugi alati ette tulla.<\/p>\n<p data-start=\"148\" data-end=\"283\">Kasuta populaarsemat bussipeatust, et testida erijuhte. N\u00e4iteks kasutasin peatust Taksopark (ID 1135). Seal on v\u00f5imalik n\u00e4ha<\/p>\n<ol>\n<li data-start=\"148\" data-end=\"283\">Hilinemisi<\/li>\n<li data-start=\"148\" data-end=\"283\">Olukordi, kus j\u00e4relej\u00e4\u00e4nud aeg on ainult sekundites<\/li>\n<li data-start=\"148\" data-end=\"283\">V\u00e4ljunud bussi eemaldamist nimekirjast<\/li>\n<li>Sihtkohti, mis sisaldavad mitte-ASCII m\u00e4rke \u2013 nt M\u00e4nniku, Tallinn-V\u00e4ike<\/li>\n<\/ol>\n<p><video style=\"width: 100%; height: auto; max-width: 100%;\" controls=\"controls\" width=\"300\" height=\"150\"><source src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/recording_taksopark.webm\" type=\"video\/webm\" \/>Your browser does not support the video tag.<\/video><\/p>\n<p>Pane t\u00e4hele, et k\u00f5ike ei ole testitud<\/p>\n<ol>\n<li>Peatused, kus on ka trammi- v\u00f5i trolliliinid (trollid on saadaval loomulikult alles 2027 versioonis)<\/li>\n<li>Kuidas k\u00e4sitletakse j\u00e4relej\u00e4\u00e4nud aega busside puhul, mis saabuvad p\u00e4rast s\u00fcda\u00f6\u00f6d, kui praegune aeg on veel enne s\u00fcda\u00f6\u00f6d.<\/li>\n<li>Kui \u00fchtegi bussi ei ole tulemas<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<h5><span class=\"ez-toc-section\" id=\"MS_Windows\"><\/span>MS Windows<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Antud \u00fclesannet on v\u00f5imalik lahendada ka Windowsil, kuid selleks tuleb teha m\u00f5ned t\u00e4iendavad liigutused. Sammud on testitud ja t\u00f6\u00f6tasid kevadel 2022 kasutades chocolatey kaudu installeeritud 64 bitist MinGW-d (see oli osa lihtsast tarkvara paigaldamise juhendist Windowsil kasutades k\u00e4surida). V\u00e4ljav\u00f5te eelmise aasta vestlusest, kus sammud kirja said (inglise keeles)<\/p>\n<div class=\"su-quote su-quote-style-default\"><div class=\"su-quote-inner su-u-clearfix su-u-trim\">\n<p>1. Install libcurl on Windows. Uses chocolatey package manager<\/p>\n<p><span class=\"codespan__pre-wrap\"><code>choco install curl<\/code><\/span><\/p>\n<p>2. Make the library (dll file) available to the compiled program. Copy libcurl-x64.dll from libcurl installation directory to your program directory (assumes 64-bit compiler).<\/p>\n<p>3. You need to download CA certificate so cURL can verify the certificate on the opendata website <a class=\"theme markdown__link\" href=\"https:\/\/curl.se\/ca\/cacert.pem\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/curl.se\/ca\/cacert.pem<\/a>.<\/p>\n<p>4. You need to specify the certificate authority file location to the code. Add this to the setup of the download in the file_helper.c, replacing the path\\\\to\\\\file with the path to the downloaded .pem file.<\/p>\n<p><span class=\"codespan__pre-wrap\"><code>curl_easy_setopt(curl_handle, CURLOPT_CAINFO, \"path\\\\to\\\\file\");<\/code><\/span><\/p>\n<p>5. You need to rewrite the check if a file is already downloaded because that uses POSIX library available on UNIX systems &#8211; unistd.h. You should rewrite it with windows solution of that. Haven&#8217;t tested, but you&#8217;ll likely find the function <span class=\"codespan__pre-wrap\"><code>BOOL FileExists(LPCTSTR szPath)<\/code><\/span>\u00a0in the library\u00a0<span class=\"codespan__pre-wrap\"><code>io.h<\/code><\/span>. You may need to add additional Windows-specific libraries.<\/p>\n<p>6. You can only download as CSV with the code provided. To download space delimited, you need to rewrite the ReplaceChars function. Easy option would be to open up a second file pointer for writing to a different file and remove the fseek, Simplest would be to do getchar -&gt; putchar with a check in between for commas to be replaced with spaces.<\/p>\n<p>7. You need to add -I and -L flags to your compiler command line arguments. Mine were:<\/p>\n<p><span class=\"codespan__pre-wrap\"><code>-I C:\\ProgramData\\chocolatey\\lib\\curl\\tools\\curl-7.81.0-win64-mingw\\include\\ -L C:\\ProgramData\\chocolatey\\lib\\curl\\tools\\curl-7.81.0-win64-mingw\\lib\\<\/code><\/span><\/p>\n<\/div><\/div>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_1_W05-3_Mitme_struktuuri_liikme_pohjal_sorteerimine\"><\/span>Lisa\u00fclesanne 1 [W05-3]: Mitme struktuuri liikme p\u00f5hjal sorteerimine<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Lisa\u00fclesande lahendamiseks peab olema realiseeritud men\u00fc\u00fc valik 5 jaoks vajaminev funktsionaalsus. Selleks pead:<\/p>\n<ul>\n<li>Realiseerima qsort v\u00f5rdlusfunktsioonid struktuurimassiivi sorteerimiseks perenime j\u00e4rgi. Kui perenimed on samad, tuleb teha t\u00e4iendav otsus sorteerimiseks eesnime alusel.<\/li>\n<li>Kutsuma v\u00e4lja qsort funktsiooni struktuurimassiivi sorteerimiseks vastavalt men\u00fc\u00fc valikule ning seej\u00e4rel massiivi v\u00e4ljatr\u00fcki funktsiooni<\/li>\n<li>Kutsuma v\u00e4lja qsort funktsiooni struktuurimassiivi sorteerimiseks vastavalt men\u00fc\u00fc valikule ning seej\u00e4rel massiivi v\u00e4ljatr\u00fcki funktsiooni<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Testimine-3\"><\/span>Testimine<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>J\u00e4rgnev v\u00e4ljund sisaldab vaid lisa\u00fclesande tulemust<\/p>\n<pre class=\"theme:cisco-router toolbar:2 nums:false lang:default decode:true\">risto@risto-wk-tux:~\/pr2\/lab\/wk5_div\/t1_qsort\/solution$ .\/qsort\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 5\r\nEmployees sorted by employee last and first name: \r\n     Anneli         Oja      7.30        0\r\n     Andres      Rebane     22.50       10\r\n      Doris      Rebane     10.20        3\r\n       Mark      Rebane     10.30        5\r\n      Sirje       Vakra     15.40        0\r\n\r\n\r\nSelect your action!\r\n\r\n1. Sort and display integer array (intArr)\r\n2. Sort and display float array (floatArr)\r\n3. Sort and display structures ordered by employment length\r\n4. Sort and display structures ordered first name\r\n5. Sort and display structures ordered by last and first.\r\n0. Exit\r\n\r\n&gt; 0\r\nristo@risto-wk-tux:~\/Nextcloud\/work\/ttu\/teaching\/_generic\/prog2\/lab\/wk5_div\/t1_qsort\/solution$<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Lisaulesanne_2_W05-4_Soidukite_asukohad\"><\/span>Lisa\u00fclesanne 2 [W05-4]: S\u00f5idukite asukohad<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Lisa\u00fclesande lahendamiseks pead alla laadima ka teise andmefaili, mis sisaldab k\u00f5igi s\u00f5idukite GPS asukohakordinaate.<\/p>\n<ul>\n<li>Lae GPS asukohti alla perioodiliselt.<br \/>\n<em>Soovitav andmete uuendamisintervall on 5 .. 10 sekundit<\/em><\/li>\n<li>Leia ICT hoone asukohakordinaadid<\/li>\n<li>Arvuta k\u00f5igi s\u00f5idukite kaugus ICT hoonest<\/li>\n<li>J\u00e4rjesta s\u00f5idukid kauguse j\u00e4rgi kasvavas j\u00e4rjekorras<\/li>\n<li>Uuenda v\u00e4ljundit perioodiliselt.<\/li>\n<li>Piira v\u00e4ljudnite arvu nii, et nii baas- kui lisa\u00fclesande v\u00e4ljundid mahuksid m\u00f5istlikult ekraanile<\/li>\n<\/ul>\n<p>NB! Uuendamise intervalli miinimumaeg on 15 sekundit, mis on antud aluskoodiga kaasa. Muuda see l\u00fchemaks, et v\u00f5imaldada asukohti tihedamalt alla laadida.<\/p>\n<p><strong>Andmed<\/strong><\/p>\n<p>Andmefaili aadressi leiad kas kasutades arendaja t\u00f6\u00f6riistu veebibrauseris v\u00f5i eesti avaandmete portaalist:\u00a0 <strong><a href=\"https:\/\/andmed.eesti.ee\/datasets\/uhistranspordivahendite-asukohad-reaalajas\">https:\/\/andmed.eesti.ee\/datasets\/uhistranspordivahendite-asukohad-reaalajas<\/a><\/strong><\/p>\n<p>Avaandmete portaalis on saadaval ka andmete kirjeldus.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Testimine-4\"><\/span><strong>Testimine<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>M\u00e4rka, et videos uuendatakse asukohakordinaate ning kaugust hoonest ligikaudu iga 5 sekundi tagant. K\u00f5igi s\u00f5idukite asukohad ei muutu &#8211; n\u00e4iteks osad v\u00f5ivad parasjagu paikneda l\u00f5ppjaamas, oodates oma v\u00e4ljumisaega.<\/p>\n<p><video style=\"width: 100%; height: auto; max-width: 100%;\" controls=\"controls\" width=\"300\" height=\"150\"><source src=\"https:\/\/blue.pri.ee\/ttu\/wp-content\/uploads\/2023\/02\/recording_extra.webm\" type=\"video\/webm\" \/>Your browser does not support the video tag.<\/video><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Vihjed\"><\/span>Vihjed<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Kauguse leidmiseks kahe punkti vahel maakeral on mitmeid valemeid. Haversine on \u00fcks v\u00f5imalikest &#8211; see pole k\u00fcll k\u00f5ige t\u00e4psem, kuid on v\u00f5rdlemisi lihtne ja arvutuslikult kiire.<\/li>\n<li>Soovitav on tehta loendur, mis &#8220;tiksub&#8221; nagu kell, et k\u00e4ivitada perioodiliselt andmefaili allalaadimine ja t\u00f6\u00f6tlemine<\/li>\n<li>Kui soovid kauakestvat ja t\u00e4psemat programmi, saad uuendamist rakendada ka v\u00e4ljuvatele s\u00f5idukitele<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Parast_seda_tundi_peaksid\"><\/span>P\u00e4rast seda tundi peaksid<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Oskama t\u00fckeldada oma programmi mitme koodifaili vahel mitmest koodifailist koosnevat programmi kompileerida<\/li>\n<li>Oskama kasutada qsort funktsiooni<\/li>\n<li>M\u00f5istma qsort funktsiooni v\u00f5rdlusfunktsiooni n\u00f5udeid ning suutma kirjutada v\u00f5rdlusfunktsiooni lihtsatele massiividele ning ka struktuurimassiividele<\/li>\n<li>Teadma viitade eksisteerimisest funktsioonidele ning oskama funktsiooni edastada viita teisele funktsioonile<\/li>\n<li>Teadma \u00fcldistatult samme, mis on vajalikud kolmandate osapoolte teekide kasutamiseks ning oskama neid oma programmi kompileerida<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Taiendav_materjal\"><\/span>T\u00e4iendav materjal<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Sorting algorithms visualized<br \/>\n<strong><a href=\"https:\/\/www.toptal.com\/developers\/sorting-algorithms\">https:\/\/www.toptal.com\/developers\/sorting-algorithms<\/a><\/strong><\/li>\n<li>Big-O cheat sheet<br \/>\n<strong><a href=\"https:\/\/www.bigocheatsheet.com\">https:\/\/www.bigocheatsheet.com<\/a><\/strong><\/li>\n<li>Quicksort algorithm<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Quicksort\">https:\/\/en.wikipedia.org\/wiki\/Quicksort<\/a><\/strong><\/li>\n<li>Example structure<br \/>\n<strong><a href=\"https:\/\/github.com\/JackWetherell\/c-project-structure\">https:\/\/github.com\/JackWetherell\/c-project-structure<\/a><\/strong><\/li>\n<li>List of common C libraries<br \/>\n<strong><a href=\"https:\/\/github.com\/oz123\/awesome-c\">https:\/\/github.com\/oz123\/awesome-c<\/a><\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Praktikumi materjal Slaidid: Qsort Slaidid: Koodi t\u00fckeldamine Koodin\u00e4ide: Andmet\u00fc\u00fcbist s\u00f5ltumatu mullsorteerimine N\u00e4idisprojekt koodi t\u00fckeldamisest:\u00a0https:\/\/blue.pri.ee\/ttu\/files\/iax0584\/demokood\/division_to_files.zip Praktikumi \u00fclesanded Selles praktikumis on kaks \u00fclesannet. Esimeses \u00fclesandes \u00f5pid sorteerima arvumassiive ning struktuuridest koosnevaid massiive ja koodi t\u00fckeldama Teises \u00fclesandes \u00f5pid andmeid internetist alla laadima M\u00f5lemat \u00fclesannet laiendab lisa\u00fclesanne \u00dclesanne 1 [W05-1]: Quicksort Selle \u00fclesande eesm\u00e4rk on harjutada qsort()\u00a0 funktsiooni &hellip; <a href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr2et5-qsort-code-div\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">PR2ET5:  Qsort ja t\u00fckeldus<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97,176],"tags":[],"class_list":["post-8236","post","type-post","status-publish","format-standard","hentry","category-laborid","category-pr2-et"],"_links":{"self":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/comments?post=8236"}],"version-history":[{"count":24,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8236\/revisions"}],"predecessor-version":[{"id":11461,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/8236\/revisions\/11461"}],"wp:attachment":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/media?parent=8236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/categories?post=8236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/tags?post=8236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}