Razred Avto

Razred Avto

Avtor: Mojca Šuštaršič

Besedilo naloge

Izdelujemo spletno anketo o priljubljenosti različnih avtomobilov. V ta namen bomo sestavili razred Avto, ki naj hrani pet osnovnih podatkov: o letu izdelave, ceni, velikosti (dolžini), barvi in o tipu (limuzina ali kupe): • velikost (dolžino): decimalno število med 3.0 in 5.5, • leto izdelave: int • ceno: int • barvo: poljuben niz z opisom barve in • ali je avto tipa limuzina, karavan, kupe... . Vse spremenljivke razreda morajo biti privatne, razred pa mora tudi poznati metode za nastavljanje in branje teh vrednosti. Rešite naslednje probleme:

  1. Izpišite koliko avtomobilov posamezne barve je v datoteki.
  2. Ker je izdelovalcu avtomobilov zmanjkalo rumene barve, jo bo nadomestil z oranžno. Vsem avtomobilov popravite opis barve tako, da kjer je v opisu (pod)niz "rumen" ali "rumena" ali ... to zamenjate z ustrezno obliko niza "oranžna". Ustrezno popravite podatke na datoteki!
  3. Trgovec je ugotovil, karavani starejši kot 4 leta ne gredo več v promet. Zato jih bo odpisal. Koliko znaša vrednost odpisanih avtomobilov? podatki o avtomobilih, ki jih ima trgovec na zalogi, so v tabeli.
  4. Sivi uvoznik ponuja trgovcu avtomobile, ki so na datoteki. Trgovec se je odločil, da bo prodajal le več kot pet let stare kupeje s ceno do 10000€. Preberi datoteko in sestavi tabelo avtomobilov, kjer so le tovrstna avtomobili.
  5. Vrni tabelo avtomobilov, ki vsebuje vse avtomobile v nekem cenovnem intervalu. Podatki so na neki datoteki.
  6. Vsaj en (zaželjeno pa več) problem po vaši izbiri ... (opišite jih!)

Koda v Pythonu

 class Avto:
    '''Razred Avto hrani izdelavo, ceno, barvo avtomobila, tip vozila in
    njegova velikost
    '''

    def __init__(self, izdelava, cena, barva='',\
                 tip=['limuzina','karavan', 'kupe', 'kabriolet', 'terenec'],\
                 velikost ='3.0:5.5'):
        assert type(izdelava) == int, 'napačen vnos števila'
        self.izdelava = izdelava
        assert type(cena) == int, 'napačen vnos števila'
        self.cena = cena
        self.velikost = velikost
        assert type(barva) == str, 'napačen vnos, podaj niz'
        self.barva = barva
        assert type(tip) == str, 'napačen vnos, podati moraš seznam'
        self.tip = tip


    def getIzdelava(self):
        return self.izdelava

    def getCena(self):
        return self.cena

    def getTip(self):
        return self.tip

    def getBarva(self):
        return self.barva

    def setBarva(self, nova):
        self.barva=nova

    def getVelikost(self):
        return self.velikost


    def izDatoteke(ime):
        sez = []
        with open(ime, 'r') as dat:
            for vrstica in dat:
                vrstica=vrstica.strip() #odstranimo bele znake
                vr=vrstica.split(" ") #naredimo nov seznam, elementi ločeni z ;
                ########
                vr[0]=int(vr[0])
                vr[1]=int(vr[1])
                vr[4]=float(vr[4])
                ########
                sez.append(Avto(vr[0], vr[1],vr[2], vr[3], vr[4]))
        return sez

    def opis(self):
        a=[self.getIzdelava(), self.getCena(), self.getBarva(), self.getTip(), self.getVelikost()]
        opis=''
        for i in a:
            opis+=str(i)+' ' #str(i), ker so nekateri elementi tipa int ali float
        return opis.strip()

    def __repr__(self):
        return self.opis()

    def preveriBarve(sez):
        stBarv=[]
        barve=[]
        for i in sez:
            barve.append(i.getBarva()) #dodajamo vse barve
        mnozica=set(barve) #naredimo še množico
        for i in mnozica:
            dvojica=(i,barve.count(i))
            stBarv.append(dvojica)
        return stBarv

    @staticmethod
    def rumeni (ime):
        sez=Avto.izDatoteke(ime)
        for i in sez:
            if i.getBarva()=='rumena':
                i.setBarva('oranzna')

        dat=open(ime, 'w')
        for i in sez:
            dat.write(i.opis()+'\n')
        dat.close()

    @staticmethod
    def odpisaniKaravani(self, ime):
        sez = self.izDatoteke(ime)
        cena = []
        for i in sez:
            if i.getIzdelava() < 2007:
                cena.append(i.getCena())
        return sum(cena)

    @staticmethod
    def kupeji(ime):
        sez = Avto.izDatoteke(ime)
        kupe = []
        for i in sez:
            if i.getIzdelava() < 2006 and i.getCena() < 10000:
                kupe.append(i)
        return kupe

    @staticmethod
    def intervalCen(ime, minCena, maxCena):
        sez = Avto.izDatoteke(ime)
        cena = []
        for i in sez:
            if i.getCena() >= minCena and i.getCena() <= maxCena:
                cena.append(i)
        return cena

    @staticmetohd
    def poisciAvto(ime, barva, izdelava):
        sez = Avto.izDatoteke(ime)
        avto = []
        for i in sez:
            if i.getBarva() == barva and i.getIzdelava() == izdelava:
                avto.append(i)
        return avto 

