EMBI

EMBI

Avtor: Petra Velikanje

BESEDILO NALOGE

Podjetje Embi d.o.o. izdeluje embalaže vseh vrst (kartonske, plastične, kovinske...) in oblik (kocka, piramida...). Sestavi jim osnovni razred za vse embalaže Embalaza, če veš, da vsaka embalaža vsebuje podatke o:

• tipu embalaže: ker izdelujejo le končno mnogo tipov embalaže, se sme tip izbrati le izmed nekaj v naprej definiranih. V razredu Embalaza zato definirajte tabelo nizov, ki predstavljajo dovoljene tipe embalaže. Tip embalaže naj bo možno spremeniti tako, da direktno povemo tip embalaže kot niz ali pa tako, da podamo indeks tipa embalaže v tabeli tipov. Če tak tip embalaže ne obstaja, naj se vrže napaka. Poznamo vsaj plastično in kartonsko embalažo.

• obliki embalaže: za obliko veljajo enaka pravila kot za tip, le da zaenkrat poznamo le oblike: kocka, tetraeder in valj.

• barvo embalaže: barva je lahko poljuben neprazen niz.

• maso embalaže: pozitivno število.

• ceno izdelave: ker cene izdelave za splošno embalažo ne poznamo, naj bo nastavljena na 0.

Seveda mora razred vsebovati metode za nastavljanje in branje teh lastnosti ter vsaj konstruktor brez parametrov, ki ustvari embalažo s smiselnimi lastnostmi. Seveda je takšna embalaža še povsem neuporabna (ne vemo npr. na kakšni temperaturi jo lahko skladiščimo...), dodatne lastnosti embalaže pa so močno odvisne od materiala, iz katerega je embalaža izdelana. Denimo, da nas trenutno najbolj zanima plastična embalaža. Zato iz razreda Embalaza izpelji razred PlasticnaEmbalaza, ki vsebuje lastnosti:

• vrsta plastičnega materiala, iz katerega je narejena ta embalaža (izbira iz nekaj vnaprej definiranih možnosti)

• temperaturno območje, v katerem je embalaža primerna za skladiščenje. To je lastnost razreda in ne posameznega objekta!

• maksimalna nosilnost embalaže - odvisna od vrste plastičnega materiala in je enaka za vse embalaže, ki so narejene iz določene vrste plastike!

• ali je primerna za skladiščenje hrane: nekatere vrste plastike niso primene za skladiščenje hrane. Ker pa je stvar odvisna tudi od načina izdelave, je potrebno to posebej povedati za vsak objekt posebej.

• cena za kg embalaže: koliko stane 1kg plastične embalaže. Predpostavi, da vsaka plastična embalaža stane enako za kg.

Razred naj vsebuje tudi nekaj smiselnih konstruktorjev. Vsebuje naj metodo, ki pove koliko kilogramov tovora še lahko spravimo v embalažo. Je linearno odvisna od mase embalaže (v embalaži, ki tehta 1kg, lahko shranimo 5kg tovora), a ne večja od neke v naprej določene vrednosti, ki je shranjena v maksimalni nosilnosti embalaže, in jo dobimo na podlagi testiranja našega plastičnega materiala. Ker se metodologija testiranja lahko spremeni, se lahko tudi največja nosilnost velikokrat spremeni. Vsebuje naj tudi metodo, ki pove, koliko stane določena plastična embalaža. Cena je odvisna od teže te embalaže, ter od oblike. Izdelava v obliki tetraedra podraži izdelavo za 20%, izdelava v obliki valja pa za 35%.

Razred tudi preizkusi: ustvari tabelo 100 plastičnih embalaž z naključnimi začetnimi podatki. Nato med njimi poišči tako, v kateri bi lahko prepeljali hrano težko 10kg, ki stane najmanj (oblika ni pomembna, pomembno pa je, da je material ustrezen - torej tak, da dovoljuje pakiranje hrane). Ali nas stane kaj manj, če namesto hrane želimo prepeljati računalniško opremo iste teže? Kaj pa, če je pomembna tudi oblika embalaže? Denimo, da letalski prevoznik sprejme le embalažo v obliki kocke. Katera embalaža je najbolj ugodna v tem primeru (torej v prej ustvarjeni tabeli embalaž upoštevaj le tiste, ki so v obliki kocke)?

