Forumi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 26.02.2015., 23:23   #31
L31
Premium
Moj komp
 
Datum registracije: Jan 2013
Lokacija: Zagreb
Postovi: 863
Ne bih ti znao pomoci, tek sam na pocetku prvog predavanja one gospodjice iz prvog posta.
L31 je offline   Reply With Quote
Staro 26.02.2015., 23:26   #32
Bullet1
Premium
Moj komp
 
Bullet1's Avatar
 
Datum registracije: Oct 2006
Lokacija: Dubrovnik
Postovi: 2,576
Simple:

computepay je funkcija koja prima dva argumenta (h i r) odnosno ante i mate ili kako god hoćeš ih možeš nazvati.
Kada se program izvršava, najprije se izvršava try pa se zatim poziva computepay funkcija čiji se rezultat sprema u varijablu pay te sa print pay ispisiva taj rezultat.

Ukratko, kada poziva funkciju predaje argumente hours i rate koji su neka realna brojčana vrijednost. Ti argumenti se pri pozivu funkcije kopiraju u varijable h i r (moglo ih se isto nazvati hours i rate ali vjerojatno namjerno nije kako ne bi mislio da radiš direktno sa donjim varijablama već njihovim kopijama).
Ovisno o tome je li h <= 40 rade se zadane operacije a rezultat se sprema u varijablu p. Tu varijablu, odnosno njenu vrijednost moramo zapamtiti prilikom izvršenja funkcije. Za taj dio je zaslužan return p koji kod poziva pay = computepay(hours, rate) ima ulogu da u varijablu pay spremi vrijednost varijable p iz funkcije.

Nadam se da nisam zakompliciro s odgovorom

to bi izgledalo ovako na primjeru:

ukoliko za Enter hours unesemo 5.5 a za Enter rate unesemo 3.5 onda pozivamo funkciju computepay koja bi izgledala computepay(5.5, 3.5). Ulaskom u funkciju varijabla h iznosi 5.5 a varijabla r 3.5. Iizvršava se if uvjet jer h nije veći od 40 pa je rezultat 19.25 i taj rezultat se sprema u varijablu p. Else dio se preskače i funkcija vraća vrijednost 19.25 te se ta vrijednost sprema u varijablu pay jer smo tako rekli pri pozivu funkcije (pay = computepay(...)).
Kada isprintamo varijablu p (print p) vidit ćemo da je rezultat 19.25.

Zadnje izmijenjeno od: Bullet1. 26.02.2015. u 23:34.
Bullet1 je offline   Reply With Quote
Staro 26.02.2015., 23:32   #33
Neo-ST
Buying Bitcoin
Moj komp
 
Neo-ST's Avatar
 
Datum registracije: Feb 2007
Lokacija: Croatia
Postovi: 7,976
Citiraj:
Autor Bullet1 Pregled postova
Ukratko, kada poziva funkciju predaje argumente hours i rate koji su neka realna brojčana vrijednost. Ti argumenti se pri pozivu funkcije kopiraju u varijable h i r (moglo ih se isto nazvati hours i rate ali vjerojatno namjerno nije kako ne bi mislio da radiš direktno sa donjim varijablama već njihovim kopijama).
Dobro, ali kako je on povezao hours sa h, rate sa r i pay sa p ?
Neo-ST je offline   Reply With Quote
Staro 27.02.2015., 00:17   #34
Princ288
Premium
Moj komp
 
Princ288's Avatar
 
Datum registracije: May 2012
Lokacija: Zagreb
Postovi: 848
Predzadnji red, kad poziva funkciju compute, prenosi parametre hours i rate a u prvom redu ih ta funkcija kopira u h i r. U predzadnjem redu ti ito tako pise pay=... A vracas p, ona vrijedbost koju vracas ce se spremiti u pay.
Princ288 je offline   Reply With Quote
Staro 27.02.2015., 04:24   #35
Bullet1
Premium
Moj komp
 
Bullet1's Avatar
 
Datum registracije: Oct 2006
Lokacija: Dubrovnik
Postovi: 2,576
Citiraj:
Autor Neo-ST Pregled postova
Dobro, ali kako je on povezao hours sa h, rate sa r i pay sa p ?
Samo treba shvatiti da h i hours nisu iste varijable već je h kopija od hours.
Dakle ako ti imaš varijablu imena Neo-ST koju šalješ funkciji, nije uopće bitno kako će se ona u funkciji zvati. Može se zvati isto Neo-ST a može Bullet, Pero a, z, žnj itd.

funkcija ima oblik:

funkcija (a, b) {
...tijelo funkcije...
}

a u main programu ti tu funkciju pozivaš funkcija(Neo-ST, Bullet) gdje argumenti koje predaješ odgovaraju tipu varijable koja funkcija prima.

Neznam kako bi ti pobliže objasnio od ovako:

Dakle, computepay gledaj kao funkciju i nema apsolutno nikakve veze što je ona napisana prije try. Try se nalazi u main dijelu programa i služi kako bi ti dao vrijednost nekoj varijabli.
Imaš jabuku i trebaš joj dati vrijednost da znaš koliko ona košta. Ako si definirao da jabuka košta 2kn možeš ju zapisati kao jabuka = 2. S druge strane imaš krušku koja košta 3kn i definiraš varijablu kruška = 3. Sada imaš dvije opcije za izračun koliko jedna jabuka i jedna kruška skupa koštaju. Prva opcija je da u main programu samo nastaviš pisati nešto poput:
suma = jabuka + kruška ;
što znači da je suma = 2 + 3 odnosno suma = 5;
ili napraviš funkciju koja se zove suma te prima parametre artikl1 i artikl2. Takav zapis funkcije izgleda suma(artikl1, artikl2). Ti od te funkcije tražiš da ti napravi sumu dvaju artikala i da ti vrati rezultat. Nebitno je jesu li u pitanju kruške i jabuke ili šljive i smokve, ista je matematika. Dakle, definirao si u glavnom programu da je:
jabuka = 2;
kruška = 3;
i sada želiš primjeniti funkciju koja će zbrojiti vrijednosti krušaka i jabuka. To ćeš napraviti jednostavnim pozivom funkcije suma(jabuka, kruška) i spremit ćeš povratnu vrijednost u neku varijablu kako bi tu sumu mogao koristiti dalje u programu ili ju samo ispisati. Da ne filozofiram dalje, napisat ću ti jednostavniji primjer od toga što imaš zadano pa možda shvatiš.

Code:
//ovo je funkcija koju pozivaš iz main programa
def suma(artikl1, artikl2):
    rezultat = artikl1 + artikl2;
    return rezultat;


//ovo je main program
jabuka = 2;
kruška = 3;
šljiva = 5;
smokva = 1;

//funkcija sprema rezultat (5) u varijablu trošak1
trošak1 = suma(jabuka, kruška);

//ispisivamo vrijednost varijable trošak1 odnosno broj 5
print trošak1;

//funkcija sprema rezultat (6) u varijablu trošak2
trošak2 = suma(šljiva, smokva); 

//ispisivamo vrijednost varijable trošak2 odnosno broj 6
print trošak2;

//funkcija sprema rezultat (11) u varijablu ukupan_trošak
ukupan_trošak = suma(trošak1, trošak2); 

//ispisivamo vrijednost varijable ukupan_trošak odnosno broj 11
print ukupan_trošak;
Vidimo da smo funkciju suma upotrijebili 3 puta za različite proizvode. To je moguće zato jer se svaki puta kada pozovemo funkciju suma, oni argumenti koje smo predali u main programu preslikaju/kopiraju u one argumente koje funkcija prima.

Jabuka se preslikala u artikl1
Kruška se preslikala u artikl2

Šljiva se preslikala u artikl1
Smokva se preslikala u artikl2

Trošak1 se preslikao u artikl1
Trošak2 se preslikao u artikl2

Već su neke ure i neznam kako da ti bolje objasnim, sorry...
Bullet1 je offline   Reply With Quote
Staro 27.02.2015., 09:02   #36
L31
Premium
Moj komp
 
Datum registracije: Jan 2013
Lokacija: Zagreb
Postovi: 863
Ako sam dobro shvatio, funkcija je zadana sa svojim varijablama. Kad definiramo sumu, unutar sume su elementi funkcije i nije bitno sto napisemo jer kad napisemo tu funkciju program zna o kojoj je funkciji rijec i automatski za artikl1 stavlja jabuku, za artikl2 stavlja krusku...odnosno u primjeru sa slike za hours stavlja h a za rate r
Jesam dobro shvatio?
L31 je offline   Reply With Quote
Staro 27.02.2015., 11:26   #37
KhongLo
Registered User
Moj komp
 
KhongLo's Avatar
 
Datum registracije: Jan 2015
Lokacija: Zagreb
Postovi: 695
Tako je. Ono što funkcija radi je definirano u tijelu funkcije, a s kojim vrijednostima će to nešto raditi zadaje se pomoću argumenata. Tijelo funkcije je sve ono što ide ispod def ime_funkcije(arg1, arg2, arg3), pri čemu su arg1, arg2 i arg3 argumenti.

Osim toga što se "razbijanjem" koda na funkcije dobiva na čitljivosti te lakšem pronalaženju i popravljanju grešaka, jedna od glavnih svrha njihovog korištenja je tzv. reusability, tj. ista funkcija može se koristiti u različitim programima i za potpuno različite stvari. Bullet1 je naveo kao primjer funkciju suma i s njom je zbrajao cijene voća. Ista ta funkcija može se kasnije u nekom drugom programu koristiti npr. za zbrajanje kilometara od Zagreba do Rijeke i od Rijeke do Splita. Naravno, ako će je se koristiti za zbrajanje kilometara, bilo bi primjerenije da se artikl1 i artikl2 preimenuju u nešto poput kilometri1 i kilometri2 jer bi bilo lakše za razumijeti u okviru tog programa, pa bi to izgledalo ovako:

Code:
def suma(kilometri1, kilometri2):
    rezultat = kilometri1 + kilometri2
    return rezultat

# Cestovne udaljenosti izmedu gradova su sljedece:
zagreb_rijeka = 170
rijeka_split = 360

''' Koliko cu kilometara prijeci ako krenem iz Zagreba, prespavam u Rijeci i
nastavim dalje prema Splitu? '''
udaljenost = suma(zagreb_rijeka, rijeka_split)
print udaljenost
Isti taj program mogao se napisati i bez da se išta u Bulletovom kodu mijenja, osim vrijednosti varijabli, samo je manje čitljivo i može biti zbunjujuće za onoga tko će čitati taj kod:
Code:
def suma(artikl1, artikl2):
    rezultat = artikl1 + artikl2
    return rezultat

# Cestovne udaljenosti izmedu gradova su sljedece:
jabuka = 170
kruska = 360

''' Koliko cu kilometara prijeci ako krenem iz Zagreba, prespavam u Rijeci i
nastavim dalje prema Splitu? '''
trosak = suma(jabuka, kruska)
print trosak
Oba programa bi na ekran trebala ispisati 530.

Zadnje izmijenjeno od: KhongLo. 27.02.2015. u 11:34.
KhongLo je offline   Reply With Quote
Staro 27.02.2015., 11:46   #38
L31
Premium
Moj komp
 
Datum registracije: Jan 2013
Lokacija: Zagreb
Postovi: 863
Kad se dobro objasni, izgleda vrlo jednostavno
L31 je offline   Reply With Quote
Staro 27.02.2015., 12:28   #39
KhongLo
Registered User
Moj komp
 
KhongLo's Avatar
 
Datum registracije: Jan 2015
Lokacija: Zagreb
Postovi: 695
Kad sam se već dotaknuo lakšeg modificiranja programa i debugginga dat ću još jedan primjer zašto treba koristiti funkcije. Kad sam se prvi put u susreo s programiranjem, korištenje funkcija (i klasa) mi se činilo sasvim bezveze i razmišljao sam u stilu: Ma to je za pi***, ja cijeli kod napišem u komadu i ako je krajnji rezultat točan, onda sam miran, no vrlo brzo sam shvatio da je taj način razmišljanja kriv.

Primjer:
Web shop koji prodaje računalne komponente daje 10% popusta za gotovinsko plaćanje. Kod koji određuje cijenu koju će kupac platiti izgleda ovako:

Code:
def konacna_cijena(cijena_komponente, nacin_placanja):
    # 10% = 0.1
    popust = 0.1

    if nacin_placanja is 'gotovina':
        return cijena_komponente - popust*cijena_komponente
    else:
        return cijena_komponente

# Kupac nazove i pita za cijenu AMD FX 8320 procesora, a trgovac mu odgovara:
cijena_procesora = 1200
cijena_gotovina = konacna_cijena(cijena_procesora, 'gotovina')
print('Za placanje gotovinom to ce vas kostati', cijena_gotovina, 'kn,')
cijena_rate = konacna_cijena(cijena_procesora, 'rate')
print('a ako placate na rate, onda je cijena', cijena_rate, 'kn.')
Ako iz bilo kojeg razloga vlasnik web shopa odluči da je bolje da popust za gotovinsko placanja bude 9%, jedina stvar koju će trebati promijeniti jest umjesto popust = 0.1 napisati popust = 0.09.

Kada bi kod bio napisan tako da se za svaku komponentu konačna cijena računa zasebno kao što je to dano u primjeru ispod, tada bi promjena iz 10 u 9% zahtijevala malo više vremena, a mogućnost da se nešto propusti promijeniti ili napravi krivo je daleko veća.

Code:
def cijena_procesora(cijena_cpu, nacin_placanja):
    popust = 0.1

    if nacin_placanja is 'gotovina':
        return cijena_cpu - popust*cijena_cpu
    else:
        return cijena_cpu

def cijena_grafe(cijena_gpu, nacin_placanja):
    popust = 0.1

    if nacin_placanja is 'gotovina':
        return cijena_gpu - popust*cijena_gpu
    else:
        return cijena_gpu

def cijena_memorije(cijena_ram, nacin_placanja):
    popust = 0.1

    if nacin_placanja is 'gotovina':
        return cijena_ram - popust*cijena_ram
    else:
        return cijena_ram
Dakle, ovako se ne pisu programi!

Doduše, programe koji imaju veze s poslovanjem trgovine bilo bi bolje pisati objektno orijentirano, ali sada smo na funkcijama, pa sam onda korištenje klasa izostavio.
KhongLo je offline   Reply With Quote
Staro 27.02.2015., 21:28   #40
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
ups. nevidjeh čitavu drugu stranu teme..
__________________
"I intend to live forever. So far, so good."

job security - example

Zadnje izmijenjeno od: rodney. 27.02.2015. u 21:56.
rodney je offline   Reply With Quote