Predgovor

Kar slišim, pozabim. Kar vidim, si zapomnim. Kar naredim, razumem.

— (modificiran) kitajski pregovor

Ne glede na to, da v času nastajanja te zbirke knjig, sploh pa na papirju, pregovorno nihče več ne bere, sva avtorja ugotovila, da je kljub preobilju informacij podobnega čtiva, namenjenega inženirjem, zelo malo. Na to so naju konec koncev opozarjali tudi študenti, ki so si podobne zbirke najbolj želeli. In zato je tudi nastala. Pred vami je tako zbirka nalog za učenje programiranja v programskem jeziku Python. Zbirka je bila pripravljena v pomoč vsem, ki bi se želeli naučiti programirati, še posebej pa študentom pri predmetu Računalništvo in informatika na Fakulteti za gradbeništvo in geodezijo Univerze v Ljubljani.

Programiranje je zanimiv izziv in zahteva vsaj nekaj algoritmičnega razmišljanja, ki se ga ne moremo naučiti s ponavljanjem za drugimi ali pa zgolj z branjem knjig. Programiranja se naučimo s samostojnim reševanjem nalog. S tipkovnico!

Pred vami je torej zbirka osnovnih nalog z rešitvami, napisanimi v programskem jeziku Python, ki vas bo popeljala od samih začetkov do točke, ko boste lahko začeli pridobljeno znanje uporabljati tudi za reševanje svojih nalog in izboljšanje svojih delovnih procesov.

V tem učbeniku oziroma zbirki nalog ne boste našli čisto vseh osnov in v njej ne bodo predstavljeni čisto vsi koncepti, bo pa dober priročnik za vse, ki se boste želeli priučiti programiranja ali pa svoje znanje programiranja zgolj preveriti oziroma nadgraditi. Ugotovili boste (če morda še ne veste), da se lahko reševanja lotite na (skoraj) neomejeno število načinov. Eni so bolj učinkoviti, drugi so bolj berljivi, tretji so sintaktično bolj pravilni…​ Ustrezni so (skoraj) vsi, samo da vrnejo pričakovane rezultate. Vsako predstavljeno rešitev naloge torej vzemite kot eno od možnosti in nikakor ne edino pravilno!

Sedaj pa veselo na delo.

Srečno!

Robert Klinc in Matevž Dolenc

Napotki za uporabo

Navodila za uporabo za gradbene inženirje

Zbirka je razdeljena na dva dela:

  • v prvem delu so opisane naloge z bistvenimi namigi ter povezavami do rešitev,

  • v drugem delu pa so predstavljene možne rešitve.

Vse rešitve so opremljene z bistvenimi pojasnili, pri določenih nalogah pa je predstavljenih več možnih rešitev, vse z namenom, da bodo predstavljene rešitve čim bolj jasne in razumljive.

Vsa izvorna koda je objavljena na spletnem mestu GitHub.

Vse rešitve so prilagojene osnovni stopnji programiranja in bi morale biti razumljive tudi začetnikom.

Predlagava, da si najprej izberete programerski izziv v prvem delu, si ogledate namige in poskusite sami napisati rešitev. Šele ko nalogo rešite, si oglejte tudi predlagane rešitve ter razlike med posameznimi različicami, če obstajajo. V pomoč pri razumevanju so vam lahko tudi bistvena pojasnili pri vsaki od rešitev.

Želiva vam uspešno programiranje.

Poglavje 1. Naloge

1.1. Množenje števil

Pripravite program, v katerem dvema spremenljivkama določite vrednost, nato pa uvedete tretjo, ki je zmnožek prejšnjih dveh. Tretjo spremeljivko izpišete na zaslon.

Primer: mnozenec, mnozitelj, zmnozek = mnozenec * mnozitelj, izpišete spremenljivko zmnozek.

Reševanje

Nalogo rešimo tako, da uvedemo novi spremenljivki, jima določimo vrednost, nato pa uvedemo tretjo, ki je zmnožek prejšnjih dveh. Rezultat izpišemo na zaslon s pomočjo funkcije print().

Primer rešitve: Programska koda 1.

1.2. Pozdrav

Pripravite program, ki vas bo vprašal po vašem imenu, nato pa vas bo pozdravil.

Primer: program vas vpraša Kako vam je ime? in vas po vpisu imena Robert pozdravi s Pozdravljen_a, Robert!.

Reševanje

Za reševanje uporabimo funkcijo input(), ki nas vpraša po imenu in naš vpis dodeli določeni spremenljivki kot niz znakov (string). Ta niz znakov lahko potem združimo s poljubnim besedilom in s pomočjo funkcije print() izpišemo na zaslon.

Primer rešitve: Programska koda 2.

1.4. Seštevanje števil

Pripravite program, ki vas bo pozval, da vpišete števili, nato pa ju bo seštel in vam vrnil rezultat.

1.5. Izračun ploščine in obsega pravokotnika

Pripravite program, ki vas bo pozval, da vpišete dolžini stranic pravokotnika, nato pa bo izračunal ploščino in obseg pravokotnika ter vam vrnil rezultata.

Reševanje

Tukaj je potrebno uporabnika pozvati k vpisu dolžin stranic s pomočjo funkcije input():

1.6. Pretvarjanje med Celzijevimi in Fahrenheitovimi stopinjami

Napišite program, ki mu uporabnik vpiše temperaturo v Fahrenheitovih stopinjah, program pa jo izpiše v Celzijevih (°F → °C). Med temperaturama pretvarjamo po formuli °C = 5/9 (°F – 32).

Za potrebe Američanov napiši še program, ki računa v nasprotni smeri (°C → °F).

Reševanje

V tem primeru spoznamo uporabo pogojnih stavkov. Pomembni sta formuli za pretvorbo med °C in °F:

  • formula za izračun °F → °C: T(°C) = (T(°F) - 32) / 1,8

  • formula za izračun °C → °F: T(°F) = 1,8 * T(°C) + 32

Pripravimo lahko tri programe:

1.7. Preverjanje, ali je podano število popoln kvadrat

Napišite program, ki mu podate število, program pa izpiše, ali gre za popoln kvadrat ali ne.

(Popoln kvadrat je v matematiki pozitivno celo število, ki se ga lahko zapiše kot kvadrat drugega celega števila.)

Reševanje

Kako lahko preverimo, če je število popoln kvadrat? Tako, da preverimo, če je koren tega števila celo število! Pri tem bomo spoznali novi funkciji is_integer() in int().

Nalogo lahko rešimo na več načinov:

1.8. Delitelji podanega števila

Napišite program, ki mu podate število, program pa sam poišče in izpiše vse delitelje podanega števila. Vsak delitelj naj bo izpisan zgolj enkrat, delitelji pa naj bodo urejeni po velikosti.

Reševanje

Za rešitev te naloge se moramo spomniti, da je za delitelja nekega števila značilno, da je ostanek pri deljenju števila z deliteljem enak 0. Na tem lahko gradimo. Za reševanje bomo uporabili zanko while, lahko pa bi nalogo rešili tudi s pomočjo zanke for.

Nalogo lahko rešimo tako, da:

1.9. Praštevilo

Napišite program, ki za podano število pove, ali je praštevilo.

Reševanje

Praštevilo je naravno število (n > 1), ki ima točno dva pozitivna delitelja (faktorja), število 1 in samega sebe.

Naloga je logično nadaljevanje naloge 8. Lahko jo rešimo tako, da preverjamo, koliko je deliteljev nekega števila. Če sta zgolj 2 (1 in število, ki ga preverjamo), smo našli praštevilo. Lahko pa preverimo vsa števila razen 1 in števila, ki ga preverjamo, in če najdemo še en delitelj, vemo, da število ni praštevilo, v nasprotnem primeru pa je.

1.10. Prestopno leto

Napišite program, ki za vpisano letnico pove, ali je (bilo/bo) leto prestopno.

Reševanje

Pravilo za določanje prestopnih let je:

  • Leto je prestopno, če je deljivo s 4, razen …​

  • …​ v primeru, da je leto deljivo s 100, leto ni prestopno, razen …​

  • …​ v primeru, da je leto deljivo s 400, leto je prestopno.

Zdaj že vidimo, da bo naša rešitev vsebovala nekaj pogojnih stavkov.

1.11. Fibonaccijevo zaporedje

Napiši program, ki izpiše prvih X členov Fibonaccijevega zaporedja. Število X na poziv vnese uporabnik.

Reševanje

Fibonaccijevo zaporedje se začne s številoma 1, 1, vsak naslednji člen pa dobimo tako, da seštejemo prejšnja dva. 1 in 1 je 2, 1 in 2 je 3, 2 in 3 je 5, 3 in 5 je 8 in tako naprej. Zaporedje se tako začne z 1 1 2 3 5 8 13 21 34 55.

Rešitev bo morala vsebovati pristop k prirejanju spremenljivk:

1.12. Računanje statistike

Napišite program, ki od uporabnika bere števila, dokler uporabnik ne vpiše števila 0.

Program naj sproti izpisuje največje vpisano število, najmanjše vpisano število ter povprečje vpisanih števil.

Rešitev

Nalogo rešimo s pomočjo zapisovanja vpisanih števil v polje.

Primer rešitve: naloga 12.

1.13. Seštevanje števk naravnega števila

Sestavite program, ki prebere naravno število in sešteje vse njegove števke, kar ponavlja, dokler ne pride do enomestnega števila. Program naj izpisuje vse vmesne rezultate.

1.14. Pravilno sklanjanje

Sestavite program, ki prebere število in v pravilni slovenščini izpiše, koliko opravljenih izpitov imate.

Rešitev

Težava je s sklanjanjem v slovenščini, saj opravimo 1 izpit, 2 izpita in 3 (ali 4) izpite ter 5 (ali več) izpitov.

Pozorni pa moramo biti tudi pri številih, večjih od 100! Opravimo namreč 101 (201, 301, …​) izpit, 102 izpita in 103 (ali 104) izpite ter 105 (ali več) izpitov.

Rešitev naloge: naloga 14.

1.16. Risanje smrečice

Napiši program, ki od uporabnika dobi naravno število, nato pa nariše smrečico z znakom *.

Smrečica naj ima toliko vrstic, kot jih uporabnik definira z vnosom naravnega števila.

1.17. Obrat naravnega števila

Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.

1.18. Je besedilo palindrom?

Sestavi program, v katerem uporabnik vpiše niz znakov, program pa pove, ali je vpisan niz znakov palindrom ali ne.

Pomoč: Palindrom je niz znakov, ki se enako prebere z leve in z desne.

Rešitvi

Rešitvi naloge:

1.19. Največji skupni delitelj podanih števil

Sestavi program, ki izračuna največji skupni delitelj števil a in b in izpiše vse vmesne rezultate Evklidovega algoritma.

1.20. Ugibanje celega števila med 0 in 100

Sestavi program, s katerim ugibamo celo število med 0 in 100.

Program naj si naključno izbere število med 0 in 100, uporabnik pa naj v čim manj poskusih ugane, katero število je izbral.

1.21. Ali trikotnik obstaja?

Sestavi program, ki bo prebral tri realna števila, nato pa preveril, ali obstaja trikotnik s takimi dolžinami stranic. Če obstaja, naj program izračuna njegovo ploščino in obseg.

Poglavje 2. Rešitve

2.1. Množenje števil

Pripravite program, v katerem dvema spremenljivkama določite vrednost, nato pa uvedete tretjo, ki je zmnožek prejšnjih dveh. Tretjo spremeljivko izpišete na zaslon.

Primer: mnozenec, mnozitelj, zmnozek = mnozenec * mnozitelj, izpišete spremenljivko zmnozek.

2.1.1. Rešitev

Programska koda 1. naloga001.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki zmnoži podani števili. """

# Podamo številki, ki ju bomo zmnožili
mnozenec = 2
mnozitelj = 4

# zmnožimo števili
zmnozek = mnozenec * mnozitelj

# izpišemo vsoto
print(zmnozek)
#print(f"Rezultat: {mnozenec} * {mnozitelj} = {zmnozek}")
Tabela 1. Razlaga
vrstica komentar

1

Dobra praksa je, da vsako datoteko začnemo z navedbo, da gre za program, napisan v programskem jeziku Python. Tako lahko v tej vrstici najdemo deklaracijo, ki se ne spreminja in je lahko za vsako datoteko identična. V računalništvu se shebang (imenovan tudi hashbang, hashpling, pound bang ali crunchbang) nanaša na znaka "#!", kadar sta to prva dva znaka v ukazu za tolmača kot prva vrstica besedilne datoteke. V operacijskem sistemu, podobnem Unixu, nalagalnik programa prisotnost teh dveh znakov razume kot znak, da je datoteka skripta, in poskuša to skripto izvesti z uporabo tolmača, določenega v preostanku prve vrstice v datoteki. V našem primeru gre za tolmač oziroma prevajalnik, ki prevaja ukaze, zapisane v programskem jeziku Python.

2

V tej vrstici se nahajajo navodila, ki aplikaciji, v kateri ste odprli datoteko s programsko kodo, pove, da mora znake v datoteki interpretirati s kodno tabelo UTF-8.

4

S tremi znaki " označujemo večvrstični niz znakov. Če se nahaja na začetku vrstice, Python vse, kar je vmes, interpretira kot komentar in ne izvaja.

6

Z znakom # se začenjajo enovrstični komentarji. Vse, kar se nahaja desno od znaka #, Python obravnava kot komentar.

7

Tukaj uvedemo spremenljivko mnozenec, ki ji dodelimo vrednost 2.

8

Tukaj uvedemo spremenljivko mnozitelj, ki ji dodelimo vrednost 4.

11

Uvedemo spremenljivko zmnozek, za katero določimo, da je zmnožek spremenljivk mnozenec in mnozitelj.

14

Vrednost spremenljivke zmnozek izpišemo na zaslon z uporabo funkcije print.

15

Če želite lepši izpis, lahko rezultat zapišete v kompleksnejši obliki. Če ste pozorni, je v izvorni kodi vrstica komentirana. Če želite, da se izpiše, je potrebno znak # odstraniti.

Če program zaženete, bo program izpisal zgolj rešitev. Če pa odstranite znak # v vrstici 15, pa bo izpis podoben spodnjemu.

Rezultat: 2 * 4 = 8

2.2. Pozdrav

Pripravite program, ki vas bo vprašal po vašem imenu, nato pa vas bo pozdravil.

Primer: program vas vpraša Kako vam je ime? in vas po vpisu imena Robert pozdravi s Pozdravljen_a, Robert!.

2.2.1. Rešitev

Programska koda 2. naloga002.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki vas vpraša po imenu, nato pa vas pozdravi. """

# povprašamo po imenu
ime = input("Kako ti je ime? ")

# pozdravimo
print(f"Pozdravljen_a, {ime}!")
Tabela 2. Razlaga
vrstica komentar

7

Da nam lahko uporabnik vnese vrednost, ki jo priredimo spremenljivki ime, uporabimo vgrajeno funkcijo input(). Funkcija nam vrne vrednost tipa string (niz znakov).

10

Izpišemo pozdrav.

Izpis programa bo podoben naslednjemu.

Kako ti je ime? Herman Celjski
Pozdravljen_a, Herman Celjski!

2.3. Izračun ploščine in obsega kroga

Pripravite program, ki vam bo za podan polmer izračunal ploščino in obseg kroga ter vam izpisal rezultat.

2.3.1. Rešitev #1

Programska koda 3. naloga003a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# določimo polmer
r = 5

# izračunamo ploščino kroga
ploscina = 3.14 * r * r

# izračunamo obseg kroga
obseg =  2 * 3.14 * r

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")
Tabela 3. Razlaga
vrstica komentar

4

S tremi znaki " označujemo večvrstične komentarje. Vse, kar je vmes, Python interpretira kot komentar in ne izvaja.

6

Z znakom # se začenjajo enovrstični komentarji. Vse, kar se nahaja desno od znaka #, Python obravnava kot komentar.

7

Tukaj uvedemo spremenljivko r in ji dodelimo vrednost 5.

10

Uvedemo spremenljivko ploscina, ki ji dodelimo ploščino, izračunano po formuli π * r2.

13

Uvedemo spremenljivko obseg, ki ga izračunamo po formuli 2 * π * r.

16 in 17

Izpišemo rezultata.

Če program zaženete, bo program izpisal rešitev v naslednji obliki.

Ploščina kroga s polmerom 5 je 78.5.
Obseg kroga s polmerom 5 je 31.400000000000002.

Opazite lahko, da je vrednost spremenljivke obseg drugačna, kot bi pričakovali. Z vašim programom ni prav nič narobe! To se zgodi zaradi numerične napake samega programskega jezika. Vrednosti s plavajočo decimalno vejico (tip float) na splošno nimajo natančne dvojiške predstavitve. To je posledica načina, kako centralna procesna enota (CPU) računalnika obdeluje podatke s plavajočo vejico (decimalna številka). Zaradi tega lahko pride do določene izgube natančnosti in nekatere operacije s plavajočo vejico lahko dajo nepričakovane rezultate.

Takšno obnašanje je lahko posledica enega od naslednjih dejavnikov:

  • Dvojiška (binarna) predstavitev decimalnega števila morda ni natančna.

  • Med uporabljenimi števili prihaja do neujemanja tipov (na primer uporaba števil tipa float in integer).

Več o samem fenomenu si lahko preberete tukaj.

Pozor

Sam program lahko seveda precej izboljšamo:

  • Za potenciranje lahko uporabimo drugačen način zapisa.

  • Namesto približka vrednosti π lahko uporabimo natančnejšo vrednost.

  • Vrednosti lahko zaokrožimo.

  • Polmer lahko podamo interaktivno.

2.3.2. Rešitev #2: uporaba natančnejše vrednosti π

Programska koda 4. naloga003b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = 5

# izračunamo ploščino kroga
ploscina = math.pi * r * r

# izračunamo obseg kroga
obseg =  2 * math.pi * r

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Če primerjamo rešitev 1 in rešitev 2 opazimo, da smo v drugem poskusu dodali vrstici 6 in 7 ter spremenili vrstici 13 in 16. V vrstici 7 smo vključili Python modul math, ki nam (poleg ostalega) omogoča uporabo matematičnih konstant. Brez te vrstice ne bi mogli uporabiti matematične konstante math.pi, ki nam da natančnejšo vrednost π in boljši končni rezultat.

Program sedaj vrne bolj natančen rezultat.

Ploščina kroga s polmerom 5 je 78.53981633974483.
Obseg kroga s polmerom 5 je 31.41592653589793.

Še vedno pa so možne izboljšave (vsaj pri zakroževanju, saj nas ne zanima toliko decimalk).

2.3.3. Rešitev #3: uporaba alternativnega načina potenciranja

Programska koda 5. naloga003c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = 5

# izračunamo ploščino kroga
ploscina = math.pi * r**2

# izračunamo obseg kroga
obseg =  2 * math.pi * r

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Če primerjamo rešitev 2 in rešitev 3 opazimo, da smo tokrat spremenili vrstico 13, kjer smo namesto množenja r * r uporabili zapis r**2, kar je v programskem jeziku Python enakovredno zapisu r2. Zapisa sta enakovredna in izpis je identičen.

2.3.4. Rešitev #4: uporaba alternativnega načina potenciranja #2

Programska koda 6. naloga003d.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = 5

# izračunamo ploščino kroga
ploscina = math.pi * math.pow(r,2)

# izračunamo obseg kroga
obseg =  2 * math.pi * r

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Ker smo že v rešitvi 2 vključili modul math, lahko za potenciranje uporabimo tudi njegovo vgrajeno funkcijo math.pow(). Tako lahko v vrstici 13 polmer r potenciramo v obliki math.pow(r,2). Funkcija math.pow() potrebuje 2 parametra: prvi je vrednost, ki jo potenciramo, drugi parameter pa označuje potenco. Tudi ta oblika zapisa je enakovredna obema prejšnjima, tako da je izpis identičen.

2.3.5. Rešitev #5: zaokroževanje

Programska koda 7. naloga003e.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = 5

# izračunamo ploščino kroga
ploscina = math.pi * math.pow(r,2)
ploscina = round(ploscina,2)

# izračunamo obseg kroga
obseg =  2 * math.pi * r
obseg = round(obseg,2)

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Običajno ne potrebujemo tako natančnih vrednosti in jih želimo zakrožiti na manj decimalnih mest. V ta namen lahko uporabimo vgrajeno funkcijo round, kar smo naredili v vrsticah 14 in 18. Funkcija round() zahteva dva parametra: prvi parameter je številčna vrednost, drugi pa želeno število decimalnih mest. Izpis po tej spremembi se seveda spremeni.

Ploščina kroga s polmerom 5 je 78.54.
Obseg kroga s polmerom 5 je 31.42.

2.3.6. Rešitev #6: interaktivni vnos polmera r

Programska koda 8. naloga003f.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = input("Vnesi polmer kroga: ")
# pretvorimo r v številko
r = float(r)

# izračunamo ploščino kroga
ploscina = math.pi * math.pow(r,2)
ploscina = round(ploscina,2)

# izračunamo obseg kroga
obseg =  2 * math.pi * r
obseg = round(obseg,2)

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Da ne bi bilo potrebno vedno spreminjati programa, ko želimo izračun za drugačno vrednost polmera r, lahko program spremenimo tako, da nas interaktivno vpraša po vrednosti polmera. V ta namen uporabimo vgrajeno funkcijo input, ki uporabnika pozove k vnosu polmera. To smo storili v vrstici 10. Pri tem je potrebno biti pozoren, saj vgrajena funkcija input vedno vrne spremenljivko tipa string. To pomeni, da moramo dobljeno spremenljivko spremeniti v enega od številskih tipov (int, float), saj nam bo v nasprotnem primeru program vrnil napako. To smo storili v vrstici 12.

Izpis je sedaj podoben spodnjemu.

Vnesi polmer kroga: 5
Ploščina kroga s polmerom 5.0 je 78.54.
Obseg kroga s polmerom 5.0 je 31.42.
Pozor

Kljub vsem spremembam pa program še vedno ni popoln, saj ne preverja vnosov. To lahko preverite tako, da takrat, ko vas pozove k vnosu polmera r namesto številke vpišete črko. Program se bo v takšnem primeru ustavil z napako.

Primer izpisa, če vnesemo črko namesto številke.

Vnesi polmer kroga: r
Traceback (most recent call last):
  File "naloga003f.py", line 12, in <module>
    r = float(r)
        ^^^^^^^^
ValueError: could not convert string to float: 'r'

Seveda lahko pripravimo program, ki bo obravnaval tudi to izjemo.

2.3.7. Rešitev #6: interaktivni vnos polmera r s kontrolo vnosa

Programska koda 9. naloga003g.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega kroga. """

# vključimo modul math
import math

# določimo polmer
r = input("Vnesi polmer kroga: ")

# poskusimo pretvoriti r v številko
try:
    r = float(r)
except:
    print(f"'{r}' ni številka!")
    quit()

# izračunamo ploščino kroga
ploscina = math.pi * math.pow(r,2)
ploscina = round(ploscina,2)

# izračunamo obseg kroga
obseg =  2 * math.pi * r
obseg = round(obseg,2)

# izpišemo ploščino in obseg kroga
print(f"Ploščina kroga s polmerom {r} je {ploscina}.")
print(f"Obseg kroga s polmerom {r} je {obseg}.")

Razlika med Programska koda 8 in Programska koda 9 je zgolj v vrsticah 13-17. Program v vrstici 14 poskusi pretvoriti vnos iz podatkovnega tipa string v tip float. Če mu to ne uspe, v vrstici 16 izpiše, da vnosna vrednost ne predstavlja številke in se v vrstici 17 ustavi. Če je z vnosom vse v redu, program deluje tako kot Programska koda 8.

Izpis v primeru napačnega vnosa je sedaj podoben spodnjemu.

Vnesi polmer kroga: r
'r' ni številka!

2.4. Seštevanje števil

Pripravite program, ki vas bo pozval, da vpišete števili, nato pa ju bo seštel in vam vrnil rezultat.

2.4.1. Rešitev #1

Programska koda 10. naloga004a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki sešteje podani števili. """

# Izpišemo, za kakšen program gre
print("*"*40)
print("*"*5,"Program za seštevanje števil","*"*5)
print("*"*40)

# Podamo številki, ki ju seštevamo
sestevanec1 = input('Vnesite prvo število: ')
sestevanec2 = input('Vnesite drugo število: ')

# seštejemo števili
vsota = sestevanec1 + sestevanec2

# izpišemo vsoto
print(f"Rezultat: {sestevanec1} + {sestevanec2} = {vsota}")
Tabela 4. Razlaga
vrstica komentar

7

Funkcijo print() že poznamo, velja pa spomniti, da sintaksa "*" * 40 pomeni, da bomo niz znakov "*" ponovili 40-krat. Povedano drugače, izpis funkcije print("RI"*3) bi bil RIRIRI. Naša sintaksa zgoraj bo torej pomenila, da bomo izpisali 40 znakov *.

12

Uporabnika pozovemo, da vpiše prvo število, ki ga priredimo spremenljivki z imenom sestevanec1.

13

Uporabnika pozovemo, da vpiše drugo število, ki ga priredimo spremenljivki z imenom sestevanec2.

16

Uvedemo novo spremenljivko vsota, ki dobi vrednost seštevka spremenljivk sestevanec1 in sestevanec2.

19

Izpišemo vsoto.

Če program zaženete, bo izpis podoben spodnjemu.

****************************************
***** Program za seštevanje števil *****
****************************************
Vnesite prvo število: 1
Vnesite drugo število: 2
Rezultat: 1 + 2 = 12

Zakaj ne sešteje vrednosti? Zato, ker nam Python funkcija input vrne niz znakov (vrednost tipa string) in ne enega od številskih tipov (integer, float, …​). S seštevanjem dveh vrednosti v 16. vrstici kode (Programska koda 10) smo tako sestavili dva niza znakov (postavili enega k drugemu) in ne sešteli. To se zgodi tudi v primeru, da vpišemo številke, saj funkcija input v vsakem primeru vrne vrednost tipa string.

Rešitev je pretvorba podatkovnega tipa string v enega od številskih tipov (integer ali float). Če pretvorimo v integer, bo program deloval, a zgolj za cela števila, pri vnosu decimalnih števil bo vrnil napako, zato bomo pretvorili v podatkovni tip float.

2.4.2. Rešitev #2

Programska koda 11. naloga004b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki sešteje podani števili. """

# Izpišemo, za kakšen program gre
print("*"*40)
print("*"*5,"Program za seštevanje števil","*"*5)
print("*"*40)

# Podamo številki, ki ju seštevamo
sestevanec1 = input('Vnesite prvo število: ')
sestevanec2 = input('Vnesite drugo število: ')

# spremenimo tip spremenljivke iz 'string' v 'float'
sestevanec1 = float(sestevanec1)
sestevanec2 = float(sestevanec2)

# seštejemo števili
vsota = sestevanec1 + sestevanec2

# izpišemo vsoto
print(f"Rezultat: {sestevanec1} + {sestevanec2} = {vsota}")

Razlika med Programska koda 10 in Programska koda 11 je zgolj v vrsticah 16 in 17, kjer smo spremenili tipa spremenljivk sestevanec1 in sestevanec2 iz string v float. Vse ostalo ostane enako.

Program po tej spremembi sešteje obe podani števili.

****************************************
***** Program za seštevanje števil *****
****************************************
Vnesite prvo število: 1
Vnesite drugo število: 2
Rezultat: 1.0 + 2.0 = 3.0

Seveda pa so lahko rešitve tudi drugačne.

2.4.3. Rešitev #3

Programska koda 12. naloga004c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki sešteje podani števili. """

# Izpišemo, za kakšen program gre
print("*"*40)
print("*"*5,"Program za seštevanje števil","*"*5)
print("*"*40)

# Podamo številki, ki ju seštevamo
sestevanec1 = input('Vnesite prvo število: ')
sestevanec2 = input('Vnesite drugo število: ')

# spremenimo tip spremenljivke iz 'string' v 'float'
sestevanec1 = float(sestevanec1)
sestevanec2 = float(sestevanec2)

# seštejemo števili
vsota = sestevanec1 + sestevanec2

# izpišemo vsoto
print("Rezultat: {} + {} = {}".format(sestevanec1,sestevanec2,vsota))

Drugačna je zgolj zadnja vrstica kode.

2.4.4. Rešitev #4

Programska koda 13. naloga004d.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki sešteje podani števili. """

# Izpišemo, za kakšen program gre
print("*"*40)
print("*"*5,"Program za seštevanje števil","*"*5)
print("*"*40)

# Podamo številki, ki ju seštevamo
sestevanec1 = input('Vnesite prvo število: ')
sestevanec2 = input('Vnesite drugo število: ')

# spremenimo tip spremenljivke iz 'string' v 'float'
sestevanec1 = float(sestevanec1)
sestevanec2 = float(sestevanec2)

# seštejemo števili
vsota = sestevanec1 + sestevanec2

# izpišemo vsoto
print("Rezultat: "+str(sestevanec1)+" + "+str(sestevanec2)+" = "+str(vsota))

Tako primer Programska koda 12 kot tudi Programska koda 13 se od Programska koda 11 razlikujeta zgolj v vrstici 23, kjer s pomočjo funkcije print izpišemo niz znakov (string), ki ga vsakič pripravimo drugače. Vsi načini so enakovredni, gre le za berljivost izvorne kode. Bodite pozorni na primer Programska koda 13, kjer v omenjeni vrstici uporabimo tudi funkcijo str, ki spremeljivko tipa float spremeni v spremenljivko tipa string! To storimo zato, ker je potrebno pri programiranju operirati s spremenljivkami istega tipa in v tem primeru za izpis združujemo nize znakov.

V svojih programih lahko uporabljate kateri koli način. Izpis vseh treh programov je identičen.

Pozor

Kljub tej spremembi program še vedno ne deluje v vseh primerih povsem pravilno, saj ne preverja vnosov. Da je res tako, lahko preverite tudi sami, tako, da namesto številk vnesete črke ali pa decimalne številke zapišete z vejico. Program se bo v takšnem primeru ustavil z napako. Seveda lahko zajamemo tudi primere napačnih vnosov.

2.4.5. Rešitev #5: preverjanje vnosov

Programska koda 14. naloga004e.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki sešteje podani števili. """

# Izpišemo, za kakšen program gre
print("*"*40)
print("*"*5,"Program za seštevanje števil","*"*5)
print("*"*40)