• Ustvari tudi razred KartonEmbalaza, ki naj ima iste lastnosti kor razred PlasticnaEmbalaza. Vemo, da je ta embalaža vedno primerna za hrano, a ima nižjo nosilnost kot plastična embalaža (embalaža teže 1kg zdrži le okrog 2kg tovora) in nekoliko nižje stroške izdelave (izdelava embalaže težke 1kg nas stane 900 SIT).

Razred preveri na enak način kot razred PlasticnaEmbalaza. • Sestavi testni program, ki bo ustvaril naključno mnogo plastičnih in kartonastih embalaž (a vsaj 100 vsake vrste) in jih shrani v tabelo. Med njimi nato poišči takšno embalažo, ki bo:

• najprimernejša za prevoz hrane teže 1 kg v obliki valja.

• najprimernejša za prevoz hrane teže 100 kg v obliki kocke.

• najprimernejša za prevoz strojenih kož mase 2 kg katerekoli oblike.

• najprimernejša za prevoz strojenih kož mase 20 kg v obliki tetraedra.

Opomba: z "najprimernejša" seveda mislimo najcenejša. Po koncu prejšnje naloge morate imeti tri razrede: Embalaza, PlasticnaEmbalaza in KartonEmbalaza. Uporabite jih za rešitev sledečih problemov:

• Podjetu "Halo, Kitajc!" se je nabralo kar nekaj kosov plastične in kartonske embalaže (1000 kosov vsake). Upoštevajte, da so embalaže različnih tež, oblik, varv, tipov plastike... zato jih naključno generirajte. Ker so se sklenili porabiti zalogo, za vsako naročilo posebej vzamejo najprimernejšo (beri najcenejšo) embalažo, ki je ustrezna. Pomagaj jim izbati najprimernejšo embalažo, če za vsako naročilo poznaš težo blaga, ki ga je potrebno dostaviti in ali je blago hrana. Podatke o naročilu naključno generiraj - naročil naj bo vsaj 100 in ko enkrat neko embalažo porabiš, je ne smeš več uporabiti.

• Prevozniki so podjetje opozorili, da vsaka oblika embalaže ni primerna za vse vrste transporta. Tako na letala sprejemajo le embalažo v obliki kocke, za transport mleka hočejo le tetraedre... Zato poleg vsakega naročila izveš še, kakšne oblike naj bo embalaža. Poišči najcenejšo!

• Za dostavo nekega zdravila zdravniška zbornica zahteva, da je zapakirano v embalaži iz plastike tipa HDPE ali PETE, ki mora biti valjaste oblike in mora imeti nosilnost vsaj 200% višjo, kot je dejanska masa zdravila. Poišči najprimernejšo embalažo, če ti povedo maso zdravila.

• Na koncu leta so v podjetju delali inventuro in zanimalo jih je, koliko denarja lahko dobijo s prodajo vse embalaže, ki jim je ostala. Pomagaj jim in izračunaj skupno vrednost vseh vrst embalaže, če veš, da je v tem času embalaža v obliki kocke izgubila 10%, embalaža v obliki valja 20% in embalaža v obliki tetraedra 30% svoje vrednosti.

OPIS PROBLEMA IN IDEJA REŠITVE

Podjetje Embi d.o.o. izdeluje embalaže vseh vrst. Da nebi zaposleni izgubljali čas za vnašanjem embalaže v računalnik je pametna rešitev narediti razred Embalaza(), ki vsebuje vse metode za nastavljanje podatkov, katere lastnik zahteva za vsako embalažo posebej. Ker pa se embalaža predvsem deli na plastično, kartonasto in kovinsko embalažo. Pa lahko naredimo tudi razreda PlasticnaEmbalaza(), kjer vnašamo le plastično embalažo, in KartonskaEmbalaza(),kjer vnašamo samo kartonasto embalažo. Tako olajšamo delo zaposlenim v podjetju

RAZLAGA ALGORITMA

Najprej naredim razred Embalaza() v katerem shranim GET in SET metode. Najbolj pomemben je konstruktor. To je metoda init v kateri definiramo vse parametre tako,da ji lahko uporabljamo. Spreminjamo pa jih lahko le preko SET in GET metod. Za izpis podanih parametrov sem uporabila GET metode. V mojem primeru so to metode :

• getTip() – vrne tip embalaže

• getOblika() – vrne obliko embalaže

