Pravokotnik

Pravokotnik

Avtor: Ana Rot

PRAVOKOTNIK

Navodilo naloge, opis problema in ideja rešitve:

Navodilo naloge

Pravokotnik Napišite razred Pravokotnik,ki ima podane dve stranici. Stranici sta celi števili. Razred naj vsebuje tudi objektne metode za izračun ploščine in obsega. Sestavite tabelo objektov tipa Pravokotnik z naključnimi, a smiselnimi podatki. Rešite naslednje naloge:

  • Izračunajte, koliko pravokotnikov ima ploščino manjšo od povprečne ploščine pravokotnikov v tabeli
  • Vse pravokotnike v tabeli, ki jih lahko, spremenite v kvadrate. Npr. pravokotnik s stranicami 4 in 6 lahko spremenite v pravokotnik (kvadrat) s stranico 5, pravokotnikov s stranicama 11 in 4 oz. 10 in 7 pa ne bo mogoče.
  • Iz žice izdelujemo modele pravokotnikov. Koliko m žice potrebujemo, če želimo narediti vse pravokotnike v tabeli, ker pravokotnik s stranicama 5 in 12 naredimo kot žični model s stranicama 5cm in 12cm.
  • Moja izbira: Nariši poljuben pravokotnik z logo želvo.

Opis problema in ideja rešitve

Če imamo pogosto opraviti z računanjem obsega, ploščine in podobnih operacij na pravokotnikih je ugodna rešitev, da zanje sestavimo metode. Še bolje pa je če jih sestavimo v razred iz katerega jih potem kličemo tako, da najprej naredimo objekt, ki bo tipa našega razreda in na tem objetku kličemo metode.

Ključni koraki pri sestavljanju programa:

Naredim razred »Pravokotnik« v katerega napišem različne metode. Zelo pomemben je konstruktor – to je metoda init, ki vsebuje paramerta stranicaA in stranicaB, ki predstavljata stranici pravokotnika. V prvi in drugi vrstici konstruktorja sem uporabila stavek »assert«, ki preverjata ali je uporabnik res vnesel celi pozitivni števili za dolžini stranic, kot je predpostavljeno v navodilu naloge. V nasporotnem primeru se sproži izjema, ki uporabniku na zaslon izpiše sporočilo: »AsertionError: Stranica mora biti celo število.«. Napisala sem tudi »get« metodi (getStranicaA in getStranicaB), kateri ob njihovem klicu vrneta vrednost stranice a oz. stranice b. Metoda obseg izračuna obseg pravokotnika s podanima stranicama, metoda ploscina pa izračuna ploščino pravokotnika. Nazadnje sem napisala še metodo str. Ta se izpiše ob klicu metode print na objektu tipa Pravokotnik, kot vidimo tudi na zgornji sliki. To sem shranila v datoteko Pravokotnik_01.py.

Razred Pravokotnik:

import types

class Pravokotnik:
    '''
    Razred Pravokotnik dobi za parametra stranici a in b. Vsebuje razlučne metode.
    Lahko izračunamo obseg in ploščino ali   pa samo izpišemo  stranico a ali b.
    '''
    def __init__(self, stranicaA, stranicaB):
        assert type(stranicaA) == int and type(stranicaB) == int, 'Stranica mora biti celo število.'
        assert stranicaA > 0 and stranicaB > 0, 'Stranici morata biti pozitivni.'
        self.a = stranicaA
        self.b = stranicaB

    def getStranicaA(self):
        return self.a

    def getStranicaB(self):
        return self.b

    def ploscina(self):
        return self.a * self.b

    def obseg(self):
        return (2*self.a) + (2*self.b)

    def __str__(self):
        return 'Ta pravokotnik ima stranico a dolgo ' + str(self.a) + ' cm, stranico b pa ' + str(self.b) + ' cm.'

Ključni koraki pri sestavljanju programa:

