6. nädal Testimine. Stringid. Näited: string_objektina.py, stringid.py Vaatame esitluse abil, mida kujutab endast testimine. Peamiselt tegeleme dünaamilise testimisega, kuid kergelt käsitleme ka staatilist testimist ja sellega seonduvat küsimustikku (kus osa teemasid ei ole veel arusaadavad). NB! 2. nädala juures olev link "Mõtteid vigade otsimisest" on sisuliselt ka juhis staatiliseks testimiseks. Ülesanded: Teeme testid ülesandele 3. nädal, ül 6 (liigaasta) 4. nädal, ül 6 (spordipäev) --------------------------------------------------------------------------- Stringidest, sh nende mälus talletamisest. Stringe saab: a) sümbol haaval läbi vaadata ja iga sümboliga midagi teha; b) vaadata stringis mõnes konkreetses kohas olevat sümbolit (või ka mitut järjestikku) ja nendeha midagi teha; c) töödelda kasutades stringimeetodeid, mida on Pythonis ohtralt; katsume mõista funktsioonide väljakutsumise ja klassi meetodite kasutamise erinevusi. Stringimeetodite kirjeldused on leitavad siit: https://docs.python.org/3/library/stdtypes.html#string-methods Lisaks võib uurida stringi moodulit aadressil: https://docs.python.org/3/library/string.html Kuid sealt me esmasteks vajadusteks midagi hädavajalikku ei leia. Ülesanne 1 Väikesed näpuharjutused meetodeid kasutades a) Sisestatakse tekstilõik ja otsitav sõna. Programm leiab, kas tekstilõigus on olemas otsitav sõna ja annab vastuseks, "Sõna ei leidnud" või "Sõna algas ... positsioonist". b) Sisestatakse tekstilõik, otsitav sõna ja asendussõna. Programm uurib, kas otsitav sõna on olemas. Kui jah, siis asendab selle sõna asendussõnaga ja trükib teksti uuesti välja, vastasel juhul annab teate, et otsitavat sõna ei leitud ja asendamist ei toimu. Abiks on meetodid str.find(), str.replace(). Ülesanne 2 Caesari salakiri Salakirjad on olnud populaarsed aastatuhandeid. Üks lihtsamaid nendest on nn Caesari salakiri. Selle põhimõte on lihtne: lepitakse kokku samm, mille kauguselt tähestikust võetakse sõnas oleva tähe asemele asendustäht. Sama sammu /nihet kasutatakse iga tähe jaoks. Näiteks sõna "kala" krüpteeruks sammu 4 korral "oepe". Kui samm läheb üle tähestiku lõpu, jätkatakse liikumist algusest. Teise kirjelduse (Wikipedia) järgi tehakse nihe vasakule - siis saaks sõnast "kala" "gwhw Programmi ülesanne on küsida sõna (või ka lause), küsida samuti nihe/samm ja krüpeerida sõna antud sammuga. Olukorra lihtsustamiseks eeldame, et tekstis on vaid ladina tähed. Samas peab aga jälgima, et kirjavahemärgid tühikud jms paika jääksid. Kasulikeks funktsioonideks osutuvad siin: ord() - annab ASCII-tabeli alusel tähe koodi ja chr() - tuletab koodist sümboli (ikka ASCII tabeli alusel) Töö käik: leia kood, liida samm, leia täht (sümbol) Tööd tuleb teha stringis täht haaval for-tsükliga. Probleem tekib siis, kui kood läheb suuremaks kui tähestikus viimasel tähel. Kuidas jõuda tagasi tähestiku piiridesse? Alternatiiv: kirjuta ise programmi algusesse tähestik. Otsi krüpteeritavat tähte (str.find()) ja leia vaste tähestikust. Tähestiku piires püsimiseks on kasu jäägi leidmise tehtest (jääk tähestiku pikkusega). NB! Kodus kirjuta teine programm, mis võimaldab dekrüpteerimist. Selleks on teada krüpteeritud tekst ja samm. Ülesanne 3 Isikukood Programmile on sisendiks on kasutaja nimi ja Eesti Vabariigi kodaniku isikukood (IK). Leia IK-st järgmised andmed ja trüki nad võimalikult viisakalt ekraanile: 1. Sünnipäev 2. Vanus 3. Sugu 4. Kontrolli, kas IK kontrollsumma on õige ehk kontrollnumbri leidmine. Vaata veebilehel eraldi lingil isikukoodi selgitust (kui ta veel piisavalt tuttav pole). Vanuse arvutamiseks on vaja tänast kuupäeva. Seda saab küsida moodulis time oleva funktsiooniga localtime(), näiteks nii: aeg = time.localtime() Funktsioon localtime() tagastab klassi struct_time, milles on järgmised atribuudid (http://docs.python.org/3/library/time.html): Index Attribute Values 0 tm_year (e.g. 1993) 1 tm_mon range [1,12] 2 tm_mday range [1,31] 3 tm_hour range [0,23] 4 tm_min range [0,59] 5 tm_sec range [0,61] 6 tm_wday range [0,6], Monday is 0 7 tm_yday range [1,366] 8 tm_isdst 0, 1 or -1 (daylight saving) N/A tm_zone abbreviation of timezone name N/A tm_gmtoff offset east of UTC in seconds Sellest loetelust on vaja esimest kolme elementi, mida saab kätte indeksiga aeg[0], aeg[1], aeg[2] või atrbuudiga aeg.tm_year jne. Täpse vanuse määramiseks harjuta if-lauset (mis arvestab sellega, kas sünnipäev on juba olnud või mitte). Kuidas lisada sünnikuu nimetusena ja kuidas mõistlikul viisil välja arvutada IK kontrollnumber, kasutades selleks tsüklit? Sellest räägime lisa järgmisel nädalal. Testid kontrollnumbrile (kõik järgnevad isikukoodid on korrektsed): 1. kordajatega 39105174211, 39401225223, 60002010241, 50002242212 2. kordajatega 39603022765, 39506063722, 49210030250, 49601204711 3. lihtsalt 0 39410130010, 39506102720, 38705290260, 49601300260