• getBarva() – vrne barvo embalaže

• getMasa() – vrne maso embalaže

• getCena() – vrne ceno za kilogram embalaže

Za spreminjanje parametrov oziroma podatkov pa sem uporabila SET metode. V mojem primeru so to metode:

• setTip() – spremeni parameter tip embalaže

• setOblika() – spremeni parameter oblika embalaže

• setBarva() – spremeni parameter barva embalaže

• setMasa() – spremeni parameter masa embalaže

• setCena() – spremeni parameter cena embalaže

S pomočjo teh metod mi ni potrebno ponovno definirati celega razreda ampak lahko spremenim samo določen parameter(podatek). Uporabila sem tudi metodo set. Ta metoda se izpiše ob klicu metode print na objektu tipa Embalaza. Razred sem shranila v datoteko embalaza.py.

Koda razreda Embalaza v pythonu

class Embalaza:
    '''Razred Embalaza(tipEmbalaze,oblikaEmbalaze,barva,masaEmbalaze,cenaEmbalaze) ustvari objekt tipa Embalaza.V tem rezredu so
    že definirane nekatere oblike in tipi embalaže:
    tipi=['kartonasta','plastična','kovinska']
    oblike=['kocka','tetraeder','valj']
    če vpišemo kako drugo obliko ali tip embalaže se nam sproči napaka.
    Parametre tipEmbalaze, oblikaEmbalaze in barvo podamo v nizu, parametre masaEmbalaze in cenaEmbalaze pa podamo kot celo število'''
    def __init__(self,tipEmbalaze='kartonasta',oblikaEmbalaze='kocka',barvaEmbalaze='bela',masaEmbalaze=1,cenaEmbalaze=0):
        tipi=['kartonasta','plastična','kovinska']
        oblike=['kocka','tetraeder','valj']
        #assert(type(oblikaEmbalaze)==str).'Oblika embalaže mora biti podana v nizu'
        assert(barvaEmbalaze!=''),'Barva mora biti neprazen niz'
        assert(int(masaEmbalaze)>0),'Masa embalaže mora biti pozitivna.'
        assert(type(masaEmbalaze)==int or float),'Podatek o masi embalaže mora biti podan kot število.'
        assert(int(cenaEmbalaze)>=0),'Cena embalaže mora biti pozitivna.'
        assert(type(masaEmbalaze)==float or int),'Masa embalaže mora biti podana kot število.'
        assert(type(cenaEmbalaze)==float or int),'Cena embalaže mora biti podana kot število.'
        self._barva=barvaEmbalaze
        self._masa=masaEmbalaze
        self._cena=cenaEmbalaze
        if len(tipEmbalaze)!=1:
            if tipEmbalaze in tipi== True:
                raise Exception('Tip embalaže ni definiran v razredu!')
            else:
                self._tip=tipEmbalaze
        else:
            a=int(tipEmbalaze)
            if a<abs(3):
                self._tip=tipi[a]
            else:
                raise Exception('Število indeksa je preveliko glede na definiran seznam tipov embalaže')
        if len(oblikaEmbalaze)!=1:
            if oblikaEmbalaze in oblike== True:
                raise Exception('Oblika embalaže ni definirana v razredu!')
            else:
                self._oblika=oblikaEmbalaze
        else:
            a=int(oblikaEmbalaze)
            if a<abs(3):
                self._oblika=oblike[a]
            else:
                raise Exception('Število indeksa je preveliko glede na definiran seznam oblik embalaže')


    #metode, ki izpišejo posamezne parametre
    def getTip(self):
        '''Metoda getTip() izpiše tip embalaže.'''
        return self._tip

    def getOblika(self):
        '''Metoda getOblika() izpiše obliko embalaže.'''
        return self._oblika

    def getBarva(self):
        '''Metoda getBarva() izpiše barvo embalaže.'''
        return self._barva

    def getMasa(self):
        '''Metoda getMasa() izpiše maso embalaže.'''
        return int(self._masa)

    def getCena(self):
        '''Metoda getCena() izpiše ceno embalaže.'''
        return self._cena

    #metode, ki nastavijo posamezne parametre
    def setTip(self,tip1):
        '''Metoda setTip(tip1) nastavi tip embalaže objektu.Parameter podamo kot niz. '''
        assert(tip1 in tipi or c<3),'Ta tip embalaže ne obstaja ali pa ni definiran v tem razredu.'
        tipi=['kartonasta','plastična','kovinska']
        if len(tip1)==1:
            c=int(tip1)
            self._tip=tipi[c]
        else:
            self._tip=tip1

    def setOblika(self,oblika1):
        '''Metoda setOblika(oblika1) nastavi obliko embalaže objektu.Parameter podamokot niz. '''
        oblike=['kocka','tetraeder','valj']
        assert(oblika1 in oblika or d<3),'Ta oblika embalaže ne obstaja ali pa ni definirana v tem razredu.'
        if len(oblika1)==1:
            d=int(oblika1)
            self._oblika=oblike[d]
        else:
            self._oblika=oblika1

    def setBarva(self,barva1):
        '''Metoda setBarva(barva1) nastavi barvo embalaže objektu.Parameter podamo kot niz. '''
        assert(type(barva1)==str),'Barva embalaže mora biti podana v nizu.'
        assert(barva1!=''),'Barva embalaže mora biti neprazen niz.'
        self._barva=barva1

    def setMasa(self,masa1):
        '''Metoda setMasa(masa1) nastavi maso embalaže objektu. Parameter podamo kot celo ali decimalno število.'''
        assert(type(masa1)==int or float),'Masa mora biti podana kot število.'
        assert(masa1>0),'Masa embalaže mora biti pozitivna.'
        self._masa=masa1

    def setCena(self,cena1):
        '''Metoda setCeno(cena1)nastavi maso embalaže objektu. Parameter podamo kot celo ali decimalno število.'''
        assert(type(cena1)==int or float),'Cena embalaže mora biti podana kot število.'
        assert(cena1>=0),'Cena embalaže mora biti pozitivna.'
        self._cena=cena1

    def __str__(self):
        '''Metoda izpiše objekt v stavku.'''
        return('Embalaža je '+str(self._tip)+', oblike '+str(self._oblika)+', barva je '+str(self._barva)+', težka je '+str(self._masa)+' dag, cena pa je '+str(self._cena)+' evrov.')
    def __repr__(self):
        '''Metoda izpiše objekt v stavku.'''
        return('Kartonska embalaža ('+str(self._tip)+','+str(self._oblika)+','+str(self._barva)+','+str(self._masa)+','+str(self._cena)+')')