Odprem novo datoteko. Najprej uvozim prejšnjo datoteko Pravokotnik_01.py in knjižnjico random. To potrebujem, ker se bom v metodah sklicevala na že napisan razred pravokotnik v datoteki Pravokotnik_01.py. Naredim metodo »tabelaPravokotnikov«, katera bi bo v seznam shranila 10 naključnih objektov tipa Pravokotnik. To storim tako, da najprej ustvarim prazen seznam. Z for zanko in metodo »range(10)« (ta poskrbi da bo v seznamu 10 objektov) v tabelo dodam 10 naključnih objektov tipa Pravokotnik. Za dodajanje v seznam uporabim metodo append, ki mi dodaja na konec seznama. Objekte pa ustvarim tako, da najprej pokličem prejšnjo datoteko Pravokotnik_01, iz te datoteke pa še razred Pravokotnik. Parametri naj bodo poljubni, to dosežem z uporabo random-a (»random.randrange(1,200,1)«). Ta mi izbere naključno število od 1 do 200, korakom 1.

Algoritem:

import Pravokotnik_01
import random


def tabelaPravokotnikov():
    '''
    Metoda nam naredi tabelo najkljucnih objetktov tipa Pravokotnik.
    '''
    tabela = []
    for i in range(10):
       tabela.append(Pravokotnik_01.Pravokotnik(random.randrange(1,200,1),
        random.randrange(1,200,1)))
    return tabela
##    for i in tabela:
##        print(i)

Ključni koraki pri sestavljanju programa:

Izračunati hočem koliko je takih pravokotnikov, katerih ploščina je manjša od povprečja vseh pravokotnikov v tabeli.

Najprej uvozim datoteko, kjer imam shranjeno metodo »tabelaPravokotnikov«. Definiram spremenljivki »sestevek«, v katero bom shranila vse ploščine pravokotnikov, in spremenljivko »vseh«, v katero pa bom shranila število vseh pravokotnikov. Z for zanko pregledam celotno tabelo objektov tipa Pravokotnik, tabelo dobim tako, da jo pokličem iz prejšnje metode (»Pravok.tabelaPravokotnikov()«). V zanki pa spremenljivki »sestevek« dodajam ploščino pravokotnikov. Ploščino dobim tako, da jo pokličem iz datoteke Pravokotnik_01.py, kjer sem v razredu Pravokotnik napisala metodo za raučunanje pološčine pravokotnika. Spremenljivko »vseh« pa vsakič povečam za ena. Povprečje izračunam tako, da seštevek vseh ploščin delim z številom pravokotnikov. Ko imam povprečje izračunano lahko pregledam koliko pravokotnikov ima manjšo ploščino od povprečja in jih preštejem ter izpišem. Tega se lotim tako, da najprej definiram spremenljivko »stevec«, v katero bom shranila pravokotnike z manjšo ploščino od povprečja. Z for zanko pregledam pravokotnike. Če je ploščina posameznega pravokotnika manjša od povprečja ga izpišem ter povečam spremenljivko »stevec«. Ko se zanka konča pa izpišem stavek, ter spremenljivko »stevec«, ki pove koliko je teh pravokotnikov.

Algoritem:

import Pravokotnik_02

def ploscinaManjsaOdPovprecja():
    '''
    Metoda nam izracuna koliko izmed pravokotnikov v tabeli ima     plošcino manjšo od povprecja.
    '''
    sestevek = 0
    vseh = 0
    for j in Pravokotnik_02.tabelaPravokotnikov():
        sestevek += Pravokotnik_01.Pravokotnik.ploscina(j)
        vseh += 1
    povprecje = sestevek / vseh

    stevec = 0
    for k in Pravokotnik_02.tabelaPravokotnikov():
        if Pravokotnik_01.Pravokotnik.ploscina(k) < povprecje:
            print(k)
            stevec += 1
    print('\nPravokotnikov, ki imajo manjšo plošcino od povprecja je: ' + str(stevec))

Ključni koraki pri sestavljanju programa:

Iz pravokotnika se da sestaviti kvadrat če je seštevek stranice a in stranice b sodo število.

Metoda »pravokotnikiKvadrati« mi pregleda vse pravokotnike v tabeli. Metoda mi sešteva stranice. Stranico a in b dobim tako, da pokličem »get« metodi iz razreda Pravokotnik iz datoteke Pravokotnik_01.py. Če je pri vsoti stranic ostanek pri deljenju z 2 enak nič (to pomeni, da je število sodo) izpiše pravokotnik in poleg njega izpiše True, kar pomeni, da iz pravokotnika lahko sestavimo kvadrat. V nasprotnem primeru ga ravno tako izpiše, a zraven izpiše False, kar pa pomeni, da iz pravokotnika ne moremo sestaviti kvadrata.

Algoritem:

