Az objektumorientált programozás alapjai

Az objektumorientált programozás alapjai

Ebben a fejezetben megismerkedünk az objektumorientált programozás – az OOP – elméletével és gyakorlatával.
Beszélünk a programozási paradigmákról, az OOP-t támogató programozási nyelvekről, az OOP előnyeiről és az alapelveiről.
Az elméleti ismereteinket a gyakorlatban is kipróbáljuk, egyre komplexebb példák segítségével ásunk mind mélyebbre.

Beadandó feladatok:

1.1 Feladat: Készíts egy programot, amelyben van egy Negyzet nevű osztály. Attribútuma legyen az oldal hossza. Rendelkezzen továbbá a kerület és terület számításra is egy-egy metódussal!

import random


class Negyzet:
    def __init__(self, oldalhossz):
        self.oldalhossz = oldalhossz

    def terulet(self):
        return pow(self.oldalhossz, 2)

    def kerulet(self):
        return self.oldalhossz * 4


negyzetek = []
for _ in range(5):
    negyzet = Negyzet(random.randint(2, 20))
    negyzetek.append(negyzet)

for negyzet in negyzetek:
    print(f'Ha pl. a négyzet oldala: {negyzet.oldalhossz} egység, '
          f'akkor a területe: {negyzet.terulet()} egységnégyzet '
          f'kerülete pedig: {negyzet.kerulet()} egység.')

Ugrás az oldal tetejére

1.2 Feladat: Módosítsd az előző programot úgy, hogy a metódus ne a kerület- illetve a területértékkel térjen vissza, hanem maga gondoskodjon ezen értékek kiírásáról egy egész mondatos formában.

import random


class Negyzet:
    def __init__(self, oldalhossz):
        self.oldalhossz = oldalhossz
        self.terulet = pow(self.oldalhossz, 2)
        self.kerulet = self.oldalhossz * 4
        print(f'Ha pl. a négyzet oldala: {self.oldalhossz} egység,'
              f' akkor a területe: {self.terulet} egységnégyzet '
              f'kerülete pedig: {self.kerulet} egység.')


negyzetek = []
for _ in range(5):
    negyzet = Negyzet(random.randint(2, 20))
    negyzetek.append(negyzet)

"""
Vagy nem tudom mire gondolt a feladat aklkotója:
(1_3_feladatban egy harmadik verzió is van, ott a kiíró függvény 
az osztályon kívűl lett elhelyezve)

import random
class Negyzet:
    def __init__(self, oldalhossz):
        self.oldalhossz = oldalhossz
        self.terulet = pow(self.oldalhossz, 2)
        self.kerulet = self.oldalhossz * 4
        self.kiir()

    def kiir(self):
        print(f'Ha pl. a négyzet oldala: {self.oldalhossz} egység, 
        akkor a területe: {self.terulet} egységnégyzet '
              f'kerülete pedig: {self.kerulet} egység.')

negyzetek = []
for _ in range(5):
    negyzet = Negyzet(random.randint(2, 20))
    negyzetek.append(negyzet)"""

Ugrás az oldal tetejére

1.3 Feladat: Az 1.1 feladatban meghatározottak szerint készíts egy programot, amely a felhasználótól egymás után bekér négyzetek oldalhosszát egészen addíg, amíg a felhasználó 0 értéket nem ad meg! Ezen adat alapján a program hozzon létre negyzet objektumokat, melyeket egy listában tárol! A program írja ki a megadott négyzetek oldalhosszát, kerületét és területét!

class Negyzet:
    def __init__(self, oldalhossz):
        self.oldalhossz = oldalhossz

    def terulet(self):
        return pow(self.oldalhossz, 2)

    def kerulet(self):
        return self.oldalhossz * 4


def kiir(negyzet):
    print(f'A négyzet oldala: {negyzet.oldalhossz} egység,'
          f' területe: {negyzet.terulet()} egységnégyzet '
          f'kerülete pedig: {negyzet.kerulet()} egység.')


oldalhossz = 0
negyzetek = []
while oldalhossz != "0":
    oldalhossz = input("Add meg négyzet oldalainak hosszát: ")
    if oldalhossz == "0" or not oldalhossz.isdigit():
        print("Nullát vagy valótlan adatot adtál meg,"
              " ilyen négyzet nem létezik! Program Vége!")
    else:
        negyzet = Negyzet(int(oldalhossz))
        negyzetek.append(negyzet)
        kiir(negyzet)