RAZLAGA ALGORITMA

S pomočjo razreda Embalaza() sem naredila podrazred PlasticnaEmbalaza(). Razred PlasticnaEmbalaza je v bistvu specializacija razreda Embalaza(). Razred PlasticnaEmbalaza dobi za parametre:

• tip plastične embalaže

• obliko embalaže(podeduje od razreda Embalaza())

• maso embalaže(podeduje od razreda Embalaza())

• temperatura shranjevanja(podan za cel razred)

• ter podatek o tem ali je primerno za pakiranje hrane

V razredu PlasticnaEmbalaza() sem shranila vse tiste GET in SET metode,ki niso bile definirane v nadrejenem razredu Embalaza(). GET metode, ki so definirane v razredu so: getTemperatura() – vrne temperaturo na kateri je embalaža primerna za skladiščenje

  • getNosilnost() – vrne nosilnost embalaže
  • getPakiranjeHrane() – izpiše ali je embalaža primerna za pakiranje hrane.
  • getTipPlasticna() – pove iz kakšnega materiala je embalaža

Uporabila sem tudi set metode, s katerimi nastavljamo parametre. V razredu PlasticnaEmbalaza() je shranjena metoda MaksimalnaTezaTovora(), ki nam pove ali je teža tovora manjša od nosilnosti embalaže. Metodo sem sestavila tako, da sem najprej sem izračunala koliko tovora lahko spravimo v embalažo. Nato pa sem podatek primerjala z nosilnostjo embalaže. Če masa tovora presega nosilnost embalaže nam funkcija to izpiše.

V razredu se nahaja tudi metoda cenaKoncneEmbalaze(). Ta metoda nam pove koliko bo stala embalaže po izdelavi. Cena je odvisna tudi od oblike embalaže. Metodo sem sestavila tako, da sem najprej preverila kakšne oblike je embalaža nato pa sem izračunala ceno. Za izračun embalaže sem ceno embalaže, maso embalaže in dodatek k ceni zaradi oblike. Metoda nam nato vrne število. Razred sem shranila v datoteko plasticnaEmbalaza.py.