def pravokotnikiKvadrati():
    '''
    Metoda nam pove ali se pravokotnik da spremeniti v kvadrat ali ne.
    '''
    for j in Pravokotnik_02.tabelaPravokotnikov():
        a = Pravokotnik_01.Pravokotnik.getStranicaA(j)
        b = Pravokotnik_01.Pravokotnik.getStranicaB(j)
        vsota = int(a) + int(b)
        if vsota % 2 == 0:
            print(j, True)
        else:
            print(j, False)

Ključni koraki pri sestavljanju programa:

Zanima me koliko metrov žice je potrebno za izdelavo vseh pravokotnikov v tabeli. Predpostavim, da parametri v razredu Pravokotnik predstavljajo centimetre.

Najprej definiram spremenljivko »zica«, v katero bom shranjevala seštevke obsega vsakega pravokotnika. Z for zanko pregledam celotno tabelo pravokotnikov. V zanki povečujem spremenljivko »zica« za obseg vsakega pravokotnika v tabeli. Sedaj imam v spremenljivki »zica« rezultat v centimetrih, da dobim metre delim z 100 in to vrnem kot rezultat.

Algoritem:

def kolikoZice():
    '''
    Metoda nam pove koliko metrov žice potrebujemo, da naredimo vse pravokotnike.
    '''
    zica = 0
    for j in Pravokotnik_02.tabelaPravokotnikov():
        zica += Pravokotnik_01.Pravokotnik.obseg(j)
    return zica/100

Ključni koraki pri sestavljanju programa:

Želim narisati poljuben pravokotnik z logo želvo. Da to lahko storim moram najprej uvoziti knjižnjico turtle. Metodi »narisiPravokotnik« za parameter podam »zelva«, s tem bom določila s katero želvo bom narisala pravokotnik. Najprej v spremenljivko »p« shranim poljuben pravokotnik, v spremenljivko »a« shranim stranico a tega pravokotnika, v spremenljivko »b« pa stranico b. Nato začnem z risanjem.

»zelva.fd(a)« pomeni, da se premaknem naprej za dolžino a

»zelva.lt(90)« pomeni, da se v levo zavrtim za 90 stopinj

Algoritem:

import turtle

def narisiPravokotnik(zelva):
    '''Metoda z logo želvo nariše pravokotnik.'''
    p = Pravokotnik_01.Pravokotnik(random.randrange(1,500,1),random.randrange(1,500,1))
    a = p.getStranicaA()
    b = p.getStranicaB()
    zelva.fd(a)
    zelva.lt(90)
    zelva.fd(b)
    zelva.lt(90)
    zelva.fd(a)
    zelva.lt(90)
    zelva.fd(b)

Povezave do Pythonovih datotek

Pythonova datoteka, kjer je shranjen razred Pravokotnik: Pravokotnik_01

Pythonova datoteka, kjer so shranjene ostale metode: Pravokotnik_02

Smisleni testni programi

  1. Testni program: Preverjam kako se bo program odzovel, v primeru, da mu za parameter podamo števili napisani v nizu. Izjema bi morala biti prestrežena. Opis: V »try« stavku sem ustvarila spremenljivko »a« v katero sem shranila tip objekta pravokotnik. Za parameter sem ji podala številki, vendar napisani v nizu. Če se to lahko izvede se bo izpisal print stavek pod njim, kateri bo povedal, da bi se morala sprožiti izjema in da parametri morajo biti podani kot int (celo število). Če se sproži izjema pa se izpiše print stavek v »except«.
  1. Testni program: V tem testnem programu preverjam ali bo program deloval, če mu podamo za parameter decimalna števila. V navodilih predpostavimo, da so parametri cela števila. Preverim ali je program dovolj dobro napisan, da se nebo sesul. Postopek je enak kot je opisan pri prvem testnem programu.
  1. Testni program: Pomemben testni program je tudi, če za parameter podamo nič ali negativno število. Stranica pravokotnik ne more biti dolga nič ali negativno.
  1. Testni program: S tem testnim programom preverjam delovanje metode ploscina v razredu Pravokotnik. Preverjam, če je program pravilno napisan ter če pravilno izračuna ploščino pravokotnika.
  1. Testni program: S tem testnim programom preverjam delovanje metode obseg v razredu Pravokotnik. Preverjam, če je program pravilno napisan ter če pravilno izračuna ploščino pravokotnika.

Testiranje programa

0%
0%