Gradnja rešitve problema 2

Gradnja rešitve problema 2

Avtor: Saša Kožuh

Učni cilji: gradnja rešitve

Besedilo problema

Napiši funkcijo, ki kot vhod dobi spremenljivko z logičnim naslovom datoteke in celo število n. Funkcija naj vrne n-to vrstico v datoteki. Če ima datoteka manj kot n vrstic naj vrne niz "prekratka datoteka".

Ideja rešitve

Osnovna ideja je, da z zanko pregledamo datoteko vrstico po vrstico do n-te vrstice. Če slučajno pregledamo celo datoteko pa kljub temu nismo prišli do n-te vrstice potem je datoteka prekratka.

  1. Definiramo funkcijo
  2. Definiramo števec, ki ga bomo potrebovali za iskanje željene vrstice.
  3. Ker bomo zanko izvajali dokler prebrana vrstica ne bo prazna moramo pred prvim zvajanjem definirati spremenljivko vrstica, ki pa ne sme biti prazna. Torej notri shranimo kakršen koli niz le da ni prazna.
  4. Napravimo while zanko. In sicer jo delajmo toliko časa dokler ne pridemo do konca datoteke.

    1. Preberemo tekočo vrtico
    2. Pogledamo, če je tekoča vrstica tista ki jo iščemo. Tukaj je to najbolje napraviti z if stavkom.
    3. Če je to iskana vrstica jo vrnemo, sicer gremo dalje.
    4. Povečamo števec zanke.
  5. Če slučajno pridemo do konca zanke in se ni nikoli zgodilo, da bi bil izpoljnjen if pogoj, pomeni da je prej konec datoteke kot smo našli željeno vrstico. Vrnemo "prekratka datoteka"

Gradnja rešitve

  1. Definirajmo fukcijo
    def izpisiN(dat,n) :

  2. Števec. Začeli bomo v prvi vrstici zato naj bo števec na začetku ena.
    i = 1

  3. Definirajmo premenljivko vrstica.
    vrstica = "karkoli "

  4. Zanka dokler vrstica ni prazna.
    while vrstica != '':

    1. Preberemo tekočo vrstico
      vrstica = dat.readline()

    2. Pogledamo, če izvajamo zanko že n-tič. if i == n :

      1. Če to res potem vrnimo to vrstico. Sicer nadaljujemo
        return vrstica
    3. Povečamo števec zanke.
      i = i + 1
  5. Končamo zanko. Če se je zanka izvedla do konca potem je vrstic v datoteki manj od n => datoteka je prekratka. Vrnimo niz "prekratka datoteka".
    return "prekratka datoteka

Rešitev probelma


def vrniN(dat,n):
    i = 1
    vrstica = "karkoli"
    while vrstica != "" :
       vrstica = dat.readline()
       if i == n :
          return vrstica
       i = i + 1
    return "prekratka datoteka"

Robni pogoji

Vedno je pametno pogledati kako se koda obnaša v "čudnih" pogojih.
Če ji damo datoteko s podatki in "normalen" n, funkcija deluje dobro.
Če ji damo prekratko datoteko glede na dan n, tudi deluje v redu.
Če ji damo prazno datoteko in n>1, tudi deluje v redu.
Če pa ji damo prazno datoteko in n = 1, potem bi pa morala vrniti niz, da je datoteka prekratka, pa vrne prazen niz.
Če pogledamo še natančneje, vidimo da vedno kadar damo n takšen, da je za ena več kot je vrstic dobimo nazaj prazen niz.

Kje je težava? Kako jo odpraviti?

Če si natančneje pogledamo zanko, vidimo da ko preberemo zadnjo vrstico se zanka še enkrat izvede, in če je ravno i v tem zadnjem prehodu zanke enak n potem nam vrne vrednost tekoče vrstice, ki pa je seveda že prazna.

Rešitev nastale težave je načeloma več. Ena izmed rešitev je, da poleg preverjanja, če je i = n zraven preverimo še, če je istočasno vrstica polna, potem jo vrnem sicer pa ne.
if i == n  and vrstica != "":

Končna rešitev


def vrniN(dat,n):
    i = 1
    vrstica = "karkoli"
    while vrstica != "" :
       vrstica = dat.readline()
       if i == n  and vrstica != "":
          return vrstica
       i = i + 1
    return "prekratka datoteka"

0%
0%