Razred KartonEmbalaza() sem sestavila na isti način kot razred PlasticnaEmbalaza(). Razred sem shranila v datoteko kartonskaEmbalaza.py.

Koda razreda PlasticnaEmbalaza

class PlasticnaEmbalaza(Embalaza):
    '''Razred PlasticnaEmbalaza(tip,oblika,barva,masa,hranaDaAliNe) ustvari objekt
    tipa PlasticnaEmbalaza.
    Parametra tip, oblika  ter hranaDaAliNe podamo kot niz
    parameter masa pa podamo kot število
    definirana seznami so:
        plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
        oblike=['kocka','tetraeder','valj']
        nosilnost=[500,50,100,50,250,300,400,100,50,500]
        cenik=[10,15,25,30,35,40,45,50,55,60]'''
    def __init__(self,tipPlasticneEmbalaze='polipropilen',oblikaEmbalaze='kocka',barvaEmbalaze='bela',masaEmbalaze=1,hranaDa='ne',cenaEmbalaze=0, temperatura=''):
        Embalaza.__init__(self,oblikaEmbalaze,barvaEmbalaze,masaEmbalaze)
        plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
        oblike=['kocka','tetraeder','valj']
        nosilnost=[500,50,100,50,250,300,400,100,50,500]
        cenik=[10,15,25,30,35,40,45,50,55,60]
        assert(type(oblikaEmbalaze)==str),'podatek o obliki embalaže mora biti podan v nizu'
        assert(type(hranaDa)==str),'Podatek o skladiščenju hrane mora biti podan v nizu'
        assert(type(tipPlasticneEmbalaze)==str),'Tip plastične embalaže mora biti podan kot niz'
        assert(hranaDa=='ne' or hranaDa=='da'),'podatek o primernosti plastične embalaže za hrano ni podan pravilno!'
        #preverimo ali je tip plastične embalaže podan z besedo toda ta beseda mora biti definirana v seznamu plastika!
        #beseda mora biti podana v nizu.
        if len(tipPlasticneEmbalaze)!=1:
            if tipPlasticneEmbalaze in plastika== True:
                raise Exception('Tip plastične embalaže ni definiran v razredu!')
            else:
                self._tip1=tipPlasticneEmbalaze
                i=plastika.index(tipPlasticneEmbalaze)
        #preverimo ali je tip plastične embalaže podan z nizom dolžine ena(to je število podano v nizu).Seveda pa mora biti
        #število manjše od dolžine seznama definiranega v razredu.
        else:
            d=int(tipPlasticneEmbalaze)
            if d<9:
                self._tip1=plastika[d]
                i=d
            else:
                raise Exception('Število indeksa je preveliko glede na definiran seznam tipov plastične embalaže')
        if len(oblikaEmbalaze)!=1:
            if oblikaEmbalaze in oblike== True:
                raise Exception('Oblika embalaže ni definirana v razredu!')
            else:
                self._oblika=oblikaEmbalaze
        else:
            a=int(oblikaEmbalaze)
            if a<abs(3):
                self._oblika=oblike[a]
            else:
                raise Exception('Število indeksa je preveliko glede na definiran seznam oblik embalaže')
        self._temp='2°C do 15°C'
        self._nosi=nosilnost[i]
        self._cena=cenik[i]
        self._hrana=hranaDa
        self._oblika=oblikaEmbalaze
        self._masa=masaEmbalaze
        self._barva=barvaEmbalaze
        #metode za izpis parametrov
    def getTemperatura(self):
        '''Metoda getTempetratura() izpiše temperaturno območje, v katerem je embalaža primerna za skladiščenje.'''
        return self._tem
    def getNosilnost(self):
        '''Metoda getNosilnost() izpiše maksimalno nosilnost embalaže.'''
        return str(self._nosi)+'kg.'
    def getHrana(self):
        return self._hrana
    def getPakiranjeHrane(self):
        '''Metoda getPakiranjeHrane() izpiše ali je izbrana embalaža primerna za pakiranje hrane.'''
        if self._hrana=='ne':
            print('Tip plastične embalaže ni primeren za pakiranje!')
        else:
            print('Tip plastične embalaže je primeren za pakiranje!')
    def getTipPlasticna(self):
        '''Metoda getTipPlasticna() izpiše tip plastične embalaže. '''
        return self._tip1
    #metode za nastavljanje parametrov
    def setTipPlasticnaEmbalaza(self,plastica):
        '''Metoda setTipPlasticnaEmbalaza(plastica) nastavi tip plastične embalaže. '''
        plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
        nosilnost=[500,50,100,50,250,300,400,100,50,500]
        cenik=[10,15,25,30,35,40,45,50,55,60]
        assert(plastica in plastika or c<9),'Ta tip embalaže ne obstaja ali pa ni definiran v tem razredu.'
        #preverimo ali je parameter plastica podan z besedo toda ta beseda mora biti definirana v seznamu plastika!
        #(Beseda je podana v nizu.)
        if len(plastica)==1:
            c=int(plastica)
            self._tip1=plastika[c]
            r=c
        #preverimo ali je parameter plastika podan z nizom dolžine ena(to je število podano v nizu).Seveda pa mora biti
        #število manjše od dolžine seznama definiranega v razredu.
        else:
            self._tip1=plastica
            r=index(plastica)
        self._nosi=nosilnost[r]
        self._cena=cenik[r]

    def MaksimalnaTezaTovora(self):
        '''Metoda MaksimalnaTezaTovora() nam izračuna koliko kilogramov tovora lahko spravimo v embalažo vendar mora
            manjša od maksimalne nosilnosti! '''
        z=int(self._masa)*5
        assert(z<=self._nosi),'Teža tovora presega maksimalno nosilnost embalaže'

    def cenaKoncneEmbalaze(self):
        '''metoda cenaKoncneEmbalaze()izračuna končno ceno embalaže. Upošteva tudi podražitve zaradi oblike!'''
        oblike=['kocka','tetraeder','valj']
        if self._oblika==oblike[0]:
            ko= int(self._cena)*int(self._masa)
        elif self._oblika==oblike[1]:
            ko= int(self._cena)*int(self._masa)*1.2
        else:
            ko= int(self._cena)*int(self._masa)*1.35
        return round(ko,3)

    def __str__(self):
        '''Metoda izpiše objekt v stavku.'''
        return('Plastična embalaža je tipa '+str(self._tip1)+', oblike '+str(self._oblika)+', barva je '+str(self._barva)+', težka je '+str(self._masa)+' kg, cena pa je '+str(self._cena)+' evrov.')
    def __repr__(self):
        '''Metoda izpiše objekt v stavku.'''
        return('Plastična embalaža('+str(self._tip1)+','+str(self._oblika)+','+str(self._barva)+','+str(self._masa)+','+str(self._cena)+')')

