Poročilo 2. naloge (SMS)

Poročilo 2. naloge (SMS)

Avtor: Nastja Bastjančič

OPIS PROBLEMA IN IDEJA REŠITVE

NAVODILO NALOGE:

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: (presledek)

2: abc

3: def

4: ghi

5: jkl

6: mno

7: pqrs

8: tuv

9: wxyz

OPIS PROBLEMA IN IDEJA REŠITVE

OPIS PROBLEMA:

Naloga zahteva, da spišemo program, ki vrne število, kolikokrat moramo pri pisanju sporočila SMS počakati, preden ga natipkamo.

Poglejmo si konkreten primer:

Vzemimo niz »soncek je«. Pri tipkanju tega niza s tipkovnico mobilnega telefona, ki ima zgoraj opisano razporeditev črk po tipkah, vidimo, da moramo počakati le enkrat – to je pred črko »n« - torej program bo vrnil število 1. Ker predpostavimo, da niz vsebuje le male angleške črke in presledke, programa za ta problem ni težko spisati.

Če bi niz vseboval še kak drug znak, kot je na primer ».«, »,«, »-«, »!«, »?« in podobno, do napake ne bi prišlo, saj program te znake ignorira. V primeru vnosa niza »so.ncek je« bo vrnil število 0, saj je ».« nedefinirana (t.j. ne spada v nobeno skupino črk na tipkovnici). Zato sem naredila testna programčka »spremeni1« in »spremeni2«, ki nizu spremenita morebitne šumnike v črke »c«, »s« in »z« ter izbrišeta najpogostejša ločila, kot so ».«, »,«, »:«, »;«, »(«, »)«, »?« in »!«.

Tako podani niz polepšamo in v primeru vnosa niza »so.ncek je«, program vrne število 1, kar je tudi pravilno.

OPIS PROBLEMA IN IDEJA REŠITVE

IDEJA REŠITVE:

  • Najprej, za vsak slučaj, spremenimo vse znake niza v male znake (ukaz niz.lower()).
  • Niz bomo razbili na črke in jih dali v nov, prazen seznam sez.
  • Tako za niz »soncek je« dobimo ['s', 'o', 'n', 'c', 'e', 'k', ' ', 'j', 'e']
  • Definiramo, kateri znaki se skrivajo v določeni tipki prenosnega telefona: če pritisnemo na tipko 1, naredimo presledek, če uporabimo tipko 2, lahko dobimo črke »a«, »b« ali »c« (odvisno kolikokrat pritisnemo nanjo) in tako dalje.
  • Definiramo spremenljivko »pocakaj = 0«, kjer bomo šteli, kolikokrat bomo morali pri pisanju SMS-ja počakati (nastavimo jo na 0) ter spremenljivki »j = 0« in »k = 1«, kateri bosta predstavljali indekse elementov seznama sez.
  • In potem s pomočjo zanke while preverimo vsaki sosednji črki, ki sta v seznamu sez. Če sta črki pod isto tipko na prenosnem telefonu, se števec »pocakaj« poveča za 1.
  • Metoda nam vrne število, ki se skriva za »pocakaj« - to je kolikokrat smo morali počakati med pisanjem podanega niza.

ALGORITEM IN REŠITEV NALOGE

def SMS (niz):

--->niz = niz.lower()

--->sez = []

--->for i in niz:

------->sez.append(i)

--->tipka1 = ' '

--->tipka2 = 'abc'

--->tipka3 = 'def'

--->tipka4 = 'ghi'

--->tipka5 = 'jkl'

--->tipka6 = 'mno'

--->tipka7 = 'prqs'

--->tipka8 = 'tuv'

--->tipka9 = 'wxyz'

--->pocakaj = 0

--->j = 0

--->k = 1

--->while j < len(sez)-1:

------->if (sez[j] in tipka1) and (sez[j+1] in tipka1): pocakaj += 1

------->elif (sez[j] in tipka2) and (sez[j+1] in tipka2): pocakaj += 1

------->elif (sez[j] in tipka3) and (sez[j+1] in tipka3): pocakaj += 1

------->elif (sez[j] in tipka4) and (sez[j+1] in tipka4): pocakaj += 1

------->elif (sez[j] in tipka5) and (sez[j+1] in tipka5): pocakaj += 1

------->elif (sez[j] in tipka6) and (sez[j+1] in tipka6): pocakaj += 1

------->elif (sez[j] in tipka7) and (sez[j+1] in tipka7): pocakaj += 1

------->elif (sez[j] in tipka8) and (sez[j+1] in tipka8): pocakaj += 1

------->elif (sez[j] in tipka9) and (sez[j+1] in tipka9): pocakaj += 1

------->j += 1

--->return pocakaj

ALGORITEM IN REŠITEV NALOGE

PRIMERI UPORABE:

>>> SMS('soncek je')

1

TESTNI PRIMERI

Testne programčke bi bilo morda bolje zagnati pred funkcijo SMS, saj podani niz tako rečeno »polepšajo oz. pripravijo« za nadaljno uporabo s funkcijo SMS. Sledeči programčki:

  • preverijo, ali je podani niz res niz – v primeru vnosa števila se sproži »AssertionError« z danim sporočilom (glej funkcijo »test1«),
  • niz po potrebi spremenijo tako, da iz njega odstranijo najpogosteje uporabljene znake, kot so npr.: ».«, »,«, »:«, »;« itd. Problem nastane, ko podamo

npr. niz = »so.ncek je«, saj v tem primeru funkcija SMS vrne število 0. Ko pa niz popravimo s funkcijo »spremeni1«, vrne rezultat 1 – kar je tudi pravilno, saj smo predpostavili, da je na tipkovnici prenosnega telefona le presledek in male angleške črke,

  • niz po potrebi spremenijo tako, da vse šumnike spremenijo v iste črke brez strešic (glej funkcijo »spremeni2«).

TESTNI PRIMERI

import types

def test1 (niz):

--->assert type(niz) == str, 'Sporočilo mora biti nek niz!'

--->print ('Sporočilo je v pravem formatu.')

TESTNI PRIMERI

def spremeni1 (niz):

Ker bi lahko bila v nizu kaka vejica ali pika ali kako drugo pogostejše ločilo, naredimo program, ki bo iz niza odstranil take znake.

--->niz = niz.lower()

--->znaki = ['.',',',':',';','(',')','?', '!']

--->for i in niz:

------->if i in znaki:

----------->niz = niz.replace(i, "")

------->else:

----------->pass

--->return niz

def spremeni2(niz):

--->sumniki = ['č','š','ž']

--->niz = niz.lower()

--->for i in niz:

------->if i == 'č':

----------->niz = niz.replace(i, 'c')

------->if i == 'š':

----------->niz = niz.replace(i, 's')

------->if i == 'ž':

----------->niz = niz.replace(i, 'z')

------->else:

----------->pass

--->return niz

TESTNI PRIMERI

FILMČEK: Predstavitev uporabe funkcije in testnih programčkov:

KLikni za ogled

0%
0%