Razlaga kode

Razred Avto hrani izdelavo, ceno, barvo, tip in velikost avtomobila. Naredila sem get in set metode. Get metode mi vračajo podatke o avtomobilu, set metode pa služijo za uporabo pri spreminjanu podatkov o avtomobilu. Začela sem z funkcijo izDatoteke, zato da sem lahko prebrala kar sem zapisala v datoteko avto.txt. Funkcija opis vrača vse lastnosti avtomobila, uporabila sem jo pri funkciji repr, slednjo sem uporabila zaradi lažjega klicaja za opis avtomobila. Metoda preveriBarve sprejme seznam in vrača število avtomobilov po barvah. Metoda rumeni sprejme ime datoteke. Prebere to datoteko in naredi seznam ter v tem seznamu vse avtomobile rumene barve, spremeni v oranžne. Nato še odpre podano datoteko za pisanje in spremeni barve tudi v prvotni datoteki. Metoda odpisaniKaravani ponovno sprejme ime datoteke, gre skozi to datoteko in podatke ponovno shrani v seznam. Potem gremo z zanko for skozi seznam in preverimo če je izdelani avto starejši od 4-ih let(oz. je izdelava avtomobila pred letom 2007) in če je, vzamemo ceno tistega avtomobila, jo damo v že naprej narejen prazen seznam in na koncu metoda vrne vsoto cen vseh avtomobilov starejših od 4-ih let. Metoda kupeji ravno tako sprejme ime datoteke, gre skozi datoteko in podatke shrani v seznam. Z zanko for gremo skozi seznam s podtaki o avtomobilih in če je izdelava avtomobila(kupeja) starejša od 5-ih let in cena manjša od 10 000, ta avtomobil dodamo v naprej narejen prazen seznam. Na koncu nam metoda vrne vse kupe-je, ki so starejši od 5-ih let. Metoda intervalCen sprejme ime datoteke, minimalno ceno avtomobila in maksimalno ceno avtomobila. Ponovno naredimo seznam s podatki o avtomobilih in prazen seznam za kasnejše shranjevanje podatkov. Ponovno gremo z zanko for skozi seznam s podatki in če je cena avtomobila višja od minimalne in nižja od maksimalne, ta avtomobil dodamo v že naprej narejen prazen seznam. Na koncu vrnemo seznam vseh ustreznih avtomobilov.

Uporaba funkcije

 >>> a = Avto(2005, 2800, 'srebrna', 'karavan', '4.9')
>>> a.getIzdelava()
2005
>>> a.getCena()
2800
>>> a.getBarva()
'srebrna'
>>> a.getTip()
'karavan'
>>> a.getVelikost()
'4.9'
>>> a.izDatoteke('avto.txt')
[2000 2000 rdeca limuzina 3.9, 1999 1500 modra karavan 5.4, 2005 3500 crna kabriolet 3.5, 2010 10000 bela limuzina 4.7, 2011 20000 rdeca kupe 4.0, 2008 9250 modra karavan 5.5, 1999 1500 oranzna limuzina 4.5, 2006 4680 oranzna 'kupe' 4.0]
>>> print(a)
2005 2800 srebrna karavan 4.9
>>> sez = Avto.izDatoteke('avto.txt')
>>> Avto.preveriBarve(sez)
[('crna', 1), ('oranzna', 2), ('rdeca', 2), ('bela', 1), ('modra', 2)]
>>> Avto.rumeni('avto.txt')
>>> Avto.odpisaniKaravani('karavan.txt')
19400
>>> Avto.kupeji('kupe-ji.txt')
[2005 6800 siva kupe 4.3, 2000 4200 rumena kupe 3.4, 1998 3000 rdeca kupe 4.8, 1997 1800 bela kupe 4.5]
>>> Avto.intervalCen('avto.txt', 2000, 7000)
[2000 2000 rdeca limuzina 3.9, 2005 3500 crna kabriolet 3.5, 2006 4680 oranzna 'kupe' 4.0]
>>> Avto.poisciAvto('avto.txt', 'modra', 1999)
[1999 1500 modra karavan 5.4] 

0%
0%