TESTNI PROGRAMI

Razred Embalaza sem preizkusila s testnim programom unittest. S pomočjo tega programa sem preverila ali je konstruktor pravilno nastavljen.

Koda testnega programa

from embalaza import*
import math

class Test(unittest.TestCase):

    def testPrazen(self):
        '''
        Preveri delovanje privzetega konstruktorja.
        '''
        i = Embalaza()
        self.assertEqual(i.getTip(),'kartonasta',"Tip privzete embalaženi ni prav nastavljen")
        self.assertEqual(i.getOblika(),'kocka',"Oblika privzete embalaže ni prav nastavljena")
        self.assertEqual(i.getBarva(),'bela',"barva privzete embalaže ni prav nastavljena")
        self.assertEqual(i.getMasa(),1,"Masa privzete embalaže ni prav nastavljena")
        self.assertEqual(i.getCena(),0,"Cena privzete embalaže ni prav nastavljena")

    def testTipJeStevilo(self):
        i=Embalaza('1','kocka','rdeča',23,45)
        (tip,oblika,barva,masa,cena)=('plastična','kocka','rdeča',23,45)
        self.assertEqual(i.getTip(),tip,"Tip ni pravi")
        self.assertEqual(i.getOblika(),oblika,"Oblika ni prava")
        self.assertEqual(i.getBarva(),barva,"Barvani prava")
        self.assertEqual(i.getMasa(),masa,"Masa ni prava")
        self.assertEqual(i.getCena(),cena,"Cena ni prava")

    def testOblikaJeStevilo(self):
        i=Embalaza('plastična','2','rdeča',23,45)
        (tip,oblika,barva,masa,cena)=('plastična','valj','rdeča',23,45)
        self.assertEqual(i.getTip(),tip,"Tip ni pravi")
        self.assertEqual(i.getOblika(),oblika,"Oblika ni prava")
        self.assertEqual(i.getBarva(),barva,"Barvani prava")
        self.assertEqual(i.getMasa(),masa,"Masa ni prava")
        self.assertEqual(i.getCena(),cena,"Cena ni prava")
if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

TESTNI PROGRAMI

Podrazred PlasticnaEmbalaza() sem preverila tako da sem ustvarila tabelo z 100 plastičnimi embalažami, ki so imele naključno izbrane parametre. Generiranje naključno izbranih podatkov nam omogoča razred RANDOM, ki je že definiran v Pythonu. Razred sem preizkusila z metodami:

• najmanjsaCenaGledeNaHrano() – vrne nam najcenejšo embalažo ne glede na to ali je ustrezna za pakiranje hrane ali ne. V metodi sem najprej sestavila tabelo 100 primerov embalaž , ki sem jih s pomočjo ukaza random naključno generirala. Nato sem z for zanko pregledala tabelo in izločila tiste ki si primerne za pakiranje hrane, nato sem pogledala še končne cene embalaže in izmed primernih sem izbrala najprimernejšo.

• najmanjsaCenaNegledeNaHrano() - vrne nam najcenejšo embalažo glede na to, da je ustrezna za pakiranje hrane. Metoda je podobna metodi najmanjsaCenaGledeNaHrano() , vendar pri tej metodi ni nujno da je embalaža primerna za pakiranje hrane.

• odvisnoOdOblikeKocka() – vrne nam najcenejšo embalažo glede na obliko kocke.

• odvisnoOdOblikeTetraeder() – vrne nam najcenejšo embalažo glede na obliko tetraedra

• odvisnoOdOblikeValj() - vrne nam najcenejšo embalažo glede na obliko valja

Z metodami odvisnoOdOblikeKocka(), odvisnoOdOblikeTetraeder() in odvisnoOdOblikeValj() preverim ali je cena kaj odvisna od oblike. V metodi sem z for zanko šla skozi tabelo 100 embalaž in izločila tiste, ki so ustrezale pogoju določene oblike. nato sem izbrala tisto embalažo, ki je stala najmanj. Testni program sem shranila v datoteko preizkus_plasticna.py.

Testiranje

Enako sem testirala razred KartonEmbalaza(). Testni program pa sem shranila v datoteko z imenom preizkus_kartonska.py

Koda testnega progama za razred PlasticnaEmbalaza

import random

