Vaje iz branja datotek, zank in pogojev
Datoteke, ki jih potrebujete za reševanje teh nalog, najdete na https://ucilnica.fri.uni-lj.si/mod/resource/view.php?id=53247.
Primeri s predavanj
Nič ne bo škodilo, če to narediš znova - s čim manj škiljenja v zapiske. :)
- Izpiši vse temperature v datoteki temperature.txt.
Rešitev
for vrstica in open("temperature.txt"):
print(int(vrstica))
- Izpiši vse temperature, vendar pretvorjene v Fahrenheite.
Rešitev
for vrstica in open("temperature.txt"):
temp_c = int(vrstica)
temp_f = temp_c * 9 / 5 + 32
print(temp_c, "C je", temp_f, "F")
- Izpiši povprečno temperaturo.
Rešitev
vsota = 0
dni = 0
for vrstica in open("temperature.txt"):
vsota = vsota + int(vrstica)
dni += 1
print(vsota / dni)
- Izpiši vse temperature višje od 17 stopinj.
Rešitev
for vrstica in open("temperature.txt"):
temp = int(vrstica)
if temp > 17:
print(temp)
- Izpiši število dni, ko je temperatura višja od 17 stopinj.
Rešitev
toplih = 0
for vrstica in open("temperature.txt"):
temp = int(vrstica)
if temp > 17:
toplih = toplih + 1
print("Toplih dni bo", toplih)
- Izpiši najnižjo in najvišjo napovedano temperaturo. Poskusi oboje izračunati v okviru ene same zanke.
Rešitev
najvisja = -float("inf")
najnizja = float("inf")
for vrstica in open("temperature.txt"):
temp = int(vrstica)
if temp > najvisja:
najvisja = temp
if temp < najnizja:
najnizja = temp
print(najvisja, najnizja)
- Izpiši zaporedno številko dneva z najnižjo temperaturo.
Rešitev
najnizja = float("inf")
dan = 0
for vrstica in open("temperature.txt"):
dan = dan + 1 # štejemo dneve
temp = int(vrstica)
if temp < najnizja: # naleteli smo na nov rekord
najnizja = temp # zapomnimo si to, rekordno temperaturo
najhladnejsi_dan = dan # in to številko dneva
print("Najnižja temperatura bo", najnizja, "C in bo nastopila na dan", najhladnejsi_dan)
Še malo vremena
- Znaš izračunati poprečno temperaturo tako, kot to delajo pri smučarskih skokih, kjer ne upoštevajo tistega ocenjevalca, ki je dal najmanjšo in ocenjevalca, ki je dal največjo oceno? Če je najmanjšo (ali največjo) oceno dalo več ocenjevalcev, seveda odstranijo le enega. (Nasvet: računaj vsoto, minimum in maksimum. Po zanki odšteješ minimum in maksimum od vsote ter izračunaš povprečje.)
Rešitev
najvisja = -float("inf")
najnizja = float("inf")
vsota = 0
st_dni = 0
for vrstica in open("temperature.txt"):
temp = int(vrstica)
vsota += temp
st_dni += 1
if temp > najvisja:
najvisja = temp
if temp < najnizja:
najnizja = temp
print((vsota - najvisja - najnizja) / (st_dni - 2))
Nariši (no, izpiši) graf temperatur:
24 ************************ 18 ****************** 15 *************** 16 **************** 18 ******************
Rešitev
for vrstica in open("temperature.txt"):
temp = int(vrstica)
print(temp, "*" * temp)
Kitajci
V datoteki yuan.txt je tečaj evra proti kitajske valute yuan (ki se menda izgovori tako, kot bi Nemci izgovorili üen) v času od 1. aprila 2005 do 9. oktobra 2023, brez sobot in nedelj.
- Izpiši najvišjo in najnižjo vrednost - točneje, koliko največ in koliko najmanj yuanov je bil vreden evro.
Rešitev
najnizja = float("inf")
najvisja = - float("inf")
for vrstica in open("yuan.txt"):
vrednost = float(vrstica)
if vrednost < najnizja:
najnizja = vrednost
if vrednost > najvisja:
najvisja = vrednost
print(najnizja, najvisja)
- Koliko dni je bil evro vreden več ali enako 10 yuanov?
Rešitev
stevec = 0
for vrstica in open("yuan.txt"):
vrednost = float(vrstica)
if vrednost >= 10:
stevec += 1
print(stevec)
- Kolikšen delež dni (v odstotki) je bil evro vreden več ali enako 10 yuanov?
Rešitev
stevec = 0
stevec_vsi = 0
for vrstica in open("yuan.txt"):
vrednost = float(vrstica)
stevec_vsi += 1
if vrednost >= 10:
stevec += 1
print(stevec / stevec_vsi)
- Na kateri dan (zaporedna številka dneva) je evro prvič padel pod osem yuanov? (Opazka: na razmerje med yuanom in evrom najbrž vpliva predvsem ravnanje kitajske in ne toliko evropske banke. Ko je vrednost yuana nizka, je to lahko dobro za kitajski izvoz, čeprav stvari seveda niso tako preproste.)
Rešitev
i = 0
for vrstica in open("yuan.txt"):
vrednost = float(vrstica)
i += 1
if vrednost < 8:
print(i)
break
Če poznamo enumerate
pa lahko rešimo takole:
for i, vrstica in enumerate(open("yuan.txt"), start=1):
vrednost = float(vrstica)
if vrednost < 8:
print(i)
break
- Malo težja: kako dolgo je najdaljše zaporedje dni, ko je bil evro vreden manj kot 8 yuanov?
Rešitev
najdaljse_zap = 0
trenutno_zap = 0
for vrstica in open("yuan.txt"):
vrednost = float(vrstica)
if vrednost < 8:
trenutno_zap += 1
elif trenutno_zap > najdaljse_zap:
najdaljse_zap = trenutno_zap
trenutno_zap = 0
if trenutno_zap > najdaljse_zap:
najdaljse_zap = trenutno_zap
print(najdaljse_zap)
- Še malo težja: na kateri dan se je začelo to zaporedje?
Rešitev
najdaljse_zap = 0
trenutno_zap = 0
for i, vrstica in enumerate(open("yuan.txt"), start=1):
vrednost = float(vrstica)
if vrednost < 8:
trenutno_zap += 1
elif trenutno_zap > najdaljse_zap:
najdaljse_zap = trenutno_zap
najdaljse_dan = i - trenutno_zap
trenutno_zap = 0
if trenutno_zap > najdaljse_zap:
najdaljse_zap = trenutno_zap
najdaljse_dan = i - trenutno_zap
print("Najdaljse zporedje se je začelo na dan", najdaljse_dan, "in je trajalo", najdaljse_zap, "dni")
Kolesa
Lastnik štirih koles različnih znamk (Cube, Canyon, Stevens, Nakamura) si v datoteko "kolesa.txt" beleži, kolikokrat se pelje s katerim.
- Napiši program, ki to prešteje in izpiše.
Rešitev
Zaenkrat bomo nalogo rešili takole:cube = 0
canyon = 0
stevens = 0
nakamura = 0
for vrsica in open("kolesa.txt"):
kolo = vrsica.strip() # odstrani \n na koncu vsake vrstice
if kolo == "Cube":
cube += 1
elif kolo == "Canyon":
canyon += 1
elif kolo == "Stevens":
stevens += 1
elif kolo == "Nakamura":
nakamura += 1
print("Cube:", cube, "Canyon:", canyon, "Stevens:", stevens, "Nakamura:", nakamura)
V prihodnjosti pa bomo poznali slovarje in bomo nalogo rešitli takole:
stevec = {}
for vrsica in open("kolesa.txt"):
kolo = vrsica.strip() # odstrani \n na koncu vsake vrstice
if kolo not in stevec:
stevec[kolo] = 0
stevec[kolo] += 1
print(stevec)
- Napiši program, ki izpiše, s katerim kolesom se je peljal največkrat.
Rešitev
Če želimo izpisati največkrat uporabljeno kolo, dodamo sledečo kodo rešitvi prve naloge:if cube > canyon and cube > stevens and cube > nakamura:
print("Cube")
elif canyon > stevens and canyon > nakamura:
print("Canyon")
elif stevens > nakamura:
print("Stevens")
else:
print("Nakamura")
Problem: iz razlogov, ki jih bomo spoznali zdaj zdaj, je na koncu vrstice, prebrane iz datoteke, še nekaj šare. Namesto niza "Cube"
bo Python prebral "Cube\n"
. Če se želiš tega znebiti, dodaj vrstico vrstica = vrstica.strip()
(ob predpostavki, da se prebrana vrstica nahaja v spremenljivki vrstica
.)