print('A megadott négyzetek kiíratása: \n')
for negyzet in negyzetek:
    print(f'A négyzet oldala: {negyzet.oldalhossz} egység,'
          f' akkor a területe: {negyzet.terulet()} egységnégyzet '
          f'kerülete pedig: {negyzet.kerulet()} egység.')

Ugrás az oldal tetejére

2. Feladat: Készíts egy programot, amely objektumorientált módon tartja nyilván kutyák adatait (név, életkor, nem)! A nevét a felhasználó adja meg, az életkorát és a nemét véletlenszerűen határozza meg a program! Befejezésként a program a képernyőre írja ki a megadott kutyák adatait!

import random


class Kutya:
    def __init__(self, nev, eletkor, nem):
        self.nev = nev
        self.eletkor = eletkor
        self.nem = nem


kutya_neve = " "
kutyak = []
while kutya_neve != "":
    kutya_neve = input("Add meg a kutya nevét (ha végeztél,"
                       " csak üss ENTERT): ")
    if kutya_neve == "":
        print("Nem adtál meg kutyának nevet! Program Vége!")
    else:
        eletkor = random.randint(1, 20)
        nem = random.choice([True, False])
        if nem:
            nem = "szuka"
        else:
            nem = "kan"
        kutya = Kutya(kutya_neve, eletkor, nem)
        kutyak.append(kutya)

for kutya in kutyak:
    print(f'A kutya neve: {kutya.nev}, '
          f'életkora: {kutya.eletkor}, neme: {kutya.nem}')

Ugrás az oldal tetejére

1.1 Feladat: Hozz létre egy Diak nevű osztályt. Attribútumai: név, osztály, születési év. Az egyik metódusa állíptsa meg az aktuális év és a születési év alapján a diák életkorát, a másik metódusa pedig adjon vissza egy f-sztringet, amelyben mondatszerűen szerepelnek a diák adatai: Szia, Kiss Péter vagyok, a 10.A osztályba járok, 16 éves vagyok.

import datetime


class Diak:
    def __init__(self, nev, osztaly, szuletesi_ev):
        self.nev = nev
        self.osztaly = osztaly
        self.szuletesi_ev = szuletesi_ev

    def eletkor(self):
        return datetime.datetime.now().year - self.szuletesi_ev

    def kiir_adat(self):
        return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
               f"osztályba járok, {self.eletkor()} éves vagyok."



diak01=Diak('Kiss Péter', '8.A', 2008)
diak02=Diak('Nagy László', '2.C', 2014)

print(diak01.kiir_adat())
print(diak02.kiir_adat())

Ugrás az oldal tetejére

1.2 Feladat: Fejleszd tovább az előző programot úgy, hogy az osztálynak legyen osztályattribútuma, osztály- és statikus metódusa!

import datetime


class Diak:
    also_tagozatos = 0
    felso_tagozatos = 0

    def __init__(self, nev, osztaly, szuletesi_ev):
        self.nev = nev
        self.osztaly = osztaly
        self.szuletesi_ev = szuletesi_ev

# az osztály második karaktere szám (10., 11., 12. stb.. mind felső)
        if self.osztaly[1:2].isdigit():
            type(self).felso_tagozatos += 1
        else:
            if int(self.osztaly[0:1]) > 4:
                type(self).felso_tagozatos += 1
            else:
                type(self).also_tagozatos += 1

    def eletkor(self):
        return datetime.datetime.now().year - self.szuletesi_ev

    def kiir_adat(self):
        return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
               f"osztályba járok, {self.eletkor()} éves vagyok."

    @classmethod
    def diakok_letszama(cls):
        return cls.also_tagozatos + cls.felso_tagozatos

    @staticmethod
    def suli_info():
        return 'Futrinka Utcai Általános Iskola\nFaliújság\n\n'


diak01=Diak('Kiss Péter', '8.A', 2008)
diak02=Diak('Nagy László', '2.C', 2014)

print(Diak.suli_info())

print(diak01.kiir_adat())
print(diak02.kiir_adat())

print(f'Felsőtagozatos diákok létszáma: {Diak.felso_tagozatos}')
print(f'Alsótagozatos diákok létszáma: {Diak.also_tagozatos}')

print(f'Az iskola diákjainak létszáma: {Diak.diakok_letszama()}')

Ugrás az oldal tetejére

1.3 Feladat: Fejleszd tovább az előző programot úgy, hogy az hozzon létre öt Diak-objektumot. A nevet egy-egy vezeték és keresztneveket tartalmazó listából állítsa össze véletlenszerűen, az osztályt és a születési évet pedig szintén véletlenszerűen generálja! A Diak-objektumokat egy listában tárolja! A program a listát bejárva írja ki a diákadatokat a képernyőre!