# Podamo številki, ki ju seštevamo
sestevanec1 = input('Vnesite prvo število: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    sestevanec1 = float(sestevanec1)
except:
    print(f"Prva podana vrednost ni število. Podali ste {sestevanec1}.")
    quit()

sestevanec2 = input('Vnesite drugo število: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    sestevanec2 = float(sestevanec2)
except:
    print(f"Druga podana vrednost ni število. Podali ste {sestevanec2}.")
    quit()

# seštejemo števili
vsota = sestevanec1 + sestevanec2

# izpišemo vsoto
print(f"Rezultat: {sestevanec1} + {sestevanec2} = {vsota}")

V tej rešitvi preverjamo tudi uporabnikove vnose. Vse prejšnje rešitve (Programska koda 10, Programska koda 11, Programska koda 12 in Programska koda 13) namreč odpovedo, če uporabnik namesto številke vnese kakšen drug znak. Zato smo v tej rešitvi uvedli preverjanje izjem. Tako v vrtici 15 povemo, da bomo v vrstici 16 poskusili spremenljivko sestevanec1 pretvoriti iz tipa string v tip float:

  • Če bo pretvorba uspešna, se bo naš program izvajal od vrstice 20 dalje (izpustil bo del kode, ki se nahaja pod izjemo (except)).

  • Če pretvorba ne bo uspešna, bo izvedel kodo, ki se nahaja v bloku except (izvedel bo kodo v vrstici 18 ter vrstici 19). Najprej bo torej izpisal obvestilo, da podana vrednost ni število, takoj zatem pa bo prekinil izvajanje programa (v ta namen smo uporabili funkcijo quit(), ki prekine izvajanje).

Preverjanje ponovimo tudi za vnos druge številke (vrstice 24-28).

2.5. Izračun ploščine in obsega pravokotnika

Pripravite program, ki vas bo pozval, da vpišete dolžini stranic pravokotnika, nato pa bo izračunal ploščino in obseg pravokotnika ter vam vrnil rezultata.

2.5.1. Rešitev #1: računanje brez preverjanja vnosov

Programska koda 15. naloga005a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega pravokotnika. """

# Izpišemo, za kakšen program gre
print("*"*64)
print("*"*5,"Program za računanje ploščine in obsega pravokotnika","*"*5)
print("*"*64)

# Podamo stranici pravokotnika
stranicaA = input('Vnesite dolžino stranice a: ')
stranicaB = input('Vnesite dolžino stranice b: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
stranicaA = float(stranicaA)
stranicaB = float(stranicaB)

# izračun obsega in ploščine
obseg = 2*stranicaA + 2*stranicaB
ploscina = stranicaA * stranicaB

# izpišemo ploščino in obseg
print(f"Ploščina pravokotnika s stranicama {stranicaA} in {stranicaB} je {ploscina}.")
print(f"Obseg pravokotnika s stranicama {stranicaA} in {stranicaB} je {obseg}.")

Če program zaženete, bo izpis podoben spodnjemu.

****************************************************************
***** Program za računanje ploščine in obsega pravokotnika *****
****************************************************************
Vnesite dolžino stranice a: 2
Vnesite dolžino stranice b: 4
Ploščina pravokotnika s stranicama 2.0 in 4.0 je 8.0.
Obseg pravokotnika s stranicama 2.0 in 4.0 je 12.0.
Tabela 5. Razlaga
vrstica komentar

12

Uporabnika pozovemo, da vpiše dolžino stranice a, vrednost pa priredimo spremenljivki z imenom stranicaA.

13

Uporabnika pozovemo, da vpiše dolžino stranice b, vrednost pa priredimo spremenljivki z imenom stranicaB.

16

Spremenljivko stranicaA s pomočjo vgrajene funkcije float() spremenimo iz podatkovnega tipa string v tip float.

17

Spremenljivko stranicaB s pomočjo vgrajene funkcije float() spremenimo iz podatkovnega tipa string v tip float.

20

Uvedemo novo spremenljivko obseg in ji dodelimo vrednost rezultata formule za izračun obsega pravokotnika.

21

Uvedemo novo spremenljivko ploscina in ji dodelimo vrednost rezultata formule za izračun ploščine pravokotnika.

24

Izpišemo rezultat.

25

Izpišemo rezultat.

Pozor

Kljub tej spremembi program, tako kot tudi v primeru 2.4: seštevanje števil, še vedno ne deluje v vseh primerih povsem pravilno, saj ne preverja vnosov. Da je res tako, lahko preverite tudi sami, tako, da namesto številk za dolžino stranice a ali b vnesete črke ali pa decimalne številke zapišete z vejico. Program se bo v takšnem primeru ustavil z napako.

Napaka v primeru vnosa črke namesto številke je podobna naslednji.

****************************************************************
***** Program za računanje ploščine in obsega pravokotnika *****
****************************************************************
Vnesite dolžino stranice a: r
Vnesite dolžino stranice b: k
Traceback (most recent call last):
  File "naloga005a.py", line 16, in <module>
    stranicaA = float(stranicaA)
                ^^^^^^^^^^^^^^^^
ValueError: could not convert string to float: 'r'

Seveda lahko zajamemo tudi primere napačnih vnosov.

2.5.2. Rešitev #2: računanje s preverjanjem vnosov

Programska koda 16. naloga005b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program za računanje ploščine in obsega pravokotnika. """

# Izpišemo, za kakšen program gre
print("*"*64)
print("*"*5,"Program za računanje ploščine in obsega pravokotnika","*"*5)
print("*"*64)

# Podamo stranici pravokotnika
stranicaA = input('Vnesite dolžino stranice a: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    stranicaA = float(stranicaA)
except:
    print(f"Podali ste '{stranicaA}', kar ni število.")
    quit()

stranicaB = input('Vnesite dolžino stranice b: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    stranicaB = float(stranicaB)
except:
    print(f"Podali ste '{stranicaB}', kar ni število.")
    quit()

# izračun obsega in ploščine
obseg = 2*stranicaA + 2*stranicaB
ploscina = stranicaA * stranicaB

# izpišemo ploščino in obseg
print(f"Ploščina pravokotnika s stranicama {stranicaA} in {stranicaB} je {ploscina}.")
print(f"Obseg pravokotnika s stranicama {stranicaA} in {stranicaB} je {obseg}.")

Razlika med Programska koda 15 in Programska koda 16 je zgolj v vrsticah 14-19 in 23-28. Sedaj že vemo: program v vrsticah 16 in 25 poskusi pretvoriti vnos iz podatkovnega tipa string v tip float. Če mu to ne uspe, v vrsticah 18 in 27 izpiše, da tega ne more storiti, in se v vrstici 19 ali pa 28 ustavi. Če je z vnosom vse v redu, program deluje tako kot Programska koda 15.

Sedaj je izpis v primeru napačnega vnosa podoben naslednjemu.

****************************************************************
***** Program za računanje ploščine in obsega pravokotnika *****
****************************************************************
Vnesite dolžino stranice a: r
Podali ste 'r', kar ni število.

2.6. Pretvarjanje med Celzijevimi in Fahrenheitovimi stopinjami

Napišite program, ki mu uporabnik vpiše temperaturo v Fahrenheitovih stopinjah, program pa jo izpiše v Celzijevih (°F → °C). Med temperaturama pretvarjamo po formuli °C = 5/9 (°F – 32).

Za potrebe Američanov napiši še program, ki računa v nasprotni smeri (°C → °F).

2.6.1. Rešitev #1: °F → °C

Programska koda 17. naloga006a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#T(°C) = (T(°F) - 32)/1,8
#T(°F) = 1,8 T(°C) + 32

# Izpišemo, za kakšen program gre
print("*"*73)
print("*"*5,"Program za pretvarjanje stopinj Fahrenheita v stopinje Celzija","*"*5)
print("*"*73)

# Podajte 
temperaturaF = input('Vnesite °F: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    temperaturaF = float(temperaturaF)
except:
    print(f"Podana vrednost ni število. Podali ste {temperaturaF}.")
    quit()

# pretvorimo F v C
temperaturaC = (temperaturaF - 32)*5/9

# zaokrožimo temperaturo v °C na 1 decimalko
temperaturaC = round(temperaturaC,1)

# izpišemo rezultat
print(f"{temperaturaF} °F = {temperaturaC} °C")

Če program zaženete, bo izpis podoben spodnjemu.

**************************************************************************
***** Program za pretvarjanje stopinj Fahrenheita v stopinje Celzija *****
**************************************************************************
Vnesite °F: 56
56.0 °F = 13.3 °C

V programu ni nič novega, vse smo spoznali že v prejšnjih nalogah:

  • Uporabnika najprej pozovemo, da vpiše temperaturo v °F (vrstica 17).

  • Vnos (vrednost spremenljivke temperaturaF) poskusimo spremeniti iz tipa string (ki ga vrne funkcija input()) v tip float. Če pretvorba ni uspešna, program izpiše, da vpisana vrednost ni številka, in se prekine, v nasprotnem primeru pa se izvajanje nadaljuje. Vse to se zgodi v vrsticah 20-24.

  • Če se izvajanje programa ni prekinilo (kar pomeni, da je bil vnos številčen), pretvorimo °F v °C (vrstica 27).

  • V vrstici 30 vrednost spremenljivke temperaturaC s pomočjo funkcije round zaokrožimo na eno decimalno mesto.

  • Rezultat izpišemo (vrstica 29).

2.6.2. Rešitev #2: °C → °F

Programska koda 18. naloga006b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#T(°C) = (T(°F) - 32)/1,8
#T(°F) = 1,8 T(°C) + 32

# Izpišemo, za kakšen program gre
print("*"*73)
print("*"*5,"Program za pretvarjanje stopinj Celzija v stopinje Fahrenheita","*"*5)
print("*"*73)

# Podajte 
temperaturaC = input('Vnesite °C: ')

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    temperaturaC = float(temperaturaC)
except:
    print(f"Podana vrednost ni število. Podali ste {temperaturaC}.")
    quit()

# pretvorimo F v C
temperaturaF = (temperaturaC)*1.8+32

# zaokrožimo C na 1 decimalko
temperaturaF = round(temperaturaF,1)

# izpišemo rezultat
print(f"{temperaturaC} °C = {temperaturaF} °F")

Izpis programa:

**************************************************************************
***** Program za pretvarjanje stopinj Celzija v stopinje Fahrenheita *****
**************************************************************************
Vnesite °C: 30
30.0 °C = 86.0 °F

2.6.3. Rešitev #3: Pretvorba v obe smeri

Seveda so možne tudi rešitve, kjer lahko v en program združimo pretvorbi v obe smeri - združimo Programska koda 17 in Programska koda 18 v skupen program.

Ena od možnih rešitev je naslednja.

Programska koda 19. naloga006c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Izpišemo, za kakšen program gre
print("*"*54)
print("*"*5,"Program za pretvarjanje °C v °F in obratno","*"*5)
print("*"*54)

# navodilo
print("Podajte vrednost, ki jo želite pretvoriti.")
print("Dodajte C, če je vrednost v °C, in F, če je vrednost v °F. Primer: '23 C'")

# uporabnik poda vrednost 
vnos = input('Vnesite stopinje: ')

# odstranimo morebitne presledke na začetku in koncu vnosnega niza znakov
vnos = vnos.strip()

# preberemo zadnji znak
lestvica = vnos[-1]

# preberemo stopinje
temperatura = vnos[:-1]

# odstranimo morebitne presledke na začetku in koncu vnosnega niza znakov
temperatura = temperatura.strip()

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
try:
    temperatura = float(temperatura)
except:
    print(f"Podana vrednost ni število. Podali ste {vnos}.")
    quit()

# preverimo, ali pretvarjamo °F v °C ali °C v °F
if lestvica == "C" or lestvica == "c":
    # pretvorimo F v C
    temperaturaF = (temperatura)*1.8+32

    # izpišemo rezultat pretvorbe
    print(f"{temperatura} °C = {temperaturaF} °F")
elif lestvica == "F" or lestvica == "f":
    # pretvorimo F v C
    temperaturaC = (temperatura - 32)*5/9

    # zaokrožimo C na 1 decimalko
    temperaturaC = round(temperaturaC,1)

    # izpišemo rezultat
    print(f"{temperatura} °F = {temperaturaC} °C")
else:
    # ne pretvarjamo ne F in ne C
    print("Niste določili, po kateri lestvici je vrednost, ki ste jo podali.")

Program je precej daljši, saj vsebuje kar nekaj kontrol in dodatne kode.

Tabela 6. Razlaga
vrstica komentar

11

Navodilo uporabniku pove, da mora poleg temperature vpisati tudi enoto (C za °C in F za °F). Dodan je tudi primer vnosa.

17

V tej vrstici s pomočjo funkcije strip() iz spremenljivke vnos odstranimo morebitne presledke pred in za nizom znakov. To pomeni, da če uporabnik namesto '30 C' vnese ' 30 C ', mi niz znakov spremenimo tako, da bo vrednost spremenljivke vnos enaka '30 C'.

20

Tukaj uvedemo spremenljivko lestvica, ki ji priredimo vrednost, ki je enaka zadnjemu znaku v nizu znakov (string) vnos. Z drugimi besedami: 'odrežemo' zadnji znak in ga priredimo spremenljivki lestvica. Če torej uporabnik vnese vrednost '30 C', bo po tej vrstici vrednost spremenljivke lestvica enaka 'C'.

23

V tej vrstici storimo podobno kot v vrstici 20, le da uvedemo spremenljivko temperatura in ji priredimo vrednost, ki je enaka vsem znakom v nizu znakov (string) vnos, razen zadnjega. Z drugimi besedami: spremenljivki vnos odstranimo zadnji znak in ostalo priredimo spremenljivki temperatura. Če torej uporabnik vnese vrednost '30 C', bo po tej vrstici vrednost spremenljivke temperatura enaka '30 ' (bodite pozorni na presledek za številko).

26

Ker po vrstici 23 lahko ostanejo neželeni presledki, ki onemogočajo pretvorbo iz niza znakov (string) v decimalno število (float), jih moramo odstraniti. V ta namen ponovno uporabimo funkcijo strip().

29-33

Poskusimo pretvoriti tip spremenljivke temperatura v decimalno število. Če nam ne uspe, izvajanje programa prekinemo.

36-41

Preverimo, če je vrednost spremenljivke lestvica enaka veliki ali mali črki 'C'. Če je, je uporabnik vnesel temperaturo v °C, zato pretvorimo v °F in rezultat izpišemo. V tem delu je koda identična Programska koda 18.

42-50

Če vrednost spremenljivke lestvica ni enaka veliki ali mali črki 'C', je pa enaka veliki ali mali črki 'F', je uporabnik vnesel temperaturo v °F, zato pretvorimo v °C in rezultat izpišemo. V tem delu je koda identična Programska koda 17.

51-53

Če se program izvede do sem, uporabnik ni vnesel predvidene oznake 'F' ali 'C' in se zato program brez pretvorbe konča.

Izpis je približno podoben naslednjemu.

******************************************************
***** Program za pretvarjanje °C v °F in obratno *****
******************************************************
Podajte vrednost, ki jo želite pretvoriti.
Dodajte C, če je vrednost v °C, in F, če je vrednost v °F. Primer: '23 C'
Vnesite stopinje: 30   F
30.0 °F = -1.1 °C

Kot lahko opazite, zna naš program računati tudi v primeru, da je presledkov med številko in enoto več.

Če uporabnik ne vnese oznake lestvice (F ali C), se program konča na naslednji način.

******************************************************
***** Program za pretvarjanje °C v °F in obratno *****
******************************************************
Podajte vrednost, ki jo želite pretvoriti.
Dodajte C, če je vrednost v °C, in F, če je vrednost v °F. Primer: '23 C'
Vnesite stopinje: 23
Niste določili, po kateri lestvici je vrednost, ki ste jo podali.

2.7. Preverjanje, ali je podano število popoln kvadrat

Napišite program, ki mu podate število, program pa izpiše, ali gre za popoln kvadrat ali ne.

(Popoln kvadrat je v matematiki pozitivno celo število, ki se ga lahko zapiše kot kvadrat drugega celega števila.)

2.7.1. Rešitev #1: s pomočjo modula math in funkcije math.sqrt()

Programska koda 20. naloga007a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki preveri, ali je podano število popoln kvadrat. """

# Izpišemo, za kakšen program gre
print("*"*53)
print("*"*5,"Program za preverjanje popolnih kvadratov","*"*5)
print("*"*53)

# Uvozimo potrebne Python module
import math

# Uporabnika pozovemo, da vpiše število, ki ga bomo preverili
stevilo = input("Vpišite število: ")

# Lepotni izpis
print("-"*53)

# Izpišemo število, ki ga je uporabnik vnesel
print(f"Število, ki ga preverjamo, je: {stevilo}")

# Lepotni izpis
print("="*53)

# Spremenljivko število pretvorimo v tip 'float'
stevilo_stevilo = float(stevilo)

# Izračunamo koren podanega števila
koren = math.sqrt(stevilo_stevilo)

# Preverimo, če je izračunan koren tipa 'integer'
if koren.is_integer():
    # ker vemo, da je koren tipa integer, ga pretvorimo v ta tip
    koren = int(koren)
    # izpišemo besedilo
    print(f"Podano število {stevilo} je popoln kvadrat števila {koren}!")
else:
    # izpišemo obvestilo, da podano število ni popoln kvadrat 
    print(f"Podano število {stevilo} ni popoln kvadrat.")
# Lepotni izpis
print("-"*53)

Posebnost programa je uporaba funkcije math.sqrt() v vrstici 30, ki vrne koren števila. Seveda je za to, da lahko funkcijo math.sqrt() sploh uporabimo, potrebno vključiti modul math, kar smo storili v vrstici 12.

Prav tako sta novi funkciji is_integer() ter int(). Funkcijo is_integer() smo uporabili v vrstici 33, da smo preverili, če je koren, izračunan v vrstici 30, celo število. Če je, potem imamo popoln kvadrat, in lahko neznanko stevilo pretvorimo v podatkovni tip integer, kar storimo v vrstici 35 s funkcijo int(). To storimo zgolj zato, da nam program vrne celo število (kar je logično, če gre za popoln koren) in ne izpisuje decimalk.

Ostanejo nam samo še ustrezni izpisi.

Če program zaženete, bo izpis podoben spodnjemu.

*****************************************************
***** Program za preverjanje popolnih kvadratov *****
*****************************************************
Vpišite število: 9
-----------------------------------------------------
Število, ki ga preverjamo, je: 9
=====================================================
Podano število 9 je popoln kvadrat števila 3!
-----------------------------------------------------

2.7.2. Rešitev #2: brez pomoči modula math

Če ne želite vključiti modula math, lahko rešitev poiščete drugače.

Programska koda 21. naloga007b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki preveri, ali je podano število popoln kvadrat brez vključenega modula math. """

# Izpišemo, za kakšen program gre
print("*"*53)
print("*"*5,"Program za preverjanje popolnih kvadratov","*"*5)
print("*"*53)

# Uporabnika pozovemo, da vpiše število, ki ga bomo preverili
stevilo = input("Vpišite število: ")

# Lepotni izpis
print("-"*53)

# Izpišemo število, ki ga je uporabnik vnesel
print(f"Število, ki ga preverjamo, je: {stevilo}")

# Lepotni izpis
print("="*53)

# Spremenljivko število pretvorimo v tip 'float'
stevilo_stevilo = float(stevilo)

# Izračunamo koren podanega števila
koren = stevilo_stevilo**0.5

# Preverimo, če je izračunan koren tipa 'integer'
if koren.is_integer():
    # ker vemo, da je koren tipa integer, ga pretvorimo v ta tip
    koren = int(koren)
    # izpišemo besedilo
    print(f"Podano število {stevilo} je popoln kvadrat števila {koren}!")
else:
    # izpišemo obvestilo, da podano število ni popoln kvadrat 
    print(f"Podano število {stevilo} ni popoln kvadrat.")
# Lepotni izpis
print("-"*53)

Razlik med Programska koda 20 in Programska koda 21 ni veliko. Opazite lahko, da v tem primeru nismo vključili modula math in da smo v vrstici 27 za korenjenje uporabili vgrajeno možnost potenciranja (za kar uporabimo dva znaka **). Rezultat (in tudi izpis) je identičen Programska koda 20.

Vendar pa tako Programska koda 20 in Programska koda 21 odpovesta, če namesto številke vnesete črko. Izpis bo v tem primeru podoben naslednjemu.

*****************************************************
***** Program za preverjanje popolnih kvadratov *****
*****************************************************
Vpišite število: rk
-----------------------------------------------------
Število, ki ga preverjamo, je: rk
=====================================================
Traceback (most recent call last):
  File "naloga007b.py", line 24, in <module>
    stevilo_stevilo = float(stevilo)
                      ^^^^^^^^^^^^^^
ValueError: could not convert string to float: 'rk'

Seveda znamo popraviti tudi to.

2.7.3. Rešitev #3: s kontrolami vnosa

Programska koda 22. naloga007c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki preveri, ali je podano število popoln kvadrat s kontrolami. """

# Izpišemo, za kakšen program gre
print("*"*53)
print("*"*5,"Program za preverjanje popolnih kvadratov","*"*5)
print("*"*53)

# Uvozimo potrebne Python module
import math

# Uporabnika pozovemo, da vpiše število, ki ga bomo preverili
stevilo = input("Vpišite število: ")

# Lepotni izpis
print("-"*53)

# Izpišemo število, ki ga je uporabnik vnesel
print(f"Število, ki ga preverjamo, je: {stevilo}")

# Lepotni izpis
print("="*53)

# Preverimo, ali je uporabnik vpisal število ali ne
try:
    # Spremenljivko število poskusimo pretvoriti v tip 'float'
    stevilo_stevilo = float(stevilo)
except:
    # Če pretvorba v tip 'float' ni uspešna, izpiši obvestilo in končaj program
    print("Podali ste niz znakov namesto števila.\nPreverjanje ni smiselno!")
    # Lepotni izpis
    print("-"*53)
    quit()


# Izračunamo koren podanega števila
koren = math.sqrt(stevilo_stevilo)

# Preverimo, če je izračunan koren tipa 'integer'
if koren.is_integer():
    # ker vemo, da je koren tipa integer, ga pretvorimo v ta tip
    koren = int(koren)
    # izpišemo besedilo
    print(f"Podano število {stevilo} je popoln kvadrat števila {koren}!")
else:
    # izpišemo obvestilo, da podano število ni popoln kvadrat 
    print(f"Podano število {stevilo} ni popoln kvadrat.")
# Lepotni izpis
print("-"*53)

Razlika je zgolj v vrsticah 27 do 35, kjer uvedemo kontrolo vnosa. Če uporabnik vnese neštevilčno vrednost, se funkcija float() v vrstici 29 ne more izvesti, zato program izpiše obvestilo, da je uporabnik podal niz znakov in zato preverjanje ni smiselno. Program se nato ustavi.

Izpis je v takšnem primeru podoben spodnjemu.

*****************************************************
***** Program za preverjanje popolnih kvadratov *****
*****************************************************
Vpišite število: Robert
-----------------------------------------------------
Število, ki ga preverjamo, je: Robert
=====================================================
Podali ste niz znakov namesto števila.
Preverjanje ni smiselno!
-----------------------------------------------------

Če je pretvorba v vrstici 29 uspešna, se program izvede tako kot se je v primeru Programska koda 20 in Programska koda 21. <<<

2.8. Delitelji podanega števila

Napišite program, ki mu podate število, program pa sam poišče in izpiše vse delitelje podanega števila. Vsak delitelj naj bo izpisan zgolj enkrat, delitelji pa naj bodo urejeni po velikosti.

Reševanje

Vprašajmo se, kako bi lahko nalogo sploh rešili. Načinov je seveda mnogo, a če izkoristimo moč računalnika in poiščemo najpreprostejšo, lahko rešitev poiščemo tako, da se sprehodimo po vseh celih številkah od 1 do vpisane in preverjamo, ali je rezultat deljenja vpisanega števila in trenutnega števila celo število. Tako dobimo vse možne delitelje.

Nalogo bi lahko rešili s pomožjo zanke for, a v tem primeru smo izbrali zanko while.

2.8.1. Rešitev #1: izpis vsakega delitelja v novi vrstici

Programska koda 23. naloga008a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("*"*43)
print("*** Iskanje deliteljev podanega števila ***")
print("*"*43)

# Uporabnika pozovemo, da vpiše število, katerega delitelje bomo iskali
stevilo = input("Vpišite število, za katerega želite poiskati vse delitelje: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

print(f"Delitelji števila {stevilo} so:")

# gremo po deliteljih od 1 dalje
trenutno_stevilo = 1
while trenutno_stevilo <= stevilo:
    #izračunamo ostanek pri deljenju števila s trenutnim številom
    ostanek = stevilo % trenutno_stevilo
    # preverimo, kakšen je ostanek deljenja izbranega števila z i
    if ostanek == 0:
        print(trenutno_stevilo)
    trenutno_stevilo = trenutno_stevilo + 1
Tabela 7. Razlaga
vrstica komentar

12-16

V teh vrsticah preverjamo, če je vnešeno število sploh celo število (tipa integer) in ne decimalno število ali pa recimo niz znakov. V tem primeru iskanje deliteljev nima smisla in izvajanje programa prekinemo z obvestilom, da uporabnik ni podal celega števila.

21

V tej vrstici uvedemo novo spremenljivko trenutno_stevilo in ji dodelimo vrednost 1. To spremenljivko potrebujemo zato, da vemo, kateri delitelj trenutno preverjamo ter tudi zato, da lahko vrednost trenutnega števila ob koncu vsakega obhoda zanke povečamo za 1 (to storimo v vrstici 28).

22

Začnemo izvajati zanko while. Ta zanka se izvaja tako dolgo, dokler je vrednost spremenljivke trenutno_stevilo manjše ali enako vrednosti spremenljivke stevilo, to je številke, ki jo je uporabnik vnesel in ki jo preverjamo.

24

Tukaj preverjamo, kakšen je ostanek pri deljenju števila, ki ga preverjamo (spremenljivke stevilo) s trenutnim številom (spremenljivka trenutno_stevilo). Ta ostanek nam v programskem jeziku Python da operator %.

26

Če je ostanek enak 0 (ga ni), pomeni, da smo našli delitelj podanega števila in ga v vrstici 27 izpišemo.

28

Povečamo trenutno število (spremenljivka trenutno_stevilo) za 1 in gremo v nov krog izvajanja zanke while. Namesto zapisa v tej vrstici bi lahko zapisali tudi 'trenutno_stevilo += 1'. Oba zapisa sta enakovredna, seveda pa je slednji krajši.

Program deluje! Če ga zaženete, bo izpis podoben spodnjemu (seveda je odvisno od tega, kakšno število mu podate).

*******************************************
*** Iskanje deliteljev podanega števila ***
*******************************************
Vpišite število, za katerega želite poiskati vse delitelje: 123
Delitelji števila 123 so:
1
3
41
123

V primeru, da vpišete decimalno število ali pa niz znakov, se program tudi prav lepo ustavi.

*******************************************
*** Iskanje deliteljev podanega števila ***
*******************************************
Vpišite število, za katerega želite poiskati vse delitelje: 4.5
Niste podali celega števila!
*******************************************
*** Iskanje deliteljev podanega števila ***
*******************************************
Vpišite število, za katerega želite poiskati vse delitelje: Robert
Niste podali celega števila!
Pozor

Kljub vsemu program ni popoln. Da je res tako, lahko opazite, če mu podate negativno celo število.

V tem primeru program ne bo vrnil napake, temveč se bo izvedel, a ne bo našel nobenega delitelja. Zakaj?

Razlog je v naši zanki, ki se začne v vrstici 22. Zanka while se namreč v takšnem primeru izvaja vse dokler je vrednost spremenljivke trenutno_stevilo manjša ali enaka vrednosti spremenljivke stevilo. V spornem primeru je vrednost spremenljivke stevilo negativna, trenutno_stevilo pa ima vrednost 1. Pogoj je torej izpolnjen še preden se zanka izvede prvič.

Seveda bi lahko program popravili na več načinov, a mi ga bomo tako, da bomo negativno število spremenili v pozitivno. To lahko storimo s pogojnimi stavki (če npr. je število negativno, ga pomnoži z -1), lahko pa uporabimo vgrajeno funkcijo abs(), ki za podano število vrne njegovo absolutno vrednost, kar smo storili v Programska koda 24. Rešitev je seveda še več.

2.8.2. Rešitev #2: izpis deliteljev za absolutno vrednost celega števila

Programska koda 24. naloga008b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("*"*43)
print("*** Iskanje deliteljev podanega števila ***")
print("*"*43)

# Uporabnika pozovemo, da vpiše število, katerega delitelje bomo iskali
stevilo = input("Vpišite število, za katerega želite poiskati vse delitelje: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

# preverjali bomo absolutno vrednost podanega števila
stevilo = abs(stevilo)

# izpišemo prvo vrstico izpisa
print(f"Delitelji števila {stevilo} so:")

# gremo po deliteljih od 1 dalje
trenutno_stevilo = 1
while trenutno_stevilo <= stevilo:
    #izračunamo ostanek pri deljenju števila s trenutnim številom
    ostanek = stevilo % trenutno_stevilo
    # preverimo, kakšen je ostanek deljenja izbranega števila z i
    if ostanek == 0:
        print(trenutno_stevilo)
    trenutno_stevilo = trenutno_stevilo + 1

Ob pozornem pregledu in primerjavi Programska koda 23 in Programska koda 24 opazimo, da je razlika (če zanemarimo komentarje) zgolj v vrstici 19, kjer smo zapisali, naj program od te vrstice dalje išče delitelje za absolutno vrednost (pozitivno celo število) vnosa.

Program sedaj deluje tudi za negativna števila, a vrne delitelje njegove absolutne vrednosti.

*******************************************
*** Iskanje deliteljev podanega števila ***
*******************************************
Vpišite število, za katerega želite poiskati vse delitelje: -16
Delitelji števila 16 so:
1
2
4
8
16

2.8.3. Rešitev #3: izpis deliteljev v eni vrstici

Tako Programska koda 23 kot Programska koda 24 izpišeta delitelje po vrsticah, kar je prostorsko potratno, mi pa seveda znamo program popraviti tako, da bodo delitelji izpisani v eni vrstici.

Programska koda 25. naloga008c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("*"*43)
print("*** Iskanje deliteljev podanega števila ***")
print("*"*43)

# Uporabnika pozovemo, da vpiše število, katerega delitelje bomo iskali
stevilo = input("Vpišite število, za katerega želite poiskati vse delitelje: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

# preverjali bomo absolutno vrednost podanega števila
stevilo = abs(stevilo)

# gremo po deliteljih od 1 dalje
trenutno_stevilo = 1

# uvedemo spremenljivko, kamor bomo zapisovali rezultate
delitelji = ""

while trenutno_stevilo <= stevilo:
    #izračunamo ostanek pri deljenju števila s trenutnim številom
    ostanek = stevilo % trenutno_stevilo
    # preverimo, kakšen je ostanek deljenja izbranega števila z i
    if ostanek == 0:
        delitelji = delitelji + str(trenutno_stevilo)
        # vejico izpišemo samo, če ne dodajamo zadnjega števila v nizu
        if trenutno_stevilo != stevilo:
            delitelji +=", "
    trenutno_stevilo = trenutno_stevilo + 1

#izpišemo delitelje
# začnemo izpis rezultatov
print(f"Delitelji števila {stevilo} so: {delitelji}")
Tabela 8. Razlaga
vrstica komentar

25

Uvedemo novo spremenljivko delitelji in ji dodelimo prazen niz znakov. Spremenljivki bomo v zanki while dodajali najdene delitelje, vse naenkrat pa izpisali v vrstici 40.

32

Ko najdemo delitelj, ga dodamo k prejšnjim (dodamo k nizu delitelji). Pri tem uporabimo funkcijo str(), saj je spremenljivka trenutno_stevilo tipa integer (celo število). To vrstico bi lahko zapisali tudi kot 'trenutno_stevilo += str(trenutno_stevilo)'. Oba zapisa sta enakovredna.

34

Preverimo, če trenutno_stevilo ni enako spremenljivki stevilo. Če je, to pomeni, da smo prišli do konca deliteljev in vejice v vrstici 35 ne dodamo. Če ni enako, pa pomeni, da pričakujemo vsaj še en delitelj, zato jo bomo dodali.

35

Če v vrstici 34 trenutno_stevilo ni enako spremenljivki stevilo, dodamo vejico.

40

Izpišemo besedilo in delitelje.

Izpis je sedaj podoben spodnjemu.

*******************************************
*** Iskanje deliteljev podanega števila ***
*******************************************
Vpišite število, za katerega želite poiskati vse delitelje: -12
Delitelji števila 12 so: 1, 2, 3, 4, 6, 12

2.9. Praštevilo

Napišite program, ki za podano število pove, ali je praštevilo.

2.9.1. Rešitev

Programska koda 26. naloga009.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Program, ki za podano število pove, ali je praštevilo. """

# Uporabnika pozovemo, da vpiše število, ki ga preverjamo
stevilo = input("Vpišite število, za katerega vas zanima, ali gre za praštevilo: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

# uvedemo novo spremenljivko "napaka", ki ji določimo vrednost "False"
napaka = False

# za vsa števila od 2 do izbranega števila - 1 preverimo, ali je delitelj števila
for i in range(2,stevilo):
    # če je trenutno število i delitelj, spremenimo vrednost spremenljivke napaka
    if stevilo % i == 0:
        napaka = True

# če ima vrednost TRUE, potem izpišemo, da iskano število NI praštevilo
if napaka == True:
    print(f"Število {stevilo} NI praštevilo!")
else:
    print(f"Število {stevilo} JE praštevilo!")
Tabela 9. Razlaga
vrstica komentar

17

Uvedemo novo spremenljivko napaka, ki ji določimo začetno vrednost "False". S tem smo ji določili podatkovni tip boolean, kar pomeni, da ima lahko zgolj vrednost 0 ali 1 oziroma True ali False.

20

Za vsa cela števila v obsegu od 2 do (ampak brez) vrednosti stevilo bomo preverjali, ali je trenutno število (ki je v našem primeru vrednost spremenljivke i) delitelj stevilo.

22

Preverjamo, če je i delitelj stevilo.

23

Če v vrstici 22 ugotovimo, da je i delitelj, spremenimo vrednost spremenljivke napaka v True, To pomeni, da smo našli še en delitelj, ki ni 1 in ni podano število, kar pomeni, da nimamo praštevila.

26

Preverimo vrednost spremenljivke napaka. Če ima vrednost True, vemo, da smo našli še vsaj en dodaten delitelj in podano število ni praštevilo, kar izpišemo v vrstici 27.

28

Ker nismo našli nobenega dodatnega delitelja, vemo, da je podano število praštevilo, kar izpišemo v vrstici 29.

Izpis programa, če je podano število praštevilo.

Vpišite število, za katerega vas zanima, ali gre za praštevilo: 127
Število 127 JE praštevilo!

V primeru, da podano število ni praštevilo, je izpis seveda drugačen.

Vpišite število, za katerega vas zanima, ali gre za praštevilo: 128
Število 128 NI praštevilo!

Delujejo pa seveda tudi kontrole.

Vpišite število, za katerega vas zanima, ali gre za praštevilo: Robert
Niste podali celega števila!

2.10. Prestopno leto

Napišite program, ki za vpisano letnico pove, ali je (bilo/bo) leto prestopno.

2.10.1. Rešitev

Programska koda 27. naloga010.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("******************************")
print("*** Ali je leto prestopno? ***")
print("******************************")

# pozovemo uporabnika, naj vpiše letnico
letnica = input("Vpiši letnico: ")

# preverimo, če je vpisana res letnica
try:
    letnica = int(letnica)
    # omejimo letnice na obseg od -9999 do 9999
    if letnica > 9999 or letnica < -9999:
        print("Niste vnesli letnice!")
        quit()
except:
    print("Niste vnesli letnice!")
    quit()

# uvedemo spremeljivko prestopno
prestopno = False

# če je letnica deljiva s 400, je leto prestopno
if letnica % 400 == 0:
    prestopno = True
# če ni deljiva s 400, je pa deljiva s 4 in 100, potem leto ni prestopno
elif letnica % 4 == 0 and letnica % 100 == 0:
    prestopno = False
# letnica je deljiva s 4, ni pa hkrati deljiva s 100 -> leto je prestopno
elif letnica % 4 == 0:
    prestopno = True

if prestopno:
    print(f"Leto {letnica} JE prestopno!")
else:
    print(f"Leto {letnica} NI prestopno!")
Tabela 10. Razlaga
vrstica komentar

13

Preverimo, če je podana letnica tipa integer oziroma celo število.

15

Omejimo letnice na obseg od -9999 do 9999.

23

Uvedemo spremenljivko prestopno in ji določimo vrednost False. Tako predvidevamo, da vnešena letnica ne označuje prestopnega leta, razen če bomo ugotovili drugače.

26

Začnemo s preverjanjem. Najprej preverimo, če je letnica deljiva s 400, saj potem vemo, da je leto prestopno.

29

Če letnica ni deljiva s 400, je pa hkrati deljiva s 4 in 100, potem leto ni prestopno.

32

Če je letnica deljiva s štiri ter ni deljiva s 100 in 400, potem je leto prestopno. Delitelja 400 in 100 smo preverili že v prejšnjih dveh pogojih.

35

Preverimo, če ima spremenljivka prestopno vrednost (pomeni, da nima vrednosti 0 ali False). Če ima, potem je leto prestopno in to izpišemo na zaslon. Ta vrstica bi lahko bila zapisana tudi kot 'if prestopno == True:'. Zapisa sta enakovredna.

38

Če leto ni prestopno, to izpišemo na zaslon.

Primer izpisa programa.

******************************
*** Ali je leto prestopno? ***
******************************
Vpiši letnico: 2023
Leto 2023 NI prestopno!

2.11. Fibonaccijevo zaporedje

Napiši program, ki izpiše prvih X členov Fibonaccijevega zaporedja. Število X na poziv vnese uporabnik.

2.11.1. Rešitev #1: z vmesno spremenljivko

Programska koda 28. naloga011a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Napiši program, ki izpiše prvih _X_ členov Fibonaccijevega zaporedja. Število _X_ na poziv vnese uporabnik.
"""

# Uporabnika pozovemo, da vpiše število, koliko členov Fibonaccijevega zaporedja naj prikažemo
stevilo = input("Vpišite, koliko členov Fibonaccijevega zaporedja vas zanima: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

#ker moramo vedno poznati dve števili zaporedja, uvedemo dve novi neznanki
stevilo_ena = 1
stevilo_dva = 1
# za vsa števila od 1 do izbranega števila + 1 izračunamo in izpišemo
for i in range(1,stevilo+1):
    print(stevilo_ena)
    # uvesti moramo novo spremeljivko, da si začasno zapomni vrednost spremenljivke stevilo_ena
    stevilo_nic = stevilo_ena
    stevilo_ena = stevilo_dva
    stevilo_dva = stevilo_nic+stevilo_ena
Tabela 11. Razlaga
vrstica komentar

19-20

Ker moramo vedno poznati dve števili zaporedja, uvedemo dve novi neznanki: stevilo_ena in stevilo_dva ter obema priredimo/določimo vrednost 1, ker sta to prva dva člena Fibonaccijevega zaporedja.

22

Izvedemo zanko za vse vrednosti od 1 do stevilo (ki ga je vnesel uporabnik)+1. Zakaj stevilo povečamo za 1? Ker nam funkcija range(zacetek,konec) vrne vrednosti po formuli r[i] = začetek + korak*i, kjer je i >= 0 in r[i] < konec. Korak je v našem primeru 1, saj ga nismo določili drugače.

23

Izpišemo vrednost spremenljivke stevilo_ena.

25

Vrednost spremenljivke stevilo_ena začasno zapišemo, kar storimo tako, da jo priredimo spremenljivki stevilo_nic. To moramo storiti zato, ker bi drugače trenutno vrednost spremenljivke stevilka_ena prepisali in izgubili, ga pa potrebujemo, da izračunamo naslednje število.

26

Spremenljivka stevilo_ena zdaj dobi vrednost spremenljivke stevilo_dva (premaknemo se po Fibonaccijevem zaporedju za eno mesto v desno).

27

Nova vrednost spremenljivke stevilo_dva pa je seštevek vrednosti spremenljivk stevilka_ena in stevilka_nic. Zato smo uvedli vmesno spremenljivko.

Primer izpisa programa za prvih 5 členov zaporedja.

Vpišite, koliko členov Fibonaccijevega zaporedja vas zanima: 5
1
1
2
3
5

2.11.2. Rešitev #2: z dvojnim prirejanjem

Programska koda 29. naloga011b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Napiši program, ki izpiše prvih _X_ členov Fibonaccijevega zaporedja. Število _X_ na poziv vnese uporabnik.
"""

# Uporabnika pozovemo, da vpiše število, koliko členov Fibonaccijevega zaporedja naj prikažemo
stevilo = input("Vpišite, koliko členov Fibonaccijevega zaporedja vas zanima: ")

# preverimo, ali je podano število tipa 'integer'
try:
    stevilo = int(stevilo)
except:
    print("Niste podali celega števila!")
    quit()

#ker moramo vedno poznati dve števili zaporedja, uvedemo dve novi neznanki
stevilo_ena = stevilo_dva = 1
# za vsa števila od 1 do izbranega števila + 1 izračunamo in izpišemo
for i in range(1,stevilo+1):
    print(stevilo_ena)
    stevilo_ena, stevilo_dva = stevilo_dva,stevilo_ena+stevilo_dva
Tabela 12. Razlaga
vrstica komentar

19

Za razliko od rešitve a v tem primeru ne določamo/prirejamo vsake spremenljivke posebej ampak lahko to v programskem jeziku Python storimo hkrati, saj je vrednost obeh spremenljivk (stevilka_ena in stevilka_dva) enaka, to je 1.

23

Tudi v zanki lahko obe vrednosti vsakič izračunamo hkrati, kar pomeni, da ne potrebujemo vmesne spremenljivke kot v rešitvi a. Kratka razlaga je, da programski jezik Python najprej izračuna vrednosti na desni strani enačaja in jih nato priredi spremenljivkam na levi.

Izpis programa je identičen prejšnjemu.

2.12. Računanje statistike

Napišite program, ki od uporabnika bere števila, dokler uporabnik ne vpiše števila 0.

Program naj sproti izpisuje največje vpisano število, najmanjše vpisano število ter povprečje vpisanih števil.

2.12.1. Rešitev

Programska koda 30. naloga012.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Napiši program, ki od uporabnika bere števila, dokler uporabnik ne vpiše števila 0. Program naj sproti izpisuje največje, najmanjše in povprečje števil, vpisanih do sedaj.
"""

# Izpišemo, za kakšen program gre
print("*"*43)
print("*"*5,"Program za računanje statistike","*"*5)
print("*"*43)

# ustvarimo nov prazen seznam
stevila = []

while True:
    # uporabnika prosimo, naj vpisuje števila
    stevilo = input('Vnesi število: ')

    # če je vpisano število 0 naj se program prekine.
    if stevilo == "0":
        print("Pritisnili ste 0 in tako končali program.")
        quit()

    # preverimo, ali je uporabnik vnesel število
    try:
        stevilo = float(stevilo)
    except:
        print("Niste vnesli števila!")
        quit()
    
    stevila.append(stevilo)
    print(f"V seznamu so števila: {stevila}")
    print(f"Največje število = {max(stevila)}")
    print(f"Najmanjše število = {min(stevila)}")
    print(f"Povprečje števil v seznamu = {sum(stevila)/len(stevila)}")
    print("-"*40)
Tabela 13. Razlaga
vrstica komentar

14

Za našo rešitev bomo uporabili seznam (angl. list), zato uvedemo nov seznam stevila, ki je na začetku seveda prazen.

16

While True je način oblikovanja zanke v programskem jeziku Python, ki omogoča, da se blok kode ponavlja v nedogled. Pogosto se uporablja v povezavi z ukazom break, ki omogoča izhod iz zanke pod določenimi pogoji. V našem primeru je izhod iz zanke v vrstici 23 in se izvede ob pogoju, da uporabnik vnese število 0. Kakšna je razlika med break in quit? Kadar uporabimo break, se bo koda za zanko po izhodu iz zanke izvedla. Če uporabimo quit, se program na tistem mestu konča. V našem primeru smo uporabili quit, ker kode za zanko while nimamo.

18

Uporabnika pozovemo k vpisu številke, ki jo priredimo spremenljivki stevilka. Pazite na razliko med stevilka in stevilke (v vrstici 14). Gre namreč za dve različni spremenljivki.

21-23

Če uporabnik vnese število 0, izpišemo obvestilo (vrstica 22) ter izvajanje programa prekinemo (vrstica 23). Če uporabnik vpiše kaj drugega, se ta blok kode preskoči.

26-30

V tem bloku kode preverimo, če je uporabnik vnesel število. Če ga ni, izpišemo sporočilo (vrstica 29 in izvajanje programa prekinemo (vrstica 30))

32

Če je vnos prestal vse prejšnje kontrole, številko dodamo na seznam stevila. To storimo zato, ker bomo uporabili funkcije, vgrajene v sam programski jezik, ki delujejo s seznami. Lahko bi računali tudi na roke.

33

Izpišemo števila, ki jih je uporabnik že vnesel in so trenutno na seznamu stevila.

34

Izpišemo največje število na seznamu stevila. V ta namen uporabimo vgrajeno funkcijo max(), ki vrne največjo vrednost na seznamu.

35

Izpišemo najmanjše število na seznamu stevila. V ta namen uporabimo vgrajeno funkcijo min(), ki vrne najmanjšo vrednost na seznamu.

36

Izpišemo povprečje števil na seznamu stevila. V ta namen uporabimo vgrajeni funkciji sum() (vrne vsoto vseh števil na seznamu) in len() (vrne število elementov na seznamu).

Če program zaženete, bo izpis podoben spodnjemu.

*******************************************
***** Program za računanje statistike *****
*******************************************
Vnesi število: 5
V seznamu so števila: [5.0]
Največje število = 5.0
Najmanjše število = 5.0
Povprečje števil v seznamu = 5.0
----------------------------------------
Vnesi število: 6
V seznamu so števila: [5.0, 6.0]
Največje število = 6.0
Najmanjše število = 5.0
Povprečje števil v seznamu = 5.5
----------------------------------------
Vnesi število: 4
V seznamu so števila: [5.0, 6.0, 4.0]
Največje število = 6.0
Najmanjše število = 4.0
Povprečje števil v seznamu = 5.0
----------------------------------------
Vnesi število: 0
Pritisnili ste 0 in tako končali program.
Pozor

Program deluje v skladu z navodili in vsebuje tudi kontrole vnosa. V primeru, da uporabnik vpiše črko namesto številke, se program ustavi.

*******************************************
***** Program za računanje statistike *****
*******************************************
Vnesi število: programiranje
Niste vnesli števila!

Kako bi morali program popraviti, da bi izpisal zgolj obvestilo, da ni bilo vnešeno število, ta vnos zanemaril in deloval naprej? Ni vam potrebno napisati niti ene nove vrstice kode!

Namig

Izbrišite vrstico 30 (quit()), blok kode 32-37 pa prestavite za kontrolo try (za vrstico 27 in pred except).

2.13. Seštevanje števk naravnega števila

Sestavite program, ki prebere naravno število in sešteje vse njegove števke, kar ponavlja, dokler ne pride do enomestnega števila. Program naj izpisuje vse vmesne rezultate.

2.13.1. Rešitev #1: z direktnim seštevanjem

Programska koda 31. naloga013a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Seštevanje števk naravnega števila
"""

# uporabnika prosimo, naj vpiše številko
stevilo = input('Vnesi večmestno celo število: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

while stevilo > 9:
    sestevek = 0
    stevilo_string = str(stevilo)
    for i in range(0,len(stevilo_string)):
        sestevek += int(stevilo_string[i])
    print(sestevek)
    stevilo = sestevek
Tabela 14. Razlaga
vrstica komentar

17-22

Začnemo z zanko while, ki jo bomo ponavljali, dokler ne bomo dobili enomestnega števila (manjšega od 10, oziroma drugače - ponavljamo, dokler je spremenljivka stevilo večja od 9).

18

Vsakič, ko gre zanka v nov krog, nastavimo sestevek na vrednost 0.

19

Uvedemo novo spremenljivko stevilo_string in mu priredimo vrednost spremenljivke stevilo, pri čemer tip spremenljivke s pomočjo funkcije str() spremenimo v string (niz znakov). To storimo zato, da lahko dobimo dolžino vnešenega niza znakov, saj funkcija len() ne deluje s številčnimi tipi (int,float,double).

20-21

Vse števke od prve do zadnje (od mesta 0 do konca niza) seštejemo. Bodite pozorni, da moramo v vrstici 21 niz znakov string spet spremeniti v številko, kar storimo s pomočjo funkcije int(). Vsako številko dodamo vrednosti spremenljivke sestevek.

22

Izpišemo vrednost spremenljivke sestevek.

23

Vrednost spremenljivke stevilo spremenimo in mu določimo vrednost spremenljivke sestevek, zato, da bomo v naslednji iteraciji seštevali števke novega števila. Če bo vrednost spremenljivke stevilo manjše od 10, se bo zanka while prekinila in se ne bo izvedla.

Primer izpisa:

Vnesi večmestno celo število: 99999
45
9

2.13.2. Rešitev #2: z uporabo definirane funkcije

Programska koda 32. naloga013b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Seštevanje števk naravnega števila
"""

# uporabnika prosimo, naj vpiše številko
stevilo = input('Vnesi večmestno celo število: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

def sestej(x):
    sestevek = 0
    x_string = str(x)
    for i in range(0,len(x_string)):
        sestevek += int(x_string[i])
    return sestevek

while stevilo > 9:
    stevilo = sestej(stevilo)
    print(stevilo)
Tabela 15. Razlaga
vrstica komentar

17-22

Tokrat uporabimo možnost priprave (definiranja) lastne funkcije, ki bo seštevala vrednosti. Gre za splošni zapis fukcij, ki jih v programski kodi navadno večkrat uporabljamo in jih zato definiramo kot svojo funkcijo. Ta mora biti definirana preden jo prvič kličemo v programski kodi, ker se ta izvaja po vrsti in mora imeti definirano fukcijo v spominu. Dobra prakasa je, da se vse definicije funkcij, ki jih imamo v programski kodi, uvrsti na začetek, takoj za tem, ko uvozimo vse morebitne dodatne knjižnice, ki jih uporabljamo. Šele po vseh definicijah pišemo programsko kodo, ki jo izvajamo.

Opazimo lahko, da je funkcija sestej() precej podobna vrsticam 17-21 rešitve a, razlika je zgolj v dodatni vrstici 22, saj rešitve funkcije ne izpišemo, ampak jo vrnemo (s pomočjo return). Ime spremenljivke stevilo_string smo namenoma spremenili v x_string, ker smo spremenljivko, ki jo podamo kot parameter funkcije sestej(), poimenovali x in ne stevilo, da ne bi prišlo do pomote.

24-26

Zanko while izvajamo ob identičnih pogojih kot prej, razlika je zgolj v tem, da sedaj v zanki zgolj pokličemo prej uvedeno (pripravljeno, določeno) funkcijo sestej(), ki ji podamo vsakokratno število, funkcija nam vrne rezultat, ki ga potem v vrstici 26 izpišemo.

Izpis programa je identičen prejšnjemu.

2.14. Pravilno sklanjanje

Sestavite program, ki prebere število in v pravilni slovenščini izpiše, koliko opravljenih izpitov imate. Bodite pozorni pri številih, večjih od 100!

2.14.1. Rešitev

Pri tem reševanju imamo 4 različne možnosti sklanjanja:

  • izpit (za 1 opravljen izpit)

  • izpita (za 2 opravljena izpita)

  • izpite (za 3 ali 4 opravljene izpite)

  • izpitov (za več kot 4 opravljene izpite)

Ker se nam te 4 možnosti ponavljajo tudi kasneje (npr. 101, 201, 1001, 10201), moramo najti vzorec. Kaj je skupnega vsem tem številom?

Skupen jim je ostanek pri deljenju s 100:

  • Če je ostanek 1, izberemo sklon izpit.

  • Če je ostanek 2, izberemo sklon izpita.

  • Če je ostanek 3 ali 4, izberemo slon izpite.

  • V vseh ostalih primerih izberemo sklon izpitov.

Programska koda 33. naloga014.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Pravilno sklanjanje
"""

# uporabnika prosimo, naj vpiše število opravljenih izpitov
stevilo = input('Vnesi število opravljenih izpitov: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo%100 == 1:
    besedilo = "izpit"
elif stevilo%100 == 2:
    besedilo = "izpita"
elif stevilo%100 == 3 or stevilo%100 == 4:
    besedilo = "izpite"
else:
    besedilo = "izpitov"

print(f"Opravili ste {stevilo} {besedilo}.")

Če program zaženete, bo izpis podoben spodnjemu.

Vnesi število opravljenih izpitov: 103
Opravili ste 103 izpite.

2.15. Fakulteta števila

Sestavi program, ki izračuna fakulteto vnešenega števila.

2.15.1. Rešitev #1: z računanjem in prikazom vmesnih korakov

Programska koda 34. naloga015a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("-"*21)
print("| Fakulteta števila |")
print("-"*21)

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi število: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo < 0:
    print("Ne morem izračunati fakultete negativnega števila!")
    quit()

if stevilo == 0 or stevilo == 1:
    print(f"{stevilo}! = 1")
else:
    izpis = []
    n = stevilo
    fakulteta = 1
    while n > 0:
        izpis.append(str(n))
        fakulteta *= n
        n -= 1

    izpis = ' * '.join(izpis)
    print(f"{stevilo}! = {izpis} = {fakulteta}")
Tabela 16. Razlaga
vrstica komentar

11-15

Preverimo, če je uporabnik vnesel celo število (vrstica 12). Če ni vnesel celega števila (lahko je vnesel decimalno število, črke, polje, slovar ali kakršen koli drug poljuben niz), ga na to opozorimo (vrstica 14) in program prekinemo (vrstica 15).

17-19

Preverimo, če je uporabnik morda vnesel negativno število. Če ga je vnesel, izpišemo, da izračun ni možen (vrstica 18) ter program prekinemo (vrstica 19).

21-22

Če uporabnik vpiše število 0 ali 1, je rezultat ena. Ker gre za posebnost (sploh v primeru, da računamo 0!), to rešimo s pogojnim stavkom.

23

Uporabnik je vnesel celo število, večjo od 1 (vse ostale smo izločili v korakih zgoraj), zato lahko izračunamo fakulteto števila.

24

Uvedemo spremenljivko izpis in ji priredimo prazen seznam (polje), v katerega bomo vpisovali vmesne rezultate.

25

Uvedemo spremenljivko n, ki ima na začetku enako vrednost kot spremenljivka stevilo. Zakaj potrebujemo novo spremenljivko? Ker ima spremenljivka stevilo vrednost, ki jo je vnesel uporabnik, spremenljivka n pa se bo spreminjala, ko bomovnešeno število manjšali proti 1 in računali fakulteto. Potrebujemo torej obe spremenljivki.

26

Uvedemo spremenljivko fakulteta, ki bo imela vrednost izračunane fakultete vnešenega števila. Nastavimo ji začetno vrednost 1, s katero bomo množili vsa ostala števila.

27-30

Zanka, ki se naj izvaja, dokler je vrednost spremenljivke n večja od 0 ( se pravi od vrednosti spremenljivke stevilo (vrstica 25) do 1).

28

Vsakič na seznam izpis dodamo trenutno vrednost spremenljivke n (prva bo enaka vrednosti vpisanega števila stevilo, zadnja bo 1, po tem se bo zanka prekinila, saj bo vrednost spremenljivke n enak 0 in pogoj zanke while v vrstici 27 ne bo več izpolnjen).

29

Trenutno vrednost spremenljivke fakulteta množimo s trenutno vrednostjo spremenljivke n. Po zaključeni zanki bo imela tako spremenljivka fakulteta vrednost fakultete števila. To vrstico bi lahko zapisali tudi daljše v obliki fakulteta = fakulteta * n. Oba zapisa sta enakovredna.

30

Vrednost spremenljivke n po koncu izračuna zmanjšamo za 1 in zanka se ponovno zažene. To vrstico bi lahko zapisali tudi kot n = n - 1. Oba zapisa sta enakovredna.

32

Ko se zanka prekinemo, lahko vse vrednosti v seznamu (polju) izpis uporabimo za pripravo izpisa vmesnih korakov. Ker smo uporabili seznam lahko uporabimo funkcijo join(). Ta nam vse elemente na seznamu poveže v niz znakov, med posamezne elemente pa doda niz znakov, ki ga podamo na začetku (v našem primeru je to niz znakov " * " (presledek zvezdica presledek)). Na tak način dobimo lep izpis vseh vmesnih korakov.

33

Izpišemo rezultat.

Primeri izpisa:

---------------------
| Fakulteta števila |
---------------------
Vnesi število: 6
6! = 6 * 5 * 4 * 3 * 2 * 1 = 720
---------------------
| Fakulteta števila |
---------------------
Vnesi število: -3
Ne morem izračunati fakultete negativnega števila!
---------------------
| Fakulteta števila |
---------------------
Vnesi število: 0
0! = 1
---------------------
| Fakulteta števila |
---------------------
Vnesi število: python
Niste vnesli celega števila!

2.15.2. Rešitev #2: z uporabo definirane funkcije in izpisom vmesnih rezultatov

Programska koda 35. naloga015b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("-"*21)
print("| Fakulteta števila |")
print("-"*21)

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi število: ')

def fakulteta(stevilo):
    try:
        stevilo = int(stevilo)
        if stevilo < 0:
            rezultat = "Ne morem izračunati fakultete negativnega števila!"
        elif stevilo == 0 or stevilo == 1:
            rezultat = f"{stevilo}! = 1"
        else:
            izpis = []
            n = stevilo
            fakulteta = 1
            while n > 0:
                izpis.append(str(n))
                fakulteta *= n
                n -= 1

            izpis = ' * '.join(izpis)
            rezultat = f"{stevilo}! = {izpis} = {fakulteta}"
    except:
        rezultat = "Niste vnesli celega števila!"
    return rezultat

print(fakulteta(stevilo))

Razlika med rešitvijo a in rešitvijo b je v tem, da v drugem primeru uporabimo možnost priprave (definiranja) funkcije. Funkcija fakulteta() potrebuje zgolj 1 parameter, to je število, za katerega želimo izračunati fakulteto in katerega vrednost priredimo spremenljivki stevilo. Funkcija ima povsem enake sestavne dele kot rešitev a in v vrstici 31 vrne rezultat. Rezultat je izpis, ki ga lahko direktno izpišemo, kar storimo v vrstici 33.

Izpis programa je identičen prejšnjemu.

2.15.3. Rešitev #3: z uporabo vgrajene funkcije za izračun fakultete

Programska koda 36. naloga015c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("-"*21)
print("| Fakulteta števila |")
print("-"*21)

# uvozimo modul math
import math

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi število: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo < 0:
    print("Vnesli ste negativno število!")
    quit()

print(f"{stevilo}! = {math.factorial(stevilo)}")

Opazimo lahko, da je ta program najkrajši (in morda najlažji za razumeti), ne vsebuje pa vseh vmesnih korakov.

Za reševanje uporabimo vgrajeno funkcijo math.factorial(). Če jo želimo uporabiti, moramo vključiti modul math, kar storimo v vrstici 9. Ohranimo kontroli vnosa za preverjanje, če je vnešeno celo število (vrstice 14-18) ter za preverjanje, če je uporabnik vnesel pozitivno število (vrstice 20-22), saj v nasprotnem primeru funkcija math.factorial() vrne napako.

Če uporabnik res vnese pozitivno celo število, lahko fakulteto izračunamo in jo izpišemo (vrstica 24).

Primer izpisa:

---------------------
| Fakulteta števila |
---------------------
Vnesi število: 6
6! = 720

2.16. Risanje smrečice

Napiši program, ki od uporabnika dobi naravno število, nato pa nariše smrečico z znakom *.

Smrečica naj ima toliko vrstic, kot jih uporabnik definira z vnosom naravnega števila.

2.16.1. Rešitev #1: smrečica, poravnana levo

Programska koda 37. naloga016a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("*"*20)
print("* Risanje smrečice *")
print("*"*20)

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi višino smrečice: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo < 0:
    stevilo = -stevilo
    print(f"-{stevilo} sem za vas pretvoril v {stevilo}.")

# poravnano levo
n = 1
while n <= stevilo:
    print("*"*n)
    n += 1
Tabela 17. Razlaga
vrstica komentar

9

Uporabnika pozovemo, naj vnese višino smrečice.

11-15

Preverimo, če je uporabnik vnesel celo število (vrstica 12). Če ni vnesel celega števila (lahko je vnesel decimalno število, črke, polje, slovar ali kakršen koli drug poljuben niz), ga na to opozorimo (vrstica 14) in program prekinemo (vrstica 15).

17-19

Preverimo, če je uporabnik morda vnesel negativno število. Če ga je vnesel, izpišemo, da izračun ni možen (vrstica 18) ter program prekinemo (vrstica 19).

22-25

Vpeljemo spremenljivko n in ji priredimo vrednost 1 (vrstica 22). Nato pričnemo z izvajanjem zanke, ki naj teče od trenutne vrednosti spremenljivke n do trenutka, ko bo večja od vrednosti spremenljivke stevilo (vrstica 23). V vsakem koraku najprej izpišemo toliko zvezdic, kolikor je vrednost spremenljivke n, kar naredimo tako, da niz znakov množimo z vrednostjo n (vrstica 24). Ne pozabite, da funkcija print izvede izpis v eni vrstici, vsak naslednji bo v novi vrstici. Na koncu vsake zanke vrednost spremenljivke n povečamo za 1 (vrstica 25).

Primer izpisa:

********************
* Risanje smrečice *
********************
Vnesi višino smrečice: 6
*
**
***
****
*****
******

2.16.2. Rešitev #2: smrečica, poravnana desno

Programska koda 38. naloga016b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("*"*21)
print("* Risanje smrečice *")
print("*"*21)

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi višino smrečice: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo < 0:
    stevilo = -stevilo
    print(f"-{stevilo} sem za vas pretvoril v {stevilo}.")

# poravnano desno
n = 1
while n <= stevilo:
    print(" "*(stevilo-n),"*"*n,sep="")
    n += 1 

Rešitev a in rešitev b se razlikujeta zgolj v vrstici 24 (če smo natančni, je drugačen tudi komentar v vrstici 21). Tokrat je izpis s funkcijo print nekoliko bolj težaven.

Če želimo smrečico poravnati desno, bomo morali na začetku vrstice izpisovati prazna mesta. Vemo, da:

  • bodo v zadnji izpisani vrstici izpolnjena vsa mesta in ne bo prisotnih praznih mest,

  • bodo prvi vrstici prazna vsa izpisana mesta razen enega (skrajno desnega),

  • bo vseh izpisanih vrstic toliko, kot znaša spremenljivka stevilo,

  • funkcija print izpiše več posameznih vrednosti, ki jih ločimo med sabo z vejico, med njimi pa funkcija sama izpiše niz znakov, določen z vrednostjo parametra sep (privzeta vrednost parametra sep = " " (prazno mesto)),

  • funkcija print omogoča, da nastavimo znak, ki ga vstavi med posamezne parametre znotraj funkcije.

Glede na vse navedeno se lotimo izpisa:

  • Najprej izpišemo število praznih mest. Praznih mest je toliko, kot je vrednost spremeljivke stevilo, zmanjšana za številko vrstice, v kateri se nahajamo, torej za vrednost spremenljivke n. Število praznih mest " " torej množimo z vrednostjo _(stevilo - n).

  • Nato izpišemo zvezdice. Zvezdic izpišemo toliko kot je številka vrstice, v kateri se nahajamo, torej kot je vrednost spremenljivke n. Na tem mestu se lahko testiramo. Če izpisujemo 10 vrstic, bo v prvi vrstici 9 praznih mest in 1 polno, v drugi 8 praznih in 2 polni itd. Algoritem torej deluje.

  • Ostane še tretji parameter, to je sep="". Z njim nastavimo funkcijo print tako, da med posameznimi parametri v izpisu namesto praznega mesta (" ") ne vstavi nič. Tako imamo celotno kontrolo izpisa.

Primer izpisa:

*********************
* Risanje smrečice *
*********************
Vnesi višino smrečice: 5
    *
   **
  ***
 ****
*****

2.16.3. Rešitev #3: smrečica, poravnana sredinsko

Programska koda 39. naloga016c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("*"*21)
print("* Risanje smrečice *")
print("*"*21)

# uporabnika prosimo, naj vpiše število
stevilo = input('Vnesi višino smrečice: ')

try:
    stevilo = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

if stevilo < 0:
    stevilo = -stevilo
    print(f"-{stevilo} sem za vas pretvoril v {stevilo}.")

# poravnano sredinsko
n = 1
while n <= stevilo:
    stevilo_zvezdic = 2 * n - 1
    najvecje_stevilo = 2 * stevilo - 1
    stevilo_praznih = (najvecje_stevilo - stevilo_zvezdic) / 2
    stevilo_praznih = int(stevilo_praznih)
    print(" "*stevilo_praznih,"*"*stevilo_zvezdic,sep="")
    n += 1 

Ta primer se od rešitve a in rešitve b spet razlikuje zgolj od vrstice 24 dalje (če ponovno zanemarimo komentar v vrstici 21). V tem primeru moramo v vsaki vrstici izračunati število praznih mest na začetku tako, da bo zvezdica izpisana na sredini.

Tabela 18. Razlaga
vrstica komentar

24

Vpeljemo spremenljivko stevilo_zvezdic in mu priredimo vrednost 2 * n - 1. To storimo zato, ker v izpisu ne moremo zvezdic poravnati drugače kot eno nad drugo. To pomeni, da bomo imeli v drugi vrstici izpisa namesto dveh smrečic 3, v tretji 5 itd.

25

Izračunamo največje število zvezdic (spremenljivka najvecje_stevilo), ki ga dobimo tako, da na mesto vrednosti spremenljivke n vstavimo vrednost spremenljivke stevilo. Tako dobimo število zapolnjenih mest v zadnji vrstici, kar bo podlaga za centriranje ostalih izpisov.

26

Izračunamo število praznih mest na začetku vrstice (spremenljivka stevilo_praznih), ker moramo ta prazna mesta izpisati. To storimo tako, da od največjega števila zapolnjenih mest (spremenljivka najvecje_stevilo) odštejemo število zvezdic (spremenljivka stevilo_zvezdic), potem pa to delimo z 2. Zakaj? Ker je polovica teh praznih mest levo od zvezdic, polovica pa desno.

27

Uporabimo funkcijo int, ki poskrbi, da je dobljeno število (spremenljivka stevilo_praznih) vedno celo. Ta vrstica je do neke mere nepotrebna, saj nam prejšnji dve formuli vedno vrneta liho število, razlika dveh lihih števil pa je vedno soda, a tako smo lahko še dodatno prepričani, da bo dobljena vrednost res cela in da se program ne bo končal z napako.

28

Ostane nam zgolj še izpis. Če ste pozorni, izpisujemo prazna mesta zgolj levo, ne pa desno. Če želite, jih lahko izpišete tudi desno, a razlika prostemu očesu ne bo vidna (saj boste izpisovali prazna mesta).

Primer izpisa:

*********************
* Risanje smrečice *
*********************
Vnesi višino smrečice: 5
    *
   ***
  *****
 *******
*********

2.17. Obrat naravnega števila

Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.

2.17.1. Rešitev #1: splošna rešitev

Programska koda 40. naloga017a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

""" Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.  """

# Pozovemo uporabnika, naj poda število
stevilo = input("Podajte število, ki ga želite obrniti: ")

# preštejemo, koliko znakov ima niz
dolzina = len(stevilo)

n = 1
obrat = ""
while n <= dolzina:
    obrat += stevilo[dolzina-n]
    n+=1

# izpišemo obratno število
print(f"Obrat števila '{stevilo}' je '{obrat}'.")
Tabela 19. Razlaga
vrstica komentar

7

Uporabnika pozovemo, naj poda število, ki ga želi obrniti.

10

Da bomo lahko uporabili zanko, moramo vedeti, kako dolgo (koliko števk) ima število, zato uporabimo funkcijo len(). Pri tem velja opozorilo, da čeprav smo uporabnika pozvali k vpisu števila, lahko vpiše karkoli in ker funkcija input vrne niz znakov, lahko uporabimo funkcijo len, drugače bi se morali znajti drugače.

12

Uvedemo spremenljivko n, ki jo bomo potrebovali za premikanje od prve števke do zadnje. Spremenljivki n določimo vrednost 1.

13

Uvedemo spremenljivko obrat, ki jo bomo potrebovali za sestavljanje novega števila. Spremenljivki obrat določimo začetno vrednost "" (prazen niz znakov).

14

Nastavimo zanko, ki naj se izvaja, dokler spremenljivka n ne bo manjša ali enaka spremenljivki dolzina. Z drugimi besedami: zanka naj se izvaja, dokler ne bomo prišli od prvega znaka niza do zadnjega.

15

Spremenljivki obrat dodamo znak, ki se nahaja za n mest stran od zadnjega znaka. Trik v tem koraku je, da lahko vsak niz znakov (string) uporabljamo kot seznam (list) posameznih znakov. Tako je potem neko število seznam, v katerem se nahajajo posamezne števke celotnega števila. Če potem obračamo recimo številko 12345, se lahko premikamo po posameznih števkah: 1, 2, 3, 4 in 5. V zanki bomo tako v prvem koraku spremenljivki obrat dodali števko 5, ki pa se nahaja na mestu, označenem z indeksom 4. Zakaj 4? Ker se mesta v seznamih začnejo šteti z 0 in ne 1. Pri številki 12345 je torej števka 1 na mestu 0.

16

Premaknemo se za 1 števko naprej.

19

Izpišemo rezultat.

Primer izpisa:

Podajte število, ki ga želite obrniti: 12345
Obrat števila '12345' je '54321'.
Pozor

Tako pripravljen program deluje za kateri koli vpisan niz znakov, kar pomeni, da ne deluje tako, kot bi si želeli.

Podajte število, ki ga želite obrniti: FGG
Obrat števila 'FGG' je 'GGF'.

Če želimo, da bo program deloval samo za naravna števila, ga moramo dopolniti.

2.17.2. Rešitev #2: primer rešitve, ki deluje samo za cela števila

Programska koda 41. naloga017b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

""" Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.  """

## OPOMBA: deluje samo za cela števila

# Pozovemo uporabnika, naj poda število
stevilo = input("Podajte število, ki ga želite obrniti: ")

try:
    tmp = int(stevilo)
except:
    print("Niste vnesli celega števila!")
    quit()

# preštejemo, koliko znakov ima niz
dolzina = len(stevilo)

n = 1
obrat = ""
while n <= dolzina:
    obrat += stevilo[dolzina-n]
    n+=1

# izpišemo vsoto
print(f"Obrat števila '{stevilo}' je '{obrat}'.")

Rešitev a dopolnimo s preverjanjem tipa spremenljivke (vrstice 11-15). Če uporabnik ne vpiše naravnega (celega) števila, se program z obvestilom o napačnem vpisu ustavi.

Primer izpisa ob napaki:

Podajte število, ki ga želite obrniti: FGG
Niste vnesli celega števila!
Pozor

Tako pripravljen program deluje za katero koli vpisano celo število, tudi negativno, ki ga bo izpisal celo napačno.

Podajte število, ki ga želite obrniti: -123
Obrat števila '-123' je '321-'.

To pomeni, da moramo program še dopolniti.

2.17.3. Rešitev #3: primer rešitve, ki deluje samo za naravna števila

Programska koda 42. naloga017c.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

""" Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.  """

## OPOMBA: deluje samo za cela števila

# Pozovemo uporabnika, naj poda število
stevilo = input("Podajte število, ki ga želite obrniti: ")

if stevilo.isdigit() == False:
    print("Niste vnesli naravnega števila!")
    quit()

# preštejemo, koliko znakov ima niz
dolzina = len(stevilo)

n = 1
obrat = ""
while n <= dolzina:
    obrat += stevilo[dolzina-n]
    n+=1

# izpišemo vsoto
print(f"Obrat števila '{stevilo}' je '{obrat}'.")

Čeprav bi lahko nadgradili rešitev b s pogojnim stavkom, ki bi preverjal, ali je vnešeno število pozitivno ali negativno, smo raje predstavili rešitev z uporabo metode isdigit() (vrstice 11-13). Z njo preverimo, če so vsi znaki v nizu številke. Če se na primer v podanem nizu nahaja znak - ali pa recimo črka, decimalna vejica ali pika, metoda vrne vrednost False. Če metoda vrne vrednost True, smo lahko prepričani, da se v podanem nizu nahajajo samo številke. Druge kontrole niso potrebne. Izpis je popolnoma enak prejšnjemu.

2.17.4. Rešitev #4: primer rešitve, ki deluje samo za naravna števila (krajši način)

Programska koda 43. naloga017d.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

""" Sestavi program, ki prebere naravno število in ga izpiše v obratnem vrstnem redu.  """

# Pozovemo uporabnika, naj poda število
stevilo = input("Podajte naravno število, ki ga želite obrniti: ")

if stevilo.isdigit() == False:
    print("Niste vnesli naravnega števila!")
    quit()

# obrnemo
obrat = stevilo[::-1]

# izpišemo vsoto
print(f"Obrat števila '{stevilo}' je '{obrat}'.")

Ta rešitev je najkrajša in izkorišča možnosti in bližnjice programskega jezika Python.

Opazimo lahko, da je namesto zanke, s katero smo operirali v prvih treh primerih, v vrstici 14 uporabljen poseben ukaz oziroma operator [::-1]. S tem ukazom povemo, da želimo ustvariti nov niz znakov, ki začne na koncu prvotnega niza in se pomika proti začetku (to je poziciji 0) s korakom -1, torej nazaj (v drugem posebnem primeru bi se lahko pomikal tudi naprej, odvisno od tega, kaj želimo doseči). Izpis je drugače identičen prejšnjemu.

2.18. Je besedilo palindrom?

Sestavi program, v katerem uporabnik vpiše niz znakov, program pa pove, ali je vpisan niz znakov palindrom ali ne.

Naloga je zelo podobna nalogi 17, predvsem rešitvi a, a zahteva dodatne kontrole.

2.18.1. Rešitev #1: (polovična) rešitev

Programska koda 44. naloga018a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("**********************************")
print("*** Ali je besedilo palindrom? ***")
print("**********************************")

# pozovemo uporabnika, naj vpiše besedilo
besedilo = input("Vpiši potencialen palindrom: ")

# obrnemo besedilo
obrnjeno_besedilo = besedilo[::-1]

# primerjamo besedili
if besedilo == obrnjeno_besedilo:
    print(f"Besedilo '{besedilo}' JE palindrom!")
else:
    print(f"Besedilo '{besedilo}' NI palindrom!")
Tabela 20. Razlaga
vrstica komentar

9

Uporabnika pozovemo, naj poda besedilo, ki ga bomo preverjali.

12

Podano besedilo obrnemo, podobno, kot smo storili pri rešitvi d naloge 17.

15-18

Preverimo, če sta vrednosti spremenljivk besedilo ter obrnjeno_besedilo identični ter na podlagi primerjave izpišemo, da besedilo je ali pa ni palindrom.

Primer izpisa:

**********************************
*** Ali je besedilo palindrom? ***
**********************************
Vpiši potencialen palindrom: pericarežeracirep
Besedilo 'pericarežeracirep' JE palindrom!
**********************************
*** Ali je besedilo palindrom? ***
**********************************
Vpiši potencialen palindrom: perica reže raci rep
Besedilo 'perica reže raci rep' NI palindrom!
Pozor

Kot vidimo, tako pripravljen program sicer deluje, a ne tako, kot smo vajeni. Kot vidimo zgoraj, za besedilo 'pericarežeracirep' pravilno ugotovi, da je palindrom, hkrati pa v primeru, da zapišemo besedilo v obliki 'perica reže raci rep' tega ne ugotovi, saj moramo presledke postaviti drugam. Zato rešitev izboljšajmo.

2.18.2. Rešitev #2: (končna) rešitev

Programska koda 45. naloga018b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Uporabnik vpiše niz znakov, program pa pove, ali je vpisan niz palindrom ali ne.
Palindrom je niz znakov, ki se enako prebere z leve in z desne.
"""

## tole deluje: pericarezeracirep
## tole ne deluje: perica reze raci rep

print("*********************************")
print("*** Ali je besedilo palindrom ***")
print("*********************************")


# pozovemo uporabnika, naj vpiše besedilo
besedilo = input("Vpiši potencialen palindrom: ")

# odstranimo presledke in vse velike črke spremenimo v male
cisto_besedilo = besedilo.replace(" ","").lower()
cisto_besedilo = cisto_besedilo.replace(".","").replace(",","").replace("!","")

# obrnemo besedilo
obrnjeno_besedilo = cisto_besedilo[::-1]

# primerjamo besedili
if cisto_besedilo == obrnjeno_besedilo:
    print(f"Besedilo '{besedilo}' JE palindrom!")
else:
    print(f"Besedilo '{besedilo}' NI palindrom!")

Rešitev a popravimo tako, da dodamo vrstici 21 in 22. V vrstici 21 najprej vpeljemo spremenljivko cisto_besedilo. Tej spremenljivki nato priredimo vrednost spremenljivke besedilo, ki ji najprej odstranimo presledke (s pomočjo metode replace()), nato pa še vse črke zmanjšamo (s pomočjo metode lower()).

Ker razmišljamo vnaprej, v vrstici 22 nizu znakov odstranimo še ločila. Pozorni moramo biti še na vrstici 25 in 28, saj operiramo s spremenljivko cisto_besedilo in ne besedilo. Ostalo ostane enako, program pa sedaj deluje pravilno.

Primer izpisa:

*********************************
*** Ali je besedilo palindrom ***
*********************************
Vpiši potencialen palindrom: Perica Reže Raci REP!
Besedilo 'Perica Reže Raci REP!' JE palindrom!

2.19. Največji skupni delitelj podanih števil

Sestavi program, ki izračuna največji skupni delitelj števil a in b in izpiše vse vmesne rezultate Evklidovega algoritma.

2.19.1. Rešitev #1: rešitev

Programska koda 46. naloga019a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import math

# Izpišemo, za kakšen program gre
print("*"*60)
print("*"*5,"Program za izračun največjega skupnega delitelja","*"*5)
print("*"*60)

# definirajmo funkcijo, ki nam bo preverila, če sta vnešeni številki celi
def preveriStevilke(stevilka):
    try:
        stevilka = int(stevilka)
        return stevilka
    except:
        print(f"'{stevilka}' ni številka.")
        quit()

# Pozovemo uporabnika, naj poda dve celi številki
stevilo1 = input("Podajte prvo celo število: ")
# preverimo številki
stevilo1 = preveriStevilke(stevilo1)

stevilo2 = input("Podajte drugo celo število: ")
stevilo2 = preveriStevilke(stevilo2)

print("-"*60)

# določimo spremenljivki a in b
a,b = stevilo1,stevilo2

# Evklidov algoritem
while b:
    n = math.floor(a/b)
    print(f"{a} = {n} * {b} + {a%b}")
    a,b=b,a%b
print(f"Največji delitelj števil {stevilo1} in {stevilo2} je {a}.")
Tabela 21. Razlaga
vrstica komentar

12-18

Definiramo funkcijo preveriStevilke(), ki preveri, če sta vnešeni številki celi. Funkcijo pripravimo zato, ker bomo preverjali 2 vnosa. Funkcija v primeru, da uporabnik ne vnese celih števil, vrne napako in ustavi izvajanje.

21,25

Uporabnika pozovemu k vnosu številk, za kateri bomo iskali največji skupni delitelj.

23,26

Preverimo, če je uporabnik res vnesel številki. Pri tem uporabimo funkcijo preveriStevilke().

31

Uvedemo novi spremenljivki a in b, za zamenjavo pa uporabimo dvojno prirejanje. Namesto a,b=stevilo1,stevilo2 v vrstici 32 bi denimo lahko napisali a = stevilo1 in v novo vrstico b = stevilo2.

34-37

Uporabimo Evklidov algoritem. Zanj uporabimo zanko while, ki se izvaja tako dolgo, dokler ima spremenljivka b vrednost, ki je večja od 0. Uporabimo tudi funkcijo math.floor(), ki količnik (a/b) zaokroži na najbližje celo število navzdol. Bodite pozorni, da smo zaradi uporabe te funkcije v vrstici 4 morali uvoziti modul math. Morda spomnimo še to, da nam izraz a%b vrne ostanek pri deljenju a z b.

38

Ko se zanka zaključi (ko je b = 0, kar pomeni, da je a največji delitelj, saj ostanka pri deljenju v prejšnjem koraku ni bilo), izpišemo rezultat.

Primer izpisa:

************************************************************
***** Program za izračun največjega skupnega delitelja *****
************************************************************
Podajte prvo celo število: 27
Podajte drugo celo število: 63
------------------------------------------------------------
63 = 2 * 27 + 9
27 = 3 * 9 + 0
Največji delitelj števil 27 in 63 je 9.

2.19.2. Rešitev #2: rešitev za več kot 2 podani števili

Programska koda 47. naloga019b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import math

# Izpišemo, za kakšen program gre
print("*"*60)
print("*"*5,"Program za izračun največjega skupnega delitelja","*"*5)
print("*"*60)

# definirajmo funkcijo, ki nam bo preverila, če sta vnešeni številki celi
def preveriStevilke(stevilka):
    try:
        stevilka = int(stevilka)
        return stevilka
    except:
        print(f"'{stevilka}' ni številka.")
        quit()

# Pozovemo uporabnika, naj poda števila
stevila = input("Podajte števila (ločite jih z vejico): ")

# sestavimo seznam s števili
stevila_string = stevila.split(",")

# uvedemo seznam stevila
stevila = []

# preverimo števila in jih dodamo v seznam, če ni napake
for i in stevila_string:
    i = preveriStevilke(i.replace(" ",""))
    stevila.append(i)

# izpišemo vnešena števila
print(f"Vnesli ste števila: {stevila}")
print("-"*60)

i = 1
while i < len(stevila):
    if i == 1:
        a,b = stevila[i],stevila[i-1]
    else:
        a,b = stevila[i],delitelj
    a_original,b_original = a,b

    print(f"Preglejujem številki {a} in {b}.")
    # Evklidov algoritem
    while b:
        n = math.floor(a/b)
        print(f"{a} = {n} * {b} + {a%b}")
        a,b=b,a%b
    delitelj = a
    print(f"Največji skupni delitelj števil {a_original} in {b_original} je {delitelj}.")
    print("-"*60)
    i += 1

print(f"Največji skupni delitelj števil {', '.join(stevila_string)} je {delitelj}.")

Ta rešitev temelji na rešitvi a z dvema bistvenima popravkoma:

  • pri vnosu uporabnik številke vnese tako, da jih loči z vejicami,

  • iskanje največjega skupnega delitelja za več kot 2 števili.

Tabela 22. Razlaga bistvenih delov
vrstica komentar

24

Vpeljemo spremenljivko stevila_string in ji priredimo seznam, ki ga pripravimo tako, da vpisane vrednosti (spremenljivka stevila) ločimo po vejicah.

27

Prejšnjo spremenljivko stevila spremenimo v prazen seznam.

30-32

Preverimo vse vrednosti v seznamu stevila_string, če so res števila. V primeru, da naletimo na vrednost, ki ni celo število, se program ustavi.

31

Preverjamo trenutno število, a pri tem iz vrednosti spremenljivke i odstranimo presledke. Tako uvedemo še eno kontrolo in uporabniku dovolimo, da pri naštevanju za vejicami uporablja presledke.

32

Če se program pri preverjanju vrednosti v vrstici 31 ni ustavil (če se ni ustavil zaradi kontrol v definirani funkciji preveriStevilke), potem dobljeno število dodamo na seznam stevila.

38-55

V tem sklopu izvajamo evklidov algoritem, kot smo to počeli v rešitvi a. Razlika je v tem, da ne vemo, koliko števil bo uporabnik vpisal, zato se po seznamu premikamo od začetka do konca. Trik je v tem, da najprej iščemo največji delitelj prvih dveh vpisanih števil, v vsakem naslednjem koraku pa preverjamo zgolj največji skupni delitelj med naslednjim številom ter deliteljem iz prejšnjega koraka. Spremenljivki a_original ter b_original, ki jih uvedemo v vrstici 44, sta namenjeni zgolj izpisu b vrstici 53, saj bi drugače začetni vrednosti izgubili.

57

Pri izpisu uporabimo metodo join(), ki elemente podanega seznama pretvori v niz znakov tako, da med posamezne elemente vstavi niz, ki mu ga podamo (v našem primeru je to ", ").

Primer izpisa:

************************************************************
***** Program za izračun največjega skupnega delitelja *****
************************************************************
Podajte števila (ločite jih z vejico): 14,77, 35,  777
Vnesli ste števila: [14, 77, 35, 777]
------------------------------------------------------------
Preglejujem številki 77 in 14.
77 = 5 * 14 + 7
14 = 2 * 7 + 0
Največji skupni delitelj števil 77 in 14 je 7.
------------------------------------------------------------------------------------------
Preglejujem številki 35 in 7.
35 = 5 * 7 + 0
Največji skupni delitelj števil 35 in 7 je 7.
------------------------------------------------------------------------------------------
Preglejujem številki 777 in 7.
777 = 111 * 7 + 0
Največji skupni delitelj števil 777 in 7 je 7.
------------------------------------------------------------------------------------------
Največji skupni delitelj števil 14, 77,  35,   777 je 7.

2.20. Ugibanje celega števila med 0 in 100

Sestavi program, s katerim ugibamo celo število med 0 in 100.

Program naj si naključno izbere število med 0 in 100, uporabnik pa naj v čim manj poskusih ugane, katero število je izbral.

2.20.1. Rešitev #1: rešitev brez pomoči

Programska koda 48. naloga020a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("*********************************")
print("***** Igra: ugani številko! *****")
print("*********************************")

# vključim modul random, da bom lahko izbral naključen integer
import random

# izberem iskano številko
iskanaStevilka = random.randint(0,100)

steviloPoskusov = 0

#nastavim začetno število na vrednost, ki zagotovo ni enaka iskani
stevilka = -1

while stevilka != iskanaStevilka:
    stevilka = input("Ugani številko med 0 in 100: ")
    steviloPoskusov += 1
    if stevilka.isnumeric(): 
        stevilka = int(stevilka)
        if stevilka != iskanaStevilka:
            print(f"Poskus št. {steviloPoskusov}. {stevilka} ni prava številka.")
            print(f"Poskusi znova!")
        elif stevilka == iskanaStevilka:
            print(f"Bravo! V {steviloPoskusov}. poskusu si uganil številko {stevilka}!")
            print(f"Igra je končana!")
    else:
        print(f"Poskus št. {steviloPoskusov}. Vnesel si '{stevilka}', kar ni cela številka.")
        print(f"Poskusi znova!")
Tabela 23. Razlaga
vrstica komentar

9

Vključimo modul random, saj ga bomo potrebovali, da si bo program izbral naključno število.

12

Uvedemo novo spremenljivko iskanaStevilka in ji določimo naključno vrednost med 0 in 100. Za to uporabimo funkcijo randint(), ki je del modula random.

14

Uvedemo spremenljivko steviloPoskusov in določimo začetno število poskusov 0.

17

Uvedemo spremenljivko stevilka in ji določimo začetno vrednost, ki zagotovo ni enaka iskani.

19

Začnemo izvajati zanko while, ki se izvaja tako dolgo, dokler številka, ki jo uporabnik vnese, ni enaka številki, ki si jo je izbral program.

20

Uporabnika pozovemo, naj vpiše številko med 0 in 100.

21

Število poskusov povečamo za 1.

22

Če vnešena vrednost vsebuje samo številke, gremo naprej, v nasprotnem primeru se izvede vrstica 31 in se uporabnik pozove k vpisu nove številke.

23

Tip spremenljivke stevilka spremenimo v tip integer, saj iz vrstice 22 vemo, da so vnešene samo številke.

24-29

Preverjamo, če je vnešena vrednost enaka iskani. Če je, program končamo, če ni, se program izvaja naprej.

Primer izpisa:

*********************************
***** Igra: ugani številko! *****
*********************************
Ugani številko med 0 in 100: 0
Poskus št. 1. 0 ni prava številka.
Poskusi znova!
Ugani številko med 0 in 100: 1
Poskus št. 2. 1 ni prava številka.
Poskusi znova!
Ugani številko med 0 in 100: 2
Poskus št. 3. 2 ni prava številka.
Poskusi znova!
Ugani številko med 0 in 100: 3
Bravo! V 4. poskusu si uganil številko 3!
Igra je končana!

2.20.2. Rešitev #2: rešitev s pomočjo

Programska koda 49. naloga020b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print("*********************************")
print("***** Igra: ugani številko! *****")
print("*********************************")

# vključim modul random, da bom lahko izbral naključen integer
import random

# izberem iskano številko
iskanaStevilka = random.randint(0,100)

steviloPoskusov = 0

stevilka = -1

while stevilka != iskanaStevilka:
    stevilka = input("Ugani številko med 0 in 100: ")
    steviloPoskusov += 1
    if stevilka.isnumeric(): 
        stevilka = int(stevilka)
        if stevilka != iskanaStevilka:
            if stevilka > iskanaStevilka:
                pomoc = "Iskana številka je manjša!"
            else:
                pomoc = "Iskana številka je večja!"
            print(f"Poskus št. {steviloPoskusov}. {stevilka} ni prava številka.")
            print(f"{pomoc} Poskusi znova!")
        elif stevilka == iskanaStevilka:
            print(f"Bravo! V {steviloPoskusov}. poskusu si uganil številko {stevilka}!")
            print(f"Igra je končana!")
        print("-"*33)
    else:
        print(f"Poskus št. {steviloPoskusov}. Vnesel si '{stevilka}', kar ni cela številka.")
        print(f"Poskusi znova!")

Pri tej rešitvi uporabniku pomagamo tako, da mu v vsakem koraku povemo, ali je iskana številka manjša ali večja od vpisane. Tako ga usmerjamo k rešitvi.

Od rešitve a se razlikuje zgolj v vrsticah 24 do 27 (ter izpisu pomoči v vrstici 29).

Primer izpisa:

*********************************
***** Igra: ugani številko! *****
*********************************
Ugani številko med 0 in 100: 3
Poskus št. 1. 3 ni prava številka.
Iskana številka je večja! Poskusi znova!
---------------------------------
Ugani številko med 0 in 100: 50
Poskus št. 2. 50 ni prava številka.
Iskana številka je manjša! Poskusi znova!
---------------------------------
Ugani številko med 0 in 100: 30
Bravo! V 3. poskusu si uganil številko 30!
Igra je končana!
---------------------------------

2.21. Ali trikotnik obstaja?

Sestavi program, ki bo prebral tri realna števila, nato pa preveril, ali obstaja trikotnik s takimi dolžinami stranic. Če obstaja, naj program izračuna njegovo ploščino in obseg.

2.21.1. Rešitev #1: rešitev z vnosom vsake stranice posebej

Programska koda 50. naloga021a.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Izpišemo, za kakšen program gre
print("*"*64)
print("*"*5,"Karakteristike trikotnika","*"*5)
print("*"*64)

# Podamo stranice pravokotnika
a = input('Vnesite dolžino stranice a: ')
b = input('Vnesite dolžino stranice b: ')
c = input('Vnesite dolžino stranice c: ')

# definirajmo funkcijo, ki nam bo preverila vnešene stranice
def preveriStevilke(stevilka):
    try:
        stevilka = float(stevilka)
        return stevilka
    except:
        print(f"'{stevilka}' ni številka.")
        quit()

print("-"*64)

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
a = preveriStevilke(a)
b = preveriStevilke(b)
c = preveriStevilke(c)

# uvedemo spremenljivko napaka tipa 'boolean', ki ima privzeto vrednost 'false'
napaka = False

# preverimo, če trikovnik s podanimi stranicami obstaja
if a + b > c:
    print(f"a + b > c: Pogoj JE izpolnjen -> {a} + {b} > {c}")
else:
    print(f"a + b > c: Pogoj NI izpolnjen -> {a} + {b} < {c}")
    napaka = True

if b + c > a:
    print(f"b + c > a: Pogoj JE izpolnjen -> {b} + {c} > {a}")
else:
    print(f"b + c > a: Pogoj NI izpolnjen -> {b} + {c} < {a}")
    napaka = True

if a + c > b:
    print(f"a + c > b: Pogoj JE izpolnjen -> {a} + {c} > {b}")
else:
    print(f"a + c > b: Pogoj NI izpolnjen -> {a} + {c} < {b}")
    napaka = True

print("-"*64)
if napaka == True:
    print(f"Trikotnik s podanimi stranicami {a}, {b} in {c} ne obstaja.")
else:
    obseg = a + b + c
    
    #polobseg
    s = obseg / 2

    # izračun površine po Heronovi formuli
    povrsina = (s*(s-a)*(s-b)*(s-c))**0.5

    # izpis
    print(f"Trikotnik s podanimi stranicami {a}, {b} in {c} ima obseg {obseg} in površino {povrsina}.")
Tabela 24. Razlaga
vrstica komentar

10-12

Uporabnika pozovemo k vnosu vseh treh stranic in vpisane vrednosti priredimo spremenljivkam a, b in c.

15-21

Definiramo funkcijo preveriStevilke(), ki za vpisano vrednost preveri, ali gre za decimalno število ali ne. Najprej poskusi vpisan niz znakov pretvoriti v decimalno število (z uporabo funkcije float(), vrstica 17). Če je pretvorba uspešna, vrne številko (vrstica 18), v nasprotnem primeru pa izpiše napako (vrstica 20) in program ustavi (vrstica 21).

26-28

Vsako od spremenljivk (a, b in c) preverimo, če gre za število.

31

Uvedemo spremenljivko napaka, ki je tipa boolean in ima privzeto vrednost False. V nadaljevanju jo bomo uporabili za preverjanje vseh pogojev.

34-50

Preverimo, če trikotnik s podanimi dolžinami stranic obstaja. Pri vsakem od pogojev izpišemo, če je pogoj izpolnjen. Če ni izpolnjen, vrednost spremenljivke napaka spremenimo v True, kar pomeni, da trikotnik s podanimi dolžinami stranic ne obstaja.

53-65

Preverimo, če je vrednost spremenljivke napaka enaka True (vrstica 53). V tem primeru izpišemo obvestilo o tem, da trikotnik s podanimi stranicami ne obstaja (vrstica 54). Če vrednost spremenljivke napaka ni enaka True (kar pomeni, da je enaka False), to pomeni, da tak trikotnik obstaja, zato zanj izračunamo obseg (vrstica 56) in površino (vrstica 62) ter rezultat z obvestilom izpišemo (vrstica 65).

Primer izpisa, če trikotnik obstaja:

****************************************************************
***** Karakteristike trikotnika *****
****************************************************************
Vnesite dolžino stranice a: 3
Vnesite dolžino stranice b: 4
Vnesite dolžino stranice c: 5
----------------------------------------------------------------
a + b > c: Pogoj JE izpolnjen -> 3.0 + 4.0 > 5.0
b + c > a: Pogoj JE izpolnjen -> 4.0 + 5.0 > 3.0
a + c > b: Pogoj JE izpolnjen -> 3.0 + 5.0 > 4.0
----------------------------------------------------------------
Trikotnik s podanimi stranicami 3.0, 4.0 in 5.0 ima obseg 12.0 in površino 6.0.

Primer izpisa ob napaki:

****************************************************************
***** Karakteristike trikotnika *****
****************************************************************
Vnesite dolžino stranice a: 1
Vnesite dolžino stranice b: 2
Vnesite dolžino stranice c: b
----------------------------------------------------------------
'b' ni številka.

Primer izpisa, če trikotnik ne obstaja:

****************************************************************
***** Karakteristike trikotnika *****
****************************************************************
Vnesite dolžino stranice a: 1
Vnesite dolžino stranice b: 2
Vnesite dolžino stranice c: 3
----------------------------------------------------------------
a + b > c: Pogoj NI izpolnjen -> 1.0 + 2.0 < 3.0
b + c > a: Pogoj JE izpolnjen -> 2.0 + 3.0 > 1.0
a + c > b: Pogoj JE izpolnjen -> 1.0 + 3.0 > 2.0
----------------------------------------------------------------
Trikotnik s podanimi stranicami 1.0, 2.0 in 3.0 ne obstaja.

2.21.2. Rešitev #2: rešitev z enkratnim vnosom

Programska koda 51. naloga021b.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Izpišemo, za kakšen program gre
print("*"*64)
print("*"*5,"Karakteristike trikotnika","*"*5)
print("*"*64)

# Podamo stranice pravokotnika
stranice = input('Vnesite dolžine stranic trikotnika, ki jih loči z vejico: ')

# Podan niz znakov pretvorimo v seznam
stranice = stranice.split(",")

# Preverimo, koliko delov ima seznam
if len(stranice) != 3:
    print("Podali ste več ali manj kot 3 stranice!")
    quit()

# če so tri stranice
a = stranice[0]
b = stranice[1]
c = stranice[2]

# definirajmo funkcijo, ki nam bo preverila vnešene stranice
def preveriStevilke(stevilka):
    try:
        stevilka = float(stevilka)
        return stevilka
    except:
        print(f"{stevilka} ni številka.")
        quit()

print("-"*64)

# poskusimo spremeniti tip spremenljivke iz 'string' v 'float'
a = preveriStevilke(a)
b = preveriStevilke(b)
c = preveriStevilke(c)

# uvedemo spremenljivko napaka tipa 'boolean', ki ima privzeto vrednost 'false'
napaka = False

# preverimo, če trikovnik s podanimi stranicami obstaja
if a + b > c:
    print(f"a + b > c: Pogoj JE izpolnjen -> {a} + {b} > {c}")
else:
    print(f"a + b > c: Pogoj NI izpolnjen -> {a} + {b} < {c}")
    napaka = True

if b + c > a:
    print(f"b + c > a: Pogoj JE izpolnjen -> {b} + {c} > {a}")
else:
    print(f"b + c > a: Pogoj NI izpolnjen -> {b} + {c} < {a}")
    napaka = True

if a + c > b:
    print(f"a + c > b: Pogoj JE izpolnjen -> {a} + {c} > {b}")
else:
    print(f"a + c > b: Pogoj NI izpolnjen -> {a} + {c} < {b}")
    napaka = True

print("-"*64)
if napaka == True:
    print(f"Trikotnik s podanimi stranicami {a}, {b} in {c} ne obstaja.")
else:
    obseg = a + b + c
    
    #polobseg
    s = obseg / 2

    # izračun površine po Heronovi formuli
    povrsina = (s*(s-a)*(s-b)*(s-c))**0.5

    # izpis
    print(f"Trikotnik s podanimi stranicami {a}, {b} in {c} ima obseg {obseg} in površino {povrsina}.")

Pri tej rešitvi uporabnika ne pozovemo k vnosu vrednosti za vsako stranico posebej, ampak ga pozovemo, da to stori v enem koraku. Od rešitve a je ta različica drugačna od vrstice 10 do vrstice 23.

Tabela 25. Razlaga
vrstica komentar

10

Uporabnika pozovemo k vnosu vseh treh stranic, ki jih mora ločiti z vejico.

13

Vpeljemo spremenljivko stranice in ji priredimo vrednosti, ki jih dobimo tako, da vpisan niz znakov razdelimo po vejicah. Spremenljivka stranice je torej seznam (podatkovni tip list).

16-18

Preverimo, če ima seznam stranice več ali manj elementov kot 3. Če število elementov ne ustreza 3, izpišemo poročilo o napaki (vrstica 17) in izvajanje prekinemo (vrstica 32).

21-23

Če se izvajanje v vrstici 32 ne prekine, potem vemo, da ima seznam točno 3 elemente, zato uvedemo spremenljivke a, b in c in jim priredimo prvo (indeks 0, vrstica 21), drugo (indeks 1, vrstica 22) ter tretjo (indeks 2, vrstica 23) vrednost na seznamu stranice.

Primer izpisa:

****************************************************************
***** Karakteristike trikotnika *****
****************************************************************
Vnesite dolžine stranic trikotnika, ki jih loči z vejico: 4,   5,  7
----------------------------------------------------------------
a + b > c: Pogoj JE izpolnjen -> 4.0 + 5.0 > 7.0
b + c > a: Pogoj JE izpolnjen -> 5.0 + 7.0 > 4.0
a + c > b: Pogoj JE izpolnjen -> 4.0 + 7.0 > 5.0
----------------------------------------------------------------
Trikotnik s podanimi stranicami 4.0, 5.0 in 7.0 ima obseg 16.0 in površino 9.797958971132712.
Pozor

Če ste pozorni, pri pretvarjanju vnosnega niza znakov najprej v seznam in potem v decimalno število nikjer ne odstranjujemo presledkov. To ni potrebno, ker za odvečne presledke poskrbi uporabljena funkcija float().

Poglavje 3. Dodatni viri

Kolofon

Fakulteta za gradbeništvo in geodezijo Univerze v Ljubljani.

© 2024 Fakulteta za gradbeništvo in geodezijo

Objavljeno v Ljubljani.

Zbirko sta zasnovala Robert Klinc in Matevž Dolenc.

Ustvarjen s pomočnikom Asciidoctor na Apple Mac OS X.