def najmanjsaCenaGledeNaHrano():
    '''Metoda najmanjsaCenaGledeNaHrano() izračuna najcenejšo embalažo glede na pakiranje hrane'''
    tabela=[]
    tabela1=[]
    plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
    oblike=['kocka','tetraeder','valj']
    barva=['rjava','zelena','rdeča','modra','rumena','vijola']

    for i in range(100):
        tabela.append(PlasticnaEmbalaza(tipPlasticneEmbalaze=random.choice(plastika),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._hrana=='da':
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def najmanjsaCenaNegledeNaHrano():
    '''Metoda najmanjsaCenaNegledeNaHrano() izračuna najcenejšo embalažo neglede na pakiranje hkrane'''
    tabela=[]
    tabela1=[]
    plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
    oblike=['kocka','tetraeder','valj']
    barva=['rjava','zelena','rdeča','modra','rumena','vijola']
    for i in range(100):
        tabela.append(PlasticnaEmbalaza(tipPlasticneEmbalaze=random.choice(plastika),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def odvisnoOdOblikeKocka():
    '''Metoda odvisnoOdOblikeKocka() izračuna najnižjo ceno embalažo glede na obliko kocke'''
    tabela=[]
    tabela1=[]
    plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
    oblike=['kocka','tetraeder','valj']
    barva=['rjava','zelena','rdeča','modra','rumena','vijola']
    for i in range(100):
        tabela.append(PlasticnaEmbalaza(tipPlasticneEmbalaze=random.choice(plastika),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='kocka':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki kocke')

def odvisnoOdOblikeTetraeder():
    '''Metoda odvisnoOdOblikeTetraeder() izračuna najnižjo ceno embalažo glede na obliko tetraedra'''
    tabela=[]
    tabela1=[]
    plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
    oblike=['kocka','tetraeder','valj']
    barva=['rjava','zelena','rdeča','modra','rumena','vijola']
    for i in range(100):
        tabela.append(PlasticnaEmbalaza(tipPlasticneEmbalaze=random.choice(plastika),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='tetraeder':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki tetraedra')

def odvisnoOdOblikeValj():
    '''Metoda odvisnoOdOblikeValj() izračuna najnižjo ceno embalažo glede na obliko valja'''
    tabela=[]
    tabela1=[]
    plastika=['polipropilen','polistiren','polietilen','poliester','poliamid','Polivinil klorid','poliuretan','polikarbonat','polioksimetilen']
    oblike=['kocka','tetraeder','valj']
    barva=['rjava','zelena','rdeča','modra','rumena','vijola']
    for i in range(100):
        tabela.append(PlasticnaEmbalaza(tipPlasticneEmbalaze=random.choice(plastika),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='valj':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki valja')

Koda testnega progama za razred KartonEmbalaza

from kartonskaEmbalaza import *
import random

def najmanjsaCenaGledeNaHrano1():
    ''' Metoda najmanjsaCenaNegledeNaHrano1() izračuna najcenejšo embalažo neglede na pakiranje hkrane'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(10):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),masaEmbalaze=10,hranaDa='da'))
    for j in tabela:
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def odvisnoOdOblikeKocka():
    '''Metoda odvisnoOdOblikeKocka() izračuna najnižjo ceno embalažo glede na obliko kocke'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(10):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='kocka':
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def odvisnoOdOblikeTetraeder():
    '''Metoda odvisnoOdOblikeTetraeder() izračuna najnižjo ceno embalažo glede na obliko tetraedra'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(100):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='tetraeder':
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def odvisnoOdOblikeValj():
    '''Metoda odvisnoOdOblikeValj() izračuna najnižjo ceno embalažo glede na obliko valja'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(100):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='valj':
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

TESTNI PROGRAMI

Nazadnje sem sestavila testni program za razreda PlasticnaEmbalaza() in KartonEmbalaza() v katerem sem definirala metode:

  • najprimernejsaZaPrevozHrane() – vrne najprimernejšo embalažo za prevoz hrane teže 1kg v obliki valja.
  • najprimernejsaZaPrevozHrane1() - vrne najprimernejšo embalažo za prevoz hrane teže 100kg v obliki kocke.
  • najprimernejsaZaPrevoz() - vrne najprimernejšo embalažo za prevoz strojenih kož teže 2 kg v katerikoli obliki
  • najprimernejsaZaPrevoz1() - vrne najprimernejšo embalažo za prevoz strojenih kož teže 20kg v obliki tetraedra.

testiranje

Koda testnega programa

import random

def najmanjsaCenaGledeNaHrano1():
    ''' Metoda najmanjsaCenaNegledeNaHrano1() izračuna najcenejšo embalažo neglede na pakiranje hkrane'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(10):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),masaEmbalaze=10,hranaDa='da'))
    for j in tabela:
            tabela1.append(j.cenaKoncneEmbalaze())
    return min(tabela1)

def odvisnoOdOblikeKocka():
    '''Metoda odvisnoOdOblikeKocka() izračuna najnižjo ceno embalažo glede na obliko kocke'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(10):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='kocka':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki kocke')

def odvisnoOdOblikeTetraeder():
    '''Metoda odvisnoOdOblikeTetraeder() izračuna najnižjo ceno embalažo glede na obliko tetraedra'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(100):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='tetraeder':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki tetraedra')


def odvisnoOdOblikeValj():
    '''Metoda odvisnoOdOblikeValj() izračuna najnižjo ceno embalažo glede na obliko valja'''
    tabela=[]
    tabela1=[]
    karton=['tetrapak', 'lepenka', 'karton']
    oblike=['kocka','tetraeder','valj']
    for i in range(100):
        tabela.append(KartonEmbalaza(tipKartonskaEmbalaze=random.choice(karton),oblikaEmbalaze=random.choice(oblike),masaEmbalaze=10,hranaDa=random.choice(['da','ne'])))
    for j in tabela:
        if j._oblika=='valj':
            tabela1.append(j.cenaKoncneEmbalaze())
    if len(tabela1)>0:
        return min(tabela1)
    else:
        raise Exception('Ni embalaže v obliki valja')
0%
0%