Praktikum 12¶
Allolevad ülesanded on kursuse "Sissejuhatus programmeerimisse Pythoni baasil" YFX0500 praktikumis koos kursusega ja kodus iseseisvalt lahendamiseks. Kuidas lahendada allolevaid ülesandeid? Uuri ja kasuta loengus kommenteeritud süntaksi näiteid, abiinfot (Pythoni sisseehitatud funktsioon help, jne.), Internetti ja enda aju. Küsimuste korral, mis tekivad praktikumi ajal, pöördu õppejõu või õppejõudude poole. Iganädalaselt peale praktikumi toimumist avaldatakse ülesannete lahendused kursuse kodulehel.
Inimintellekti loodud ülesanded¶
Ülesanne 0:
Loo klass Koer, millel on:
- Atribuudid ehk objektimuutujad:
nimi,energy(algväärtusega50ühikut).
- Meetodid:
haugumis prindib konsooli"Woof!"ja vähendab energiat5-e ühiku võrra jamaga(minutit)mis suurendab energiataset koguseminutit // 2võrra. Eesmärk:
- Loo kaks koeraobjekti, lase neil haukuda ja tukastada ning väljasta konsooli nende lõplikud energiatasemed.
Näidisvastus: Kui koer haugatab kaks kord ja magab 5 minutit siis tema energiatase on 42 ühikut.
Ülesanne 1:
Uuri allolevat lähtekoodi.
class DoorBell:
click = 0 # Staatiline klassimuutuja.
def __init__(self):
self.click = 0 # Dünaamiline objektimuutuja.
def ring(self):
self.click += 1
DoorBell.click += 1
print(f"Ring! -> Counters: dynamic {self.click}, static {DoorBell.click}.")
d1 = DoorBell()
d2 = DoorBell()
for _ in range(5):
d1.ring()
for _ in range(2):
d2.ring()
print(d1.click)
print(d2.click)
print(DoorBell.click)
Miks väljastavad koodi kolm viimast rida konsooli tulemuse 5, 2 ja 7?
Ülesanne 2:
Loo klass mis defineerib rahakoti objekte. Rahakott peab sisaldama sularaha (arv, meelevaldne kogus), pangakaarte (arv) ja isikut tõendavaid dokumente (arv). Klass peab sisaldama infot selle kohta mis materjalist rahakott tehtud on ja mis värvi see on. Loo kaks rahakoti objekti:
- Loo punane nahast rahakott mis sisaldab 200 ühikut raha.
- Loo sinine tekstiilist rahakott mis sisaldab 2000 ühikut raha.
Ülesanne 3:
Täiusta eelmises ülesandes loodud klassi lisades sellele kaks meetodid. Meetodid peavad lisama ja eemaldama rahakotist raha.
Lihtsustus: Luba raha kogusel muutuda negatiivseks või olla negatiivne.
Ülesanne 4:
Täiusta esimeses ülesandes loodud klassi. Kirjuta üle spetsiaalne meetod __str__ või __repr__ nii, et objekti kirjeldus oleks inimloetav lause stiilis:
<Värv> <materjal> rahakott sisaldab <x> koguse raha <y> pangakaarti ...
Asenda <Värv>, <materjal>, <x> ja <y> objekti vastavate väärtustega.
Ülesanne 5:
Loo klass MyInt milles defineerid meetodi add mis liidab kahte (täis) arvu. Loodud meetod võiks käituda sarnaselt spetsiaalsele meetodile __add__.
Oodatav käitmine:
num1 = MyInt(1)
num2 = MyInt(3)
print(num1.add(num2)) # -> 4
print(MyInt.add(num1, num2)) # -> 4
Ülesanne 6:
Loo klass MyInt milles kirjutad üle operaatori * mis korrutab kahte (täis) arvu. Ülekirjutatud meetod peab käituma sarnaselt või identselt maagilisele meetodile __mul__ ja operaatorile *.
Oodatav käitumine:
num1 = MyInt(2)
num2 = MyInt(3)
print(num1 * num2) # -> 6
print(num1.__mul__(num2)) # -> 6
print(MyInt.__mul__(num1, num2)) # -> 6
Ülesanne 7:
Loo klass Punkt mis defineerib punkti kolmemõõtmelises ruumis. Punkti asukoht ruumis on defineeritud kolme koordinaadiga $(x, y, z)$. Lisa klassile meetod mis võrdleb kahte punkti. Võid maadilise meetodi __eq__ üle kirjutada või kirjutada enda meetodi:
- Loe kaks punkti võrdseks kui nende vastavad koordinaadi väärtused on võrdsed.
Soovitus: Koodi testimisel kasuta koordinaatide väärtustena täisarve.
Ülesanne 8:
Täienda eelmises ülesandes kirjutatud klassi Punkt. Lisa (ülekirjutus) maagilised meetodid millele vastavad Pythoni võrdlusoperaatorid < (väiksem kui) ja > (suurem kui):
- Loe suuremaks ($>$) punkti mille koordinaadid on teise punkti vastavatest koordinaatidest suuremad või võrdsed ($\ge$).
- Loe väiksemaks ($<$) punkti mille koordinaadid on teise punkti vastavatest koordinaatidest väiksemad või võrdsed ($\le$).
Ülesanne 9:
Kirjuta kooliõpetaja ainepäeviku klass mis loob õpilasi kellel peab olema nimi. Loo meetodid millega saab:
- olemasolevaid hindeid järgi vaadata,
- hinnet lisada ja
- eelnevalt lisatud hindeid ühe kaupa eemaldada.
Ülesanne 10: *
Kirjuta kooliõpetaja päeviku klass mis loob õpilasi kellel peab olema nimi ja kes on võtnud teatud aineid nt. 'Mata' ja 'Kahaline', vmt. Loo meetodid millaga saab:
- olemasolevaid hindeid järgi vaadata,
- hinnet teatud aines lisada ja
- ühe kaupa eelnevalt lisatud ainehindeid eemaldada.
Ülesanne 11:
Loo klass Vektor mis defineerib kahemõõtmelisi vektoreid. Kirjuta üle spetsiaalne meetod __abs__ millele vastab funktsioon abs, nii et see arvutab ja väljastab vektori pikkust $l$ (moodulit). Mooduli $l$ arvutamise valem on järgmine:
$$ l = \sqrt{x^2 + y ^2}, $$
kus $x$ ja $y$ on vektori komponendid.
Oodatav käitumine:
vektor = Vektor(3, 4)
print(abs(vektor)) # -> 5.0
print(vektor.__abs__()) # -> 5.0
print(Vektor(3, 4).__abs__()) # -> 5.0
Ülesanne 12:
Loo klass Vektor mis mis defineerib kahemõõtmelisi vektoreid $\vec{a} = (a_x, a_y)$. Kirjuta üle spetsiaalne meetod __add__ millele vastab operaator + (liitmine), nii et see arvutab kahe vektori summat ja leiab resultantvektori mooduli. Kahe vektori summa on leitav valemiga:
$$ \vec{c} = \vec{a} + \vec{b} = (a_x + b_x,~ a_y + b_y), $$
kus $\sigma_x$ on vektori $x$-komponent ja $\sigma_y$ on vektori $y$-komponent. Vektori pikkuse ehk mooduli $l$ arvutamise valem on kujul:
$$ l = \sqrt{c_x^2 + c_y ^2}, $$
kus $c_x$ ja $c_y$ on vektori komponendid.
Näidis vastus: $\vec{a} + \vec{b} = (3, 4) + (1, 1) = 6.4031242374328485$.
Ülesanne 13:
Loo klass Vektor mis defineerib kahemõõtmelisi vektoreid $\vec{a} = (a_x, a_y)$. Kirjuta üle spetsiaalne meetod __add__ millele vastab operaator + (liitmine), nii et see arvutab kahe vektori pikkuste ehk moodulite summat. Mooduli $l$ arvutamise valem on kujul:
$$ l = \sqrt{c_x^2 + c_y ^2}, $$
kus $c_x$ ja $c_y$ on vektori komponendid.
Näidis vastus: $\vec{a} + \vec{b} = (3,4) + (1,1) = 6.414213562373095$.
Ülesanne 14: *
Loo klass Generaator mis defineerib iteraatori (it_obj) mis suurendab täisarvu ühe võrra alustades nullist. Seega, loodav iteraator peab inkrementeerima (yield-ima) täisarve alustades 0-ga.
Vihje: Mis spetsiaalsed meetodid on iteraatoritel?
Sisendile:
print(next(it_obj)) # -> 0
print(next(it_obj)) # -> 1
print(next(it_obj)) # -> 2
for i in it_obj: # Mäletab iteraatori olekut...
if i > 10:
break
print(i)
print()
for i in Generaator():
if i > 10:
break
print(i)
Peab vastame järgmine väljund:
0
1
2
3
4
5
6
7
8
9
10
0
1
2
3
4
5
6
7
8
9
10
Ülesanne 15:
Koosta programm pangakontode loomiseks (kasuta klassi).
Programmiga peab saama:
- Luua uusi kontosid (objekt), andes kontole nime ja mingi hulga raha
- Kanda kontole raha (meetod)
- Kontole ei saa kanda negatiivset summat
- Võtta kontolt raha (meetod)
- Kontolt ei saa võtta negatiivset summat
- Kontolt ei saa võtta rohkem raha kui kontol on
Tehisintellekti loodud ülesanded¶
Järgnevad ülesanded on loodud 16.11.2025 juturoboti OpenAI ChatGPT (GPT-5) poolt.
Ülesanne TI-1:
Loo klass
Pizza, millel on:- Atribuudid ehk objektimuutujad:
suurus,millegamis on list mis sisaldab täidise komponente, nt. seened, juust, jne.
- Meetodid:
lisa_taidismis lisab täidise loendisse uue elemendi,kirjeldaprindib konsooli midagi sellist:"Suur pitsa pepperoni ja seentega"
- Eesmärk:
- Loo pitsa, lisa kolm täidist (nt.
"ükssarviku juust"), ning prindi pizze kirjeldus.
- Loo pitsa, lisa kolm täidist (nt.
- Atribuudid ehk objektimuutujad:
Asenda meetod
kirjldamaagilise meetodiga__repr__mille sisu on sama mis meetodilkirjelda.
Ülesanne TI-2:
Loo klass Koer, millel on:
- Atribuudid ehk objektimuutujad:
nimi,energy(algväärtusega5ühikut).
- Meetodid:
haugu(korda)mis prindib konsooli"Woof!"kordakorda ja vähendab energiat1-e ühiku võrra iga haugatuse kohta. Kui koera energia saab otsa pane koer magama viieks minutiks kasutades järgmist meetodit.maga(minutit)mis printdib konsooli"zzZ!"minutitkorda ja mis suurendab energiataset koguse 1minutitvõrra, seega 1minutit= 1energiaühik.
Ülesanne TI-3:
Loo klass Chicken, millel on:
- Atribuudid ehk objektimuutujad:
name- kana nimi,strength- kana jõutase (algväärtusega1).
- Meetodid:
trainmis prindib konsooli"{name} tõstab väikest hantlit!"ja suurendab jõutaset ühe ühiku võrra,fight(other)mis võrdleb kanade jõutasemeid ja prindib, kes võidab. Kui kanad on võrdselt tugevad siis teavita viigist.
Eesmärk: Kasuta moodulit random ja treeni kaks kana juhuslik arv kordi, siis pane nad omavahel võitlema.
Kodus¶
Ülesanne 16:
Loo generaatori klass mis genereetib täisarve 0 kuni 10 (kaasaarvatud). Juhul kui iteraator ammendub peab see tõstatama erisuse StopIteration.
Sisendile:
number = Generaator()
for i in number:
print(i)
next(number)
Peaks vastama järgmine väljund:
0
1
2
3
4
5
6
7
8
9
10
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
Cell In[15], line 21
18 for i in number:
19 print(i)
---> 21 next(number)
Cell In[15], line 14, in Iteraator.__next__(self)
12 return self.num
13 else:
---> 14 raise StopIteration('Lisa siia oma sõnum')
StopIteration: Lisa siia oma sõnum
Ülesanne 17:
Üldista eelmises ülesandes loodud iteraatori klassi. Lisa kasutajale võimalus valida iteraatori algus ja lõpppunkti väärtused ning itereerimise samm.
Sisendile:
numbrid1 = Iteraator(0, 20, 2)
numbrid2 = Iteraator(0, -10, -1)
for i in numbrid1:
print(i)
print()
for i in numbrid2:
print(i)
Peaks vastama järgmine väljund:
0
2
4
6
8
10
12
14
16
18
20
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
**Ülesanne 18:***
Loo klass MyInt milles defineerid meetodi add mis liidab kahte (täis) arvu. Ära kasuta konstruktorit.
Oodatav käitumine:
print(MyInt().add(1, 2)) # -> 3
MyInt_obj = MyInt()
print(MyInt_obj.add(1, 2)) # -> 3