SMS

SMS

Avtor: Ana Rot

SMS

Navodilo, opis problema in ideja rešitve

Navodilo naloge

2004.1.1 SMS Pri pisanju sporočil na prenosnem telefonu moramo vsakič, ko dve sosednji črki pripadata isti tipki prenosnega telefona, malce počakati. Če želimo na primer natipkati besedo ”bacil“, moramo pritisniti tipke: 2 2 (za b) 2 (za a) 2 2 2 (za c) 4 4 4 (za i) 5 5 5 (za l ), kar pomeni, da moramo dvakrat malce počakati — preden natipkamo ”a“ in preden natipkamo ”c“. Napiši program, ki za prebrani stavek izračuna, kolikokrat bomo pri pisanju sporočila na prenosnem telefonu morali počakati. Predpostavi, da stavek vsebuje le male črke angleške abecede in presledke. Razporeditev črk po tipkah: 1 2 3 4 5 6 7 8 9 (presledek) abc def ghi jkl mno pqrs tuv wxyz

Opomba: Sama sem predpostavila, da prepozna tudi števila (od 1 do 9) in velike črke.

Opis problema

Pri najsodobnejših prenosnih telefonih tega problema ni več, saj imajo že za vsako črko svojo tipko. Pri ostalih prenosnih telefonih pa je težava v tem, da imajo 9 tipk in v teh tipkah dobimo vse črke. V vsaki tipki so 3-4 črke. Če želimo natipkati zaporedoma dve črki ki sta na isti tipki moramo malo počakati preden natipkamo drugo črko.

Ideja reštive

Osnovna ideja, da ugotovim kolikokrat bo treba počakati predem bomo natipkali nasledno črko, je pregledati vsak znak v nizu, ki je podan kot parameter in ga shraniti v seznam kot številko, kateri pripada na tipkovnici mobitela. Na koncu pa pregledati ta seznam in vrniti število, ki nam pove kolikokrat se zaporedoma pojavi isto število. Tolikokrat bomo morali počakati preden bomo natipkali naslednjo črko.

Ključni koraki pri sestavljanju programa

Metoda »sms(beseda)« sprejme za parameter niz (lahko besedo ali stavek), v katerem so lahko črke in številke.

Najprej sem ustvarila prazen seznam (sez1 = []). V njega sem z for zanko zapisala vsak znak posebej, ki je bil podan kot parameter. For zanka nam pregleda vse elemente v seznamu (lahko tudi v nizu ali kje drugje).

Npr.: sms('beseda') → sez1 = ['b', 'e', 's', 'e', 'd', 'a']

Nato sem ustvarila nov prazen seznam (sez2 = []). Nastavila sem for zanko, ki mi pregleda vsak znak v sez1. Za vakega posebej pogleda katera številka na tipkovnici mobitela mu pripada in tega zapiše v sez2.

Npr.: sms('beseda') → sez1 = [2, 3, 7, 3, 3, 1]

Na koncu pogledam, če se kje v seznamu zaporedoma pojavi enaka številka. Če se to pomeni, da je potebno, pri pisanju sms-a na mobitelu, malo počakati. Definiram spremenljivko »stevec«, ki ga postavim na nič in bom v njega shranjevala kolikokrat bo potrebno počakati. Ter definiram še spremenljivko »k«, ki jo ravno tako postavim na nič, ta pa mi bo pretekla cel seznam s števili v zanki while. Nastavim while zanko, ki se mi izvaja dokler je spremenljivka k + 1 strogo manjša od dolžine seznama. V zanki imam if stavek, ki mi preverja ali je naslednja številka v seznamu enaka sedanji, če je to res povečam spremenljivko »stevec«. Ter povečam še spremenljivko »k«. Na koncu vrnem spremenljivko »stevec«, ki je rezultat. Tolikokrat je potrebno počakati.

Npr.: sms('beseda') → 1

Program in povezava

def sms(beseda):
    '''
    Ta metoda nam pove kolikokrat moramo pocakati, da lahko
    napišemo naslednjo crko, pri pisanju sms-a.
    '''
    assert type(beseda) == str, 'Beseda mora biti podana kot niz.'
    sez1 = []
    for i in beseda:
        sez1.append(i)
    sez2 = []
    for j in sez1:
        if j in ' 1':
            sez2.append(1)
        elif j in 'abc2ABC':
            sez2.append(2)
        elif j in 'def3DEF':
            sez2.append(3)
        elif j in 'ghi4GHI':
            sez2.append(4)
        elif j in 'jkl5JKL':
            sez2.append(5)
        elif j in 'mno6MNO':
            sez2.append(6)
        elif j in 'pqrs7PQRS':
            sez2.append(7)
        elif j in 'tuv8TUV':
            sez2.append(8)
        elif j in 'wxyz9WXYZ':
            sez2.append(9)
    stevec = 0
    k = 0
    while (k+1) < len(sez2):
        if sez2[k+1] == sez2[k]:
            stevec += 1
        k += 1
    return stevec

Testni programi

  1. Testni program: Preveriti hočem ali se bo sprožila izjema, če za parameter podam števila, ki niso napisana v nizu. V stavku »try« poskušam izvesti program sms, za parameter pa mu podam število, ki je podano kot int. Če se ta stavek lahko izvede se izpiše print stavek pod njim, ki nam pove, da je z programom nekaj narobe, saj mora biti parameter podan kot niz. V primeru da se program sesuje se izvede stavek »except«, ki pa prestreže to izjemo, ki bi se morala izvesti in mi izpiše da je vse vredu.
  1. Testni program: Ta primer je običajen, ki preverja, če program pravilo deluje za običajne primere. V spremenljivko »a« sem shranila vrednost True/False. Sama sem preverila, da če program pravilno deluje mora biti ta vrednost True. V »try« stavku napišem stavek »a = True«, če je to res se mi izpiše print stavek pod njim, če pa ni res bi se morala sprožiti izjema vendar jo stavek »except« prestreže in izpiše print stavek, ki je v njem.
  1. Testni program: V tem testnem primeru preverjam ali program pravilno deluje tudi, če besedo ločimo z več presledki. V spremenljivi »a« je shranjneno število. Nato pa naredimo enak postopek kot v testnem primeru 2.
  1. Testni program: Testiram ali program deluje pravilno tudi, če uporabim velike črke. Če se v »try« stavku ne sproži izjema, program deluje pravilno, v primeru da »except« prestreže izjemo je nekaj narobe.
  1. Testni program: Parameter za program sms mora biti en in podan mora biti kot niz. Če podamo več elementov podanih kot niz v seznamu to ni enako. V tem primeru se mora sprožiti izjema, ki pa jo prestreže stavek except.

Izvedba testnih programov

0%
0%