Predgovor
Kar slišim, pozabim. Kar vidim, si zapomnim. Kar naredim, razumem.
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 to 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 kot edino pravilno!
Sedaj pa veselo na delo.
Srečno!
Robert Klinc in Matevž Dolenc
Napotki za uporabo
Zbirka je razdeljena na dva dela:
-
v prvem delu so opisane naloge z bistvenimi namigi ter povezavami do rešitev,
-
v drugem delu so predstavljene nekatere 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 bi bila pot do rešitev čim bolj jasna in razumljiva.
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 pojasnila pri vsaki od rešitev.
Želiva vam uspešno programiranje.
Poglavje 1. Naloge
1.1. Množenje števil
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: Izvorna koda 1. |
1.2. Pozdrav
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: Izvorna koda 2. |
1.3. Izračun ploščine in obsega kroga
V tem primeru imamo več možnosti reševanja: |
1.4. Seštevanje števil
Tukaj je treba uporabnika pozvati k vpisu dveh števil s pomočjo funkcije input(), nato pa je treba biti pozoren na podatkovni tip: |
1.5. Izračun ploščine in obsega pravokotnika
Tukaj je treba uporabnika pozvati k vpisu dolžin stranic s pomočjo funkcije input(): |
1.6. Pretvarjanje med Celzijevimi in Fahrenheitovimi stopinjami
V tem primeru spoznamo uporabo pogojnih stavkov. Pomembni sta formuli za pretvorbo med °C in °F:
Pripravimo lahko tri programe: |
1.7. Preverjanje, ali je podano število popoln kvadrat
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
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 z zanko for. Nalogo lahko rešimo tako, da: |
1.9. Praštevilo
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
Pravilo za določanje prestopnih let je:
Zdaj že vidimo, da bo naša rešitev vsebovala nekaj pogojnih stavkov. |
1.11. Fibonaccijevo zaporedje
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
Nalogo rešimo s pomočjo zapisovanja vpisanih števil v polje. Primer rešitve: naloga 12. |
1.13. Seštevanje števk naravnega števila
1.14. Pravilno sklanjanje
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.15. Fakulteta števila
1.16. Risanje smrečice
1.17. Obrat naravnega števila
1.18. Je besedilo palindrom?
Rešitvi
|
1.19. Največji skupni delitelj podanih števil
Rešitvi
|
1.20. Ugibanje celega števila med 0 in 100
Rešitvi
|
1.21. Ali trikotnik obstaja?
Poglavje 2. Rešitve
2.1. Množenje števil
2.1.1. Rešitev
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}")
Če program zaženete, bo program izpisal zgolj rešitev. Če pa odstranite znak # v vrstici 15, bo izpis podoben spodnjemu.
Rezultat: 2 * 4 = 8
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 enaka. 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ča oziroma prevajalnik, ki prevaja ukaze, zapisane v programskem jeziku Python. |
2 |
V tej vrstici so 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 tega 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 treba znak # odstraniti. |
2.2. Pozdrav
2.2.1. Rešitev
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}!")
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
2.3.1. Rešitev #1
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}.")
vrstica | komentar |
---|---|
4 |
S tremi znaki " označujemo večvrstične komentarje. Vse, kar je vmes, Python interpretira kot komentar in tega 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 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:
|
2.3.2. Rešitev #2: uporaba natančnejše vrednosti π
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
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
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 pa označuje potenco. Tudi ta oblika zapisa je enakovredna obema prejšnjima, tako da je izpis identičen.
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}.")
2.3.5. Rešitev #5: zaokroževanje
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 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
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 treba 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 treba 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
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 Izvorna koda 8 in Izvorna 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 Izvorna koda 8.
Izpis v primeru napačnega vnosa je sedaj podoben spodnjemu.
Vnesi polmer kroga: r
'r' ni številka!
2.4. Seštevanje števil
2.4.1. Rešitev #1
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, 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}")
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 (Izvorna koda 10) smo tako sestavili dva niza znakov (postavili enega k drugemu) in ne sešteli. To se zgodi tudi, če 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 številski tip float.
2.4.2. Rešitev #2
Razlika med Izvorna koda 10 in Izvorna 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.
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, 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}")
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
2.4.3. Rešitev #3
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, 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
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, 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 Izvorna koda 12 kot tudi Izvorna koda 13 se od Izvorna 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 Izvorna koda 13, kjer v omenjeni vrstici uporabimo tudi funkcijo str, ki spremeljivko tipa float spremeni v spremenljivko tipa string! To storimo zato, ker je treba 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 enak.
Pozor
Kljub tej spremembi program še vedno ne deluje pravilno v vseh primerih, 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
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 (Izvorna koda 10, Izvorna koda 11, Izvorna koda 12 in Izvorna koda 13) namreč odpovedo, če uporabnik namesto številke vnese kakšen drug znak. Zato smo v tej rešitvi uvedli preverjanje izjem. Tako v vrstici 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
2.5.1. Rešitev #1: računanje brez preverjanja vnosov
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.
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. |
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
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 Izvorna koda 15 in Izvorna 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 Izvorna 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
2.6.1. Rešitev #1: °F → °C
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
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 Izvorna koda 17 in Izvorna koda 18 v skupen program.
Ena od možnih rešitev je naslednja.
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.
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 ', 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 jo pretvorimo v °F in rezultat izpišemo. V tem delu je koda enaka Izvorna 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 enaka Izvorna 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
2.7.1. Rešitev #1: s pomočjo modula math in funkcije math.sqrt()
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, treba 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 številski 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.
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 Izvorna koda 20 in Izvorna 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 enak Izvorna koda 20.
Vendar pa tako Izvorna koda 20 in Izvorna 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
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.
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)
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 Izvorna koda 20 in Izvorna koda 21.
2.8. Delitelji podanega števila
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 številih 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
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
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ša ali enaka 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
Če 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 Izvorna koda 24. Rešitev je seveda še več. |
2.8.2. Rešitev #2: izpis deliteljev za absolutno vrednost celega števila
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 Izvorna koda 23 in Izvorna 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 Izvorna koda 23 kot Izvorna 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.
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}")
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
2.9.1. Rešitev
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!")
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!
Če 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
2.10.1. Rešitev
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!")
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 vnesena 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 4 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
2.11.1. Rešitev #1: z vmesno spremenljivko
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
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
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
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 enak prejšnjemu.
2.12. Računanje statistike
2.12.1. Rešitev
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)
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, število 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. Če uporabnik vpiše črko namesto števila, se program ustavi.
|
Kako bi morali program popraviti, da bi izpisal zgolj obvestilo, da ni bilo vneseno število, ta vnos zanemaril in deloval naprej? Ni vam treba 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
2.13.1. Rešitev #1: z direktnim seštevanjem
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
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 spremenljivko 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 vnesenega 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 ji 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
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)
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, saj se ta izvaja po vrsti in mora imeti definirano funkcijo v spominu. Dobra praksa 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 enakih 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
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 0 ali 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 sklon izpite.
-
V vseh ostalih primerih izberemo sklon izpitov.
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
2.15.1. Rešitev #1: z računanjem in prikazom vmesnih korakov
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}")
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 če 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 bomo vneseno število manjšali proti 1 in računali fakulteto. Potrebujemo torej obe spremenljivki. |
26 |
Uvedemo spremenljivko fakulteta, ki bo imela vrednost izračunane fakultete vnesenega š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 enaka 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 prekine, 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. |
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
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 enak prejšnjemu.
2.15.3. Rešitev #3: z uporabo vgrajene funkcije za izračun fakultete
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 vneseno 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
2.16.1. Rešitev #1: smrečica, poravnana levo
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
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
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 v 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
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 znova 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.
vrstica | komentar |
---|---|
24 |
Vpeljemo spremenljivko stevilo_zvezdic in mu priredimo vrednost 2 * n - 1. To storimo zato, ker v izpisu zvezdic ne moremo 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
2.17.1. Rešitev #1: splošna rešitev
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}'.")
Primer izpisa:
Podajte število, ki ga želite obrniti: 12345
Obrat števila '12345' je '54321'.
vrstica | komentar |
---|---|
7 |
Uporabnika pozovemo, naj poda število, ki ga želi obrniti. |
10 |
Da bomo lahko uporabili zanko, moramo vedeti, kako dolgo je število (koliko števk ima), 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, sicer 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 je 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. |
Tako pripravljen program deluje za kateri koli vpisani niz znakov, kar pomeni, da ne deluje tako, kot bi si želeli.
Č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
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!
Tako pripravljen program deluje za katero koli vpisano celo število, tudi negativno, ki ga bo izpisal celo napačno.
To pomeni, da moramo program še dopolniti. |
2.17.3. Rešitev #3: primer rešitve, ki deluje samo za naravna števila
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 vneseno š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)
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 se 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 enak prejšnjemu.
2.18. Je besedilo palindrom?
2.18.1. Rešitev #1: (polovična) rešitev
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!")
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!
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 enaki, ter na podlagi primerjave izpišemo, da besedilo je ali pa ni palindrom. |
Kot vidimo, tako pripravljen program sicer deluje, a ne tako, kot smo vajeni. Kot vidimo zgoraj, za besedilo 'pericarežeracirep' program pravilno ugotovi, da je palindrom, a tega ne ugotovi, če besedilo zapišemo v obliki 'perica reže raci rep', saj moramo presledke postaviti drugam. Zato rešitev izboljšajmo. |
2.18.2. Rešitev #2: (končna) rešitev
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 vpisani niz palindrom ali ne.
Palindrom je niz znakov, ki se enako prebere z leve in z desne.
"""
## tole deluje: pericareŽeracirep
## tole ne deluje: perica reŽe 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
2.19.1. Rešitev #1: rešitev
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 števili celi
def preveriStevilke(stevilka):
try:
stevilka = int(stevilka)
return stevilka
except:
print(f"'{stevilka}' ni številka.")
quit()
# Pozovemo uporabnika, naj poda dve celi števili
stevilo1 = input("Podajte prvo celo število: ")
# preverimo števili
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}.")
vrstica | komentar |
---|---|
12-18 |
Definiramo funkcijo preveriStevilke(), ki preveri, če sta vneseni števili celi. Funkcijo pripravimo zato, ker bomo preverjali 2 vnosa. Če uporabnik ne vnese celih števil, funkcija vrne napako in ustavi izvajanje. |
21,25 |
Uporabnika pozovemu k vnosu števil, za kateri bomo iskali največji skupni delitelj. |
23,26 |
Preverimo, če je uporabnik res vnesel števili. 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
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 števili celi
def preveriStevilke(stevilka):
try:
stevilka = int(stevilka)
return stevilka
except:
print(f"'{stevilka}' ni število.")
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 števili {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 števila vnese tako, da jih loči z vejicami,
-
iskanje največjega skupnega delitelja za več kot 2 števili.
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. Če 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 ju uvedemo v vrstici 44, sta namenjeni zgolj izpisu v 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 števili 77 in 14.
77 = 5 * 14 + 7
14 = 2 * 7 + 0
Največji skupni delitelj števil 77 in 14 je 7.
------------------------------------------------------------------------------------------
Preglejujem števili 35 in 7.
35 = 5 * 7 + 0
Največji skupni delitelj števil 35 in 7 je 7.
------------------------------------------------------------------------------------------
Preglejujem števili 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
2.20.1. Rešitev #1: rešitev brez pomoči
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!")
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 število, ki ga uporabnik vnese, ni enako številu, ki si ga je izbral program. |
20 |
Uporabnika pozovemo, naj vpiše številko med 0 in 100. |
21 |
Število poskusov povečamo za 1. |
22 |
Če vnesena 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 vnesene samo številke. |
24-29 |
Preverjamo, če je vnesena 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
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?
2.21.1. Rešitev #1: rešitev z vnosom vsake stranice posebej
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 vnesene stranice
def preveriStevilke(stevilka):
try:
stevilka = float(stevilka)
return stevilka
except:
print(f"'{stevilka}' ni število.")
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}.")
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 vpisani niz znakov pretvoriti v decimalno število (z uporabo funkcije float(), vrstica 17). Če je pretvorba uspešna, vrne številko (vrstica 18), v nasprotnem primeru izpiše napako (vrstica 20) in program ustavi (vrstica 21). |
26-28 |
Za 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
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: ')
# Podani 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 vnesene stranice
def preveriStevilke(stevilka):
try:
stevilka = float(stevilka)
return stevilka
except:
print(f"{stevilka} ni število.")
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.
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 vpisani 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 treba, saj za odvečne presledke poskrbi uporabljena funkcija float(). |
Poglavje 3. Dodatni viri
Vsi dodatni viri so prosto dostopni na spletni strani http://pzi.si. Spodaj je seznam dodatnih virov:
-
Izvorna koda programov v knjigi.
-
Povezave do opisov uporabljenih konstant in funkcij ter pomembnih razlag:
-
Povezave na uporabne spletne vire: