Praktikum 12¶
Allolevad ülesanded on kusrsuse "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.
Ü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:
Punane nahast rahakott sisaldab <x> koguse raha <y> pangakaarti ...
jne.
Ü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 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. Punkt 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 võrreldava punkti vastavatest koordinaatidest suuremad või võrdsed.
Ülesanne 9:
Kirjuta kooliõpetaja ainepäeviku klass mis loob õpilasi kellel peab olema nimi. Loo meetodid millega saab olemasolevaid hindeid järgivaadata, 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'
. Loo meetodid millaga saab olemasolevaid hindeid järgivaadata, 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 +
, nii et see arvutab kahe vektori summat ja leiab resultantvektori mooduli. Kahe vektori summa on leitav kujul:
kus $\sigma_x$ on vektori $x$-komponent ja $\sigma_y$ on vektori $y$-komponent. 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 +
, nii et see arvutab kahe vektori moodulite summat (vektorite pikkkuste 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 Iteraator
mis defineerib iteraatoreid ja loob iteraatortoega objekte (number
). Loodav iteraator peab genereerima (yield
-ima) täisarve alustades 0-ga.
Vihje: Mis spetsiaalsed meetodid on iteraatoritel?
Sisendile:
print(next(number)) # -> 0
print(next(number)) # -> 1
print(next(number)) # -> 2
for i in number: # Üle iteraatortoega objekti.
if i > 10:
break
print(i)
print()
for i in Iteraator(): # Üle iteraatori.
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
Kodus¶
Ülesanne 16:
Loo iteraatori klass mis genereetib täisarve 0 kuni 10 (kaasaarvatud). Juhul kui iteraator ammendub peab see tõstatama erisuse StopIteration
.
Sisendile:
number = Iteraator()
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