Elektronska ključavnica

Elektronska ključavnica

Avtor: Mojca Kerin

Elektronska ključavnica

V računskem centru nekega inštituta je vhod varovan z elektronsko kljucavnico in številcnico. Na številcnici so števke od 0 do 9 in tipka „Preklici“. Geslo je neko zaporedje števk. Vrata je treba odpreti, takoj ko uporabnik vtipka pravilno geslo. Če pritisne na tipko „Preklici“, se vse tisto, kar je natipkal pred tem, ne upošteva. Prav tako naj se po uspešnem odprtju vrat zbiranje gesla zacne znova. Na primer, ce je geslo 3119 in

  • uporabnik natipka 3119 −! vrata odpremo
  • uporabnik natipka 3118 −! vrat ne odpremo
  • uporabnik natipka 33119 −! vrat ne odpremo
  • uporabnik natipka 13hpreklicii3119 −! vrata odpremo

Napiši metodo, ki bere pritisnjene tipke z datoteke (vsak pritisk je zabeležen kot ustrezna števka, oziroma s P za prekliči) in vrne, kolikokrat smo odprli vrata, ko je bilo vtipkano pravilno zaporedje. Seveda metoda dobi kot parameter geslo za vrata.

(MojcaKerin_kljucavnica7.png)

Opis problema in ideja rešitve

Naloga od nas zahteva, da napišemo metodo, ki za parameter dobi geslo za vrata. Torej moramo napisati program tako, da bo v kodi metode, že vpisano ime datoteke v kateri hranimo vtipkane kode (vsaka koda bo zapisana v svoji novi vrstici).

Sedaj pa se osredotočimo na samo kodo. Premisliti moramo kako bomo ugotavili, ali je vnešena koda pravilna, ali ne. Tiste kode, ki ne vsebujejo zanaka 'P', enostavno primerjamo s kodo, ki je pravilna. Če se kodi ujemata to zabeležimo. Tiste kode, ki pa vsebujejo znak 'P', pa preoblikujemo tako, da tisti del, ki je zapisan pred tem znakom in tudi sam znak 'P' izbrišemo in se osredotočimo na preostanek. Ta preostanek lahko spet vsebuje znak 'P' ali pa ne. 'Brisanje' znakov ponavljamo toliko časa, dokler ne dobimo kodo samih števil. Ta del ponovno primerjamo s pravilno kodo.

Ko tako pregledamo celo datoteko, kjer imamo zapisane kode, vrnemo rezultat, torej kolikokrat smo odprli vrata, ko je bilo vtipkano pravilno zaporedje.

V kodi bi lahko preverili, ali so v datoteki slučajno zapisani tudi kateri drugi znaki poleg števil od 0 do 9 in črke 'P', vendar tega nismo storili, saj se privzame, da so na številčnici števila od 0 do 9 in tiprka 'Prekliči', kot to tudi piše v besedilu naloge. (Če bi to slučajno želeli storiti, si pomagamo s ukazom assert.)

Razlaga algoritma - 1. del

Datoteka v kateri so shranjene vnesene kode se imenuje: kode.txt . Vsaka koda je vpisana v svojo vrstico.

Kodo začnemo z ukazom def , nato zapišemo ime metode, v oklepaju pa podamo parametre. SLIKA Najprej določimo števec, ki beleži, kolikokrat smo odprli vrata. Če želimo uporabiti podatke iz neke datoteke, moramo to datoteko najprej odpreti, to storimo s pomočjo ukaza open. Za prvi parameter podamo ime datoteke, v našem primeru 'kode.txt'. Drugi parameter pa je 'r', kar pomeni, da bomo datoteko odprli smo za branje (r kot read, po angleško) in jo znotraj programa shranimo kot spremenljivko dat.

S pomočjo for zanke, se sprehodimo skozi vsako vrstico v datoteki. Znotraj te zanke definiramo spremenljivko a , ki hrani trenutno vrstico (hrani jo kot niz), brez belih zakov (zank za novo vrstico :'\n', tabulatorji: '\tab'….). To dosežemo s pomočjo metode strip() .

Koda sedaj izgleda, tako kot prikazuje spodnja slika.

(MojcaKerin_kljucavnica4.png)

Razlaga algoritma - 2. del

Sedaj imamo niz v katerem je zapisana koda, preveriti moramo, če ta koda slučajno vsebuje znak 'P'. To storimo s pomočjo while zanke. Torej določimo števec i , ki ima začetno vrednost 0, saj se indeksi v nizu začnejo z 0. Nato pa postavimo while zanko, ki se bo izvajala, dokler bo števec i manjši od dolžine seznama a . Dolžino seznama ugotovimo z metodo len (len kot length, po angleško). Pozorni moram biti na to, če imamo niz '12345' ima dolžino 5, indeksi pa tečejo od 0 do 4. Torej če postavimo pogoj pri while zaniki, da se naj izvaja dokler bo števec i manjši od dolžine niza bo v redu.

Znotraj te zanke uporabimo metodo if , ki preveri ali nekaj drži. Mi bomo preverili, če je nekje znotraj niza a zank 'P' . Torej if a[i]=='P': ( a[i] pomeni element z indeksom i). Če to drži potem, v spremenljivko ind shranimo indeks tistega mesta, na katerem je zapisan znak 'P'. Ker nas vse tisto kar je bilo napisano pred tem znakom ne zanima ('P' pomeni, da je uporabnik preklical, vse tisto, kar je natipkal do sedaj), bomo del niza pred 'P' in tudi 'P' izbrisali.

Koda sedaj izgleda, tako kot prikazuje spodnja slika.

(MojcaKerin_kljucavnica5.png)

Razlaga algoritma - 3. del

Ta 'skrajšani' niz shranimo nazaj v spremenljivko a . To storimo tako: a=a[ind+1:] . Sedaj števec i ponovo nastavimo na 0, tako da bomo novo nastali niz a , pregledali spet od začetka (sedaj ima novi a začetek tam do kjer smo sedaj pregledali stari niz a). Tako končamo if stavek. Sedeaj še povečamo števec, ki ga potrebujemo za zanko while . S tem smo zaključili tudi zanko  while

Sedaj pa drugi if stavek, ki je ključnega pomena. Preverimo ali se niz a ujema s kodo. Se pravi sedaj je v spremenljivki a shranjena skrajšana koda, ali pa koda, ki ni imala nobenega znaka 'P'. If stavek postavimo tako: if a==str(koda): (ukaz st r sprmeni število v niz, tako, da spoh lahko primerjamo, drugače nam Python vrne napako). Če je pogoj izpolnjen, števec stevec povečamo za ena. Tako smo zaključili tudi ta if stavek. Na koncu, povesem izven zank napišemo še: return stevevc , ki vrne število kolikokrat smo odprli vrata.

Koda sedaj izgleda, tako kot prikazuje spodnja slika.

(MojcaKerin_kljucavnica6.png)

Testiranje metode)

0%
0%