{"id":6495,"date":"2021-11-25T10:23:44","date_gmt":"2021-11-25T08:23:44","guid":{"rendered":"https:\/\/blue.pri.ee\/ttu\/?p=6495"},"modified":"2025-11-24T17:11:08","modified_gmt":"2025-11-24T15:11:08","slug":"pr1et13-soned","status":"publish","type":"post","link":"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/","title":{"rendered":"PR1ET13: S\u00f5ned"},"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\/pr1-et\/pr1et13-soned\/#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\/pr1-et\/pr1et13-soned\/#Esitamisele_kuuluvad_ulesanded\" >Esitamisele kuuluvad \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\/pr1-et\/pr1et13-soned\/#Ulesanne_1_W13-1_Tutvume_stringh_teegiga\" >\u00dclesanne 1 [W13-1]: Tutvume string.h teegiga<\/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\/pr1-et\/pr1et13-soned\/#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\/pr1-et\/pr1et13-soned\/#Abifunktsioon\" >Abifunktsioon<\/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\/pr1-et\/pr1et13-soned\/#Juhend\" >Juhend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Naide\" >N\u00e4ide<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Lisaulesanne_W13-3_Tahtede_loendus\" >Lisa\u00fclesanne [W13]-3]: T\u00e4htede loendus<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Ulesanne_2_W13-2_CSV-st_meiliaadresside_genereerimine\" >\u00dclesanne 2 [W13-2]: CSV-st meiliaadresside genereerimine<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#CSV_formaat\" >CSV formaat<\/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\/pr1-et\/pr1et13-soned\/#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-12\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Naide-2\" >N\u00e4ide<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Vihjed\" >Vihjed<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Lisaulesanne_1_W13-4_Luhikesed_nimed\" >Lisa\u00fclesanne 1 [W13-4]: L\u00fchikesed nimed<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Lisaulesanne_2_W13-5_Unikaalsed_e-postiaadressid\" >Lisa\u00fclesanne 2 [W13-5]: Unikaalsed e-postiaadressid<\/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-16\" href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/#Parast_tundi_peaksid\" >P\u00e4rast tundi peaksid<\/a><\/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\/pr1-et\/pr1et13-soned\/#Taiendav_materjal\" >T\u00e4iendav materjal<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Praktikumi_materjal\"><\/span><strong>Praktikumi materjal<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Slaidid: <a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0583\/slaidid-et\/13_Soned.pdf\"><strong>S\u00f5ned<\/strong><\/a><\/li>\n<li>N\u00e4ide:\u00a0<strong><a href=\"https:\/\/blue.pri.ee\/ttu\/programmeerimine-i\/koodinaited\/characters-c\/\" data-select-like-a-boss=\"1\">m\u00f5ningad lihtsamad t\u00e4hem\u00e4rkide omistamised<\/a><\/strong><\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Esitamisele_kuuluvad_ulesanded\"><\/span>Esitamisele kuuluvad \u00fclesanded<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Selles tunnis on kaks \u00fclesannet, millest esimeses \u00f5pime tundma string.h teeki ning teises manipuleerime t\u00e4hem\u00e4rke k\u00e4sitsi.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_1_W13-1_Tutvume_stringh_teegiga\"><\/span>\u00dclesanne 1 [W13-1]: Tutvume string.h teegiga<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande k\u00e4igus lood samm-sammu haaval programmi, mille k\u00e4igus tutvud peamiselt erinevate string.h teegis olevate standardfunktsioonidega.<\/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><strong>Programmi koostamiseks liigu samm-sammult juhendis antud j\u00e4rjekorras.<\/strong><\/li>\n<li>Programmi k\u00e4ivitades k\u00fcsitakse kasutajalt parooli. Enne \u00f5ige parooli sisestamist ei tohi programm edasi minna.<\/li>\n<li>Kasutajalt loetakse lause. Programm kuvab, mitu t\u00e4hem\u00e4rki lauses oli (sh t\u00fchikud, kirjavahem\u00e4rgid).<\/li>\n<li>Kasutajalt loetakse otsingufraas. Seej\u00e4rel v\u00e4ljastatakse, kas eelnevalt sisestatud lauses see fraas esines v\u00f5i mite (jah\/ei vastus).<\/li>\n<li>Kasutajalt k\u00fcsitakse kaks s\u00f5na, mida kasutatakse lause moodustamisel.\n<ul>\n<li>S\u00f5nade t\u00fc\u00fcbid v\u00f5id ise valida (nt nimi, ese, omaduss\u00f5na, tegus\u00f5na, &#8230;)<\/li>\n<li>Kleebi kasutaja poolt sisestatud s\u00f5nad kokku, lisades enda poolt t\u00e4iendavaid s\u00f5nu, moodustamaks v\u00e4hemalt neljast s\u00f5nast koosneva lihtlause.<\/li>\n<li>\u00dcks kasutaja sisestatud s\u00f5nadest peab olema selle lauses esimene s\u00f5na.<\/li>\n<li>Moodustatav lause tuleb salvestada t\u00e4iesti uude t\u00e4hem\u00e4rgimassiivi, mis peab\u00a0mahutama selle lause ka siis, kui loetud 2 s\u00f5na olid maksimaalse lubatud pikkusega.<\/li>\n<\/ul>\n<\/li>\n<li>Kogu \u00fclesande v\u00e4ltel tohid sisestuse lugemiseks ja t\u00f6\u00f6tlemiseks kasutada vaid ohutuid funktsioone! St funktsioone, mis piiritlevad mitu t\u00e4hem\u00e4rki tohib maksimaalselt lugeda.<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Abifunktsioon\"><\/span>Abifunktsioon<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Selleks, et paremini aru saada mis t\u00e4hem\u00e4rgid parasjagu tekstimassiivi sees paiknevad, pakun v\u00e4lja abifunktsiooni.\u00a0Funktsioon tr\u00fckib v\u00e4lja tervikliku s\u00f5ne, misj\u00e4rel tr\u00fckitakse k\u00f5ik t\u00e4hem\u00e4rgid ja selle vastavad ASCII tabeli t\u00e4isarvulised v\u00e4\u00e4rtused. Nii on lihtsam tuvastada, kui n\u00e4iteks m\u00f5ni reavahetus v\u00f5i muu ootamatu s\u00fcmbol j\u00e4\u00e4b massiivi sisse.<\/p>\n<pre class=\"toolbar:1 lang:default decode:true\">void DebugString(char str[])\r\n{\r\n    printf(\"String is: '%s'\\n\", str);\r\n\r\n    int i = 0;\r\n    while (str[i] != '\\0')\r\n    {\r\n        printf(\"str[%d] = %3hhu %c\\n\", i, str[i], str[i]);\r\n        i++;\r\n    }\r\n    printf(\"\\n\");\r\n}<\/pre>\n<h5><span class=\"ez-toc-section\" id=\"Juhend\"><\/span>Juhend<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<h6>1. samm: kasutaja sisestuse lugemine<\/h6>\n<p>Esimese sammu teeme tunnis koos l\u00e4bi! Selle k\u00e4igus loome kaks vajalikku funktsiooni.<\/p>\n<p>Alustame esimesest, mida kasutame s\u00f5ne lugemiseks. Lahenduses on oluline, et suudaksime lugeda mitmest s\u00f5nadest koosnevaid s\u00f5nesid &#8211; st t\u00fchik ei tohi lugemist \u00e4ra l\u00f5petada! Selleks on mitmeid viise, kuid meie l\u00e4heneme \u00fclesandele kasutades funktsiooni <span class=\"lang:default highlight:0 decode:true crayon-inline \">fgets()<\/span> . Soovi korral v\u00f5id ise teist teed minna.<\/p>\n<p>Funktsiooni <span class=\"lang:default highlight:0 decode:true crayon-inline\">fgets()<\/span>\u00a0 erip\u00e4radeks on, et ta on m\u00f5eldud lugemaks failist. K\u00fcll aga k\u00f5ik asjad on failid, sh ka klaviatuurilt tulev andmevoog, seega saame kasutada failina <span class=\"lang:default highlight:0 decode:true crayon-inline\">stdin<\/span>\u00a0 nimelist faili. Teine keerukus antud funktsiooni juures on see, et ta vajab endale pikkust palju tohib lugeda &#8211; see on ohutuse tagamiseks, et puhvri pikkusest \u00fcle ei loetaks. Kolmandaks n\u00fcansiks on reavahetus, mis tekib klaviatuurilt enter klahvi vajutamisel &#8211; ka s\u00fcmbol <span class=\"lang:default highlight:0 decode:true crayon-inline \">\\n<\/span>\u00a0 salvestatakse\u00a0 massiivi.<\/p>\n<p>L\u00e4henemises kasutame p\u00f5him\u00f5tet, et loome funktsioonidele <em>wrapperid<\/em> ehk \u00fcmbritseme need t\u00e4iendavate lausetega, mis muudab funktsiooni kasutamise mugavamaks, s\u00e4ilitades turvalisuse.<\/p>\n<p>Meie \u00fcmbrisel on vaja kahte sisendit &#8211; s\u00f5net ehk t\u00e4hem\u00e4rgimassiivi, kuhu loetava teksti salvestame ning selle pikkust, et v\u00e4ltida puhvri \u00fclet\u00e4itumise r\u00fcnnakuid.<\/p>\n<p>Antud lahenduses olen j\u00e4tnud kolme kohta k\u00fcsim\u00e4rgid sisse. Sinu \u00fclesandeks on t\u00e4ita l\u00fcngad. Vihjeks: kui loetud s\u00f5ne pikkus on 10 t\u00e4hem\u00e4rki, siis indeksiga 8 paikneb viimane oluline t\u00e4hem\u00e4rk, mille kasutaja sisestas. Sellele j\u00e4rgneb reavahetuse t\u00e4hem\u00e4rk, millest peame lahti saama, asendades selle s\u00f5ne l\u00f5pu s\u00fcmboliga. Vajadusel kasuta varasemalt v\u00e4lja toodud abifunktsiooni sisendi anal\u00fc\u00fcsimiseks!<\/p>\n<p>Selleks, et funktsioon ka kompileeruks olen need 2 t\u00e4iendavalt vajalikku rida v\u00e4lja kommenteerinud. Olles k\u00fcsim\u00e4rgid asendanud, kommenteeri need sisse.<\/p>\n<p><span class=\"lang:c highlight:0 decode:true crayon-inline \">size_t<\/span>\u00a0 on andmet\u00fc\u00fcp, mida kasutatakse pikkuste hoiustamiseks ja massiivide indekseerimiseks ja loendamiseks. Tegelikkuses on see lihtsalt m\u00e4rgita t\u00e4isarv.<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">void GetString(char str[], int max)\r\n{\r\n    \/\/ Read the string from keyboard\r\n    fgets(str, max, stdin);\r\n\r\n    \/\/ TODO: Find the length of the actual string we just read\r\n    \/\/ size_t len = ???;\r\n    \r\n    \/\/ TODO: Write the string terminator in place of the newline to fix the string\r\n    \/\/ str[ ??? ] = ???;\r\n}<\/pre>\n<p>Kui lugemine on valmis, loome j\u00e4rgmise \u00fcmbrise oma vastloodud <span class=\"lang:default highlight:0 decode:true crayon-inline \">GetString()<\/span>\u00a0 funktsioonile. Nii saame mugavalt sisestust k\u00fcsida!<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">void PromptString(char str[], int max, char prompt[])\r\n{\r\n    printf(\"%s: \", prompt);\r\n    GetString(str, max);\r\n}<\/pre>\n<p>N\u00fc\u00fcd kui soovime m\u00f5nda s\u00f5net lugeda, saame oma v\u00e4ljakutse luua \u00fcsna mugavalt. N\u00e4iteks kui meil on t\u00e4hem\u00e4rgimassiiv <span class=\"lang:default highlight:0 decode:true crayon-inline \">sentence[]<\/span> , mille pikkus on defineeritud makroga <span class=\"lang:default highlight:0 decode:true crayon-inline \">MAX_STR<\/span>\u00a0, saame v\u00e4ljakutse luua<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\">PromptString(sentence, STR_MAX, \"Please enter a sentence\");<\/pre>\n<h6>2. samm: lause lugemine ja selle pikkus<\/h6>\n<p>Loe kasutajalt sisse lause. Seej\u00e4rel leia ja v\u00e4ljasta sisestatud lause pikkus. Pikkuse leidmiseks kasuta standardfunktsiooni <span class=\"lang:c highlight:0 decode:true crayon-inline \">string.h<\/span>\u00a0 teegist.<\/p>\n<h6>3. samm: fraasi otsimine<\/h6>\n<p>Lisa programmi funktsioon, milles k\u00fcsitakse kasutajalt otsingufraas. Programm v\u00e4ljastab seepeale, kas see fraas eksisteeris varasemalt sisestatud lauses v\u00f5i mitte.<\/p>\n<p>Jah-ei vastuseks piisab, kui kontrollida tagastust j\u00e4rgneval kujul<\/p>\n<p>J\u00e4rgnevas n\u00e4ites kasutusel olev <span class=\"lang:c highlight:0 decode:true crayon-inline\">NULL<\/span>\u00a0 viitab objektile v\u00f5i m\u00e4luaadressile, mida ei eksisteeri (kutsume null-viidaks). See on vajalik kuna funktsioon <span class=\"lang:c highlight:0 decode:true crayon-inline \">strstr()<\/span>\u00a0 ei tagasta mitte jah\/ei vastust, vaid \u00fctleb asukoha (m\u00e4luaadressi) kus kohas otsitav s\u00f5ne paikneb. Kui otsitavat s\u00f5ne ei leita, tagastatakse <span class=\"lang:c highlight:0 decode:true crayon-inline \">NULL<\/span>\u00a0.<\/p>\n<pre class=\"lang:default decode:true\">if (strstr() != NULL)\r\n{\r\n   \r\n}\r\nelse\r\n{\r\n    \r\n}<\/pre>\n<h6>4. samm: parooli k\u00fcsimine<\/h6>\n<p>Lisa programmi funktsioon, mis k\u00fcsib kasutajalt parooli. N\u00e4iteks:<\/p>\n<pre class=\"lang:default decode:true\">void PromptPassword(char correctPassword[])\r\n{\r\n    char userEnteredPassword[STR_MAX];\r\n    \r\n    \/\/ Write your loop for password prompt here\r\n}<\/pre>\n<p>Parooli k\u00fcsimine peab olema ts\u00fcklis ja k\u00fcsima kasutajalt parooli senikaua, kuniks kasutaja sisestab korrektse parooli. Parooli kontroll peab olema t\u00f5stutundlik (st suuri ja v\u00e4iket\u00e4hti ei v\u00f5rdsustata). Soovi korral v\u00f5id panna programmi vale parooli puhul vihjeid andma v\u00f5i end sulgema p\u00e4rast korduvalt parooli valesti sisestamist.<\/p>\n<h6>5. samm: lause moodustamine<\/h6>\n<p>Lisa programmi funktsioon, mille k\u00e4igus moodustad lihtlause. Kuna funktsioonile meil head sisendit ega tagastust anda ei ole, v\u00f5iksid alustada funktsiooni sedasi (void-void funktsioonid on erandlikud ja enamasti tuleb neid v\u00e4ltida!):<\/p>\n<pre class=\"toolbar:2 lang:default decode:true \">void FormulateSentence(void)\r\n{\r\n    \/\/ String where the final sentence will be held\r\n    char sentence[ ??? ];\r\n   \r\n    \/\/ Strings for the two user-entered words\r\n    \r\n\r\n    \/\/ Prompt the user for the two words\r\n\r\n\r\n    \/\/ Formulating the final sentence\r\n\r\n\r\n    \/\/ Print the final formulated sentence\r\n    printf(\"Result: %s\\n\", sentence);\r\n}<\/pre>\n<p><strong>M\u00f5ttekoht<\/strong>: kui pikk peaks olema <span class=\"lang:default highlight:0 decode:true crayon-inline \">sentence<\/span>\u00a0 massiivi pikkus, et see mahutaks halvimal juhul \u00e4ra m\u00f5lemad kasutaja sisestatud s\u00f5nad ning sinu lisatavad s\u00f5nad, t\u00fchikud ja kirjavahem\u00e4rgid, et moodustada lauset? Suurus v\u00f5ib olla liigkaudne aga peab olema piisav!<\/p>\n<p>Edasi m\u00f5tle v\u00e4lja millist lauset moodustada soovid. Oluline on, et selles lauses oleks kaks l\u00fcnka, kuhu kasutaja sisestab enda soovitud s\u00f5nad (ise otsustad millised &#8211; nt inimese nimi, ese, nimis\u00f5na, tegus\u00f5na, &#8230;). \u00dcks nendest s\u00f5nadest peab olema lause esimene s\u00f5na, teise asukoht on sinu enda otsustada. N\u00e4iteks <span class=\"lang:default highlight:0 decode:true crayon-inline\">&lt;s\u00f5na1&gt; on &lt;s\u00f5na2&gt; nimi!<\/span> .<\/p>\n<p>Olles kasutajalt s\u00f5nad p\u00e4rinud ja programmi sisse lugenud tuleb sul need s\u00f5nad lauseks kokku kleepida. Kokku kleebitav lause peab olema salvestatud t\u00e4iesti uude t\u00fchja t\u00e4hem\u00e4rgimassiivi. Oluline on arvestada, et mis iganes kasutaja sisestab (lubatud pikkuste raames) peab \u00e4ra mahtuma sinna koostatavasse massiivi ka sellisel juhul, kui kasutaja otsustas maksimaalselt pikad s\u00f5nad sisestada.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Naide\"><\/span>N\u00e4ide<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default decode:true\" title=\"string.h\">Please enter a password: password\r\nInvalid password! Try again!\r\n\r\nPlease enter a password: again\r\nInvalid password! Try again!\r\n\r\nPlease enter a password: hunter2\r\nPassword accepted. Welcome AzureDiamond!\r\n\r\nEnter a sentence: I do wish we could chat longer, but I'm having an old friend for dinner.\r\nThe length of the entered sentence is 72\r\n\r\nPlease enter a search phrase: old friend\r\nYour search phrase \"old friend\" exists in the originally entered sentence\r\n\r\nEnter a name: Pauline\r\nEnter an adjective: awesome\r\n\r\nResult: Pauline is an awesome person!<\/pre>\n<h5><span class=\"ez-toc-section\" id=\"Lisaulesanne_W13-3_Tahtede_loendus\"><\/span>Lisa\u00fclesanne [W13]-3]: T\u00e4htede loendus<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Loo k\u00e4sitsi uus loendamise funktsioon ning v\u00e4ljasta statistika<\/p>\n<ul>\n<li>Loenda ja kuva, mitu t\u00e4hte [a-zA-Z] oli lauses. \u00c4ra loenda kirjavahem\u00e4rke, t\u00fchikuid jne.<\/li>\n<li>Leia ja kuva, mitu protsenti kogu lausest moodustasid t\u00fchikud, kirjavahem\u00e4rgid ja muud s\u00fcmbolid.<\/li>\n<li>N\u00e4ita protsent \u00fche komakohaga.<\/li>\n<\/ul>\n<p><strong>N\u00e4ide<\/strong><\/p>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default decode:true\" title=\"string_adv\">Sentence entered: Hi, Bob!\r\nSentence length: 8\r\nAlphabetical characters: 5\r\nPercentage of other characters: 37,5%<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Ulesanne_2_W13-2_CSV-st_meiliaadresside_genereerimine\"><\/span>\u00dclesanne 2 [W13-2]: CSV-st meiliaadresside genereerimine<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Selle \u00fclesande eesm\u00e4rk on sulle tutvustada laialtlevinud andmeformaati CSV (comma separated value). \u00dclesande lahendamise k\u00e4igus saad harjutada \u00fcksikute t\u00e4hem\u00e4rkide tuvastamist ja t\u00f6\u00f6tlemist.<\/p>\n<p>Lae alla \u00fclesande aluskood: <strong><a href=\"https:\/\/blue.pri.ee\/ttu\/files\/iax0583\/aluskoodid\/13_2_csv_starter.c\">13_2_csv_starter.c<\/a><\/strong><\/p>\n<h5><span class=\"ez-toc-section\" id=\"CSV_formaat\"><\/span>CSV formaat<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>CSV on struktuursete andmete hoiustamise formaat, kus iga andmev\u00e4li on eraldatud eelnevast ja j\u00e4rgnevast komaga. Tegu on t\u00f5en\u00e4oliselt k\u00f5ige levinuma andmete varundamiseks ja hoiustamiseks kasutatava formaadiga v\u00e4ljaspool andmebaasis\u00fcsteeme. Tema peamisteks eelisteks on lihtne struktuur ning sellest tingitult on CSV toetatud praktiliselt k\u00f5igis rakendustes, mis v\u00e4hegi andmetega t\u00f6\u00f6tlevad.<\/p>\n<p>K\u00f5ige lihtsamal kujul nagu \u00f6eldud on k\u00f5ik v\u00e4ljad eraldatud \u00fcksteisest komaga. N\u00e4iteks:<\/p>\n<pre class=\"toolbar:2 lang:default highlight:0 decode:true\">Mari,Maasikas,112222IACB,49001013333\r\nToomas,Toomingas,111111MVEB,39002204444<\/pre>\n<p>T\u00e4pselt sellise keerukusega andmeid vaatame ka selles tunnit\u00f6\u00f6s. N\u00e4gemaks keerulisemaid formaate ja reegleid, kuidas hoiustada v\u00e4ljasid, mis peavad sisaldama komasid, jutum\u00e4rke ning kuidas lisada pealkirju, v\u00f5id lugeda siit: <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values#Basic_rules\">https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values#Basic_rules<\/a>.\u00a0<\/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>\u00dclesande lahendus on ehitatud antud aluskoodile<\/li>\n<li>Programm loob igale aluskoodis antud inimesele e-postiaadressi.\n<ul>\n<li>e-postiaadressi nimeosa koosneb kolmest eesnimet\u00e4hest ja kolmest perenimet\u00e4hest.<\/li>\n<li>Nimeosale j\u00e4rgneb sinu valitud domeen.<\/li>\n<li>E-postiaadressi nimi ja domeen peavad koosnema vaid v\u00e4iket\u00e4htedest.<\/li>\n<li>E-postiaadress tuleb salvestada terviklikult tekstimassiivi (loo uus muutuja seal, kus vaja) ja v\u00e4ljastada selle kaudu. Jooksvalt t\u00e4hem\u00e4rkhaaval v\u00e4ljastus pole lubatud.<\/li>\n<\/ul>\n<\/li>\n<li>Programm v\u00e4ljastab:\n<ul>\n<li>Inimese t\u00e4isnime. Eesnime ja perenime osad peavad olema eraldatud t\u00fchikuga<\/li>\n<li>Genereeritud e-postiaadressi.<\/li>\n<\/ul>\n<\/li>\n<li>Aluskoodis juba olevat koodi \u00fclesande lahendamiseks muuta ei tohi ilma juhendaja poolse n\u00f5usolekuta. Sinu poolt kirjutatava lahenduse alguspunkt peaks asuma\u00a0 <span class=\"lang:default highlight:0 decode:true crayon-inline\">ProcessPerson()<\/span>\u00a0 \u00a0funktsiooni sees. Soovi korral v\u00f5id julgelt funktsioone juurde lisada.<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Naide-2\"><\/span>N\u00e4ide<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<pre class=\"theme:cisco-router toolbar:1 nums:false lang:default highlight:0 decode:true\" title=\"CSV\">Number of CSV lines: 3\r\n\r\nProcessing line: 'Maria,Kask'\r\nName: Maria Kask\r\nE-mail: markas@ttu.ee\r\n\r\nProcessing line: 'Johanna-Maria,Kask'\r\nName: Johanna-Maria Kask\r\nE-mail: johkas@ttu.ee\r\n\r\nProcessing line: 'Kalev Kristjan,Kuusk'\r\nName: Kalev Kristjan Kuusk\r\nE-mail: kalkuu@ttu.ee<\/pre>\n<h5><span class=\"ez-toc-section\" id=\"Vihjed\"><\/span>Vihjed<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<ul>\n<li>Teades koma asukohta, tead ka mis indeksilt algab perenime esimene t\u00e4ht<\/li>\n<li>ASCII suur- ja v\u00e4iket\u00e4ht erinevad \u00fcksteisest \u00fche biti v\u00f5tta, mille j\u00e4rgu v\u00e4\u00e4rtuseks on 32 (nt A 65, a 97)<\/li>\n<li>K\u00f5ik toimingud peale e-mailiaadressi l\u00f5pu lisamise on k\u00f5ige lihtsam teha selles \u00fclesandes t\u00e4hem\u00e4rk-haaval. Saab ka kasutada <span class=\"lang:default highlight:0 decode:true crayon-inline \">string.h<\/span>\u00a0 teegi funktsioone, kuid need v\u00f5ivad olla asjatult keerukad.<\/li>\n<li>K\u00f5ige t\u00fc\u00fcpilisem viga selles \u00fclesandes on unustada s\u00f5nele null-baidi ehk terminaatori l\u00f5ppu lisamist p\u00e4rast nimeosa koostamist!<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Lisaulesanne_1_W13-4_Luhikesed_nimed\"><\/span>Lisa\u00fclesanne 1 [W13-4]: L\u00fchikesed nimed<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Muuda oma e-postiaadresside genereerimise algoritmi sedasi, et see tuleks toime ka l\u00fchemate nimede puhul.<\/p>\n<p>N\u00e4iteks: Ly Kask -&gt; lykask@ttu.ee<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Lisaulesanne_2_W13-5_Unikaalsed_e-postiaadressid\"><\/span>Lisa\u00fclesanne 2 [W13-5]: Unikaalsed e-postiaadressid<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Muuda oma e-postiaadresside genereerimise algoritmi sedasi, et see genereeriks unikaalseid postiaadresse ka siis, kui nimel on sarnane algus.<\/p>\n<p>Muuda oma data massiiv j\u00e4rgnevaks:<\/p>\n<pre class=\"toolbar:1 lang:default highlight:0 decode:true\">char *data[] = {\"Maria,Kask\",\r\n                \"Johanna-Maria,Kask\",\r\n                \"Kalev,Kristjan,Kuusk\",\r\n                \"Margit,Kasemets\",\r\n                \"Maris,Kase\",\r\n                \"Marko,Kasvataja\",\r\n                \"Margus,Kasevee\"};<\/pre>\n<p><strong>N\u00f5uded<\/strong><\/p>\n<ul>\n<li>Loodavad e-postiaadressid peavad olema unikaalsed<\/li>\n<li>Aadressi nimeosa peab j\u00e4tkuvalt olema 6 t\u00e4hem\u00e4rki<\/li>\n<li>Aadressid peavad j\u00e4tkuvalt viitama nime omanikule nii palju kui v\u00f5imalik<\/li>\n<li>T\u00e4pne algoritm ja seega saavutatav nimekuju on sinu enda valida. P\u00f5hjenda valitud lahendust kaitsmisel.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Parast_tundi_peaksid\"><\/span><strong>P\u00e4rast tundi peaksid<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Teadma, et t\u00e4hem\u00e4rkide jaoks kasutatakse erinevaid kodeeringuid, muuhulgas ASCII ja Unicode<\/li>\n<li>Teadma, mis on ASCII tabel ning kuidas seda kasutada.<\/li>\n<li>Teadma, kuidas t\u00f6\u00f6tavad s\u00f5ned C keeles.<\/li>\n<li>Teadma, kuidas l\u00f5petatakse s\u00f5net C keeles (null-terminaator\/null-bait).<\/li>\n<li>Seostama C keelseid s\u00f5nesid baidijadadega.<\/li>\n<li>Teadma, mis on CSV.<\/li>\n<li>Oskama kasutada string.h teeki s\u00f5nede manipuleerimiseks.<\/li>\n<li>Oskama ka ise kirjutada s\u00f5nede manipulatsioone (t\u00e4hem\u00e4rkhaaval l\u00e4henemine).<\/li>\n<li>Teadma, mis asi on puhvri \u00fclet\u00e4itumine ning selle kaudu tehtavatest r\u00fcnnakutest.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Taiendav_materjal\"><\/span><span id=\"Additional_content\" class=\"ez-toc-section\"><\/span><strong>T\u00e4iendav materjal<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Characters, Symbols and the Unicode Miracle &#8211; Computerphile<br \/>\n<strong><a href=\"https:\/\/www.youtube.com\/watch?v=MijmeoH9LT4\">https:\/\/www.youtube.com\/watch?v=MijmeoH9LT4<\/a><\/strong><\/li>\n<li>A beginners guide away from scanf<br \/>\n<strong><a href=\"https:\/\/www.sekrit.de\/webdocs\/c\/beginners-guide-away-from-scanf.html\">https:\/\/www.sekrit.de\/webdocs\/c\/beginners-guide-away-from-scanf.html<\/a><\/strong><\/li>\n<li>ASCII<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/ASCII\">https:\/\/en.wikipedia.org\/wiki\/ASCII<\/a><\/strong><\/li>\n<li>ASCII table<br \/>\n<strong><a href=\"https:\/\/www.rapidtables.com\/code\/text\/ascii-table.html\">https:\/\/www.rapidtables.com\/code\/text\/ascii-table.html<\/a><\/strong><\/li>\n<li>Character encoding<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Character_encoding\">https:\/\/en.wikipedia.org\/wiki\/Character_encoding<\/a><\/strong><\/li>\n<li>String.h library<br \/>\n<strong><a href=\"https:\/\/www.cplusplus.com\/reference\/cstring\/\">https:\/\/www.cplusplus.com\/reference\/cstring\/<\/a><\/strong><\/li>\n<li>Strings in C<br \/>\n<strong><a href=\"https:\/\/www.geeksforgeeks.org\/strings-in-c-2\/\">https:\/\/www.geeksforgeeks.org\/strings-in-c-2\/<\/a><\/strong><\/li>\n<li>CSV<br \/>\n<strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values\">https:\/\/en.wikipedia.org\/wiki\/Comma-separated_values<\/a><\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Praktikumi materjal Slaidid: S\u00f5ned N\u00e4ide:\u00a0m\u00f5ningad lihtsamad t\u00e4hem\u00e4rkide omistamised Esitamisele kuuluvad \u00fclesanded Selles tunnis on kaks \u00fclesannet, millest esimeses \u00f5pime tundma string.h teeki ning teises manipuleerime t\u00e4hem\u00e4rke k\u00e4sitsi. \u00dclesanne 1 [W13-1]: Tutvume string.h teegiga Selle \u00fclesande k\u00e4igus lood samm-sammu haaval programmi, mille k\u00e4igus tutvud peamiselt erinevate string.h teegis olevate standardfunktsioonidega. N\u00f5uded Programmi koostamiseks liigu samm-sammult juhendis &hellip; <a href=\"https:\/\/blue.pri.ee\/ttu\/laborid\/pr1-et\/pr1et13-soned\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">PR1ET13: S\u00f5ned<\/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,94],"tags":[],"class_list":["post-6495","post","type-post","status-publish","format-standard","hentry","category-laborid","category-pr1-et"],"_links":{"self":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495","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=6495"}],"version-history":[{"count":13,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495\/revisions"}],"predecessor-version":[{"id":10923,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/posts\/6495\/revisions\/10923"}],"wp:attachment":[{"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/media?parent=6495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/categories?post=6495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blue.pri.ee\/ttu\/wp-json\/wp\/v2\/tags?post=6495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}