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".
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.
Napravimo while zanko. In sicer jo delajmo toliko časa dokler ne pridemo do konca datoteke.
Gradnja rešitve
Zanka dokler vrstica ni prazna.
while vrstica != '':
Pogledamo, če izvajamo zanko že n-tič. if i == n :
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"