import datetime
import random


class Diak:
    also_tagozatos = 0
    felso_tagozatos = 0

    def __init__(self, nev, osztaly, szuletesi_ev):
        self.nev = nev
        self.osztaly = osztaly
        self.szuletesi_ev = szuletesi_ev

        if self.osztaly[1:2].isdigit():
            type(self).felso_tagozatos += 1
        else:
            if int(self.osztaly[0:1]) > 4:
                type(self).felso_tagozatos += 1
            else:
                type(self).also_tagozatos += 1

    def eletkor(self):
        return datetime.datetime.now().year - self.szuletesi_ev

    def kiir_adat(self):
        return f"Szia, {self.nev} vagyok, a {self.osztaly} " \
               f"osztályba járok, {self.eletkor()} éves vagyok."

    @classmethod
    def diakok_letszama(cls):
        return cls.also_tagozatos + cls.felso_tagozatos

    @staticmethod
    def suli_info():
        return 'Futrinka Utcai Általános Iskola\nFaliújság\n'

diakok = []
vezeteknevek = ('Kis', 'Nagy', 'Szabó', 'Tóth', 'Pap', 'Dombai',
                'Friedrich', 'Kovács', 'Majer', 'Rónai',
                'Szalai', 'Magyar')
keresztnevek = ('Zoltán', 'Lajos', 'Tünde', 'János', 'Kálmán',
                'Attila', 'Enikő','Anikó', 'István', 'Jenő',
                'Péter', 'Mária')
betuk = ('A', 'B', 'C', 'D', 'E', 'T', 'Z')
# lehetséges osztályvégződések

for i in range(5):
    diak_neve = vezeteknevek[random.randint(0, 11)]+ ' ' \
                + keresztnevek[random.randint(0,11)]
    osztalya = str(random.randint(1,12)) + '.' \
               + random.choice(betuk)
    szul_ev = random.randint(2008,2016)
    diakok.append(Diak(diak_neve,osztalya,szul_ev))

print(Diak.suli_info())

for diak in diakok:
    print(f'Diák neve: {diak.nev}, életkora: {diak.eletkor()}, '
          f'osztálya: {diak.osztaly}, '
          f'születési éve: {diak.szuletesi_ev}.')
print('\n')
print(f'Felsőtagozatos diákok létszáma: {Diak.felso_tagozatos}')
print(f'Alsótagozatos diákok létszáma: {Diak.also_tagozatos}')

print(f'Az iskola diákjainak létszáma: {Diak.diakok_letszama()}')

"""megjegyzés: ez így kicsit valótszerűtlen, elég lett volna csak 
a születési évet random generálni, abból következne 
hányadik osztályba jár, max. az osztály betűjelét 
lehetett volna randomozni"""

Ugrás az oldal tetejére

1.1 Feladat – Suli: Készíts egy programot, amely képes tárolni:
– a diákok nevét és osztályát,
– a tanárok nevét és szakját / szakjait,
és ezeket meg is tudja jeleníteni a képernyőn egy összefüggő mondat formájában.

Például:
Szia, a nevem Kiss Péter, és a(z) 10.A osztályba járok.
Szia, a nevem Horváth Zita, biológia-kémia szakos tanár vagyok.
Szia, a nevem Schmidt Emil, matematika szakos tanár vagyok.

Használj objektumorientált megoldást!
– Először gondold végig, milyen osztályokra lesz szükség?
– Van-e lehetőség öröklődés alkalmazása révén optimálisabb kódot írni?

class Szemely:
    def __init__(self, nev):
        self.nev = nev

    def bemutatkozik(self):
        print(f'Szia a nevem {self.nev}', end='')


class Diak(Szemely):
    def __init__(self, nev, osztaly):
        super().__init__(nev)
        self.osztaly = osztaly

    def bemutatkozik(self):
        super().bemutatkozik()
        print(f' és a(z) {self.osztaly} osztályba járok.')


class Tanar(Szemely):
    def __init__(self, nev, szakok):
        super().__init__(nev)
        self.szakok = szakok

    def bemutatkozik(self):
        super().bemutatkozik()
        print('', '-'.join(self.szakok), 'szakos tanár vagyok.')


szemelyek = {'diak01': (Diak('Kiss Péter', '10.A')), 
             'tanar01': Tanar('Horváth Zita', ['biológia', 'kémia']),
             'tanar02': Tanar('Schmidt Emil', ['matematika'])}

for t in szemelyek.items():
    t[1].bemutatkozik()

Ugrás az oldal tetejére

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük